Skip to contentSkip to conversation

ocfs2/dlm: fix lockres mastery race, v2

PATCH New Coly Li 2 participants 2 messages Dec 4, 2008 OCFS2

lore
Share & tools
lore

Coly Li

author
#0 lore raw

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.

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
index 44f87ca..dd1e754 100644
@@ -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
#1 lore raw

PATCH 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.

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
index 44f87ca..dd1e754 100644
@@ -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);