]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.14.14/rbd-reacquire-lock-should-update-lock-owner-client-id.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.14.14 / rbd-reacquire-lock-should-update-lock-owner-client-id.patch
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
5
6 From: Florian Margaine <florian@platform.sh>
7
8 commit edd8ca8015800b354453b891d38960f3a474b7e4 upstream.
9
10 Otherwise, future operations on this RBD using exclusive-lock are
11 going to require the lock from a non-existent client id.
12
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>
19
20 ---
21 drivers/block/rbd.c | 16 +++++++++++-----
22 1 file changed, 11 insertions(+), 5 deletions(-)
23
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);
28 }
29
30 +static void __rbd_lock(struct rbd_device *rbd_dev, const char *cookie)
31 +{
32 + struct rbd_client_id cid = rbd_get_cid(rbd_dev);
33 +
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);
37 +}
38 +
39 /*
40 * lock_rwsem must be held for write
41 */
42 static int rbd_lock(struct rbd_device *rbd_dev)
43 {
44 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
45 - struct rbd_client_id cid = rbd_get_cid(rbd_dev);
46 char cookie[32];
47 int ret;
48
49 @@ -3095,9 +3103,7 @@ static int rbd_lock(struct rbd_device *r
50 return ret;
51
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);
57 return 0;
58 }
59
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);
63 } else {
64 - strcpy(rbd_dev->lock_cookie, cookie);
65 + __rbd_lock(rbd_dev, cookie);
66 }
67 }
68