Skip to content

Commit 2f18d46

Browse files
committed
rbd: refactor rbd_wait_state_locked()
In preparation for lock_timeout option, make rbd_wait_state_locked() return error codes. Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 60cc43f commit 2f18d46

File tree

1 file changed

+26
-17
lines changed

1 file changed

+26
-17
lines changed

drivers/block/rbd.c

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3533,9 +3533,21 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
35333533
/*
35343534
* lock_rwsem must be held for read
35353535
*/
3536-
static void rbd_wait_state_locked(struct rbd_device *rbd_dev)
3536+
static int rbd_wait_state_locked(struct rbd_device *rbd_dev, bool may_acquire)
35373537
{
35383538
DEFINE_WAIT(wait);
3539+
int ret = 0;
3540+
3541+
if (test_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags))
3542+
return -EBLACKLISTED;
3543+
3544+
if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED)
3545+
return 0;
3546+
3547+
if (!may_acquire) {
3548+
rbd_warn(rbd_dev, "exclusive lock required");
3549+
return -EROFS;
3550+
}
35393551

35403552
do {
35413553
/*
@@ -3549,10 +3561,14 @@ static void rbd_wait_state_locked(struct rbd_device *rbd_dev)
35493561
up_read(&rbd_dev->lock_rwsem);
35503562
schedule();
35513563
down_read(&rbd_dev->lock_rwsem);
3552-
} while (rbd_dev->lock_state != RBD_LOCK_STATE_LOCKED &&
3553-
!test_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags));
3564+
if (test_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags)) {
3565+
ret = -EBLACKLISTED;
3566+
break;
3567+
}
3568+
} while (rbd_dev->lock_state != RBD_LOCK_STATE_LOCKED);
35543569

35553570
finish_wait(&rbd_dev->lock_waitq, &wait);
3571+
return ret;
35563572
}
35573573

35583574
static void rbd_queue_workfn(struct work_struct *work)
@@ -3638,19 +3654,10 @@ static void rbd_queue_workfn(struct work_struct *work)
36383654
(op_type != OBJ_OP_READ || rbd_dev->opts->lock_on_read);
36393655
if (must_be_locked) {
36403656
down_read(&rbd_dev->lock_rwsem);
3641-
if (rbd_dev->lock_state != RBD_LOCK_STATE_LOCKED &&
3642-
!test_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags)) {
3643-
if (rbd_dev->opts->exclusive) {
3644-
rbd_warn(rbd_dev, "exclusive lock required");
3645-
result = -EROFS;
3646-
goto err_unlock;
3647-
}
3648-
rbd_wait_state_locked(rbd_dev);
3649-
}
3650-
if (test_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags)) {
3651-
result = -EBLACKLISTED;
3657+
result = rbd_wait_state_locked(rbd_dev,
3658+
!rbd_dev->opts->exclusive);
3659+
if (result)
36523660
goto err_unlock;
3653-
}
36543661
}
36553662

36563663
img_request = rbd_img_request_create(rbd_dev, op_type, snapc);
@@ -5216,16 +5223,18 @@ static void rbd_dev_image_unlock(struct rbd_device *rbd_dev)
52165223

52175224
static int rbd_add_acquire_lock(struct rbd_device *rbd_dev)
52185225
{
5226+
int ret;
5227+
52195228
if (!(rbd_dev->header.features & RBD_FEATURE_EXCLUSIVE_LOCK)) {
52205229
rbd_warn(rbd_dev, "exclusive-lock feature is not enabled");
52215230
return -EINVAL;
52225231
}
52235232

52245233
/* FIXME: "rbd map --exclusive" should be in interruptible */
52255234
down_read(&rbd_dev->lock_rwsem);
5226-
rbd_wait_state_locked(rbd_dev);
5235+
ret = rbd_wait_state_locked(rbd_dev, true);
52275236
up_read(&rbd_dev->lock_rwsem);
5228-
if (test_bit(RBD_DEV_FLAG_BLACKLISTED, &rbd_dev->flags)) {
5237+
if (ret) {
52295238
rbd_warn(rbd_dev, "failed to acquire exclusive lock");
52305239
return -EROFS;
52315240
}

0 commit comments

Comments
 (0)