From: Jason Dillaman Date: Tue, 5 Jan 2016 21:32:41 +0000 (-0500) Subject: librbd: disable copy-on-read when not exclusive lock owner X-Git-Tag: v10.0.2~7^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=14fd1c700621aa155b0436eedb1c337fe72b4af3;p=ceph.git librbd: disable copy-on-read when not exclusive lock owner Fixes: #14167 Backport: infernalis, hammer Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/AioObjectRequest.cc b/src/librbd/AioObjectRequest.cc index 5b3d61656137..e02ebd37f5d1 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 9adf3383ef0c..2fd18dd24495 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 &&