When transitioning from a snapshot that had an associated parent
to a snapshot where the parent was flattened and removed, the cache
was being referenced without holding the required lock.
Fixes: http://tracker.ceph.com/issues/21558
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit
16ef97830cde30efb96f7aee69834b3a5c2d5248)
template <typename I>
void RefreshParentRequest<I>::apply() {
+ assert(m_child_image_ctx.cache_lock.is_locked());
+ assert(m_child_image_ctx.snap_lock.is_wlocked());
+ assert(m_child_image_ctx.parent_lock.is_wlocked());
if (m_child_image_ctx.parent != nullptr) {
// closing parent image
m_child_image_ctx.clear_nonexistence_cache();
}
- assert(m_child_image_ctx.snap_lock.is_wlocked());
- assert(m_child_image_ctx.parent_lock.is_wlocked());
std::swap(m_child_image_ctx.parent, m_parent_image_ctx);
}
ldout(cct, 10) << __func__ << dendl;
RWLock::WLocker owner_locker(m_image_ctx.owner_lock);
+ Mutex::Locker cache_locker(m_image_ctx.cache_lock);
RWLock::WLocker snap_locker(m_image_ctx.snap_lock);
RWLock::WLocker parent_locker(m_image_ctx.parent_lock);
if (m_snap_id != CEPH_NOSNAP) {