aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-02-11 13:33:24 -0500
committerSage Weil <sage@inktank.com>2013-05-02 00:19:02 -0400
commit57acbaa7fb00b6e1a74d29aaaaf273ed8cb4dabc (patch)
treed61d9a3626e8ae1b49739358f068108d4daf6877 /drivers/block/rbd.c
parentb155e86cf619886388d80ec298b0f13694c83595 (diff)
rbd: always check IMG_DATA flag
In a few spots, whether the an object request's img_request pointer is null is used to determine whether an object request is being done as part of an image data request. Stop doing that, and instead always use the object request IMG_DATA flag for that purpose. Swap the order of the definition of the IMG_DATA and DONE flag helpers, because obj_request_done_set() now refers to obj_request_img_data_set() to get its rbd_dev value. This will become important because the img_request pointer is about to become part of a union. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c51
1 files changed, 30 insertions, 21 deletions
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,40 +1094,39 @@ out_err:
1094 * each flag, once its value is set to 1 it is never reset to 0 1094 * each flag, once its value is set to 1 it is never reset to 0
1095 * again. 1095 * again.
1096 */ 1096 */
1097static void obj_request_done_set(struct rbd_obj_request *obj_request) 1097static void obj_request_img_data_set(struct rbd_obj_request *obj_request)
1098{ 1098{
1099 if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { 1099 if (test_and_set_bit(OBJ_REQ_IMG_DATA, &obj_request->flags)) {
1100 struct rbd_img_request *img_request = obj_request->img_request;
1101 struct rbd_device *rbd_dev; 1100 struct rbd_device *rbd_dev;
1102 1101
1103 rbd_dev = img_request ? img_request->rbd_dev : NULL; 1102 rbd_dev = obj_request->img_request->rbd_dev;
1104 rbd_warn(rbd_dev, "obj_request %p already marked done\n", 1103 rbd_warn(rbd_dev, "obj_request %p already marked img_data\n",
1105 obj_request); 1104 obj_request);
1106 } 1105 }
1107} 1106}
1108 1107
1109static bool obj_request_done_test(struct rbd_obj_request *obj_request) 1108static bool obj_request_img_data_test(struct rbd_obj_request *obj_request)
1110{ 1109{
1111 smp_mb(); 1110 smp_mb();
1112 return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; 1111 return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0;
1113} 1112}
1114 1113
1115static void obj_request_img_data_set(struct rbd_obj_request *obj_request) 1114static void obj_request_done_set(struct rbd_obj_request *obj_request)
1116{ 1115{
1117 if (test_and_set_bit(OBJ_REQ_IMG_DATA, &obj_request->flags)) { 1116 if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) {
1118 struct rbd_img_request *img_request = obj_request->img_request; 1117 struct rbd_device *rbd_dev = NULL;
1119 struct rbd_device *rbd_dev;
1120 1118
1121 rbd_dev = img_request ? img_request->rbd_dev : NULL; 1119 if (obj_request_img_data_test(obj_request))
1122 rbd_warn(rbd_dev, "obj_request %p already marked img_data\n", 1120 rbd_dev = obj_request->img_request->rbd_dev;
1121 rbd_warn(rbd_dev, "obj_request %p already marked done\n",
1123 obj_request); 1122 obj_request);
1124 } 1123 }
1125} 1124}
1126 1125
1127static bool obj_request_img_data_test(struct rbd_obj_request *obj_request) 1126static bool obj_request_done_test(struct rbd_obj_request *obj_request)
1128{ 1127{
1129 smp_mb(); 1128 smp_mb();
1130 return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0; 1129 return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0;
1131} 1130}
1132 1131
1133static void rbd_obj_request_get(struct rbd_obj_request *obj_request) 1132static 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)
1338 1337
1339static void rbd_osd_read_callback(struct rbd_obj_request *obj_request) 1338static void rbd_osd_read_callback(struct rbd_obj_request *obj_request)
1340{ 1339{
1341 struct rbd_img_request *img_request = obj_request->img_request; 1340 struct rbd_img_request *img_request = NULL;
1342 bool layered = img_request && img_request_layered_test(img_request); 1341 bool layered = false;
1342
1343 if (obj_request_img_data_test(obj_request)) {
1344 img_request = obj_request->img_request;
1345 layered = img_request && img_request_layered_test(img_request);
1346 } else {
1347 img_request = NULL;
1348 layered = false;
1349 }
1343 1350
1344 dout("%s: obj %p img %p result %d %llu/%llu\n", __func__, 1351 dout("%s: obj %p img %p result %d %llu/%llu\n", __func__,
1345 obj_request, img_request, obj_request->result, 1352 obj_request, img_request, obj_request->result,
@@ -1382,10 +1389,12 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req,
1382 1389
1383 dout("%s: osd_req %p msg %p\n", __func__, osd_req, msg); 1390 dout("%s: osd_req %p msg %p\n", __func__, osd_req, msg);
1384 rbd_assert(osd_req == obj_request->osd_req); 1391 rbd_assert(osd_req == obj_request->osd_req);
1385 rbd_assert(obj_request_img_data_test(obj_request) ^ 1392 if (obj_request_img_data_test(obj_request)) {
1386 !obj_request->img_request); 1393 rbd_assert(obj_request->img_request);
1387 rbd_assert(obj_request_img_data_test(obj_request) ^ 1394 rbd_assert(obj_request->which != BAD_WHICH);
1388 (obj_request->which == BAD_WHICH)); 1395 } else {
1396 rbd_assert(obj_request->which == BAD_WHICH);
1397 }
1389 1398
1390 if (osd_req->r_result < 0) 1399 if (osd_req->r_result < 0)
1391 obj_request->result = osd_req->r_result; 1400 obj_request->result = osd_req->r_result;