From: Dongsheng Yang Date: Tue, 21 Jun 2016 08:44:12 +0000 (-0400) Subject: librbd: introduce RBD_IMAGE_OPTION_FEATURES_[SET|CLEAR] for features overwriting. X-Git-Tag: ses5-milestone5~281^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=22f77dd301c54702ea48ed950b18a94541321f17;p=ceph.git librbd: introduce RBD_IMAGE_OPTION_FEATURES_[SET|CLEAR] for features overwriting. 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 --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 9c09547e954c..f4fa27cecc6c 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -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); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index a761da59215a..28705f703aef 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -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) {