]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: disallow add/remove image to/from mirror enabled group
authorRamana Raja <rraja@redhat.com>
Sun, 2 Feb 2025 17:28:52 +0000 (12:28 -0500)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Wed, 30 Jul 2025 17:06:02 +0000 (22:36 +0530)
Do not allow adding/removing images to/from a group that is configured
for mirroring.

Signed-off-by: Ramana Raja <rraja@redhat.com>
src/librbd/api/Group.cc

index ac630b823d1e6d928f27287e6c66fbda3cd1eefc..6ba03c3aee65053c0d7f81e8e0e563515e81ba70 100644 (file)
@@ -525,6 +525,17 @@ int Group<I>::image_add(librados::IoCtx& group_ioctx, const char *group_name,
   }
   string group_header_oid = librbd::util::group_header_name(group_id);
 
+  cls::rbd::MirrorGroup mirror_info;
+  r = cls_client::mirror_group_get(&group_ioctx, group_id, &mirror_info);
+  if (r < 0  && r != -ENOENT && r != -ENOTSUP) {
+    lderr(cct) << "error getting mirror info of group: "
+               << cpp_strerror(r) << dendl;
+    return r;
+  } else if (r == 0 &&
+             mirror_info.state != cls::rbd::MIRROR_GROUP_STATE_DISABLED) {
+    lderr(cct) << "cannot add image to mirror enabled group" << dendl;
+    return -EINVAL;
+  }
 
   ldout(cct, 20) << "adding image to group name " << group_name
                 << " group id " << group_header_oid << dendl;
@@ -613,6 +624,19 @@ int Group<I>::image_remove(librados::IoCtx& group_ioctx, const char *group_name,
     return r;
   }
 
+  cls::rbd::MirrorGroup mirror_info;
+  r = cls_client::mirror_group_get(&group_ioctx, group_id, &mirror_info);
+  if (r < 0  && r != -ENOENT && r != -ENOTSUP) {
+    lderr(cct) << "error getting mirror info of group: "
+               << cpp_strerror(r) << dendl;
+    return r;
+  } else if (r == 0 &&
+             mirror_info.state != cls::rbd::MIRROR_GROUP_STATE_DISABLED) {
+    lderr(cct) << "cannot remove image from mirror enabled group"
+               << dendl;
+    return -EINVAL;
+  }
+
   ldout(cct, 20) << "removing image from group name " << group_name
     << " group id " << group_id << dendl;