ocfs2: retry operations when a lock is marked in recovery
Kurt Hackel [Mon, 1 May 2006 21:29:28 +0000 (14:29 -0700)]
Before checking for a nonexistent lock, make sure the lockres is not marked
RECOVERING. The caller will just retry and the state should be fixed up when
recovery completes.

Signed-off-by: Kurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>

fs/ocfs2/dlm/dlmconvert.c

index 90cbaaf..2f7ad52 100644 (file)
@@ -464,6 +464,12 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
        }
 
        spin_lock(&res->spinlock);
+       status = __dlm_lockres_state_to_status(res);
+       if (status != DLM_NORMAL) {
+               spin_unlock(&res->spinlock);
+               dlm_error(status);
+               goto leave;
+       }
        list_for_each(iter, &res->granted) {
                lock = list_entry(iter, struct dlm_lock, list);
                if (lock->ml.cookie == cnv->cookie &&
@@ -473,6 +479,20 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
                }
                lock = NULL;
        }
+       if (!lock) {
+               __dlm_print_one_lock_resource(res);
+               list_for_each(iter, &res->granted) {
+                       lock = list_entry(iter, struct dlm_lock, list);
+                       if (lock->ml.node == cnv->node_idx) {
+                               mlog(0, "There is something here "
+                                    "for node %u, lock->ml.cookie=%llu, "
+                                    "cnv->cookie=%llu\n", cnv->node_idx,
+                                    lock->ml.cookie, cnv->cookie);
+                               break;
+                       }
+               }
+               lock = NULL;
+       }
        spin_unlock(&res->spinlock);
        if (!lock) {
                status = DLM_IVLOCKID;