diff options
author | Florian Margaine <florian@platform.sh> | 2017-12-13 10:43:59 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2018-01-09 11:40:21 -0500 |
commit | edd8ca8015800b354453b891d38960f3a474b7e4 (patch) | |
tree | 708eaf41ea5402e684dcf5f69f1b4030253e2e23 /drivers/block/rbd.c | |
parent | b2cd1df66037e7c4697c7e40496bf7e4a5e16a2d (diff) |
rbd: reacquire lock should update lock owner client id
Otherwise, future operations on this RBD using exclusive-lock are
going to require the lock from a non-existent client id.
Cc: stable@vger.kernel.org
Fixes: 14bb211d324d ("rbd: support updating the lock cookie without releasing the lock")
Link: http://tracker.ceph.com/issues/19929
Signed-off-by: Florian Margaine <florian@platform.sh>
[idryomov@gmail.com: rbd_set_owner_cid() call, __rbd_lock() helper]
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 38fc5f397fde..aacae6f7163e 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -3047,13 +3047,21 @@ static void format_lock_cookie(struct rbd_device *rbd_dev, char *buf) | |||
3047 | mutex_unlock(&rbd_dev->watch_mutex); | 3047 | mutex_unlock(&rbd_dev->watch_mutex); |
3048 | } | 3048 | } |
3049 | 3049 | ||
3050 | static void __rbd_lock(struct rbd_device *rbd_dev, const char *cookie) | ||
3051 | { | ||
3052 | struct rbd_client_id cid = rbd_get_cid(rbd_dev); | ||
3053 | |||
3054 | strcpy(rbd_dev->lock_cookie, cookie); | ||
3055 | rbd_set_owner_cid(rbd_dev, &cid); | ||
3056 | queue_work(rbd_dev->task_wq, &rbd_dev->acquired_lock_work); | ||
3057 | } | ||
3058 | |||
3050 | /* | 3059 | /* |
3051 | * lock_rwsem must be held for write | 3060 | * lock_rwsem must be held for write |
3052 | */ | 3061 | */ |
3053 | static int rbd_lock(struct rbd_device *rbd_dev) | 3062 | static int rbd_lock(struct rbd_device *rbd_dev) |
3054 | { | 3063 | { |
3055 | struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; | 3064 | struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; |
3056 | struct rbd_client_id cid = rbd_get_cid(rbd_dev); | ||
3057 | char cookie[32]; | 3065 | char cookie[32]; |
3058 | int ret; | 3066 | int ret; |
3059 | 3067 | ||
@@ -3068,9 +3076,7 @@ static int rbd_lock(struct rbd_device *rbd_dev) | |||
3068 | return ret; | 3076 | return ret; |
3069 | 3077 | ||
3070 | rbd_dev->lock_state = RBD_LOCK_STATE_LOCKED; | 3078 | rbd_dev->lock_state = RBD_LOCK_STATE_LOCKED; |
3071 | strcpy(rbd_dev->lock_cookie, cookie); | 3079 | __rbd_lock(rbd_dev, cookie); |
3072 | rbd_set_owner_cid(rbd_dev, &cid); | ||
3073 | queue_work(rbd_dev->task_wq, &rbd_dev->acquired_lock_work); | ||
3074 | return 0; | 3080 | return 0; |
3075 | } | 3081 | } |
3076 | 3082 | ||
@@ -3856,7 +3862,7 @@ static void rbd_reacquire_lock(struct rbd_device *rbd_dev) | |||
3856 | queue_delayed_work(rbd_dev->task_wq, | 3862 | queue_delayed_work(rbd_dev->task_wq, |
3857 | &rbd_dev->lock_dwork, 0); | 3863 | &rbd_dev->lock_dwork, 0); |
3858 | } else { | 3864 | } else { |
3859 | strcpy(rbd_dev->lock_cookie, cookie); | 3865 | __rbd_lock(rbd_dev, cookie); |
3860 | } | 3866 | } |
3861 | } | 3867 | } |
3862 | 3868 | ||