All of lore.kernel.org
 help / color / mirror / Atom feed
* [Ocfs2-devel] [PATCH] ocfs2/dlm: wait until DLM_LOCK_RES_SETREF_INPROG is cleared in dlm_deref_lockres_worker
@ 2015-12-09 10:19 jiangyiwen
  2015-12-14  5:49 ` Junxiao Bi
  0 siblings, 1 reply; 2+ messages in thread
From: jiangyiwen @ 2015-12-09 10:19 UTC (permalink / raw)
  To: ocfs2-devel

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>
---
 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;
 	}
-- 
1.8.4.3

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [Ocfs2-devel] [PATCH] ocfs2/dlm: wait until DLM_LOCK_RES_SETREF_INPROG is cleared in dlm_deref_lockres_worker
  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
  0 siblings, 0 replies; 2+ messages in thread
From: Junxiao Bi @ 2015-12-14  5:49 UTC (permalink / raw)
  To: ocfs2-devel

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;
>  	}
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-12-14  5:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 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.