ocfs2/dlm: fix lockres mastery race, v2
PATCH 1/1 ocfs2/dlm: fix lockres mastery race, v2
dlm_get_lock_resource() is supposed to return a lock resource with a proper master. If multiple concurrent threads attempt to lookup the lockres for the same lockid, one or more threads are likely to return a lockres without a proper master, if the lock mastery is underway.
This patch makes the threads wait in dlm_get_lock_resource() while the mastery is underway, ensuring all threads return the lockres with a proper master.
This issue is known limited to users using the flock() syscall. For all other fs operations, dlmglue should ensure that only one thread is performing dlm operations for a given lockid at any one time.
Thank Sunil for his review and comments.
--- fs/ocfs2/dlm/dlmmaster.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +11 -0
@@ -742,6 +742,17 @@ lookup: goto lookup; } +/* wait for lock resource is being mastered by another thread */ +spin_lock (&tmpres->spinlock); +if (tmpres->owner ==DLM_LOCK_RES_OWNER_UNKNOWN ) { +__dlm_wait_on_lockres_flags (tmpres,DLM_LOCK_RES_IN_PROGRESS ); +spin_unlock (&tmpres->spinlock); +dlm_lockres_put (tmpres); + tmpres =NULL ; + goto lookup; + } +spin_unlock (&tmpres->spinlock); +mlog (0 ,"found in hash!\n" );if (res)dlm_lockres_put (res);
Signature · 2 lines
Coly Li SuSE PRC Labs
Sunil Mushran
NAKPATCH 1/1 ocfs2/dlm: fix lockres mastery race, v2
nak
The reason is listed in yesterday's email.
Quoted 43 lines · Coly Li
dlm_get_lock_resource()is supposed to return a lock resource with a proper master. If multiple concurrent threads attempt to lookup the lockres for the same lockid, one or more threads are likely to return a lockres without a proper master, if the lock mastery is underway.This patch makes the threads wait in
dlm_get_lock_resource()while the mastery is underway, ensuring all threads return the lockres with a proper master.This issue is known limited to users using the
flock()syscall. For all other fs operations, dlmglue should ensure that only one thread is performing dlm operations for a given lockid at any one time.Thank Sunil for his review and comments.
Signed-off-by Coly Li <[email protected]>Cc Sunil Mushran <[email protected]>Cc Mark Fasheh <[email protected]>Cc Jeff Mahoney <[email protected]>--- fs/ocfs2/dlm/dlmmaster.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)fs/ocfs2/dlm/dlmmaster.c +11
-0@@ -742,6 +742,17 @@ lookup: goto lookup; } +/* wait for lock resource is being mastered by another thread */ +spin_lock (&tmpres->spinlock); +if (tmpres->owner ==DLM_LOCK_RES_OWNER_UNKNOWN ) { +__dlm_wait_on_lockres_flags (tmpres,DLM_LOCK_RES_IN_PROGRESS ); +spin_unlock (&tmpres->spinlock); +dlm_lockres_put (tmpres); + tmpres =NULL ; + goto lookup; + } +spin_unlock (&tmpres->spinlock); +mlog (0 ,"found in hash!\n" );if (res)dlm_lockres_put (res);