From: Prasanna Kumar Kalever Date: Tue, 25 Mar 2025 19:39:52 +0000 (+0530) Subject: librbd/api: add defence in group enable to bail about different pool images X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=2c38ee7f5d9efa911fa8155a81349e1a85b7c01f;p=ceph.git librbd/api: add defence in group enable to bail about different pool images If a group contains images from different pools do not allow enabling mirroring on it. Thanks to Ilya for all the suggestions and review. Signed-off-by: Prasanna Kumar Kalever --- diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index df0aff0e2380e..f33db22ddf8d0 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -2436,10 +2436,11 @@ void Mirror::image_snapshot_create(I *ictx, uint32_t flags, template int prepare_group_images(IoCtx& group_ioctx, std::string group_id, + cls::rbd::MirrorGroupState group_state, std::vector *image_ctxs, cls::rbd::GroupSnapshot *group_snap, std::vector &quiesce_requests, - cls::rbd::MirrorSnapshotState state, + cls::rbd::MirrorSnapshotState snap_state, std::set *mirror_peer_uuids, uint64_t internal_flags) { CephContext *cct = (CephContext *)group_ioctx.cct(); @@ -2471,8 +2472,19 @@ int prepare_group_images(IoCtx& group_ioctx, return r; } + if (group_state != cls::rbd::MIRROR_GROUP_STATE_ENABLED) { + auto group_pool_id = group_ioctx.get_id(); + for (auto image_ctx: *image_ctxs) { + if (group_pool_id != image_ctx->md_ctx.get_id()) { + lderr(cct) << "group image resides in a different pool, mirroring is not supported" + << dendl; + return -ENOTSUP; + } + } + } + group_snap->snapshot_namespace = cls::rbd::GroupSnapshotNamespaceMirror{ - state, *mirror_peer_uuids, {}, {}}; + snap_state, *mirror_peer_uuids, {}, {}}; for (auto image_ctx: *image_ctxs) { group_snap->snaps.emplace_back(image_ctx->md_ctx.get_id(), image_ctx->id, @@ -2781,8 +2793,8 @@ int Mirror::group_enable(IoCtx& group_ioctx, const char *group_name, std::vector quiesce_requests; std::vector image_ctxs; std::set mirror_peer_uuids; - r = prepare_group_images(group_ioctx, group_id, &image_ctxs, - &group_snap, quiesce_requests, + r = prepare_group_images(group_ioctx, group_id, mirror_group.state, + &image_ctxs, &group_snap, quiesce_requests, cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, &mirror_peer_uuids, internal_flags); @@ -3225,8 +3237,8 @@ int Mirror::group_promote(IoCtx& group_ioctx, const char *group_name, std::vector quiesce_requests; std::vector image_ctxs; std::set mirror_peer_uuids; - r = prepare_group_images(group_ioctx, group_id, &image_ctxs, - &group_snap, quiesce_requests, + r = prepare_group_images(group_ioctx, group_id, mirror_group.state, + &image_ctxs, &group_snap, quiesce_requests, cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY, &mirror_peer_uuids, SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE); @@ -3273,8 +3285,8 @@ int Mirror::group_promote(IoCtx& group_ioctx, const char *group_name, } close_images(&image_ctxs); - r = prepare_group_images(group_ioctx, group_id, &image_ctxs, - &group_snap, quiesce_requests, + r = prepare_group_images(group_ioctx, group_id, mirror_group.state, + &image_ctxs, &group_snap, quiesce_requests, cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED, &mirror_peer_uuids, SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE); @@ -3388,8 +3400,8 @@ int Mirror::group_demote(IoCtx& group_ioctx, std::vector quiesce_requests; std::vector image_ctxs; std::set mirror_peer_uuids; - r = prepare_group_images(group_ioctx, group_id, &image_ctxs, - &group_snap, quiesce_requests, + r = prepare_group_images(group_ioctx, group_id, mirror_group.state, + &image_ctxs, &group_snap, quiesce_requests, cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED, &mirror_peer_uuids, SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE); @@ -3437,8 +3449,8 @@ int Mirror::group_demote(IoCtx& group_ioctx, } close_images(&image_ctxs); - r = prepare_group_images(group_ioctx, group_id, &image_ctxs, - &group_snap, quiesce_requests, + r = prepare_group_images(group_ioctx, group_id, mirror_group.state, + &image_ctxs, &group_snap, quiesce_requests, cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED, &mirror_peer_uuids, SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE);