From 2b6d0633d5c89de3a557cdd72621dfc19f0540de Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 7 May 2015 12:35:36 -0400 Subject: [PATCH] librbd: don't hold owner_lock for write during flush The various IO callback codepaths will attempt to take the lock, which will result in deadlock since the flush cannot complete. Backport: hammer Fixes: #11537 Signed-off-by: Jason Dillaman Conflicts: src/librbd/ImageWatcher.cc --- src/librbd/ImageWatcher.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index a8a7c2114d881..82e45db169378 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -376,21 +376,21 @@ bool ImageWatcher::release_lock() return false; } prepare_unlock(); - m_image_ctx.owner_lock.put_write(); m_image_ctx.cancel_async_requests(); m_image_ctx.flush_async_operations(); - m_image_ctx.owner_lock.get_write(); - - if (!is_lock_owner()) { - return false; - } { - RWLock::WLocker l2(m_image_ctx.md_lock); + RWLock::RLocker owner_locker(m_image_ctx.owner_lock); + RWLock::WLocker md_locker(m_image_ctx.md_lock); librbd::_flush(&m_image_ctx); } + m_image_ctx.owner_lock.get_write(); + if (!is_lock_owner()) { + return false; + } + unlock(); return true; } -- 2.39.5