Master returns in-progress to non-master node when it can not clear
the refmap bit right now. And non-master node will not purge the
lock resource until receiving deref done message.

Signed-off-by: xuejiufei <xuejiu...@huawei.com>
---
 fs/ocfs2/dlm/dlmcommon.h | 5 +++++
 fs/ocfs2/dlm/dlmmaster.c | 8 +++++---
 fs/ocfs2/dlm/dlmthread.c | 7 +++++++
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
index 57a7cd5..ce695f1 100644
--- a/fs/ocfs2/dlm/dlmcommon.h
+++ b/fs/ocfs2/dlm/dlmcommon.h
@@ -783,6 +783,11 @@ struct dlm_deref_lockres
        u8 name[O2NM_MAX_NAME_LEN];
 };

+enum {
+       DLM_DEREF_RESPONSE_DONE = 0,
+       DLM_DEREF_RESPONSE_INPROG = 1,
+};
+
 struct dlm_deref_lockres_done {
        u32 pad1;
        u16 pad2;
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index 8913e7d..87e2254 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -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);
diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c
index c5f6c24..22e6eb8 100644
--- a/fs/ocfs2/dlm/dlmthread.c
+++ b/fs/ocfs2/dlm/dlmthread.c
@@ -202,6 +202,13 @@ static void dlm_purge_lockres(struct dlm_ctxt *dlm,
                dlm->purge_count--;
        }

+       if (!master && ret != 0) {
+               mlog(0, "%s: deref %.*s in progress or master goes down\n",
+                       dlm->name, res->lockname.len, res->lockname.name);
+               spin_unlock(&res->spinlock);
+               return;
+       }
+
        if (!__dlm_lockres_unused(res)) {
                mlog(ML_ERROR, "%s: res %.*s in use after deref\n",
                     dlm->name, res->lockname.len, res->lockname.name);
-- 
1.8.4.3


_______________________________________________
Ocfs2-devel mailing list
Ocfs2-devel@oss.oracle.com
https://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to