From: Venky Shankar Date: Tue, 20 Sep 2016 05:52:48 +0000 (+0530) Subject: librbd: add force option to DisableFeaturesRequest state machine X-Git-Tag: v12.0.1~282^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1dadaeed02d39e26632fe6655f2e8233f23d999c;p=ceph.git librbd: add force option to DisableFeaturesRequest state machine Signed-off-by: Venky Shankar --- diff --git a/src/librbd/Operations.cc b/src/librbd/Operations.cc index 21581eabd5fc..3bfb2da29ae1 100644 --- a/src/librbd/Operations.cc +++ b/src/librbd/Operations.cc @@ -1329,7 +1329,7 @@ void Operations::execute_update_features(uint64_t features, bool enabled, } else { operation::DisableFeaturesRequest *req = new operation::DisableFeaturesRequest( - m_image_ctx, on_finish, journal_op_tid, features); + m_image_ctx, on_finish, journal_op_tid, features, false); req->send(); } } diff --git a/src/librbd/operation/DisableFeaturesRequest.cc b/src/librbd/operation/DisableFeaturesRequest.cc index 504f53057002..3c68f136a093 100644 --- a/src/librbd/operation/DisableFeaturesRequest.cc +++ b/src/librbd/operation/DisableFeaturesRequest.cc @@ -31,8 +31,10 @@ template DisableFeaturesRequest::DisableFeaturesRequest(I &image_ctx, Context *on_finish, uint64_t journal_op_tid, - uint64_t features) - : Request(image_ctx, on_finish, journal_op_tid), m_features(features) { + uint64_t features, + bool force) + : Request(image_ctx, on_finish, journal_op_tid), m_features(features), + m_force(force) { } template @@ -300,7 +302,7 @@ Context *DisableFeaturesRequest::handle_get_mirror_image(int *result) { 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; @@ -324,7 +326,7 @@ void DisableFeaturesRequest::send_disable_mirror_image() { &DisableFeaturesRequest::handle_disable_mirror_image>(this); mirror::DisableRequest *req = - mirror::DisableRequest::create(&image_ctx, false, true, ctx); + mirror::DisableRequest::create(&image_ctx, m_force, true, ctx); req->send(); } diff --git a/src/librbd/operation/DisableFeaturesRequest.h b/src/librbd/operation/DisableFeaturesRequest.h index e9edaf904c50..436e30a13404 100644 --- a/src/librbd/operation/DisableFeaturesRequest.h +++ b/src/librbd/operation/DisableFeaturesRequest.h @@ -20,13 +20,13 @@ class DisableFeaturesRequest : public Request { 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(); @@ -102,6 +102,7 @@ private: */ uint64_t m_features; + bool m_force; bool m_acquired_lock = false; bool m_writes_blocked = false; diff --git a/src/test/librbd/operation/test_mock_DisableFeaturesRequest.cc b/src/test/librbd/operation/test_mock_DisableFeaturesRequest.cc index 4d451c71545e..7ae6d96a872d 100644 --- a/src/test/librbd/operation/test_mock_DisableFeaturesRequest.cc +++ b/src/test/librbd/operation/test_mock_DisableFeaturesRequest.cc @@ -333,7 +333,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, All) { 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(); @@ -380,7 +380,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, ObjectMap) { 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(); @@ -424,7 +424,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, ObjectMapError) { 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(); @@ -467,7 +467,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, Mirroring) { 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(); @@ -510,7 +510,7 @@ TEST_F(TestMockOperationDisableFeaturesRequest, MirroringError) { 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();