[PATCH] dm clone: balance ios_in_flight on fail-mode I/O kills

Samuel Moelius <[email protected]>
Newsgroups dev.linux.lists.dm-devel,org.kernel.vger.linux-kernel
Message-ID <20260609001927.1235749.07e5479ceb80.dm-clone-fail-mode-ios-in-flight-leak@trailofbits.com>
dm-clone increments ios_in_flight before mapping a bio.  When the target
is in fail mode, map() returns DM_MAPIO_KILL and the device-mapper core
completes the bio without calling the target end_io hook.

That leaves ios_in_flight permanently elevated for each killed bio. The
target can then wait for in-flight I/O that will never complete.

Drop the ios_in_flight reference before returning DM_MAPIO_KILL from the
fail-mode path.

Assisted-by: Codex:gpt-5.5-cyber-preview
Signed-off-by: Samuel Moelius <[email protected]>
---
 drivers/md/dm-clone-target.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/md/dm-clone-target.c b/drivers/md/dm-clone-target.c
index c0f9b93983d4..701e03dc2685 100644
--- a/drivers/md/dm-clone-target.c
+++ b/drivers/md/dm-clone-target.c
@@ -1316,11 +1316,11 @@ static int clone_map(struct dm_target *ti, struct bio *bio)
 	struct clone *clone = ti->private;
 	unsigned long region_nr;
 
-	atomic_inc(&clone->ios_in_flight);
-
 	if (unlikely(get_clone_mode(clone) == CM_FAIL))
 		return DM_MAPIO_KILL;
 
+	atomic_inc(&clone->ios_in_flight);
+
 	/*
 	 * REQ_PREFLUSH bios carry no data:
 	 *
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.