From 7d5323b923b9976d399759e12af5165e36935569 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 6 Jul 2015 13:36:10 -0400 Subject: [PATCH] librbd: add support for dynamically enabling/disabling journaling Signed-off-by: Jason Dillaman --- src/librbd/internal.cc | 10 +++++++++- src/test/librbd/test_librbd.cc | 15 +++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index b61018d391d87..d714aa30f6c2d 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 74f2c07aa8b46..8309518a0e259 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); -- 2.39.5