]> err.no Git - linux-2.6/commitdiff
ocfs2: Check for refreshing locks in generic unblock function
authorMark Fasheh <mark.fasheh@oracle.com>
Thu, 14 Sep 2006 04:02:29 +0000 (21:02 -0700)
committerMark Fasheh <mark.fasheh@oracle.com>
Sun, 24 Sep 2006 20:50:47 +0000 (13:50 -0700)
Tidy up the exit path a bit too.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/dlmglue.c

index 40562185088a13768764e98d95f914852b4d5c63..ebc4a49801bdb4326ef25d42b1aefea73448af8a 100644 (file)
@@ -2640,22 +2640,22 @@ recheck:
        /* if we're blocking an exclusive and we have *any* holders,
         * then requeue. */
        if ((lockres->l_blocking == LKM_EXMODE)
-           && (lockres->l_ex_holders || lockres->l_ro_holders)) {
-               spin_unlock_irqrestore(&lockres->l_lock, flags);
-               ctl->requeue = 1;
-               ret = 0;
-               goto leave;
-       }
+           && (lockres->l_ex_holders || lockres->l_ro_holders))
+               goto leave_requeue;
 
        /* If it's a PR we're blocking, then only
         * requeue if we've got any EX holders */
        if (lockres->l_blocking == LKM_PRMODE &&
-           lockres->l_ex_holders) {
-               spin_unlock_irqrestore(&lockres->l_lock, flags);
-               ctl->requeue = 1;
-               ret = 0;
-               goto leave;
-       }
+           lockres->l_ex_holders)
+               goto leave_requeue;
+
+       /*
+        * Can we get a lock in this state if the holder counts are
+        * zero? The meta data unblock code used to check this.
+        */
+       if ((lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH)
+           && (lockres->l_flags & OCFS2_LOCK_REFRESHING))
+               goto leave_requeue;
 
        /* If we get here, then we know that there are no more
         * incompatible holders (and anyone asking for an incompatible
@@ -2692,6 +2692,13 @@ downconvert:
 leave:
        mlog_exit(ret);
        return ret;
+
+leave_requeue:
+       spin_unlock_irqrestore(&lockres->l_lock, flags);
+       ctl->requeue = 1;
+
+       mlog_exit(0);
+       return 0;
 }
 
 static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,