diff options
| -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 | } |
