summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-05-07 02:40:33 +0400
committerAlex Elder <elder@inktank.com>2013-05-13 23:12:41 +0400
commit70cf49cfc7a4d1eb4aeea6cd128b88230be9d0b1 (patch)
treeecc02aa809064607d872cf4c433cf0489b2f5604
parentb91f09f17b2a302f07022e2f766969e2536d71b3 (diff)
downloadlinux-70cf49cfc7a4d1eb4aeea6cd128b88230be9d0b1.tar.xz
rbd: ignore zero-overlap parent
An rbd clone image that has an overlap with its parent of 0 is effectively not a layered image at all. Detect this case and treat such an image as non-layered. Issue a warning to be sure the user knows what's going on. This resolves: http://tracker.ceph.com/issues/5028 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r--drivers/block/rbd.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 5161e80a38ef..b67ecda1e7ef 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -3665,9 +3665,13 @@ static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev)
ceph_decode_64_safe(&p, end, parent_spec->snap_id, out_err);
ceph_decode_64_safe(&p, end, overlap, out_err);
- rbd_dev->parent_overlap = overlap;
- rbd_dev->parent_spec = parent_spec;
- parent_spec = NULL; /* rbd_dev now owns this */
+ if (overlap) {
+ rbd_dev->parent_spec = parent_spec;
+ parent_spec = NULL; /* rbd_dev now owns this */
+ rbd_dev->parent_overlap = overlap;
+ } else {
+ rbd_warn(rbd_dev, "ignoring parent of clone with overlap 0\n");
+ }
out:
ret = 0;
out_err: