aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2016-09-15 11:56:39 -0400
committerIlya Dryomov <idryomov@gmail.com>2016-10-03 10:13:49 -0400
commit7c84883adf6dc614fc9e01304aa1813a55c43ad2 (patch)
tree182db0abb76f1588ba12b99e7c3ec320b50c9b47
parent710214e391476f331abed1b774b5f025d054ab7f (diff)
rbd: don't call rbd_osd_req_format_read() for !img_data requests
Accessing obj_request->img_request union field is only valid for object requests associated with an image (i.e. if obj_request_img_data_test() returns true). rbd_osd_req_format_read() used to do more, but now it just sets osd_req->snap_id. Standalone and stat object requests always go to the HEAD revision and are fine with CEPH_NOSNAP set by libceph, so get around the invalid union field use by simply not calling rbd_osd_req_format_read() in those places. Reported-by: David Disseldorp <ddiss@suse.de> Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Alex Elder <elder@linaro.org> Reviewed-by: David Disseldorp <ddiss@suse.de>
-rw-r--r--drivers/block/rbd.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 3218ac4f2e09..02e9a0f0bf7b 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1951,11 +1951,10 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req)
1951 1951
1952static void rbd_osd_req_format_read(struct rbd_obj_request *obj_request) 1952static void rbd_osd_req_format_read(struct rbd_obj_request *obj_request)
1953{ 1953{
1954 struct rbd_img_request *img_request = obj_request->img_request;
1955 struct ceph_osd_request *osd_req = obj_request->osd_req; 1954 struct ceph_osd_request *osd_req = obj_request->osd_req;
1956 1955
1957 if (img_request) 1956 rbd_assert(obj_request_img_data_test(obj_request));
1958 osd_req->r_snapid = img_request->snap_id; 1957 osd_req->r_snapid = obj_request->img_request->snap_id;
1959} 1958}
1960 1959
1961static void rbd_osd_req_format_write(struct rbd_obj_request *obj_request) 1960static void rbd_osd_req_format_write(struct rbd_obj_request *obj_request)
@@ -2937,8 +2936,6 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
2937 stat_request->page_count = page_count; 2936 stat_request->page_count = page_count;
2938 stat_request->callback = rbd_img_obj_exists_callback; 2937 stat_request->callback = rbd_img_obj_exists_callback;
2939 2938
2940 rbd_osd_req_format_read(stat_request);
2941
2942 rbd_obj_request_submit(stat_request); 2939 rbd_obj_request_submit(stat_request);
2943 return 0; 2940 return 0;
2944 2941
@@ -4034,7 +4031,6 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
4034 osd_req_op_cls_response_data_pages(obj_request->osd_req, 0, 4031 osd_req_op_cls_response_data_pages(obj_request->osd_req, 0,
4035 obj_request->pages, inbound_size, 4032 obj_request->pages, inbound_size,
4036 0, false, false); 4033 0, false, false);
4037 rbd_osd_req_format_read(obj_request);
4038 4034
4039 rbd_obj_request_submit(obj_request); 4035 rbd_obj_request_submit(obj_request);
4040 ret = rbd_obj_request_wait(obj_request); 4036 ret = rbd_obj_request_wait(obj_request);
@@ -4276,7 +4272,6 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
4276 obj_request->length, 4272 obj_request->length,
4277 obj_request->offset & ~PAGE_MASK, 4273 obj_request->offset & ~PAGE_MASK,
4278 false, false); 4274 false, false);
4279 rbd_osd_req_format_read(obj_request);
4280 4275
4281 rbd_obj_request_submit(obj_request); 4276 rbd_obj_request_submit(obj_request);
4282 ret = rbd_obj_request_wait(obj_request); 4277 ret = rbd_obj_request_wait(obj_request);