From f83aa24e8d0d21cd0c1af78797ac5adea54cf072 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 24 Jan 2017 10:34:05 -0500 Subject: [PATCH] librbd: race initializing exclusive lock and configuring IO path Signed-off-by: Jason Dillaman --- src/librbd/ExclusiveLock.cc | 32 ++++++++++++++++++++++++++------ src/librbd/ExclusiveLock.h | 16 ++-------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/librbd/ExclusiveLock.cc b/src/librbd/ExclusiveLock.cc index 593537ce0150b..bd136a7aed789 100644 --- a/src/librbd/ExclusiveLock.cc +++ b/src/librbd/ExclusiveLock.cc @@ -83,10 +83,8 @@ void ExclusiveLock::init(uint64_t features, Context *on_init) { ML::set_state_initializing(); } - m_image_ctx.aio_work_queue->block_writes(new C_InitComplete(this, on_init)); - if ((features & RBD_FEATURE_JOURNALING) != 0) { - m_image_ctx.aio_work_queue->set_require_lock_on_read(); - } + m_image_ctx.aio_work_queue->block_writes(new C_InitComplete(this, features, + on_init)); } template @@ -114,8 +112,12 @@ void ExclusiveLock::handle_peer_notification(int r) { } template -void ExclusiveLock::handle_init_complete() { - ldout(m_image_ctx.cct, 10) << dendl; +void ExclusiveLock::handle_init_complete(uint64_t features) { + ldout(m_image_ctx.cct, 10) << "features=" << features << dendl; + + if ((features & RBD_FEATURE_JOURNALING) != 0) { + m_image_ctx.aio_work_queue->set_require_lock_on_read(); + } Mutex::Locker locker(ML::m_lock); ML::set_state_unlocked(); @@ -291,6 +293,24 @@ void ExclusiveLock::post_release_lock_handler(bool shutting_down, int r, on_finish->complete(r); } +template +struct ExclusiveLock::C_InitComplete : public Context { + ExclusiveLock *exclusive_lock; + uint64_t features; + Context *on_init; + + C_InitComplete(ExclusiveLock *exclusive_lock, uint64_t features, + Context *on_init) + : exclusive_lock(exclusive_lock), features(features), on_init(on_init) { + } + virtual void finish(int r) override { + if (r == 0) { + exclusive_lock->handle_init_complete(features); + } + on_init->complete(r); + } +}; + } // namespace librbd template class librbd::ExclusiveLock; diff --git a/src/librbd/ExclusiveLock.h b/src/librbd/ExclusiveLock.h index c03cf6414d2db..9947fe380ad72 100644 --- a/src/librbd/ExclusiveLock.h +++ b/src/librbd/ExclusiveLock.h @@ -77,19 +77,7 @@ private: * @endverbatim */ - struct C_InitComplete : public Context { - ExclusiveLock *exclusive_lock; - Context *on_init; - C_InitComplete(ExclusiveLock *exclusive_lock, Context *on_init) - : exclusive_lock(exclusive_lock), on_init(on_init) { - } - virtual void finish(int r) override { - if (r == 0) { - exclusive_lock->handle_init_complete(); - } - on_init->complete(r); - } - }; + struct C_InitComplete; ImageCtxT& m_image_ctx; Context *m_pre_post_callback = nullptr; @@ -99,7 +87,7 @@ private: int m_acquire_lock_peer_ret_val = 0; - void handle_init_complete(); + void handle_init_complete(uint64_t features); void handle_post_acquiring_lock(int r); void handle_post_acquired_lock(int r); }; -- 2.47.3