From: Jason Dillaman Date: Wed, 2 Dec 2015 19:27:57 +0000 (-0500) Subject: librbd: correct lock ordering issues discovered by lockdep X-Git-Tag: v10.0.2~119^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=60519e2aa4db89fad0da67818c5bd0d87ae3572f;p=ceph.git librbd: correct lock ordering issues discovered by lockdep Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index 75a82bd0f727..f3f4a9ea50bb 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 b54f48a926dd..7395567ef716 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 e7f08bcb3dde..0b6374763f9d 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(); } }