[PATCH v2] bcache: fix I/O accounting leak in detached_dev_do_request
[email protected] Mon, 26 Jan 2026 17:28:54 +0800
| Newsgroups | org.kernel.vger.linux-bcache,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Shida Zhang <[email protected]> When a bcache device is in a detached state, iostat can show 100% utilization even after I/O workload completion. This happens because the caller, cached_dev_make_request(), calls bio_start_io_acct() to begin accounting. However, if the bio hits an early exit path in detached_dev_do_request()—either due to an unsupported discard request or a bio_alloc_clone() failure—the corresponding bio_end_io_acct() is never called. This leaves the in-flight counter permanently incremented, causing the kernel to report the device as 100% busy. Add the missing bio_end_io_acct() calls to these error/early-exit paths to ensure proper I/O accounting. Fixes: d62e26b3ffd28 ("block: pass in queue to inflight accounting") Signed-off-by: Shida Zhang <[email protected]> Acked-by: Coly Li <[email protected]> --- drivers/md/bcache/request.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index a02aecac05c..7d855e66a10 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -1107,6 +1107,7 @@ static void detached_dev_do_request(struct bcache_device *d, if (bio_op(orig_bio) == REQ_OP_DISCARD && !bdev_max_discard_sectors(dc->bdev)) { + bio_end_io_acct(orig_bio, start_time); bio_endio(orig_bio); return; } @@ -1114,6 +1115,7 @@ static void detached_dev_do_request(struct bcache_device *d, clone_bio = bio_alloc_clone(dc->bdev, orig_bio, GFP_NOIO, &d->bio_detached); if (!clone_bio) { + bio_end_io_acct(orig_bio, start_time); orig_bio->bi_status = BLK_STS_RESOURCE; bio_endio(orig_bio); return; -- 2.34.1