From 04b9a327f3d00e970d226b7b1f6a53a1dcc3e374 Mon Sep 17 00:00:00 2001 From: Yite Gu Date: Tue, 25 Mar 2025 11:05:09 +0800 Subject: [PATCH] blk/kerneldevice: fix invalid iterator usage after erase in discard_queued traversal fixes: https://tracker.ceph.com/issues/70636 Signed-off-by: Yite Gu (cherry picked from commit f1f0beb3899b8797c727ef09ce87ffc5c6a9531f) --- src/blk/kernel/KernelDevice.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index 64be2466540ff..c0cdd93e11a7b 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -771,11 +771,11 @@ void KernelDevice::_discard_thread(uint64_t tid) // It will also allow threads to finish in a timely manner. constexpr unsigned MAX_LOCAL_DISCARD = 32; unsigned count = 0; - for (auto p = discard_queued.begin(); - p != discard_queued.end() && count < MAX_LOCAL_DISCARD; - ++p, ++count) { - discard_processing.insert(p.get_start(), p.get_len()); - discard_queued.erase(p); + for (auto it = discard_queued.begin(); + it != discard_queued.end() && count < MAX_LOCAL_DISCARD; + ++count) { + discard_processing.insert(it.get_start(), it.get_len()); + it = discard_queued.erase(it); } // there are multiple active threads -> must use a counter instead of a flag -- 2.39.5