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:18:46 -0400
commit6365d33a275b392d3b224808490cd6172123969e (patch)
tree19fe01e087f49f1f146fc53ac320271e75ed6d7e /drivers/block/rbd.c
parent926f9b3f085cec8be0cbf4dcc66c28b5ac49cc14 (diff)
rbd: add an object request flag for image data objects
Add a flag to distinguish between object requests being done on standalone objects and requests being sent for objects representing rbd image data (i.e., object requests that are the result of image request). 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.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index f7046e976bb0..3f162e216194 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -172,6 +172,7 @@ enum obj_request_type {
172 172
173enum obj_req_flags { 173enum obj_req_flags {
174 OBJ_REQ_DONE, /* completion flag: not done = 0, done = 1 */ 174 OBJ_REQ_DONE, /* completion flag: not done = 0, done = 1 */
175 OBJ_REQ_IMG_DATA, /* object usage: standalone = 0, image = 1 */
175}; 176};
176 177
177struct rbd_obj_request { 178struct rbd_obj_request {
@@ -1099,6 +1100,24 @@ static bool obj_request_done_test(struct rbd_obj_request *obj_request)
1099 return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; 1100 return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0;
1100} 1101}
1101 1102
1103static void obj_request_img_data_set(struct rbd_obj_request *obj_request)
1104{
1105 if (test_and_set_bit(OBJ_REQ_IMG_DATA, &obj_request->flags)) {
1106 struct rbd_img_request *img_request = obj_request->img_request;
1107 struct rbd_device *rbd_dev;
1108
1109 rbd_dev = img_request ? img_request->rbd_dev : NULL;
1110 rbd_warn(rbd_dev, "obj_request %p already marked img_data\n",
1111 obj_request);
1112 }
1113}
1114
1115static bool obj_request_img_data_test(struct rbd_obj_request *obj_request)
1116{
1117 smp_mb();
1118 return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0;
1119}
1120
1102static void rbd_obj_request_get(struct rbd_obj_request *obj_request) 1121static void rbd_obj_request_get(struct rbd_obj_request *obj_request)
1103{ 1122{
1104 dout("%s: obj %p (was %d)\n", __func__, obj_request, 1123 dout("%s: obj %p (was %d)\n", __func__, obj_request,
@@ -1139,6 +1158,8 @@ static inline void rbd_img_obj_request_add(struct rbd_img_request *img_request,
1139 rbd_obj_request_get(obj_request); 1158 rbd_obj_request_get(obj_request);
1140 obj_request->img_request = img_request; 1159 obj_request->img_request = img_request;
1141 obj_request->which = img_request->obj_request_count; 1160 obj_request->which = img_request->obj_request_count;
1161 rbd_assert(!obj_request_img_data_test(obj_request));
1162 obj_request_img_data_set(obj_request);
1142 rbd_assert(obj_request->which != BAD_WHICH); 1163 rbd_assert(obj_request->which != BAD_WHICH);
1143 img_request->obj_request_count++; 1164 img_request->obj_request_count++;
1144 list_add_tail(&obj_request->links, &img_request->obj_requests); 1165 list_add_tail(&obj_request->links, &img_request->obj_requests);
@@ -1158,6 +1179,7 @@ static inline void rbd_img_obj_request_del(struct rbd_img_request *img_request,
1158 img_request->obj_request_count--; 1179 img_request->obj_request_count--;
1159 rbd_assert(obj_request->which == img_request->obj_request_count); 1180 rbd_assert(obj_request->which == img_request->obj_request_count);
1160 obj_request->which = BAD_WHICH; 1181 obj_request->which = BAD_WHICH;
1182 rbd_assert(obj_request_img_data_test(obj_request));
1161 rbd_assert(obj_request->img_request == img_request); 1183 rbd_assert(obj_request->img_request == img_request);
1162 obj_request->img_request = NULL; 1184 obj_request->img_request = NULL;
1163 obj_request->callback = NULL; 1185 obj_request->callback = NULL;
@@ -1343,7 +1365,9 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req,
1343 1365
1344 dout("%s: osd_req %p msg %p\n", __func__, osd_req, msg); 1366 dout("%s: osd_req %p msg %p\n", __func__, osd_req, msg);
1345 rbd_assert(osd_req == obj_request->osd_req); 1367 rbd_assert(osd_req == obj_request->osd_req);
1346 rbd_assert(!!obj_request->img_request ^ 1368 rbd_assert(obj_request_img_data_test(obj_request) ^
1369 !obj_request->img_request);
1370 rbd_assert(obj_request_img_data_test(obj_request) ^
1347 (obj_request->which == BAD_WHICH)); 1371 (obj_request->which == BAD_WHICH));
1348 1372
1349 if (osd_req->r_result < 0) 1373 if (osd_req->r_result < 0)
@@ -1413,12 +1437,13 @@ static struct ceph_osd_request *rbd_osd_req_create(
1413 bool write_request, 1437 bool write_request,
1414 struct rbd_obj_request *obj_request) 1438 struct rbd_obj_request *obj_request)
1415{ 1439{
1416 struct rbd_img_request *img_request = obj_request->img_request;
1417 struct ceph_snap_context *snapc = NULL; 1440 struct ceph_snap_context *snapc = NULL;
1418 struct ceph_osd_client *osdc; 1441 struct ceph_osd_client *osdc;
1419 struct ceph_osd_request *osd_req; 1442 struct ceph_osd_request *osd_req;
1420 1443
1421 if (img_request) { 1444 if (obj_request_img_data_test(obj_request)) {
1445 struct rbd_img_request *img_request = obj_request->img_request;
1446
1422 rbd_assert(write_request == 1447 rbd_assert(write_request ==
1423 img_request_write_test(img_request)); 1448 img_request_write_test(img_request));
1424 if (write_request) 1449 if (write_request)
@@ -1605,10 +1630,13 @@ static void rbd_img_request_destroy(struct kref *kref)
1605 1630
1606static bool rbd_img_obj_end_request(struct rbd_obj_request *obj_request) 1631static bool rbd_img_obj_end_request(struct rbd_obj_request *obj_request)
1607{ 1632{
1608 struct rbd_img_request *img_request = obj_request->img_request; 1633 struct rbd_img_request *img_request;
1609 unsigned int xferred; 1634 unsigned int xferred;
1610 int result; 1635 int result;
1611 1636
1637 rbd_assert(obj_request_img_data_test(obj_request));
1638 img_request = obj_request->img_request;
1639
1612 rbd_assert(!img_request_child_test(img_request)); 1640 rbd_assert(!img_request_child_test(img_request));
1613 rbd_assert(img_request->rq != NULL); 1641 rbd_assert(img_request->rq != NULL);
1614 1642
@@ -1637,6 +1665,7 @@ static void rbd_img_obj_callback(struct rbd_obj_request *obj_request)
1637 u32 which = obj_request->which; 1665 u32 which = obj_request->which;
1638 bool more = true; 1666 bool more = true;
1639 1667
1668 rbd_assert(obj_request_img_data_test(obj_request));
1640 img_request = obj_request->img_request; 1669 img_request = obj_request->img_request;
1641 1670
1642 dout("%s: img %p obj %p\n", __func__, img_request, obj_request); 1671 dout("%s: img %p obj %p\n", __func__, img_request, obj_request);