]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: disallow setting an empty mirror image entry to disabling
authorJason Dillaman <dillaman@redhat.com>
Mon, 13 Jun 2016 06:03:29 +0000 (02:03 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 13 Jun 2016 16:38:35 +0000 (12:38 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 7b2f99a97ff64451f3ae72081186dff41c507271)

src/cls/rbd/cls_rbd.cc
src/test/cls_rbd/test_cls_rbd.cc

index d261347b0997d5a67f8fcc26cf26b5a46aa37963..c430adf77a6c8752e6ca4879695d9584eb396503 100644 (file)
@@ -3112,6 +3112,12 @@ int image_set(cls_method_context_t hctx, const string &image_id,
               cpp_strerror(r).c_str());
       return r;
     }
+
+    // make sure this was not a race for disabling
+    if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_DISABLING) {
+      CLS_ERR("image '%s' is already disabled", image_id.c_str());
+      return r;
+    }
   } else if (r < 0) {
     CLS_ERR("error reading mirrored image '%s': '%s'", image_id.c_str(),
            cpp_strerror(r).c_str());
index f438b0fac6471f8c50153ec5b0f5dc9036c0da6e..b6989658f765daa3284368b6afa515927a2db03a 100644 (file)
@@ -1383,6 +1383,10 @@ TEST_F(TestClsRbd, mirror_image) {
   cls::rbd::MirrorImage image3("uuid3", cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
 
   ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id1", image1));
+  ASSERT_EQ(-ENOENT, mirror_image_set(&ioctx, "image_id2", image2));
+  image2.state = cls::rbd::MIRROR_IMAGE_STATE_ENABLED;
+  ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id2", image2));
+  image2.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING;
   ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id2", image2));
   ASSERT_EQ(-EINVAL, mirror_image_set(&ioctx, "image_id1", image2));
   ASSERT_EQ(-EEXIST, mirror_image_set(&ioctx, "image_id3", image2));