} else {
operation::DisableFeaturesRequest<I> *req =
new operation::DisableFeaturesRequest<I>(
- m_image_ctx, on_finish, journal_op_tid, features);
+ m_image_ctx, on_finish, journal_op_tid, features, false);
req->send();
}
}
DisableFeaturesRequest<I>::DisableFeaturesRequest(I &image_ctx,
Context *on_finish,
uint64_t journal_op_tid,
- uint64_t features)
- : Request<I>(image_ctx, on_finish, journal_op_tid), m_features(features) {
+ uint64_t features,
+ bool force)
+ : Request<I>(image_ctx, on_finish, journal_op_tid), m_features(features),
+ m_force(force) {
}
template <typename I>
return handle_finish(*result);
}
- if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
+ if ((mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) && !m_force) {
lderr(cct) << "cannot disable journaling: image mirroring "
<< "enabled and mirror pool mode set to image"
<< dendl;
&DisableFeaturesRequest<I>::handle_disable_mirror_image>(this);
mirror::DisableRequest<I> *req =
- mirror::DisableRequest<I>::create(&image_ctx, false, true, ctx);
+ mirror::DisableRequest<I>::create(&image_ctx, m_force, true, ctx);
req->send();
}
public:
static DisableFeaturesRequest *create(ImageCtxT &image_ctx, Context *on_finish,
uint64_t journal_op_tid,
- uint64_t features) {
+ uint64_t features, bool force) {
return new DisableFeaturesRequest(image_ctx, on_finish, journal_op_tid,
- features);
+ features, force);
}
DisableFeaturesRequest(ImageCtxT &image_ctx, Context *on_finish,
- uint64_t journal_op_tid, uint64_t features);
+ uint64_t journal_op_tid, uint64_t features, bool force);
protected:
virtual void send_op();
*/
uint64_t m_features;
+ bool m_force;
bool m_acquired_lock = false;
bool m_writes_blocked = false;
C_SaferCond cond_ctx;
MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
- mock_image_ctx, &cond_ctx, 0, features_to_disable);
+ mock_image_ctx, &cond_ctx, 0, features_to_disable, false);
{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
req->send();
C_SaferCond cond_ctx;
MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
mock_image_ctx, &cond_ctx, 0,
- RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+ RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF, false);
{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
req->send();
C_SaferCond cond_ctx;
MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
mock_image_ctx, &cond_ctx, 0,
- RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF);
+ RBD_FEATURE_OBJECT_MAP | RBD_FEATURE_FAST_DIFF, false);
{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
req->send();
C_SaferCond cond_ctx;
MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
- mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING);
+ mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING, false);
{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
req->send();
C_SaferCond cond_ctx;
MockDisableFeaturesRequest *req = new MockDisableFeaturesRequest(
- mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING);
+ mock_image_ctx, &cond_ctx, 0, RBD_FEATURE_JOURNALING, false);
{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
req->send();