aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2017-04-13 06:17:38 -0400
committerIlya Dryomov <idryomov@gmail.com>2017-05-04 03:19:23 -0400
commitcbbfb0ff115159847121afe9c7553bd5c86f6062 (patch)
tree77a36c3a69ab97acb59f7a3b95f308612af3c198
parentbbead745d96cfd51aaa332bdeab300862c7a8061 (diff)
rbd: store lock cookie
In preparation for supporting set_cookie method (or rather set_cookie fallback for older OSDs), store the lock cookie on lock and use it on unlock instead of recalculating from rbd_dev->watch_cookie. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Jason Dillaman <dillaman@redhat.com>
-rw-r--r--drivers/block/rbd.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 423de775aabb..5f563db59820 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -387,6 +387,7 @@ struct rbd_device {
387 387
388 struct rw_semaphore lock_rwsem; 388 struct rw_semaphore lock_rwsem;
389 enum rbd_lock_state lock_state; 389 enum rbd_lock_state lock_state;
390 char lock_cookie[32];
390 struct rbd_client_id owner_cid; 391 struct rbd_client_id owner_cid;
391 struct work_struct acquired_lock_work; 392 struct work_struct acquired_lock_work;
392 struct work_struct released_lock_work; 393 struct work_struct released_lock_work;
@@ -3079,7 +3080,8 @@ static int rbd_lock(struct rbd_device *rbd_dev)
3079 char cookie[32]; 3080 char cookie[32];
3080 int ret; 3081 int ret;
3081 3082
3082 WARN_ON(__rbd_is_lock_owner(rbd_dev)); 3083 WARN_ON(__rbd_is_lock_owner(rbd_dev) ||
3084 rbd_dev->lock_cookie[0] != '\0');
3083 3085
3084 format_lock_cookie(rbd_dev, cookie); 3086 format_lock_cookie(rbd_dev, cookie);
3085 ret = ceph_cls_lock(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc, 3087 ret = ceph_cls_lock(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc,
@@ -3089,6 +3091,7 @@ static int rbd_lock(struct rbd_device *rbd_dev)
3089 return ret; 3091 return ret;
3090 3092
3091 rbd_dev->lock_state = RBD_LOCK_STATE_LOCKED; 3093 rbd_dev->lock_state = RBD_LOCK_STATE_LOCKED;
3094 strcpy(rbd_dev->lock_cookie, cookie);
3092 rbd_set_owner_cid(rbd_dev, &cid); 3095 rbd_set_owner_cid(rbd_dev, &cid);
3093 queue_work(rbd_dev->task_wq, &rbd_dev->acquired_lock_work); 3096 queue_work(rbd_dev->task_wq, &rbd_dev->acquired_lock_work);
3094 return 0; 3097 return 0;
@@ -3100,19 +3103,19 @@ static int rbd_lock(struct rbd_device *rbd_dev)
3100static void rbd_unlock(struct rbd_device *rbd_dev) 3103static void rbd_unlock(struct rbd_device *rbd_dev)
3101{ 3104{
3102 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; 3105 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
3103 char cookie[32];
3104 int ret; 3106 int ret;
3105 3107
3106 WARN_ON(!__rbd_is_lock_owner(rbd_dev)); 3108 WARN_ON(!__rbd_is_lock_owner(rbd_dev) ||
3109 rbd_dev->lock_cookie[0] == '\0');
3107 3110
3108 format_lock_cookie(rbd_dev, cookie);
3109 ret = ceph_cls_unlock(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc, 3111 ret = ceph_cls_unlock(osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc,
3110 RBD_LOCK_NAME, cookie); 3112 RBD_LOCK_NAME, rbd_dev->lock_cookie);
3111 if (ret && ret != -ENOENT) 3113 if (ret && ret != -ENOENT)
3112 rbd_warn(rbd_dev, "failed to unlock: %d", ret); 3114 rbd_warn(rbd_dev, "failed to unlock: %d", ret);
3113 3115
3114 /* treat errors as the image is unlocked */ 3116 /* treat errors as the image is unlocked */
3115 rbd_dev->lock_state = RBD_LOCK_STATE_UNLOCKED; 3117 rbd_dev->lock_state = RBD_LOCK_STATE_UNLOCKED;
3118 rbd_dev->lock_cookie[0] = '\0';
3116 rbd_set_owner_cid(rbd_dev, &rbd_empty_cid); 3119 rbd_set_owner_cid(rbd_dev, &rbd_empty_cid);
3117 queue_work(rbd_dev->task_wq, &rbd_dev->released_lock_work); 3120 queue_work(rbd_dev->task_wq, &rbd_dev->released_lock_work);
3118} 3121}