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@xxxxxxx> --- drivers/block/rbd.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 792180548e89..c80942e08164 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -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(); -- 2.16.4