diff mbox

[9/9] rbd: try to acquire lock once before going waiting

Message ID 1525682645-30510-10-git-send-email-dongsheng.yang@easystack.cn (mailing list archive)
State New, archived
Headers show

Commit Message

Dongsheng Yang May 7, 2018, 8:44 a.m. UTC
Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
---
 drivers/block/rbd.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
diff mbox

Patch

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index a341929..264f68c 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -3588,6 +3588,23 @@  static int rbd_wait_state_locked(struct rbd_device *rbd_dev, bool may_acquire)
 		return -EROFS;
 	}
 
+	up_read(&rbd_dev->lock_rwsem);
+	rbd_try_acquire_lock(rbd_dev, &ret);
+	if (ret == -EBLACKLISTED) {
+		down_write(&rbd_dev->lock_rwsem);
+		set_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags);
+		up_write(&rbd_dev->lock_rwsem);
+		down_read(&rbd_dev->lock_rwsem);
+		goto out;
+	}
+	down_read(&rbd_dev->lock_rwsem);
+
+	if (ret == -ENOSPC)
+		goto out;
+
+	if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED)
+		goto out;
+
 	do {
 		/*
 		 * Note the use of mod_delayed_work() in rbd_acquire_lock()
@@ -3613,6 +3630,8 @@  static int rbd_wait_state_locked(struct rbd_device *rbd_dev, bool may_acquire)
 	} while (rbd_dev->lock_state != RBD_LOCK_STATE_LOCKED);
 
 	finish_wait(&rbd_dev->lock_waitq, &wait);
+
+out:
 	return ret;
 }