[v2 for-next 0/3] block: delay support for error injection
From: Md Haris Iqbal
Date: Sat Aug 29 2026 - 21:20:31 EST
Error injection can only fail a bio today. This adds a delay_us option so
that a rule can hold a bio back first, to model a slow device.
The delay happens above the driver, so it is invisible to the I/O
statistics and never reaches the blk-mq timeout handler or SCSI error
handling. What it does exercise is the code waiting above the block
layer: io_uring cancellation, hung task detection, and filesystem or
userspace timeouts.
Two things are worth a look. A delayed bio is marked with a new
BIO_ERROR_INJECTED bio flag, so the rules are not applied to it again and
it can never pick up a status from another rule. Resubmitting it below the
injection hook is not enough on its own, because a bio is split below the
hook and the remainder is resubmitted above it. And holding a bio back
reorders it against bios submitted later, which breaks sequential write
ordering on zoned devices. Both are documented in patch 3.
Patch 1 is a prep cleanup. It moves the rejection of an unknown status
tag into the parser, because patch 2 makes a rule without a status valid.
v1: https://lore.kernel.org/linux-block/20260827000115.128093-1-haris.iqbal@xxxxxxxxx/
Changes since v1:
- Add the BIO_ERROR_INJECTED bio flag. v1 only resubmitted a delayed bio
below the injection hook, which left the remainder of a split going
through the hook and matching the same rule again, so a bio was held
once per split instead of once.
- Patch 1: tag_to_blk_status() returns an error and passes the status back
through a pointer, instead of returning BLK_STS_OK for both the "OK" tag
and an unknown one. A delay-only rule has no status, so the two have to
be told apart.
- Documentation: a delayed bio is held once rather than once per split.
Tested in a VM.
Md Haris Iqbal (3):
block: reject unknown status tags in error injection rules
block: allow error injection rules to delay bios
Documentation: block: document error injection delays
Documentation/block/error-injection.rst | 58 ++++++++-
block/blk-core.c | 27 ++--
block/blk.h | 3 +-
block/error-injection.c | 165 +++++++++++++++++++++---
block/error-injection.h | 1 +
include/linux/blk_types.h | 1 +
6 files changed, 222 insertions(+), 33 deletions(-)
--
2.53.0