Loading drivers/block/rbd.c +26 −14 Original line number Diff line number Diff line Loading @@ -3572,12 +3572,16 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v, up_read(&rbd_dev->lock_rwsem); } static bool rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, /* * Returns result for ResponseMessage to be encoded (<= 0), or 1 if no * ResponseMessage is needed. */ static int rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, void **p) { struct rbd_client_id my_cid = rbd_get_cid(rbd_dev); struct rbd_client_id cid = { 0 }; bool need_to_send; int result = 1; if (struct_v >= 2) { cid.gid = ceph_decode_64(p); Loading @@ -3587,19 +3591,30 @@ static bool rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, dout("%s rbd_dev %p cid %llu-%llu\n", __func__, rbd_dev, cid.gid, cid.handle); if (rbd_cid_equal(&cid, &my_cid)) return false; return result; down_read(&rbd_dev->lock_rwsem); need_to_send = __rbd_is_lock_owner(rbd_dev); if (__rbd_is_lock_owner(rbd_dev)) { if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED && rbd_cid_equal(&rbd_dev->owner_cid, &rbd_empty_cid)) goto out_unlock; /* * encode ResponseMessage(0) so the peer can detect * a missing owner */ result = 0; if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED) { if (!rbd_cid_equal(&rbd_dev->owner_cid, &rbd_empty_cid)) { dout("%s rbd_dev %p queueing unlock_work\n", __func__, rbd_dev); queue_work(rbd_dev->task_wq, &rbd_dev->unlock_work); } } out_unlock: up_read(&rbd_dev->lock_rwsem); return need_to_send; return result; } static void __rbd_acknowledge_notify(struct rbd_device *rbd_dev, Loading Loading @@ -3682,13 +3697,10 @@ static void rbd_watch_cb(void *arg, u64 notify_id, u64 cookie, rbd_acknowledge_notify(rbd_dev, notify_id, cookie); break; case RBD_NOTIFY_OP_REQUEST_LOCK: if (rbd_handle_request_lock(rbd_dev, struct_v, &p)) /* * send ResponseMessage(0) back so the client * can detect a missing owner */ ret = rbd_handle_request_lock(rbd_dev, struct_v, &p); if (ret <= 0) rbd_acknowledge_notify_result(rbd_dev, notify_id, cookie, 0); cookie, ret); else rbd_acknowledge_notify(rbd_dev, notify_id, cookie); break; Loading Loading
drivers/block/rbd.c +26 −14 Original line number Diff line number Diff line Loading @@ -3572,12 +3572,16 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v, up_read(&rbd_dev->lock_rwsem); } static bool rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, /* * Returns result for ResponseMessage to be encoded (<= 0), or 1 if no * ResponseMessage is needed. */ static int rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, void **p) { struct rbd_client_id my_cid = rbd_get_cid(rbd_dev); struct rbd_client_id cid = { 0 }; bool need_to_send; int result = 1; if (struct_v >= 2) { cid.gid = ceph_decode_64(p); Loading @@ -3587,19 +3591,30 @@ static bool rbd_handle_request_lock(struct rbd_device *rbd_dev, u8 struct_v, dout("%s rbd_dev %p cid %llu-%llu\n", __func__, rbd_dev, cid.gid, cid.handle); if (rbd_cid_equal(&cid, &my_cid)) return false; return result; down_read(&rbd_dev->lock_rwsem); need_to_send = __rbd_is_lock_owner(rbd_dev); if (__rbd_is_lock_owner(rbd_dev)) { if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED && rbd_cid_equal(&rbd_dev->owner_cid, &rbd_empty_cid)) goto out_unlock; /* * encode ResponseMessage(0) so the peer can detect * a missing owner */ result = 0; if (rbd_dev->lock_state == RBD_LOCK_STATE_LOCKED) { if (!rbd_cid_equal(&rbd_dev->owner_cid, &rbd_empty_cid)) { dout("%s rbd_dev %p queueing unlock_work\n", __func__, rbd_dev); queue_work(rbd_dev->task_wq, &rbd_dev->unlock_work); } } out_unlock: up_read(&rbd_dev->lock_rwsem); return need_to_send; return result; } static void __rbd_acknowledge_notify(struct rbd_device *rbd_dev, Loading Loading @@ -3682,13 +3697,10 @@ static void rbd_watch_cb(void *arg, u64 notify_id, u64 cookie, rbd_acknowledge_notify(rbd_dev, notify_id, cookie); break; case RBD_NOTIFY_OP_REQUEST_LOCK: if (rbd_handle_request_lock(rbd_dev, struct_v, &p)) /* * send ResponseMessage(0) back so the client * can detect a missing owner */ ret = rbd_handle_request_lock(rbd_dev, struct_v, &p); if (ret <= 0) rbd_acknowledge_notify_result(rbd_dev, notify_id, cookie, 0); cookie, ret); else rbd_acknowledge_notify(rbd_dev, notify_id, cookie); break; Loading