From eff1380b150ed542790792223d0566894ef14776 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 3 Mar 2020 15:01:35 -0500 Subject: [PATCH] librbd: new RBD_FEATURE_NON_PRIMARY to prevent R/W IO When a snapshot-based image is non-primary, we will need to use this implicit feature to ensure that writes and maintenance operations cannot be performed against the image. Signed-off-by: Jason Dillaman --- doc/rbd/rbd-config-ref.rst | 7 +++++++ src/include/rbd/features.h | 22 ++++++++++++++-------- src/librbd/Features.cc | 3 ++- src/pybind/rbd/rbd.pyx | 2 ++ src/tools/rbd/ArgumentTypes.cc | 1 + 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/doc/rbd/rbd-config-ref.rst b/doc/rbd/rbd-config-ref.rst index 6fb1676c7b5..3d114741a31 100644 --- a/doc/rbd/rbd-config-ref.rst +++ b/doc/rbd/rbd-config-ref.rst @@ -265,6 +265,13 @@ RBD supports advanced features which can be specified via the command line when :Added in: v14.0.1 (Nautilus) :KRBD support: no +``Non-primary`` + +:Description: Used to restrict changes to non-primary images using snapshot-based mirroring. +:Internal value: 1024 +:Added in: v15.2.0 (Octopus) +:KRBD support: no + QOS Settings ============ diff --git a/src/include/rbd/features.h b/src/include/rbd/features.h index 89c54a36b21..00cb4d2a1ea 100644 --- a/src/include/rbd/features.h +++ b/src/include/rbd/features.h @@ -11,6 +11,7 @@ #define RBD_FEATURE_DATA_POOL (1ULL<<7) #define RBD_FEATURE_OPERATIONS (1ULL<<8) #define RBD_FEATURE_MIGRATING (1ULL<<9) +#define RBD_FEATURE_NON_PRIMARY (1ULL<<10) #define RBD_FEATURES_DEFAULT (RBD_FEATURE_LAYERING | \ RBD_FEATURE_EXCLUSIVE_LOCK | \ @@ -28,6 +29,7 @@ #define RBD_FEATURE_NAME_DATA_POOL "data-pool" #define RBD_FEATURE_NAME_OPERATIONS "operations" #define RBD_FEATURE_NAME_MIGRATING "migrating" +#define RBD_FEATURE_NAME_NON_PRIMARY "non-primary" /// features that make an image inaccessible for read or write by /// clients that don't understand them @@ -43,7 +45,8 @@ RBD_FEATURE_DEEP_FLATTEN | \ RBD_FEATURE_JOURNALING | \ RBD_FEATURE_OPERATIONS | \ - RBD_FEATURE_MIGRATING) + RBD_FEATURE_MIGRATING | \ + RBD_FEATURE_NON_PRIMARY) #define RBD_FEATURES_ALL (RBD_FEATURE_LAYERING | \ RBD_FEATURE_STRIPINGV2 | \ @@ -54,13 +57,15 @@ RBD_FEATURE_JOURNALING | \ RBD_FEATURE_DATA_POOL | \ RBD_FEATURE_OPERATIONS | \ - RBD_FEATURE_MIGRATING) + RBD_FEATURE_MIGRATING | \ + RBD_FEATURE_NON_PRIMARY) /// features that may be dynamically enabled or disabled #define RBD_FEATURES_MUTABLE (RBD_FEATURE_EXCLUSIVE_LOCK | \ RBD_FEATURE_OBJECT_MAP | \ RBD_FEATURE_FAST_DIFF | \ - RBD_FEATURE_JOURNALING) + RBD_FEATURE_JOURNALING | \ + RBD_FEATURE_NON_PRIMARY) /// features that may be dynamically disabled #define RBD_FEATURES_DISABLE_ONLY (RBD_FEATURE_DEEP_FLATTEN) @@ -73,11 +78,12 @@ RBD_FEATURE_JOURNALING) /// features that will be implicitly enabled -#define RBD_FEATURES_IMPLICIT_ENABLE (RBD_FEATURE_STRIPINGV2 | \ - RBD_FEATURE_DATA_POOL | \ - RBD_FEATURE_FAST_DIFF | \ - RBD_FEATURE_OPERATIONS | \ - RBD_FEATURE_MIGRATING) +#define RBD_FEATURES_IMPLICIT_ENABLE (RBD_FEATURE_STRIPINGV2 | \ + RBD_FEATURE_DATA_POOL | \ + RBD_FEATURE_FAST_DIFF | \ + RBD_FEATURE_OPERATIONS | \ + RBD_FEATURE_MIGRATING | \ + RBD_FEATURE_NON_PRIMARY) /// features that cannot be controlled by the user #define RBD_FEATURES_INTERNAL (RBD_FEATURE_OPERATIONS | \ diff --git a/src/librbd/Features.cc b/src/librbd/Features.cc index a2c25169c43..de50218ac09 100644 --- a/src/librbd/Features.cc +++ b/src/librbd/Features.cc @@ -21,8 +21,9 @@ static const std::map RBD_FEATURE_MAP = { {RBD_FEATURE_NAME_DATA_POOL, RBD_FEATURE_DATA_POOL}, {RBD_FEATURE_NAME_OPERATIONS, RBD_FEATURE_OPERATIONS}, {RBD_FEATURE_NAME_MIGRATING, RBD_FEATURE_MIGRATING}, + {RBD_FEATURE_NAME_NON_PRIMARY, RBD_FEATURE_NON_PRIMARY}, }; -static_assert((RBD_FEATURE_MIGRATING << 1) > RBD_FEATURES_ALL, +static_assert((RBD_FEATURE_NON_PRIMARY << 1) > RBD_FEATURES_ALL, "new RBD feature added"); diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx index 34e1d92cbaa..b71458b5cb9 100644 --- a/src/pybind/rbd/rbd.pyx +++ b/src/pybind/rbd/rbd.pyx @@ -72,6 +72,7 @@ cdef extern from "rbd/librbd.h" nogil: _RBD_FEATURE_DATA_POOL "RBD_FEATURE_DATA_POOL" _RBD_FEATURE_OPERATIONS "RBD_FEATURE_OPERATIONS" _RBD_FEATURE_MIGRATING "RBD_FEATURE_MIGRATING" + _RBD_FEATURE_NON_PRIMARY "RBD_FEATURE_NON_PRIMARY" _RBD_FEATURES_INCOMPATIBLE "RBD_FEATURES_INCOMPATIBLE" _RBD_FEATURES_RW_INCOMPATIBLE "RBD_FEATURES_RW_INCOMPATIBLE" @@ -714,6 +715,7 @@ RBD_FEATURE_JOURNALING = _RBD_FEATURE_JOURNALING RBD_FEATURE_DATA_POOL = _RBD_FEATURE_DATA_POOL RBD_FEATURE_OPERATIONS = _RBD_FEATURE_OPERATIONS RBD_FEATURE_MIGRATING = _RBD_FEATURE_MIGRATING +RBD_FEATURE_NON_PRIMARY = _RBD_FEATURE_NON_PRIMARY RBD_FEATURES_INCOMPATIBLE = _RBD_FEATURES_INCOMPATIBLE RBD_FEATURES_RW_INCOMPATIBLE = _RBD_FEATURES_RW_INCOMPATIBLE diff --git a/src/tools/rbd/ArgumentTypes.cc b/src/tools/rbd/ArgumentTypes.cc index ae5f9fd76d8..74115d8a30a 100644 --- a/src/tools/rbd/ArgumentTypes.cc +++ b/src/tools/rbd/ArgumentTypes.cc @@ -28,6 +28,7 @@ const std::map ImageFeatures::FEATURE_MAPPING = { {RBD_FEATURE_DATA_POOL, RBD_FEATURE_NAME_DATA_POOL}, {RBD_FEATURE_OPERATIONS, RBD_FEATURE_NAME_OPERATIONS}, {RBD_FEATURE_MIGRATING, RBD_FEATURE_NAME_MIGRATING}, + {RBD_FEATURE_NON_PRIMARY, RBD_FEATURE_NAME_NON_PRIMARY}, }; Format::Formatter Format::create_formatter(bool pretty) const { -- 2.39.5