diff options
-rw-r--r-- | drivers/block/rbd.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 81751cd8361..211baa7f4f0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -1094,40 +1094,39 @@ out_err: * each flag, once its value is set to 1 it is never reset to 0 * again. */ -static void obj_request_done_set(struct rbd_obj_request *obj_request) +static void obj_request_img_data_set(struct rbd_obj_request *obj_request) { - if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { - struct rbd_img_request *img_request = obj_request->img_request; + if (test_and_set_bit(OBJ_REQ_IMG_DATA, &obj_request->flags)) { struct rbd_device *rbd_dev; - rbd_dev = img_request ? img_request->rbd_dev : NULL; - rbd_warn(rbd_dev, "obj_request %p already marked done\n", + rbd_dev = obj_request->img_request->rbd_dev; + rbd_warn(rbd_dev, "obj_request %p already marked img_data\n", obj_request); } } -static bool obj_request_done_test(struct rbd_obj_request *obj_request) +static bool obj_request_img_data_test(struct rbd_obj_request *obj_request) { smp_mb(); - return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; + return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0; } -static void obj_request_img_data_set(struct rbd_obj_request *obj_request) +static void obj_request_done_set(struct rbd_obj_request *obj_request) { - if (test_and_set_bit(OBJ_REQ_IMG_DATA, &obj_request->flags)) { - struct rbd_img_request *img_request = obj_request->img_request; - struct rbd_device *rbd_dev; + if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { + struct rbd_device *rbd_dev = NULL; - rbd_dev = img_request ? img_request->rbd_dev : NULL; - rbd_warn(rbd_dev, "obj_request %p already marked img_data\n", + if (obj_request_img_data_test(obj_request)) + rbd_dev = obj_request->img_request->rbd_dev; + rbd_warn(rbd_dev, "obj_request %p already marked done\n", obj_request); } } -static bool obj_request_img_data_test(struct rbd_obj_request *obj_request) +static bool obj_request_done_test(struct rbd_obj_request *obj_request) { smp_mb(); - return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0; + return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; } static void rbd_obj_request_get(struct rbd_obj_request *obj_request) @@ -1338,8 +1337,16 @@ static void rbd_osd_trivial_callback(struct rbd_obj_request *obj_request) static void rbd_osd_read_callback(struct rbd_obj_request *obj_request) { - struct rbd_img_request *img_request = obj_request->img_request; - bool layered = img_request && img_request_layered_test(img_request); + struct rbd_img_request *img_request = NULL; + bool layered = false; + + if (obj_request_img_data_test(obj_request)) { + img_request = obj_request->img_request; + layered = img_request && img_request_layered_test(img_request); + } else { + img_request = NULL; + layered = false; + } dout("%s: obj %p img %p result %d %llu/%llu\n", __func__, obj_request, img_request, obj_request->result, @@ -1382,10 +1389,12 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req, dout("%s: osd_req %p msg %p\n", __func__, osd_req, msg); rbd_assert(osd_req == obj_request->osd_req); - rbd_assert(obj_request_img_data_test(obj_request) ^ - !obj_request->img_request); - rbd_assert(obj_request_img_data_test(obj_request) ^ - (obj_request->which == BAD_WHICH)); + if (obj_request_img_data_test(obj_request)) { + rbd_assert(obj_request->img_request); + rbd_assert(obj_request->which != BAD_WHICH); + } else { + rbd_assert(obj_request->which == BAD_WHICH); + } if (osd_req->r_result < 0) obj_request->result = osd_req->r_result; |