From: Mykola Golub Date: Thu, 7 Feb 2019 10:03:08 +0000 (+0000) Subject: librbd: make list_children work if parent snap is head X-Git-Tag: v14.1.0~56^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=82f9626fdfb1ac17b745b6355a6cf1b3f0d3aa7a;p=ceph.git librbd: make list_children work if parent snap is head (returning children for all the image snaps in this case) Signed-off-by: Mykola Golub --- diff --git a/src/librbd/api/Image.cc b/src/librbd/api/Image.cc index 80fad287eaf..94154e95795 100644 --- a/src/librbd/api/Image.cc +++ b/src/librbd/api/Image.cc @@ -233,11 +233,25 @@ int Image::get_parent(I *ictx, template int Image::list_children(I *ictx, std::vector *images) { + images->clear(); + RWLock::RLocker l(ictx->snap_lock); - cls::rbd::ParentImageSpec parent_spec{ictx->md_ctx.get_id(), - ictx->md_ctx.get_namespace(), - ictx->id, ictx->snap_id}; - return list_children(ictx, parent_spec, images); + std::vector snap_ids; + if (ictx->snap_id != CEPH_NOSNAP) { + snap_ids.push_back(ictx->snap_id); + } else { + snap_ids = ictx->snaps; + } + for (auto snap_id : snap_ids) { + cls::rbd::ParentImageSpec parent_spec{ictx->md_ctx.get_id(), + ictx->md_ctx.get_namespace(), + ictx->id, snap_id}; + int r = list_children(ictx, parent_spec, images); + if (r < 0) { + return r; + } + } + return 0; } template @@ -252,8 +266,6 @@ int Image::list_children(I *ictx, return 0; } - images->clear(); - librados::Rados rados(ictx->md_ctx); // search all pools for clone v1 children dependent on this snapshot