[PATCH] ocfs2: manually grant remote recovery lock
authorKurt Hackel <kurt.hackel@oracle.com>
Thu, 19 Jan 2006 01:07:47 +0000 (17:07 -0800)
committerMark Fasheh <mark.fasheh@oracle.com>
Thu, 16 Feb 2006 20:02:13 +0000 (12:02 -0800)
* fix a hang in recovery that occurred in dlmlock_remote.  the $RECOVERY
  lock was never moved to the granted queue even after getting DLM_NORMAL
  back from the master node.

Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/dlm/dlmlock.c

index e709412..671d4ff 100644 (file)
@@ -220,6 +220,17 @@ static enum dlm_status dlmlock_remote(struct dlm_ctxt *dlm,
                        dlm_error(status);
                dlm_revert_pending_lock(res, lock);
                dlm_lock_put(lock);
+       } else if (dlm_is_recovery_lock(res->lockname.name, 
+                                       res->lockname.len)) {
+               /* special case for the $RECOVERY lock.
+                * there will never be an AST delivered to put
+                * this lock on the proper secondary queue
+                * (granted), so do it manually. */
+               mlog(0, "%s: $RECOVERY lock for this node (%u) is "
+                    "mastered by %u; got lock, manually granting (no ast)\n",
+                    dlm->name, dlm->node_num, res->owner);
+               list_del_init(&lock->list);
+               list_add_tail(&lock->list, &res->granted);
        }
        spin_unlock(&res->spinlock);