diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 81751cd8361e..211baa7f4f0b 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -1094,31 +1094,12 @@ static struct bio *bio_chain_clone_range(struct bio **bio_src, * 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) -{ - if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { - struct rbd_img_request *img_request = obj_request->img_request; - 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", - obj_request); - } -} - -static bool obj_request_done_test(struct rbd_obj_request *obj_request) -{ - smp_mb(); - return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; -} - static void obj_request_img_data_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; - rbd_dev = img_request ? img_request->rbd_dev : NULL; + rbd_dev = obj_request->img_request->rbd_dev; rbd_warn(rbd_dev, "obj_request %p already marked img_data\n", obj_request); } @@ -1130,6 +1111,24 @@ static bool obj_request_img_data_test(struct rbd_obj_request *obj_request) return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0; } +static void obj_request_done_set(struct rbd_obj_request *obj_request) +{ + if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { + struct rbd_device *rbd_dev = NULL; + + 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_done_test(struct rbd_obj_request *obj_request) +{ + smp_mb(); + return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; +} + static void rbd_obj_request_get(struct rbd_obj_request *obj_request) { dout("%s: obj %p (was %d)\n", __func__, 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;