aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2016-09-16 09:20:42 -0400
committerIlya Dryomov <idryomov@gmail.com>2016-10-03 10:13:48 -0400
commitfa355112c2763d513f1356119684dc8a6150d08a (patch)
tree79c17910121d385b7ed4654fc3753b66eb2ce215
parent4a17dadcae55ca1f5c1ed826d42185e22653c256 (diff)
rbd: don't crash or leak on errors in rbd_img_obj_parent_read_full_callback()
- fix parent_length == img_request->xferred assert to not fire on copyup read failures - don't leak pages if copyup read fails or we can't allocate a new osd request 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.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 6db12d9a4291..77675ac8fc4c 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2674,7 +2674,7 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
2674 rbd_assert(obj_request_type_valid(orig_request->type)); 2674 rbd_assert(obj_request_type_valid(orig_request->type));
2675 img_result = img_request->result; 2675 img_result = img_request->result;
2676 parent_length = img_request->length; 2676 parent_length = img_request->length;
2677 rbd_assert(parent_length == img_request->xferred); 2677 rbd_assert(img_result || parent_length == img_request->xferred);
2678 rbd_img_request_put(img_request); 2678 rbd_img_request_put(img_request);
2679 2679
2680 rbd_assert(orig_request->img_request); 2680 rbd_assert(orig_request->img_request);
@@ -2727,6 +2727,7 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
2727 return; 2727 return;
2728 2728
2729out_err: 2729out_err:
2730 ceph_release_page_vector(pages, page_count);
2730 orig_request->result = img_result; 2731 orig_request->result = img_result;
2731 orig_request->xferred = 0; 2732 orig_request->xferred = 0;
2732 rbd_img_request_get(orig_request->img_request); 2733 rbd_img_request_get(orig_request->img_request);