From: Jason Dillaman Date: Thu, 7 May 2015 16:35:36 +0000 (-0400) Subject: librbd: don't hold owner_lock for write during flush X-Git-Tag: v9.0.2~15^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2b6d0633d5c89de3a557cdd72621dfc19f0540de;p=ceph.git 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 --- diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index a8a7c2114d8..82e45db1693 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; }