From ddd2418363a06b8631c4ce511cfe00a682861844 Mon Sep 17 00:00:00 2001 From: Sun Yuechi Date: Mon, 6 Jul 2026 19:03:59 -0700 Subject: [PATCH] rbd-mirror: take MirrorStatusUpdater lock by value in queue_update_task queue_update_task() took the lock by rvalue reference, so its early returns never released it. In handle_update_task() that left m_lock held across the on_finish->complete() calls; during shutdown a completion can re-enter try_remove_mirror_image_status() and re-lock m_lock, deadlocking. Take the unique_lock by value so it unlocks on every return path. Fixes: https://tracker.ceph.com/issues/78047 Signed-off-by: Sun Yuechi (cherry picked from commit b450195246cfeb7eabcaf8da53a433b98f279fee) --- src/tools/rbd_mirror/MirrorStatusUpdater.cc | 2 +- src/tools/rbd_mirror/MirrorStatusUpdater.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tools/rbd_mirror/MirrorStatusUpdater.cc b/src/tools/rbd_mirror/MirrorStatusUpdater.cc index 497844e4989d..793ba658b459 100644 --- a/src/tools/rbd_mirror/MirrorStatusUpdater.cc +++ b/src/tools/rbd_mirror/MirrorStatusUpdater.cc @@ -277,7 +277,7 @@ void MirrorStatusUpdater::handle_timer_task(int r) { template void MirrorStatusUpdater::queue_update_task( - std::unique_lock&& locker) { + std::unique_lock locker) { if (!m_initialized) { return; } diff --git a/src/tools/rbd_mirror/MirrorStatusUpdater.h b/src/tools/rbd_mirror/MirrorStatusUpdater.h index 4cfbb699e5ff..d9eaf06048d8 100644 --- a/src/tools/rbd_mirror/MirrorStatusUpdater.h +++ b/src/tools/rbd_mirror/MirrorStatusUpdater.h @@ -105,7 +105,7 @@ private: void schedule_timer_task(); void handle_timer_task(int r); - void queue_update_task(std::unique_lock&& locker); + void queue_update_task(std::unique_lock locker); void update_task(int r); void handle_update_task(int r); -- 2.47.3