rbd: don't crash or leak on errors in rbd_img_obj_parent_read_full_callback()
authorIlya Dryomov <idryomov@gmail.com>
Fri, 16 Sep 2016 13:20:42 +0000 (15:20 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 3 Oct 2016 14:13:48 +0000 (16:13 +0200)
- 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>
drivers/block/rbd.c

index 6db12d9a42912adf4e5f75a83fcc1377613f246b..77675ac8fc4ccb31930a35fa576a6c9e49abfec3 100644 (file)
@@ -2674,7 +2674,7 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
        rbd_assert(obj_request_type_valid(orig_request->type));
        img_result = img_request->result;
        parent_length = img_request->length;
-       rbd_assert(parent_length == img_request->xferred);
+       rbd_assert(img_result || parent_length == img_request->xferred);
        rbd_img_request_put(img_request);
 
        rbd_assert(orig_request->img_request);
@@ -2727,6 +2727,7 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request)
        return;
 
 out_err:
+       ceph_release_page_vector(pages, page_count);
        orig_request->result = img_result;
        orig_request->xferred = 0;
        rbd_img_request_get(orig_request->img_request);