fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / fs / ocfs2 / dlm / dlmconvert.c
index f66e2d8..c764dc8 100644 (file)
@@ -214,6 +214,9 @@ grant:
        if (lock->ml.node == dlm->node_num)
                mlog(0, "doing in-place convert for nonlocal lock\n");
        lock->ml.type = type;
+       if (lock->lksb->flags & DLM_LKSB_PUT_LVB)
+               memcpy(res->lvb, lock->lksb->lvb, DLM_LVB_LEN);
+
        status = DLM_NORMAL;
        *call_ast = 1;
        goto unlock_exit;
@@ -231,8 +234,7 @@ switch_queues:
 
        lock->ml.convert_type = type;
        /* do not alter lock refcount.  switching lists. */
-       list_del_init(&lock->list);
-       list_add_tail(&lock->list, &res->converting);
+       list_move_tail(&lock->list, &res->converting);
 
 unlock_exit:
        spin_unlock(&lock->spinlock);
@@ -248,8 +250,7 @@ void dlm_revert_pending_convert(struct dlm_lock_resource *res,
                                struct dlm_lock *lock)
 {
        /* do not alter lock refcount.  switching lists. */
-       list_del_init(&lock->list);
-       list_add_tail(&lock->list, &res->granted);
+       list_move_tail(&lock->list, &res->granted);
        lock->ml.convert_type = LKM_IVMODE;
        lock->lksb->flags &= ~(DLM_LKSB_GET_LVB|DLM_LKSB_PUT_LVB);
 }
@@ -284,16 +285,17 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
        if (lock->ml.convert_type != LKM_IVMODE) {
                __dlm_print_one_lock_resource(res);
                mlog(ML_ERROR, "converting a remote lock that is already "
-                    "converting! (cookie=%"MLFu64", conv=%d)\n",
-                    lock->ml.cookie, lock->ml.convert_type);
+                    "converting! (cookie=%u:%llu, conv=%d)\n",
+                    dlm_get_lock_cookie_node(lock->ml.cookie),
+                    dlm_get_lock_cookie_seq(lock->ml.cookie),
+                    lock->ml.convert_type);
                status = DLM_DENIED;
                goto bail;
        }
        res->state |= DLM_LOCK_RES_IN_PROGRESS;
        /* move lock to local convert queue */
        /* do not alter lock refcount.  switching lists. */
-       list_del_init(&lock->list);
-       list_add_tail(&lock->list, &res->converting);
+       list_move_tail(&lock->list, &res->converting);
        lock->convert_pending = 1;
        lock->ml.convert_type = type;
 
@@ -462,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 &&
@@ -471,6 +479,21 @@ 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(ML_ERROR, "There is something here "
+                                    "for node %u, lock->ml.cookie=%llu, "
+                                    "cnv->cookie=%llu\n", cnv->node_idx,
+                                    (unsigned long long)lock->ml.cookie,
+                                    (unsigned long long)cnv->cookie);
+                               break;
+                       }
+               }
+               lock = NULL;
+       }
        spin_unlock(&res->spinlock);
        if (!lock) {
                status = DLM_IVLOCKID;
@@ -513,8 +536,9 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
 leave:
        if (!lock)
                mlog(ML_ERROR, "did not find lock to convert on grant queue! "
-                              "cookie=%"MLFu64"\n",
-                    cnv->cookie);
+                              "cookie=%u:%llu\n",
+                              dlm_get_lock_cookie_node(cnv->cookie),
+                              dlm_get_lock_cookie_seq(cnv->cookie));
        else
                dlm_lock_put(lock);