From 28fa8684c1fc1c05943625ef4895657af4a6d0a0 Mon Sep 17 00:00:00 2001 From: Christopher Hoffman Date: Thu, 14 Jul 2022 12:20:29 -0600 Subject: [PATCH] librbd: bail from schedule_request_lock() if already lock owner Race condition may be hit if there are multiple pending locks for the same image and pending callbacks. Abort exclusive lock process if already exclusive lock owner. Fixes: https://tracker.ceph.com/issues/56549 Signed-off-by: Christopher Hoffman (cherry picked from commit 3527d2c764626c09c5ede80ae844551fd8845756) --- src/librbd/ImageWatcher.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index f4fdc54b90d11..f5a27e0c2bbaf 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -572,12 +572,11 @@ template void ImageWatcher::schedule_request_lock(bool use_timer, int timer_delay) { ceph_assert(ceph_mutex_is_locked(m_image_ctx.owner_lock)); - if (m_image_ctx.exclusive_lock == nullptr) { - // exclusive lock dynamically disabled via image refresh + // see notify_request_lock() + if (m_image_ctx.exclusive_lock == nullptr || + m_image_ctx.exclusive_lock->is_lock_owner()) { return; } - ceph_assert(m_image_ctx.exclusive_lock && - !m_image_ctx.exclusive_lock->is_lock_owner()); std::shared_lock watch_locker{this->m_watch_lock}; if (this->is_registered(this->m_watch_lock)) { -- 2.39.5