From: Christopher Hoffman Date: Thu, 14 Jul 2022 18:20:29 +0000 (-0600) Subject: librbd: bail from schedule_request_lock() if already lock owner X-Git-Tag: v18.0.0~478^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3527d2c764626c09c5ede80ae844551fd8845756;p=ceph-ci.git 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 --- diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index f8e47a8dfd3..85049fac74f 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)) {