From 14fd1c700621aa155b0436eedb1c337fe72b4af3 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 5 Jan 2016 16:32:41 -0500 Subject: [PATCH] librbd: disable copy-on-read when not exclusive lock owner Fixes: #14167 Backport: infernalis, hammer Signed-off-by: Jason Dillaman --- src/librbd/AioObjectRequest.cc | 13 ++++++++++--- src/librbd/CopyupRequest.cc | 7 +------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/librbd/AioObjectRequest.cc b/src/librbd/AioObjectRequest.cc index 5b3d6165613..e02ebd37f5d 100644 --- a/src/librbd/AioObjectRequest.cc +++ b/src/librbd/AioObjectRequest.cc @@ -84,9 +84,12 @@ namespace librbd { } static inline bool is_copy_on_read(ImageCtx *ictx, librados::snap_t snap_id) { + assert(ictx->owner_lock.is_locked()); assert(ictx->snap_lock.is_locked()); - return (ictx->clone_copy_on_read) && - (!ictx->read_only) && (snap_id == CEPH_NOSNAP); + return (ictx->clone_copy_on_read && + !ictx->read_only && snap_id == CEPH_NOSNAP && + (ictx->exclusive_lock == nullptr || + ictx->exclusive_lock->is_lock_owner())); } /** read **/ @@ -132,6 +135,7 @@ namespace librbd { // This is the step to read from parent if (!m_tried_parent && r == -ENOENT) { { + RWLock::RLocker owner_locker(m_ictx->owner_lock); RWLock::RLocker snap_locker(m_ictx->snap_lock); RWLock::RLocker parent_locker(m_ictx->parent_lock); if (m_ictx->parent == NULL) { @@ -240,9 +244,12 @@ namespace librbd { void AioObjectRead::send_copyup() { { + RWLock::RLocker owner_locker(m_ictx->owner_lock); RWLock::RLocker snap_locker(m_ictx->snap_lock); RWLock::RLocker parent_locker(m_ictx->parent_lock); - if (!compute_parent_extents()) { + if (!compute_parent_extents() || + (m_ictx->exclusive_lock != nullptr && + !m_ictx->exclusive_lock->is_lock_owner())) { return; } } diff --git a/src/librbd/CopyupRequest.cc b/src/librbd/CopyupRequest.cc index 9adf3383ef0..2fd18dd2449 100644 --- a/src/librbd/CopyupRequest.cc +++ b/src/librbd/CopyupRequest.cc @@ -277,12 +277,7 @@ private: RWLock::RLocker snap_locker(m_ictx->snap_lock); if (m_ictx->object_map != nullptr) { bool copy_on_read = m_pending_requests.empty(); - if (!m_ictx->exclusive_lock->is_lock_owner()) { - ldout(m_ictx->cct, 20) << "exclusive lock not held for copyup request" - << dendl; - assert(copy_on_read); - return true; - } + assert(m_ictx->exclusive_lock->is_lock_owner()); RWLock::WLocker object_map_locker(m_ictx->object_map_lock); if (copy_on_read && -- 2.47.3