]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/ocfs2/dlm/dlmmaster.c
ocfs2_dlm: Calling post handler function in assert master handler
[karo-tx-linux.git] / fs / ocfs2 / dlm / dlmmaster.c
index bd1268778b660b5b54e28589f33ada63e2445540..84f36db8ada32b5a354f05846c43e6834178ee76 100644 (file)
@@ -2036,8 +2036,12 @@ ok:
 
 done:
        ret = 0;
-       if (res)
-               dlm_lockres_put(res);
+       if (res) {
+               spin_lock(&res->spinlock);
+               res->state |= DLM_LOCK_RES_SETREF_INPROG;
+               spin_unlock(&res->spinlock);
+               *ret_data = (void *)res;
+       }
        dlm_put(dlm);
        if (master_request) {
                mlog(0, "need to tell master to reassert\n");
@@ -2064,11 +2068,25 @@ kill:
        __dlm_print_one_lock_resource(res);
        spin_unlock(&res->spinlock);
        spin_unlock(&dlm->spinlock);
-       dlm_lockres_put(res);
+       *ret_data = (void *)res; 
        dlm_put(dlm);
        return -EINVAL;
 }
 
+void dlm_assert_master_post_handler(int status, void *data, void *ret_data)
+{
+       struct dlm_lock_resource *res = (struct dlm_lock_resource *)ret_data;
+
+       if (ret_data) {
+               spin_lock(&res->spinlock);
+               res->state &= ~DLM_LOCK_RES_SETREF_INPROG;
+               spin_unlock(&res->spinlock);
+               wake_up(&res->wq);
+               dlm_lockres_put(res);
+       }
+       return;
+}
+
 int dlm_dispatch_assert_master(struct dlm_ctxt *dlm,
                               struct dlm_lock_resource *res,
                               int ignore_higher, u8 request_from, u32 flags)