summaryrefslogtreecommitdiffstats
path: root/src/tools/rbd/Utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/rbd/Utils.cc')
-rw-r--r--src/tools/rbd/Utils.cc22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc
index 71da0bd274a..b20dca05bc6 100644
--- a/src/tools/rbd/Utils.cc
+++ b/src/tools/rbd/Utils.cc
@@ -337,11 +337,14 @@ int get_pool_image_snapshot_names(const po::variables_map &vm,
SpecValidation spec_validation) {
std::string pool_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
at::DEST_POOL_NAME : at::POOL_NAME);
+ std::string namespace_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
+ at::DEST_NAMESPACE_NAME : at::NAMESPACE_NAME);
std::string image_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
at::DEST_IMAGE_NAME : at::IMAGE_NAME);
+
return get_pool_generic_snapshot_names(vm, mod, spec_arg_index, pool_key,
- pool_name, namespace_name, image_key,
- "image", image_name, snap_name,
+ pool_name, namespace_key, namespace_name,
+ image_key, "image", image_name, snap_name,
image_name_required, snapshot_presence,
spec_validation);
}
@@ -351,6 +354,7 @@ int get_pool_generic_snapshot_names(const po::variables_map &vm,
size_t *spec_arg_index,
const std::string& pool_key,
std::string *pool_name,
+ const std::string& namespace_key,
std::string *namespace_name,
const std::string& generic_key,
const std::string& generic_key_desc,
@@ -359,8 +363,6 @@ int get_pool_generic_snapshot_names(const po::variables_map &vm,
bool generic_name_required,
SnapshotPresence snapshot_presence,
SpecValidation spec_validation) {
- std::string namespace_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
- at::DEST_NAMESPACE_NAME : at::NAMESPACE_NAME);
std::string snap_key = (mod == at::ARGUMENT_MODIFIER_DEST ?
at::DEST_SNAPSHOT_NAME : at::SNAPSHOT_NAME);
@@ -478,10 +480,11 @@ int validate_snapshot_name(at::ArgumentModifier mod,
int get_image_options(const boost::program_options::variables_map &vm,
bool get_format, librbd::ImageOptions *opts) {
uint64_t order = 0, stripe_unit = 0, stripe_count = 0, object_size = 0;
- uint64_t features = 0, features_clear = 0;
+ uint64_t features = 0, features_set = 0, features_clear = 0;
std::string data_pool;
bool order_specified = true;
bool features_specified = false;
+ bool features_set_specified = false;
bool features_clear_specified = false;
bool stripe_specified = false;
@@ -509,6 +512,13 @@ int get_image_options(const boost::program_options::variables_map &vm,
stripe_specified = true;
}
+ if (vm.count(at::IMAGE_MIRROR_IMAGE_MODE) &&
+ vm[at::IMAGE_MIRROR_IMAGE_MODE].as<librbd::mirror_image_mode_t>() ==
+ RBD_MIRROR_IMAGE_MODE_JOURNAL) {
+ features_set |= (RBD_FEATURE_EXCLUSIVE_LOCK | RBD_FEATURE_JOURNALING);
+ features_set_specified = true;
+ }
+
if (vm.count(at::IMAGE_SHARED) && vm[at::IMAGE_SHARED].as<bool>()) {
if (features_specified) {
features &= ~RBD_FEATURES_SINGLE_CLIENT;
@@ -581,6 +591,8 @@ int get_image_options(const boost::program_options::variables_map &vm,
opts->set(RBD_IMAGE_OPTION_ORDER, order);
if (features_specified)
opts->set(RBD_IMAGE_OPTION_FEATURES, features);
+ if (features_set_specified)
+ opts->set(RBD_IMAGE_OPTION_FEATURES_SET, features_set);
if (features_clear_specified) {
opts->set(RBD_IMAGE_OPTION_FEATURES_CLEAR, features_clear);
}