RBD_FEATURE_FAST_DIFF | \
RBD_FEATURE_JOURNALING | \
RBD_FEATURE_NON_PRIMARY)
+#define RBD_FEATURES_MUTABLE_INTERNAL (RBD_FEATURE_NON_PRIMARY)
/// features that may be dynamically disabled
#define RBD_FEATURES_DISABLE_ONLY (RBD_FEATURE_DEEP_FLATTEN)
<< std::hex << unsupported_features << std::dec;
}
}
- uint64_t internal_features = (features & RBD_FEATURES_INTERNAL);
- if (internal_features != 0ULL) {
- features &= ~RBD_FEATURES_INTERNAL;
+
+ uint64_t ignore_features_mask = (
+ RBD_FEATURES_INTERNAL | RBD_FEATURES_MUTABLE_INTERNAL);
+ uint64_t ignored_features = (features & ignore_features_mask);
+ if (ignored_features != 0ULL) {
+ features &= ~ignore_features_mask;
if (err) {
- *err << "ignoring internal feature mask 0x"
- << std::hex << internal_features;
+ *err << "ignoring feature mask 0x" << std::hex << ignored_features;
}
}
} catch (boost::bad_lexical_cast&) {
uint64_t disable_mask = (RBD_FEATURES_MUTABLE |
RBD_FEATURES_DISABLE_ONLY);
if ((enabled && (features & RBD_FEATURES_MUTABLE) != features) ||
- (!enabled && (features & disable_mask) != features)) {
+ (!enabled && (features & disable_mask) != features) ||
+ ((features & ~RBD_FEATURES_MUTABLE_INTERNAL) != features)) {
lderr(cct) << "cannot update immutable features" << dendl;
return -EINVAL;
}