diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2016-09-16 09:20:42 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-10-03 10:13:48 -0400 |
commit | fa355112c2763d513f1356119684dc8a6150d08a (patch) | |
tree | 79c17910121d385b7ed4654fc3753b66eb2ce215 | |
parent | 4a17dadcae55ca1f5c1ed826d42185e22653c256 (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.c | 3 |
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 | ||
2729 | out_err: | 2729 | out_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); |