From: Yite Gu Date: Tue, 25 Mar 2025 03:05:09 +0000 (+0800) Subject: blk/kerneldevice: fix invalid iterator usage after erase in discard_queued traversal X-Git-Tag: v19.2.3~210^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=04b9a327f3d00e970d226b7b1f6a53a1dcc3e374;p=ceph.git 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) --- 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