Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[sfrench/cifs-2.6.git] / fs / ocfs2 / dlm / dlmconvert.c
index 8285228d9e3778659df0ca4f5324b9108e941ac1..75997b4deaf3ff9fafd4fcf25293c9312fb17fc8 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);
 }
@@ -285,8 +286,8 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
                __dlm_print_one_lock_resource(res);
                mlog(ML_ERROR, "converting a remote lock that is already "
                     "converting! (cookie=%u:%llu, conv=%d)\n",
-                    dlm_get_lock_cookie_node(lock->ml.cookie),
-                    dlm_get_lock_cookie_seq(lock->ml.cookie),
+                    dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)),
+                    dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)),
                     lock->ml.convert_type);
                status = DLM_DENIED;
                goto bail;
@@ -294,8 +295,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
        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;
 
@@ -418,7 +418,8 @@ static enum dlm_status dlm_send_remote_convert_request(struct dlm_ctxt *dlm,
  * returns: DLM_NORMAL, DLM_IVLOCKID, DLM_BADARGS,
  *          status from __dlmconvert_master
  */
-int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
+int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data,
+                            void **ret_data)
 {
        struct dlm_ctxt *dlm = data;
        struct dlm_convert_lock *cnv = (struct dlm_convert_lock *)msg->buf;
@@ -428,7 +429,7 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
        struct dlm_lockstatus *lksb;
        enum dlm_status status = DLM_NORMAL;
        u32 flags;
-       int call_ast = 0, kick_thread = 0, ast_reserved = 0;
+       int call_ast = 0, kick_thread = 0, ast_reserved = 0, wake = 0;
 
        if (!dlm_grab(dlm)) {
                dlm_error(DLM_REJECTED);
@@ -464,6 +465,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 &&
@@ -476,7 +483,11 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
        spin_unlock(&res->spinlock);
        if (!lock) {
                status = DLM_IVLOCKID;
-               dlm_error(status);
+               mlog(ML_ERROR, "did not find lock to convert on grant queue! "
+                              "cookie=%u:%llu\n",
+                    dlm_get_lock_cookie_node(be64_to_cpu(cnv->cookie)),
+                    dlm_get_lock_cookie_seq(be64_to_cpu(cnv->cookie)));
+               dlm_print_one_lock_resource(res);
                goto leave;
        }
 
@@ -503,8 +514,11 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data)
                                             cnv->requested_type,
                                             &call_ast, &kick_thread);
                res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
+               wake = 1;
        }
        spin_unlock(&res->spinlock);
+       if (wake)
+               wake_up(&res->wq);
 
        if (status != DLM_NORMAL) {
                if (status != DLM_NOTQUEUED)
@@ -513,12 +527,7 @@ 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=%u:%llu\n",
-                              dlm_get_lock_cookie_node(cnv->cookie),
-                              dlm_get_lock_cookie_seq(cnv->cookie));
-       else
+       if (lock)
                dlm_lock_put(lock);
 
        /* either queue the ast or release it, if reserved */