From: Jason Dillaman Date: Mon, 9 Mar 2015 13:55:08 +0000 (-0400) Subject: librbd: hold write snap_lock when refreshing object map X-Git-Tag: v0.94~47^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9dcd517ff9495ff917b83a761a03ec01cf9f2932;p=ceph.git librbd: hold write snap_lock when refreshing object map If the object map needs to be invalidated, a write lock on snap_lock is required. Fixes: #11067 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index d4aa428efe9a..142c2db84233 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -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); } diff --git a/src/librbd/ObjectMap.cc b/src/librbd/ObjectMap.cc index 4aa3c3b65921..27d1db7a23d5 100644 --- a/src/librbd/ObjectMap.cc +++ b/src/librbd/ObjectMap.cc @@ -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) {