md-cluster: use FORCEUNLOCK in lockres_free
authorGuoqing Jiang <gqjiang@suse.com>
Fri, 12 Aug 2016 05:42:35 +0000 (13:42 +0800)
committerShaohua Li <shli@fb.com>
Wed, 21 Sep 2016 16:09:44 +0000 (09:09 -0700)
For dlm_unlock, we need to pass flag to dlm_unlock as the
third parameter instead of set res->flags.

Also, DLM_LKF_FORCEUNLOCK is more suitable for dlm_unlock
since it works even the lock is on waiting or convert queue.

Acked-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md-cluster.c

index 34a840d..ccd756f 100644 (file)
@@ -194,25 +194,21 @@ out_err:
 
 static void lockres_free(struct dlm_lock_resource *res)
 {
-       int ret;
+       int ret = 0;
 
        if (!res)
                return;
 
-       /* cancel a lock request or a conversion request that is blocked */
-       res->flags |= DLM_LKF_CANCEL;
-retry:
-       ret = dlm_unlock(res->ls, res->lksb.sb_lkid, 0, &res->lksb, res);
-       if (unlikely(ret != 0)) {
-               pr_info("%s: failed to unlock %s return %d\n", __func__, res->name, ret);
-
-               /* if a lock conversion is cancelled, then the lock is put
-                * back to grant queue, need to ensure it is unlocked */
-               if (ret == -DLM_ECANCEL)
-                       goto retry;
-       }
-       res->flags &= ~DLM_LKF_CANCEL;
-       wait_for_completion(&res->completion);
+       /*
+        * use FORCEUNLOCK flag, so we can unlock even the lock is on the
+        * waiting or convert queue
+        */
+       ret = dlm_unlock(res->ls, res->lksb.sb_lkid, DLM_LKF_FORCEUNLOCK,
+               &res->lksb, res);
+       if (unlikely(ret != 0))
+               pr_err("failed to unlock %s return %d\n", res->name, ret);
+       else
+               wait_for_completion(&res->completion);
 
        kfree(res->name);
        kfree(res->lksb.sb_lvbptr);