From: Jason Dillaman Date: Mon, 6 Jul 2015 17:36:10 +0000 (-0400) Subject: librbd: add support for dynamically enabling/disabling journaling X-Git-Tag: v10.0.1~52^2~42 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7d5323b923b9976d399759e12af5165e36935569;p=ceph.git librbd: add support for dynamically enabling/disabling journaling Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index b61018d391d8..d714aa30f6c2 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1887,6 +1887,13 @@ reprotect_and_return_err: enable_flags |= RBD_FLAG_FAST_DIFF_INVALID; features_mask |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_EXCLUSIVE_LOCK); } + if ((features & RBD_FEATURE_JOURNALING) != 0) { + if ((new_features & RBD_FEATURE_EXCLUSIVE_LOCK) == 0) { + lderr(cct) << "cannot enable journaling" << dendl; + return -EINVAL; + } + features_mask |= RBD_FEATURE_EXCLUSIVE_LOCK; + } if (enable_flags != 0) { r = update_all_flags(ictx, enable_flags, enable_flags); @@ -1896,7 +1903,8 @@ reprotect_and_return_err: } } else { if ((features & RBD_FEATURE_EXCLUSIVE_LOCK) != 0) { - if ((new_features & RBD_FEATURE_OBJECT_MAP) != 0) { + if ((new_features & RBD_FEATURE_OBJECT_MAP) != 0 || + (new_features & RBD_FEATURE_JOURNALING) != 0) { lderr(cct) << "cannot disable exclusive lock" << dendl; return -EINVAL; } diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 74f2c07aa8b4..8309518a0e25 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -3016,17 +3016,20 @@ TEST_F(TestLibRBD, UpdateFeatures) ASSERT_EQ(-EINVAL, image.update_features(0, true)); ASSERT_EQ(0, image.update_features(RBD_FEATURE_EXCLUSIVE_LOCK | - RBD_FEATURE_OBJECT_MAP | - RBD_FEATURE_FAST_DIFF, false)); + RBD_FEATURE_OBJECT_MAP | + RBD_FEATURE_FAST_DIFF | + RBD_FEATURE_JOURNALING, false)); - // cannot enable object map w/o exclusive lock + // cannot enable object map nor journaling w/o exclusive lock ASSERT_EQ(-EINVAL, image.update_features(RBD_FEATURE_OBJECT_MAP, true)); + ASSERT_EQ(-EINVAL, image.update_features(RBD_FEATURE_JOURNALING, true)); ASSERT_EQ(0, image.update_features(RBD_FEATURE_EXCLUSIVE_LOCK, true)); // cannot enable fast diff w/o object map ASSERT_EQ(-EINVAL, image.update_features(RBD_FEATURE_FAST_DIFF, true)); ASSERT_EQ(0, image.update_features(RBD_FEATURE_OBJECT_MAP | - RBD_FEATURE_FAST_DIFF, true)); + RBD_FEATURE_FAST_DIFF | + RBD_FEATURE_JOURNALING, true)); uint64_t expected_flags = RBD_FLAG_OBJECT_MAP_INVALID | RBD_FLAG_FAST_DIFF_INVALID; @@ -3046,6 +3049,10 @@ TEST_F(TestLibRBD, UpdateFeatures) ASSERT_EQ(-EINVAL, image.update_features(RBD_FEATURE_EXCLUSIVE_LOCK, false)); ASSERT_EQ(0, image.update_features(RBD_FEATURE_OBJECT_MAP, false)); + // cannot disable exclusive lock w/ journaling + ASSERT_EQ(-EINVAL, image.update_features(RBD_FEATURE_EXCLUSIVE_LOCK, false)); + ASSERT_EQ(0, image.update_features(RBD_FEATURE_JOURNALING, false)); + ASSERT_EQ(0, image.get_flags(&flags)); ASSERT_EQ(0U, flags);