From 60519e2aa4db89fad0da67818c5bd0d87ae3572f Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 2 Dec 2015 14:27:57 -0500 Subject: [PATCH] librbd: correct lock ordering issues discovered by lockdep Signed-off-by: Jason Dillaman --- src/librbd/ImageWatcher.cc | 8 +++++--- src/librbd/ImageWatcher.h | 1 + src/test/librbd/test_JournalReplay.cc | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index 75a82bd0f72..f3f4a9ea50b 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -35,8 +35,10 @@ ImageWatcher::ImageWatcher(ImageCtx &image_ctx) : m_image_ctx(image_ctx), m_watch_lock(unique_lock_name("librbd::ImageWatcher::m_watch_lock", this)), m_watch_ctx(*this), m_watch_handle(0), - m_watch_state(WATCH_STATE_UNREGISTERED), m_lock_supported(false), - m_lock_owner_state(LOCK_OWNER_STATE_NOT_LOCKED), + m_watch_state(WATCH_STATE_UNREGISTERED), + m_refresh_lock(unique_lock_name("librbd::ImageWatcher::m_refresh_lock", + this)), + m_lock_supported(false), m_lock_owner_state(LOCK_OWNER_STATE_NOT_LOCKED), m_listeners_lock(unique_lock_name("librbd::ImageWatcher::m_listeners_lock", this)), m_listeners_in_use(false), m_task_finisher(new TaskFinisher(*m_image_ctx.cct)), @@ -131,7 +133,7 @@ int ImageWatcher::refresh() { bool lock_support_changed = false; { - RWLock::WLocker watch_locker(m_watch_lock); + Mutex::Locker refresh_locker(m_refresh_lock); if (m_lock_supported != is_lock_supported()) { m_lock_supported = is_lock_supported(); lock_support_changed = true; diff --git a/src/librbd/ImageWatcher.h b/src/librbd/ImageWatcher.h index b54f48a926d..7395567ef71 100644 --- a/src/librbd/ImageWatcher.h +++ b/src/librbd/ImageWatcher.h @@ -228,6 +228,7 @@ private: uint64_t m_watch_handle; WatchState m_watch_state; + Mutex m_refresh_lock; bool m_lock_supported; LockOwnerState m_lock_owner_state; diff --git a/src/test/librbd/test_JournalReplay.cc b/src/test/librbd/test_JournalReplay.cc index e7f08bcb3dd..0b6374763f9 100644 --- a/src/test/librbd/test_JournalReplay.cc +++ b/src/test/librbd/test_JournalReplay.cc @@ -39,11 +39,12 @@ public: Listener listener; ictx->image_watcher->register_listener(&listener); { - Mutex::Locker listener_locker(listener.lock); RWLock::RLocker owner_locker(ictx->owner_lock); while (!ictx->image_watcher->is_lock_owner()) { ictx->owner_lock.put_read(); + listener.lock.Lock(); listener.cond.Wait(listener.lock); + listener.lock.Unlock(); ictx->owner_lock.get_read(); } } -- 2.47.3