Skip to content

Commit 07e4407

Browse files
rbd-mirror: release lock before calling m_async_op_tracker.finish_op()
m_async_op_tracker.finish_op() in InstanceReplayer::start_image_replayers may invoke a completion that re-enters code paths that attempt to acquire the same mutex (m_lock), violating the non-recursive lock constraint. This can be fixed by releasing the lock before calling m_async_op_tracker.finish_op(). Fixes: https://tracker.ceph.com/issues/70951 Signed-off-by: VinayBhaskar-V <[email protected]>
1 parent ce19a4e commit 07e4407

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/tools/rbd_mirror/InstanceReplayer.cc

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,12 +370,9 @@ void InstanceReplayer<I>::queue_start_image_replayers() {
370370
}
371371

372372
template <typename I>
373-
void InstanceReplayer<I>::start_image_replayers(int r) {
374-
dout(10) << dendl;
375-
376-
std::lock_guard locker{m_lock};
373+
void InstanceReplayer<I>::start_image_replayers(
374+
const std::unique_lock<ceph::mutex>&) {
377375
if (m_on_shut_down != nullptr) {
378-
m_async_op_tracker.finish_op();
379376
return;
380377
}
381378

@@ -407,7 +404,15 @@ void InstanceReplayer<I>::start_image_replayers(int r) {
407404
m_service_daemon->add_or_update_namespace_attribute(
408405
m_local_io_ctx.get_id(), m_local_io_ctx.get_namespace(),
409406
SERVICE_DAEMON_ERROR_COUNT_KEY, error_count);
407+
}
410408

409+
template <typename I>
410+
void InstanceReplayer<I>::start_image_replayers(int r) {
411+
dout(10) << dendl;
412+
{
413+
std::unique_lock locker{m_lock};
414+
start_image_replayers(locker);
415+
}
411416
m_async_op_tracker.finish_op();
412417
}
413418

src/tools/rbd_mirror/InstanceReplayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ class InstanceReplayer {
118118

119119
void start_image_replayer(ImageReplayer<ImageCtxT> *image_replayer);
120120
void queue_start_image_replayers();
121+
void start_image_replayers(const std::unique_lock<ceph::mutex>&);
121122
void start_image_replayers(int r);
122123

123124
void stop_image_replayer(ImageReplayer<ImageCtxT> *image_replayer,

0 commit comments

Comments
 (0)