#include "librbd/Utils.h"
#include "librbd/api/Config.h"
#include "librbd/api/Group.h"
+#include "librbd/api/Image.h"
#include "librbd/api/Snapshot.h"
#include "librbd/api/Trash.h"
#include "librbd/deep_copy/MetadataCopyRequest.h"
<< dendl;
return -EBUSY;
}
+
+ RWLock::RLocker l(m_src_image_ctx->snap_lock);
+ cls::rbd::ParentImageSpec parent_spec{m_src_image_ctx->md_ctx.get_id(),
+ m_src_image_ctx->md_ctx.get_namespace(),
+ m_src_image_ctx->id, snap.id};
+ std::vector<librbd::linked_image_spec_t> child_images;
+ r = api::Image<I>::list_children(m_src_image_ctx, parent_spec, &child_images);
+ if (r < 0) {
+ lderr(m_cct) << "failed listing children: " << cpp_strerror(r)
+ << dendl;
+ return r;
+ }
+
+ size_t size = child_images.size();
+ if (size > 0) {
+ lderr(m_cct) << "image has snapshot '" << snap.name << "' with linked clones"
+ << dendl;
+ return -EBUSY;
+ }
}
}