From: Sun Yuechi Date: Tue, 7 Jul 2026 02:03:59 +0000 (-0700) Subject: rbd-mirror: take MirrorStatusUpdater lock by value in queue_update_task X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b450195246cfeb7eabcaf8da53a433b98f279fee;p=ceph.git 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 --- diff --git a/src/tools/rbd_mirror/MirrorStatusUpdater.cc b/src/tools/rbd_mirror/MirrorStatusUpdater.cc index 497844e4989..793ba658b45 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 4cfbb699e5f..d9eaf06048d 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);