From: Jason Dillaman Date: Wed, 20 Jan 2016 19:00:22 +0000 (-0500) Subject: librbd: close object map when dynamically disabled X-Git-Tag: v10.0.4~151^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f425ed9b84cd4afe898780ccfb39207ae5aa7f81;p=ceph.git librbd: close object map when dynamically disabled This will handle the case where the object map lock needs to be released. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index b247c1ff96af..013b1d6baa62 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -33,10 +33,9 @@ RefreshRequest::RefreshRequest(I &image_ctx, Context *on_finish) template RefreshRequest::~RefreshRequest() { - delete m_object_map; - // these require state machine to close assert(m_exclusive_lock == nullptr); + assert(m_object_map == nullptr); assert(m_journal == nullptr); assert(m_refresh_parent == nullptr); } @@ -600,7 +599,7 @@ Context *RefreshRequest::handle_v2_shut_down_exclusive_lock(int *result) { template Context *RefreshRequest::send_v2_close_journal() { if (m_journal == nullptr) { - return send_flush_aio(); + return send_v2_close_object_map(); } CephContext *cct = m_image_ctx.cct; @@ -629,6 +628,36 @@ Context *RefreshRequest::handle_v2_close_journal(int *result) { delete m_journal; m_journal = nullptr; + return send_v2_close_object_map(); +} + +template +Context *RefreshRequest::send_v2_close_object_map() { + if (m_object_map == nullptr) { + return send_flush_aio(); + } + + CephContext *cct = m_image_ctx.cct; + ldout(cct, 10) << this << " " << __func__ << dendl; + + // object map was dynamically disabled + using klass = RefreshRequest; + Context *ctx = create_context_callback< + klass, &klass::handle_v2_close_object_map>(this); + m_object_map->close(ctx); + return nullptr; +} + +template +Context *RefreshRequest::handle_v2_close_object_map(int *result) { + CephContext *cct = m_image_ctx.cct; + ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl; + + assert(*result == 0); + assert(m_object_map != nullptr); + delete m_object_map; + m_object_map = nullptr; + return send_flush_aio(); } diff --git a/src/librbd/image/RefreshRequest.h b/src/librbd/image/RefreshRequest.h index 7fb891b0a9fb..8a08696461d5 100644 --- a/src/librbd/image/RefreshRequest.h +++ b/src/librbd/image/RefreshRequest.h @@ -164,6 +164,9 @@ private: Context *send_v2_close_journal(); Context *handle_v2_close_journal(int *result); + Context *send_v2_close_object_map(); + Context *handle_v2_close_object_map(int *result); + Context *send_flush_aio(); Context *handle_flush_aio(int *result);