do {
m_features &= image_ctx.features;
+
+ // interlock object-map and fast-diff together
+ if (((m_features & RBD_FEATURE_OBJECT_MAP) != 0) ||
+ ((m_features & RBD_FEATURE_FAST_DIFF) != 0)) {
+ m_features |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+ }
+
m_new_features = image_ctx.features & ~m_features;
m_features_mask = m_features;
break;
}
m_features_mask |= (RBD_FEATURE_OBJECT_MAP |
+ RBD_FEATURE_FAST_DIFF |
RBD_FEATURE_JOURNALING);
}
if ((m_features & RBD_FEATURE_FAST_DIFF) != 0) {
}
m_features &= ~image_ctx.features;
+
+ // interlock object-map and fast-diff together
+ if (((m_features & RBD_FEATURE_OBJECT_MAP) != 0) ||
+ ((m_features & RBD_FEATURE_FAST_DIFF) != 0)) {
+ m_features |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+ }
+
m_new_features = image_ctx.features | m_features;
m_features_mask = m_features;
break;
}
m_enable_flags |= RBD_FLAG_OBJECT_MAP_INVALID;
- m_features_mask |= RBD_FEATURE_EXCLUSIVE_LOCK;
+ m_features_mask |= (RBD_FEATURE_EXCLUSIVE_LOCK | RBD_FEATURE_FAST_DIFF);
}
if ((m_features & RBD_FEATURE_FAST_DIFF) != 0) {
m_enable_flags |= RBD_FLAG_FAST_DIFF_INVALID;
- m_features_mask |= (RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_EXCLUSIVE_LOCK);
+ m_features_mask |= (RBD_FEATURE_EXCLUSIVE_LOCK | RBD_FEATURE_OBJECT_MAP);
}
+
if ((m_features & RBD_FEATURE_JOURNALING) != 0) {
if ((m_new_features & RBD_FEATURE_EXCLUSIVE_LOCK) == 0) {
lderr(cct) << "cannot enable journaling. exclusive-lock must be "
false));
}
- if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
- ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_FAST_DIFF,
- false));
- }
-
if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
false));
false));
}
- if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
- ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_FAST_DIFF,
- false));
- }
-
if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
false));
false));
}
- if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
- ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
- false));
- }
-
ASSERT_EQ(0, ictx->state->refresh());
MockRefreshImageCtx mock_image_ctx(*ictx);
false));
}
- if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
- ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
- false));
- }
-
ASSERT_EQ(0, ictx->state->refresh());
MockRefreshImageCtx mock_image_ctx(*ictx);
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
- ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_FAST_DIFF,
- false));
- }
-
if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
false));
false));
}
- if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
- ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_OBJECT_MAP,
- false));
- }
-
ASSERT_EQ(0, ictx->state->refresh());
expect_op_work_queue(mock_image_ctx);