[Ocfs2-devel] [PATCH] ocfs2/dlm: a missing DLM_LOCK_RES_IN_PROGRESS set

Wengang Wang wen.gang.wang at oracle.com
Thu Nov 18 20:23:11 PST 2010


For remote dlm operations, local node sets DLM_LOCK_RES_IN_PROGRESS flag on
the lockres to prevent parallel remote dlm requests.
There is a miss of setting that flag in dlmunlock_common() for the remote
case which leads to a later remote dlm request goes on.

Signed-off-by: Wengang Wang <wen.gang.wang at oracle.com>
---
 fs/ocfs2/dlm/dlmunlock.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c
index 817287c..a45be2f 100644
--- a/fs/ocfs2/dlm/dlmunlock.c
+++ b/fs/ocfs2/dlm/dlmunlock.c
@@ -104,7 +104,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
 {
 	enum dlm_status status;
 	int actions = 0;
-	int in_use;
+	int in_use, can_block;
         u8 owner;
 
 	mlog(0, "master_node = %d, valblk = %d\n", master_node,
@@ -127,9 +127,10 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
 		return DLM_BADPARAM;
 	}
 
+	can_block = master_node? (flags & LKM_CANCEL) : 1;
 	spin_lock(&res->spinlock);
 	if (res->state & DLM_LOCK_RES_IN_PROGRESS) {
-		if (master_node && !(flags & LKM_CANCEL)) {
+		if (!can_block) {
 			mlog(ML_ERROR, "lockres in progress!\n");
 			spin_unlock(&res->spinlock);
 			return DLM_FORWARD;
@@ -137,6 +138,9 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
 		/* ok for this to sleep if not in a network handler */
 		__dlm_wait_on_lockres(res);
 		res->state |= DLM_LOCK_RES_IN_PROGRESS;
+	} else {
+		if (can_block)
+			res->state |= DLM_LOCK_RES_IN_PROGRESS;
 	}
 	spin_lock(&lock->spinlock);
 
@@ -232,7 +236,8 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
 	dlm_lock_put(lock);
 
 leave:
-	res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
+	if (can_block)
+		res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
 	if (!dlm_lock_on_list(&res->converting, lock))
 		BUG_ON(lock->ml.convert_type != LKM_IVMODE);
 	else
-- 
1.7.2.3




More information about the Ocfs2-devel mailing list