Browse Source

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 <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Guoqing Jiang 9 years ago
parent
commit
400cb454a4
1 changed files with 11 additions and 15 deletions
  1. 11 15
      drivers/md/md-cluster.c

+ 11 - 15
drivers/md/md-cluster.c

@@ -194,25 +194,21 @@ out_err:
 
 
 static void lockres_free(struct dlm_lock_resource *res)
 static void lockres_free(struct dlm_lock_resource *res)
 {
 {
-	int ret;
+	int ret = 0;
 
 
 	if (!res)
 	if (!res)
 		return;
 		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->name);
 	kfree(res->lksb.sb_lvbptr);
 	kfree(res->lksb.sb_lvbptr);