1 From edd8ca8015800b354453b891d38960f3a474b7e4 Mon Sep 17 00:00:00 2001
2 From: Florian Margaine <florian@platform.sh>
3 Date: Wed, 13 Dec 2017 16:43:59 +0100
4 Subject: rbd: reacquire lock should update lock owner client id
6 From: Florian Margaine <florian@platform.sh>
8 commit edd8ca8015800b354453b891d38960f3a474b7e4 upstream.
10 Otherwise, future operations on this RBD using exclusive-lock are
11 going to require the lock from a non-existent client id.
13 Fixes: 14bb211d324d ("rbd: support updating the lock cookie without releasing the lock")
14 Link: http://tracker.ceph.com/issues/19929
15 Signed-off-by: Florian Margaine <florian@platform.sh>
16 [idryomov@gmail.com: rbd_set_owner_cid() call, __rbd_lock() helper]
17 Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
18 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
21 drivers/block/rbd.c | 16 +++++++++++-----
22 1 file changed, 11 insertions(+), 5 deletions(-)
24 --- a/drivers/block/rbd.c
25 +++ b/drivers/block/rbd.c
26 @@ -3074,13 +3074,21 @@ static void format_lock_cookie(struct rb
27 mutex_unlock(&rbd_dev->watch_mutex);
30 +static void __rbd_lock(struct rbd_device *rbd_dev, const char *cookie)
32 + struct rbd_client_id cid = rbd_get_cid(rbd_dev);
34 + strcpy(rbd_dev->lock_cookie, cookie);
35 + rbd_set_owner_cid(rbd_dev, &cid);
36 + queue_work(rbd_dev->task_wq, &rbd_dev->acquired_lock_work);
40 * lock_rwsem must be held for write
42 static int rbd_lock(struct rbd_device *rbd_dev)
44 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
45 - struct rbd_client_id cid = rbd_get_cid(rbd_dev);
49 @@ -3095,9 +3103,7 @@ static int rbd_lock(struct rbd_device *r
52 rbd_dev->lock_state = RBD_LOCK_STATE_LOCKED;
53 - strcpy(rbd_dev->lock_cookie, cookie);
54 - rbd_set_owner_cid(rbd_dev, &cid);
55 - queue_work(rbd_dev->task_wq, &rbd_dev->acquired_lock_work);
56 + __rbd_lock(rbd_dev, cookie);
60 @@ -3883,7 +3889,7 @@ static void rbd_reacquire_lock(struct rb
61 queue_delayed_work(rbd_dev->task_wq,
62 &rbd_dev->lock_dwork, 0);
64 - strcpy(rbd_dev->lock_cookie, cookie);
65 + __rbd_lock(rbd_dev, cookie);