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 70888b31e751cd73cfaf8e416be56dc9329d0fe7..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;
@@ -283,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;
@@ -415,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;
@@ -425,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);
@@ -461,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 &&
@@ -473,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;
        }
 
@@ -500,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)
@@ -510,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 */