From: Junxiao Bi <junxiao.bi@oracle.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH] ocfs2/dlm: wait until DLM_LOCK_RES_SETREF_INPROG is cleared in dlm_deref_lockres_worker
Date: Mon, 14 Dec 2015 13:49:27 +0800 [thread overview]
Message-ID: <566E5867.7080506@oracle.com> (raw)
In-Reply-To: <5668002C.3070107@huawei.com>
On 12/09/2015 06:19 PM, jiangyiwen wrote:
> commit f3f854648de6("ocfs2_dlm: Ensure correct ordering of set/clear
> refmap bit on lockres") still exists a race which can't ensure the
> ordering is exactly correct.
>
> Node1 Node2 Node3
> umount, migrate
> lockres to Node2
> migrate finished,
> send migrate request
> to Node3
> received migrate request,
> create a migration_mle,
> respond to Node2.
> set DLM_LOCK_RES_SETREF_INPROG
> and send assert master to
> Node3
> delete migration_mle in
> assert_master_handler,
> Node3 umount without response
> dlm_thread purge
> this lockres, send drop
> deref message to Node2
> found the flag of
> DLM_LOCK_RES_SETREF_INPROG
> is set, dispatch
> dlm_deref_lockres_worker to
> clear refmap, but in function of
> dlm_deref_lockres_worker,
> only if node in refmap it wait
> DLM_LOCK_RES_SETREF_INPROG
> to be cleared. So worker is
> done successfully
>
> purge lockres, send
> assert master response
> to Node1, and finish umount
> set Node3 in refmap, and it
> won't be cleared forever, thus
> lead to umount hung
>
> so wait until DLM_LOCK_RES_SETREF_INPROG is cleared in
> dlm_deref_lockres_worker.
>
> Signed-off-by: Yiwen Jiang <jiangyiwen@huawei.com>
> Reviewed-by: Joseph Qi <joseph.qi@huawei.com>
Looks good.
Reviewed-by: Junxiao Bi <junxiao.bi@oracle.com>
> ---
> fs/ocfs2/dlm/dlmmaster.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
> index ce38b4c..666ea67 100644
> --- a/fs/ocfs2/dlm/dlmmaster.c
> +++ b/fs/ocfs2/dlm/dlmmaster.c
> @@ -2388,8 +2388,8 @@ static void dlm_deref_lockres_worker(struct dlm_work_item *item, void *data)
>
> spin_lock(&res->spinlock);
> BUG_ON(res->state & DLM_LOCK_RES_DROPPING_REF);
> + __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
> if (test_bit(node, res->refmap)) {
> - __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
> dlm_lockres_clear_refmap_bit(dlm, res, node);
> cleared = 1;
> }
>
prev parent reply other threads:[~2015-12-14 5:49 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-09 10:19 [Ocfs2-devel] [PATCH] ocfs2/dlm: wait until DLM_LOCK_RES_SETREF_INPROG is cleared in dlm_deref_lockres_worker jiangyiwen
2015-12-14 5:49 ` Junxiao Bi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=566E5867.7080506@oracle.com \
--to=junxiao.bi@oracle.com \
--cc=ocfs2-devel@oss.oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.