From: Jason Dillaman Date: Mon, 13 Jun 2016 06:03:29 +0000 (-0400) Subject: cls_rbd: disallow setting an empty mirror image entry to disabling X-Git-Tag: v10.2.2~5^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6c303007af20a317f02b5caf7d3cb9f2214d2ee5;p=ceph.git cls_rbd: disallow setting an empty mirror image entry to disabling Signed-off-by: Jason Dillaman (cherry picked from commit 7b2f99a97ff64451f3ae72081186dff41c507271) --- diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index d261347b0997..c430adf77a6c 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -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()); diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index f438b0fac647..b6989658f765 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -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));