diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2017-04-13 06:17:39 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2017-05-04 03:19:24 -0400 |
commit | 3b77faa0495abd07e94119681be8cc66af5e0a3b (patch) | |
tree | 897acd98e7fe4e702e2be864c1c3434c8ad4a465 /drivers/block | |
parent | f9bebd580360c141b5fdbede9cc13a4caf23cd1a (diff) |
rbd: return ResponseMessage result from rbd_handle_request_lock()
Right now it's just 0, but "no automatic exclusive lock transfers" mode
code will need -EROFS.
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Jason Dillaman <dillaman@redhat.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/rbd.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index e3fafaf97dee..8babb1a59a0a 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -3572,12 +3572,16 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v, | |||
3572 | up_read(&rbd_dev->lock_rwsem); | 3572 | up_read(&rbd_dev->lock_rwsem); |
3573 | } | 3573 | } |
3574 | 3574 | ||
3575 | static bool rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, | 3575 | /* |
3576 | void **p) | 3576 | * Returns result for ResponseMessage to be encoded (<= 0), or 1 if no |
3577 | * ResponseMessage is needed. | ||
3578 | */ | ||
3579 | static int rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, | ||
3580 | void **p) | ||
3577 | { | 3581 | { |
3578 | struct rbd_client_id my_cid = rbd_get_cid(rbd_dev); | 3582 | struct rbd_client_id my_cid = rbd_get_cid(rbd_dev); |
3579 | struct rbd_client_id cid = { 0 }; | 3583 | struct rbd_client_id cid = { 0 }; |
3580 | bool need_to_send; | 3584 | int result = 1; |
3581 | 3585 | ||
3582 | if (struct_v >= 2) { | 3586 | if (struct_v >= 2) { |
3583 | cid.gid = ceph_decode_64(p); | 3587 | cid.gid = ceph_decode_64(p); |
@@ -3587,19 +3591,30 @@ static bool rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, | |||
3587 | dout("%s rbd_dev %p cid %llu-%llu\n", __func__, rbd_dev, cid.gid, | 3591 | dout("%s rbd_dev %p cid %llu-%llu\n", __func__, rbd_dev, cid.gid, |
3588 | cid.handle); | 3592 | cid.handle); |
3589 | if (rbd_cid_equal(&cid, &my_cid)) | 3593 | if (rbd_cid_equal(&cid, &my_cid)) |
3590 | return false; | 3594 | return result; |
3591 | 3595 | ||
3592 | down_read(&rbd_dev->lock_rwsem); | 3596 | down_read(&rbd_dev->lock_rwsem); |
3593 | need_to_send = __rbd_is_lock_owner(rbd_dev); | 3597 | if (__rbd_is_lock_owner(rbd_dev)) { |
3594 | if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED) { | 3598 | if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED && |
3595 | if (!rbd_cid_equal(&rbd_dev->owner_cid, &rbd_empty_cid)) { | 3599 | rbd_cid_equal(&rbd_dev->owner_cid, &rbd_empty_cid)) |
3600 | goto out_unlock; | ||
3601 | |||
3602 | /* | ||
3603 | * encode ResponseMessage(0) so the peer can detect | ||
3604 | * a missing owner | ||
3605 | */ | ||
3606 | result = 0; | ||
3607 | |||
3608 | if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED) { | ||
3596 | dout("%s rbd_dev %p queueing unlock_work\n", __func__, | 3609 | dout("%s rbd_dev %p queueing unlock_work\n", __func__, |
3597 | rbd_dev); | 3610 | rbd_dev); |
3598 | queue_work(rbd_dev->task_wq, &rbd_dev->unlock_work); | 3611 | queue_work(rbd_dev->task_wq, &rbd_dev->unlock_work); |
3599 | } | 3612 | } |
3600 | } | 3613 | } |
3614 | |||
3615 | out_unlock: | ||
3601 | up_read(&rbd_dev->lock_rwsem); | 3616 | up_read(&rbd_dev->lock_rwsem); |
3602 | return need_to_send; | 3617 | return result; |
3603 | } | 3618 | } |
3604 | 3619 | ||
3605 | static void __rbd_acknowledge_notify(struct rbd_device *rbd_dev, | 3620 | static void __rbd_acknowledge_notify(struct rbd_device *rbd_dev, |
@@ -3682,13 +3697,10 @@ static void rbd_watch_cb(void *arg, u64 notify_id, u64 cookie, | |||
3682 | rbd_acknowledge_notify(rbd_dev, notify_id, cookie); | 3697 | rbd_acknowledge_notify(rbd_dev, notify_id, cookie); |
3683 | break; | 3698 | break; |
3684 | case RBD_NOTIFY_OP_REQUEST_LOCK: | 3699 | case RBD_NOTIFY_OP_REQUEST_LOCK: |
3685 | if (rbd_handle_request_lock(rbd_dev, struct_v, &p)) | 3700 | ret = rbd_handle_request_lock(rbd_dev, struct_v, &p); |
3686 | /* | 3701 | if (ret <= 0) |
3687 | * send ResponseMessage(0) back so the client | ||
3688 | * can detect a missing owner | ||
3689 | */ | ||
3690 | rbd_acknowledge_notify_result(rbd_dev, notify_id, | 3702 | rbd_acknowledge_notify_result(rbd_dev, notify_id, |
3691 | cookie, 0); | 3703 | cookie, ret); |
3692 | else | 3704 | else |
3693 | rbd_acknowledge_notify(rbd_dev, notify_id, cookie); | 3705 | rbd_acknowledge_notify(rbd_dev, notify_id, cookie); |
3694 | break; | 3706 | break; |