]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: introduce RBD_IMAGE_OPTION_FEATURES_[SET|CLEAR] for features overwriting.
authorDongsheng Yang <dongsheng.yang@easystack.cn>
Tue, 21 Jun 2016 08:44:12 +0000 (04:44 -0400)
committerDongsheng Yang <dongsheng.yang@easystack.cn>
Fri, 22 Jul 2016 11:04:09 +0000 (07:04 -0400)
Currently, if we want to use the default options for rbd, we need to omit the
RBD_IMAGE_OPTION_FEATURES, but if we want --image-shared. we need to overwrite
something bese on the default value of image options.

This patch introduce two flags in image_options, RBD_IMAGE_OPTION_FEATURES_SET
means, we want to set something after you get the features from default, parent
or user. And RBD_IMAGE_OPTION_FEATURES_CLEAR will do a bit clear.

Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
src/include/rbd/librbd.h
src/librbd/internal.cc

index 9c09547e954cb4a72a5a622e99d1ed101c503258..f4fa27cecc6cfb229b3ffd9b3e1f34842037f3fb 100644 (file)
@@ -144,6 +144,8 @@ enum {
   RBD_IMAGE_OPTION_JOURNAL_ORDER = 5,
   RBD_IMAGE_OPTION_JOURNAL_SPLAY_WIDTH = 6,
   RBD_IMAGE_OPTION_JOURNAL_POOL = 7,
+  RBD_IMAGE_OPTION_FEATURES_SET = 8,
+  RBD_IMAGE_OPTION_FEATURES_CLEAR = 9,
 };
 
 CEPH_RBD_API void rbd_image_options_create(rbd_image_options_t* opts);
index a761da59215a2b0c1e7e00d5b5ccf1bb047cd40f..28705f703aefa795d697f8f096422347ffa53e41 100644 (file)
@@ -593,6 +593,8 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     {RBD_IMAGE_OPTION_JOURNAL_ORDER, UINT64},
     {RBD_IMAGE_OPTION_JOURNAL_SPLAY_WIDTH, UINT64},
     {RBD_IMAGE_OPTION_JOURNAL_POOL, STR},
+    {RBD_IMAGE_OPTION_FEATURES_SET, UINT64},
+    {RBD_IMAGE_OPTION_FEATURES_CLEAR, UINT64},
   };
 
   std::string image_option_name(int optname) {
@@ -613,6 +615,10 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return "journal_splay_width";
     case RBD_IMAGE_OPTION_JOURNAL_POOL:
       return "journal_pool";
+    case RBD_IMAGE_OPTION_FEATURES_SET:
+      return "features_set";
+    case RBD_IMAGE_OPTION_FEATURES_CLEAR:
+      return "features_clear";
     default:
       return "unknown (" + stringify(optname) + ")";
     }
@@ -1259,6 +1265,19 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     if (opts.get(RBD_IMAGE_OPTION_FEATURES, &features) != 0) {
       features = old_format ? 0 : cct->_conf->rbd_default_features;
     }
+
+    uint64_t features_clear = 0;
+    uint64_t features_set = 0;
+    opts.get(RBD_IMAGE_OPTION_FEATURES_CLEAR, &features_clear);
+    opts.get(RBD_IMAGE_OPTION_FEATURES_SET, &features_set);
+
+    uint64_t conflict = features_clear & features_set;
+    features_clear &= ~conflict;
+    features_set &= ~conflict;
+
+    features |= features_set;
+    features &= ~features_clear;
+
     uint64_t stripe_unit = 0;
     uint64_t stripe_count = 0;
     if (!old_format) {