]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: hold write snap_lock when refreshing object map
authorJason Dillaman <dillaman@redhat.com>
Mon, 9 Mar 2015 13:55:08 +0000 (09:55 -0400)
committerJosh Durgin <jdurgin@redhat.com>
Tue, 10 Mar 2015 22:41:45 +0000 (15:41 -0700)
If the object map needs to be invalidated, a write lock on
snap_lock is required.

Fixes: #11067
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/ImageWatcher.cc
src/librbd/ObjectMap.cc

index d4aa428efe9ace9c53a4ce4b47a0cb96010e19ce..142c2db84233df8693bcb4cd10bf49d415b033e6 100644 (file)
@@ -307,7 +307,7 @@ int ImageWatcher::lock() {
       unlock();
       return r;
     }
-    RWLock::RLocker l2(m_image_ctx.snap_lock);
+    RWLock::WLocker l2(m_image_ctx.snap_lock);
     m_image_ctx.object_map.refresh(CEPH_NOSNAP);
   }
 
index 4aa3c3b65921e08a26ea824534e305bee89a11ab..27d1db7a23d518ad5c18183045d7de9046a8577f 100644 (file)
@@ -147,7 +147,7 @@ bool ObjectMap::object_may_exist(uint64_t object_no) const
 
 void ObjectMap::refresh(uint64_t snap_id)
 {
-  assert(m_image_ctx.snap_lock.is_locked());
+  assert(m_image_ctx.snap_lock.is_wlocked());
   RWLock::WLocker l(m_image_ctx.object_map_lock);
 
   uint64_t features;
@@ -173,10 +173,10 @@ void ObjectMap::refresh(uint64_t snap_id)
     m_object_map.clear();
     return;
   }
-  
+
   ldout(cct, 20) << "refreshed object map: " << m_object_map.size()
                  << dendl;
-  
+
   uint64_t num_objs = Striper::get_num_objects(
     m_image_ctx.layout, m_image_ctx.get_image_size(snap_id));
   if (m_object_map.size() != num_objs) {