From: Guoqing Jiang Date: Fri, 12 Aug 2016 05:42:35 +0000 (+0800) Subject: md-cluster: use FORCEUNLOCK in lockres_free X-Git-Tag: v4.9-rc1~94^2~18 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=400cb454a4205ec1d7311bc3dd8104859c26ba46;p=karo-tx-linux.git md-cluster: use FORCEUNLOCK in lockres_free 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 Signed-off-by: Guoqing Jiang Signed-off-by: Shaohua Li --- diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index 34a840d9df76..ccd756fdc00e 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c @@ -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);