]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: add support for dynamically enabling/disabling journaling
authorJason Dillaman <dillaman@redhat.com>
Mon, 6 Jul 2015 17:36:10 +0000 (13:36 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 13 Nov 2015 01:17:52 +0000 (20:17 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/internal.cc
src/test/librbd/test_librbd.cc

index b61018d391d87f1944cbdd6482886501a04ddc87..d714aa30f6c2d0bb3ed6ca3d7e1102c8817de2df 100644 (file)
@@ -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;
         }
index 74f2c07aa8b4663446b37ea7ea2fc57309ba4dae..8309518a0e25931af3a1c73903f3bd1e5d7fc1df 100644 (file)
@@ -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);