int get_image_options(const boost::program_options::variables_map &vm,
bool get_format, librbd::ImageOptions *opts) {
- uint64_t order, features = 0, stripe_unit, stripe_count, object_size;
+ uint64_t order = 0, stripe_unit = 0, stripe_count = 0, object_size = 0;
+ uint64_t features = 0, features_clear = 0, features_set = 0;
bool order_specified = true;
bool features_specified = false;
+ bool features_clear_specified = false;
+ bool features_set_specified = false;
bool stripe_specified = false;
if (vm.count(at::IMAGE_ORDER)) {
}
if (vm.count(at::IMAGE_SHARED) && vm[at::IMAGE_SHARED].as<bool>()) {
- features &= ~RBD_FEATURES_SINGLE_CLIENT;
- features_specified = true;
+ if (features_specified) {
+ features &= ~RBD_FEATURES_SINGLE_CLIENT;
+ } else {
+ features_clear |= RBD_FEATURES_SINGLE_CLIENT;
+ features_clear_specified = true;
+ }
}
if (get_format) {
opts->set(RBD_IMAGE_OPTION_ORDER, order);
if (features_specified)
opts->set(RBD_IMAGE_OPTION_FEATURES, features);
+ if (features_clear_specified) {
+ opts->set(RBD_IMAGE_OPTION_FEATURES_CLEAR, features_clear);
+ }
+ if (features_set_specified)
+ opts->set(RBD_IMAGE_OPTION_FEATURES_SET, features_set);
if (stripe_specified) {
opts->set(RBD_IMAGE_OPTION_STRIPE_UNIT, stripe_unit);
opts->set(RBD_IMAGE_OPTION_STRIPE_COUNT, stripe_count);