diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2016-09-15 11:56:39 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-10-03 10:13:49 -0400 |
commit | 7c84883adf6dc614fc9e01304aa1813a55c43ad2 (patch) | |
tree | 182db0abb76f1588ba12b99e7c3ec320b50c9b47 | |
parent | 710214e391476f331abed1b774b5f025d054ab7f (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.c | 9 |
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 | ||
1952 | static void rbd_osd_req_format_read(struct rbd_obj_request *obj_request) | 1952 | static 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 | ||
1961 | static void rbd_osd_req_format_write(struct rbd_obj_request *obj_request) | 1960 | static 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); |