OSDN Git Service

ocfs2/dlm: return in progress if master can not clear the refmap bit right now
[uclinux-h8/linux.git] / fs / ocfs2 / dlm / dlmmaster.c
index 8913e7d..87e2254 100644 (file)
@@ -2278,7 +2278,7 @@ int dlm_drop_lockres_ref(struct dlm_ctxt *dlm, struct dlm_lock_resource *res)
                dlm_print_one_lock_resource(res);
                BUG();
        }
-       return ret;
+       return ret ? ret : r;
 }
 
 int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
@@ -2345,7 +2345,7 @@ int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
                        res->lockname.len, res->lockname.name, node);
                        dlm_print_one_lock_resource(res);
                }
-               ret = 0;
+               ret = DLM_DEREF_RESPONSE_DONE;
                goto done;
        }
 
@@ -2365,7 +2365,7 @@ int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
        spin_unlock(&dlm->work_lock);
 
        queue_work(dlm->dlm_worker, &dlm->dispatched_work);
-       return 0;
+       return DLM_DEREF_RESPONSE_INPROG;
 
 done:
        if (res)
@@ -2511,6 +2511,8 @@ static void dlm_deref_lockres_worker(struct dlm_work_item *item, void *data)
        }
        spin_unlock(&res->spinlock);
 
+       dlm_drop_lockres_ref_done(dlm, res, node);
+
        if (cleared) {
                mlog(0, "%s:%.*s node %u ref dropped in dispatch\n",
                     dlm->name, res->lockname.len, res->lockname.name, node);