Re: [PATCH] bcache: fix I/O accounting leak in detached_dev_do_request
"Coly Li" <[email protected]> Mon, 26 Jan 2026 15:47:59 +0800
| Newsgroups | org.kernel.vger.linux-bcache,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On Mon, Jan 26, 2026 at 09:42:09AM +0800, [email protected] wrote: > 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_submit_bio(), 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. > > Signed-off-by: Shida Zhang <[email protected]> Can you mention which patch that this one is fixing? It will help a bit for downstream maintainers for the backport stuffs. For this patch, you may add, Acked-by: Coly Li <[email protected]> Thanks for the fixup. Coly Li > --- > 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 >