]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: prevent 'non-primary' feature from being set via API
authorJason Dillaman <dillaman@redhat.com>
Tue, 10 Mar 2020 03:41:26 +0000 (23:41 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 10 Mar 2020 23:23:02 +0000 (19:23 -0400)
This feature is mutable from only within librbd as a mirrored image
is promoted/demoted.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/include/rbd/features.h
src/librbd/Features.cc
src/librbd/Operations.cc

index 00cb4d2a1ead703ca5f596c90b5ea9a2bc5ba132..06b5cd06471b3ce4ebb1a70c6d26937c710b4374 100644 (file)
@@ -66,6 +66,7 @@
                                          RBD_FEATURE_FAST_DIFF      | \
                                          RBD_FEATURE_JOURNALING     | \
                                          RBD_FEATURE_NON_PRIMARY)
+#define RBD_FEATURES_MUTABLE_INTERNAL   (RBD_FEATURE_NON_PRIMARY)
 
 /// features that may be dynamically disabled
 #define RBD_FEATURES_DISABLE_ONLY       (RBD_FEATURE_DEEP_FLATTEN)
index de50218ac099544174c9dc30dd584cf7d6f08264..1531a2eab4d881213790ceb5ab2a05a1701b814e 100644 (file)
@@ -74,12 +74,14 @@ uint64_t rbd_features_from_string(const std::string& orig_value,
              << std::hex << unsupported_features << std::dec;
       }
     }
-    uint64_t internal_features = (features & RBD_FEATURES_INTERNAL);
-    if (internal_features != 0ULL) {
-      features &= ~RBD_FEATURES_INTERNAL;
+
+    uint64_t ignore_features_mask = (
+      RBD_FEATURES_INTERNAL | RBD_FEATURES_MUTABLE_INTERNAL);
+    uint64_t ignored_features = (features & ignore_features_mask);
+    if (ignored_features != 0ULL) {
+      features &= ~ignore_features_mask;
       if (err) {
-       *err << "ignoring internal feature mask 0x"
-            << std::hex << internal_features;
+       *err << "ignoring feature mask 0x" << std::hex << ignored_features;
       }
     }
   } catch (boost::bad_lexical_cast&) {
index 4334a4a37b9d4c9c2c9ad72c32fe27f8d742342b..d53d7637e3f130588e280046efb1e213fa996a67 100644 (file)
@@ -1337,7 +1337,8 @@ int Operations<I>::update_features(uint64_t features, bool enabled) {
   uint64_t disable_mask = (RBD_FEATURES_MUTABLE |
                            RBD_FEATURES_DISABLE_ONLY);
   if ((enabled && (features & RBD_FEATURES_MUTABLE) != features) ||
-      (!enabled && (features & disable_mask) != features)) {
+      (!enabled && (features & disable_mask) != features) ||
+      ((features & ~RBD_FEATURES_MUTABLE_INTERNAL) != features)) {
     lderr(cct) << "cannot update immutable features" << dendl;
     return -EINVAL;
   }