From: Jason Dillaman Date: Tue, 24 Jan 2017 15:34:05 +0000 (-0500) Subject: librbd: race initializing exclusive lock and configuring IO path X-Git-Tag: v12.0.0~91^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F13086%2Fhead;p=ceph.git librbd: race initializing exclusive lock and configuring IO path Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/ExclusiveLock.cc b/src/librbd/ExclusiveLock.cc index 593537ce0150..bd136a7aed78 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 c03cf6414d2d..9947fe380ad7 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); };