diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2019-08-27 16:45:10 +0200 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2019-08-28 12:34:11 +0200 |
commit | d435c9a7b85be1e820668d2f3718c2d9f24d5548 (patch) | |
tree | 96f88099d0e3baab4bf0eaa93c4bdb5a27425876 /drivers/block/rbd.c | |
parent | e8c99200b4d117c340c392ebd5e62d85dfeed027 (diff) |
rbd: restore zeroing past the overlap when reading from parent
The parent image is read only up to the overlap point, the rest of
the buffer should be zeroed. This snuck in because as it turns out
the overlap test case has not been triggering this code path for
a while now.
Fixes: a9b67e69949d ("rbd: replace obj_req->tried_parent with obj_req->read_state")
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Jason Dillaman <dillaman@redhat.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 3327192bb71f..c8fb886aebd4 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3038,6 +3038,17 @@ again: } return true; case RBD_OBJ_READ_PARENT: + /* + * The parent image is read only up to the overlap -- zero-fill + * from the overlap to the end of the request. + */ + if (!*result) { + u32 obj_overlap = rbd_obj_img_extents_bytes(obj_req); + + if (obj_overlap < obj_req->ex.oe_len) + rbd_obj_zero_range(obj_req, obj_overlap, + obj_req->ex.oe_len - obj_overlap); + } return true; default: BUG(); |