* [PATCH v2] block: fix partial zone append completion handling in req_bio_endio()
@ 2024-01-10 9:29 Damien Le Moal
2024-01-10 9:38 ` Hannes Reinecke
2024-01-10 16:01 ` Jens Axboe
0 siblings, 2 replies; 3+ messages in thread
From: Damien Le Moal @ 2024-01-10 9:29 UTC (permalink / raw)
To: Jens Axboe, linux-block
Partial completions of zone append request is not allowed but if a zone
append completion indicates a number of completed bytes different from
the original BIO size, only the BIO status is set to error. This leads
to bio_advance() not setting the BIO size to 0 and thus to not call
bio_endio() at the end of req_bio_endio().
Make sure a partially completed zone append is failed and completed
immediately by forcing the completed number of bytes (nbytes) to be
equal to the BIO size, thus ensuring that bio_endio() is called.
Fixes: 297db731847e ("block: fix req_bio_endio append error handling")
Cc: stable@kernel.vger.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
Changes from v1:
- Fixed typo in commit message
- Added review tags
block/blk-mq.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/block/blk-mq.c b/block/blk-mq.c
index c11c97afa0bc..cd59b172c8fc 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -772,11 +772,16 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
/*
* Partial zone append completions cannot be supported as the
* BIO fragments may end up not being written sequentially.
+ * For such case, force the completed nbytes to be equal to
+ * the BIO size so that bio_advance() sets the BIO remaining
+ * size to 0 and we end up calling bio_endio() before returning.
*/
- if (bio->bi_iter.bi_size != nbytes)
+ if (bio->bi_iter.bi_size != nbytes) {
bio->bi_status = BLK_STS_IOERR;
- else
+ nbytes = bio->bi_iter.bi_size;
+ } else {
bio->bi_iter.bi_sector = rq->__sector;
+ }
}
bio_advance(bio, nbytes);
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] block: fix partial zone append completion handling in req_bio_endio()
2024-01-10 9:29 [PATCH v2] block: fix partial zone append completion handling in req_bio_endio() Damien Le Moal
@ 2024-01-10 9:38 ` Hannes Reinecke
2024-01-10 16:01 ` Jens Axboe
1 sibling, 0 replies; 3+ messages in thread
From: Hannes Reinecke @ 2024-01-10 9:38 UTC (permalink / raw)
To: Damien Le Moal, Jens Axboe, linux-block
On 1/10/24 10:29, Damien Le Moal wrote:
> Partial completions of zone append request is not allowed but if a zone
> append completion indicates a number of completed bytes different from
> the original BIO size, only the BIO status is set to error. This leads
> to bio_advance() not setting the BIO size to 0 and thus to not call
> bio_endio() at the end of req_bio_endio().
>
> Make sure a partially completed zone append is failed and completed
> immediately by forcing the completed number of bytes (nbytes) to be
> equal to the BIO size, thus ensuring that bio_endio() is called.
>
> Fixes: 297db731847e ("block: fix req_bio_endio append error handling")
> Cc: stable@kernel.vger.org
> Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> ---
> Changes from v1:
> - Fixed typo in commit message
> - Added review tags
>
> block/blk-mq.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index c11c97afa0bc..cd59b172c8fc 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -772,11 +772,16 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
> /*
> * Partial zone append completions cannot be supported as the
> * BIO fragments may end up not being written sequentially.
> + * For such case, force the completed nbytes to be equal to
> + * the BIO size so that bio_advance() sets the BIO remaining
> + * size to 0 and we end up calling bio_endio() before returning.
> */
> - if (bio->bi_iter.bi_size != nbytes)
> + if (bio->bi_iter.bi_size != nbytes) {
> bio->bi_status = BLK_STS_IOERR;
> - else
> + nbytes = bio->bi_iter.bi_size;
> + } else {
> bio->bi_iter.bi_sector = rq->__sector;
> + }
> }
>
> bio_advance(bio, nbytes);
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] block: fix partial zone append completion handling in req_bio_endio()
2024-01-10 9:29 [PATCH v2] block: fix partial zone append completion handling in req_bio_endio() Damien Le Moal
2024-01-10 9:38 ` Hannes Reinecke
@ 2024-01-10 16:01 ` Jens Axboe
1 sibling, 0 replies; 3+ messages in thread
From: Jens Axboe @ 2024-01-10 16:01 UTC (permalink / raw)
To: linux-block, Damien Le Moal
On Wed, 10 Jan 2024 18:29:42 +0900, Damien Le Moal wrote:
> Partial completions of zone append request is not allowed but if a zone
> append completion indicates a number of completed bytes different from
> the original BIO size, only the BIO status is set to error. This leads
> to bio_advance() not setting the BIO size to 0 and thus to not call
> bio_endio() at the end of req_bio_endio().
>
> Make sure a partially completed zone append is failed and completed
> immediately by forcing the completed number of bytes (nbytes) to be
> equal to the BIO size, thus ensuring that bio_endio() is called.
>
> [...]
Applied, thanks!
[1/1] block: fix partial zone append completion handling in req_bio_endio()
commit: 748dc0b65ec2b4b7b3dbd7befcc4a54fdcac7988
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-01-10 16:01 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-10 9:29 [PATCH v2] block: fix partial zone append completion handling in req_bio_endio() Damien Le Moal
2024-01-10 9:38 ` Hannes Reinecke
2024-01-10 16:01 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox