diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2017-04-13 06:17:38 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2017-05-04 03:19:23 -0400 |
commit | cbbfb0ff115159847121afe9c7553bd5c86f6062 (patch) | |
tree | 77a36c3a69ab97acb59f7a3b95f308612af3c198 | |
parent | bbead745d96cfd51aaa332bdeab300862c7a8061 (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.c | 13 |
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) | |||
3100 | static void rbd_unlock(struct rbd_device *rbd_dev) | 3103 | static 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 | } |