@@ -321,9 +321,9 @@ enum img_req_flags {
};
enum rbd_img_state {
- RBD_IMG_START = 1,
+ RBD_IMG_DONE,
+ RBD_IMG_START,
RBD_IMG_EXCLUSIVE_LOCK,
- __RBD_IMG_OBJECT_REQUESTS,
RBD_IMG_OBJECT_REQUESTS,
};
@@ -3591,40 +3591,44 @@ static bool rbd_img_advance(struct rbd_img_request *img_req, int *result)
struct rbd_device *rbd_dev = img_req->rbd_dev;
int ret;
-again:
+ dout("%s: img %p state %d\n", __func__, img_req, img_req->state);
switch (img_req->state) {
case RBD_IMG_START:
rbd_assert(!*result);
+ img_req->state = RBD_IMG_EXCLUSIVE_LOCK;
ret = rbd_img_exclusive_lock(img_req);
if (ret < 0) {
*result = ret;
+ img_req->state = RBD_IMG_DONE;
return true;
}
- img_req->state = RBD_IMG_EXCLUSIVE_LOCK;
- if (ret > 0)
- goto again;
- return false;
+ if (ret == 0)
+ return false;
+ /* fall through */
case RBD_IMG_EXCLUSIVE_LOCK:
- if (*result)
+ if (*result) {
+ img_req->state = RBD_IMG_DONE;
return true;
+ }
rbd_assert(!need_exclusive_lock(img_req) ||
__rbd_is_lock_owner(rbd_dev));
+ img_req->state = RBD_IMG_OBJECT_REQUESTS;
rbd_img_object_requests(img_req);
if (!img_req->pending.num_pending) {
*result = img_req->pending.result;
- img_req->state = RBD_IMG_OBJECT_REQUESTS;
- goto again;
+ img_req->state = RBD_IMG_DONE;
+ return true;
}
- img_req->state = __RBD_IMG_OBJECT_REQUESTS;
return false;
- case __RBD_IMG_OBJECT_REQUESTS:
+ case RBD_IMG_OBJECT_REQUESTS:
if (!pending_result_dec(&img_req->pending, result))
return false;
+ img_req->state = RBD_IMG_DONE;
/* fall through */
- case RBD_IMG_OBJECT_REQUESTS:
+ case RBD_IMG_DONE:
return true;
default:
BUG();
Reorder switch statement to avoid the use of a label/goto and add an RBD_IMG_DONE state to signal that the state machine has completed. Signed-off-by: Hannes Reinecke <hare@suse.de> --- drivers/block/rbd.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)