]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: correct lock ordering issues discovered by lockdep
authorJason Dillaman <dillaman@redhat.com>
Wed, 2 Dec 2015 19:27:57 +0000 (14:27 -0500)
committerJason Dillaman <dillaman@redhat.com>
Wed, 2 Dec 2015 19:28:06 +0000 (14:28 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ImageWatcher.cc
src/librbd/ImageWatcher.h
src/test/librbd/test_JournalReplay.cc

index 75a82bd0f7270a741d9ab01672420b9fb1a28fac..f3f4a9ea50bbf80adb8b617eb970e1e67bfd74d8 100644 (file)
@@ -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<Task>(*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;
index b54f48a926dd79cc8075dc10653d065962819ed8..7395567ef716c388be2c65e65835995cca49d03f 100644 (file)
@@ -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;
index e7f08bcb3dde6b0b7b0c655caab47cef065dc956..0b6374763f9d87402ee0a08283c212dd5d6dc055 100644 (file)
@@ -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();
       }
     }