From 677832ceb24096ddbeaf2d60e0ac72d28c399f02 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 23 Jun 2016 09:23:32 -0400 Subject: [PATCH] librbd: delete ExclusiveLock instance when switching to snapshot Fixes: http://tracker.ceph.com/issues/16446 Signed-off-by: Jason Dillaman --- src/librbd/image/SetSnapRequest.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/librbd/image/SetSnapRequest.cc b/src/librbd/image/SetSnapRequest.cc index 44da6730bd7b..e00ebeb4ac6b 100644 --- a/src/librbd/image/SetSnapRequest.cc +++ b/src/librbd/image/SetSnapRequest.cc @@ -136,13 +136,12 @@ Context *SetSnapRequest::handle_block_writes(int *result) { template Context *SetSnapRequest::send_shut_down_exclusive_lock(int *result) { - ExclusiveLock *exclusive_lock; { RWLock::RLocker snap_locker(m_image_ctx.snap_lock); - exclusive_lock = m_image_ctx.exclusive_lock; + m_exclusive_lock = m_image_ctx.exclusive_lock; } - if (exclusive_lock == nullptr) { + if (m_exclusive_lock == nullptr) { return send_refresh_parent(result); } @@ -152,7 +151,7 @@ Context *SetSnapRequest::send_shut_down_exclusive_lock(int *result) { using klass = SetSnapRequest; Context *ctx = create_context_callback< klass, &klass::handle_shut_down_exclusive_lock>(this); - exclusive_lock->shut_down(ctx); + m_exclusive_lock->shut_down(ctx); return nullptr; } @@ -327,11 +326,13 @@ int SetSnapRequest::apply() { RWLock::WLocker snap_locker(m_image_ctx.snap_lock); RWLock::WLocker parent_locker(m_image_ctx.parent_lock); if (m_snap_id != CEPH_NOSNAP) { + assert(m_image_ctx.exclusive_lock == nullptr); int r = m_image_ctx.snap_set(m_snap_name); if (r < 0) { return r; } } else { + std::swap(m_image_ctx.exclusive_lock, m_exclusive_lock); m_image_ctx.snap_unset(); } @@ -339,7 +340,6 @@ int SetSnapRequest::apply() { m_refresh_parent->apply(); } - std::swap(m_exclusive_lock, m_image_ctx.exclusive_lock); std::swap(m_object_map, m_image_ctx.object_map); return 0; } -- 2.47.3