summaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2017-04-13 06:17:39 -0400
committerIlya Dryomov <idryomov@gmail.com>2017-05-04 03:19:24 -0400
commit3b77faa0495abd07e94119681be8cc66af5e0a3b (patch)
tree897acd98e7fe4e702e2be864c1c3434c8ad4a465 /drivers/block
parentf9bebd580360c141b5fdbede9cc13a4caf23cd1a (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.c40
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
3575static 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 */
3579static 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
3615out_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
3605static void __rbd_acknowledge_notify(struct rbd_device *rbd_dev, 3620static 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;