# Re: \[PATCH 03/16\] block: add a bio\_prepare\_reissue helper

- From: Darrick J. Wong \<djwong@kernel.org\>
- Date: 2026-09-09 16:05:02 
- List: linux-block
- Page: https://ratatoskr.run/linux-block/2026/09/17540813
- Thread: https://ratatoskr.run/linux-block/2026/09/17535462/t.md

```text
On Wed, Sep 09, 2026 at 09:08:52AM +0300, Christoph Hellwig wrote:
> Add a helper to a clear a bio for reissue without a lot of the
> pointless clearing and reinitializing done by bio_reset and bio_reuse,
> and keeping the page pinning flag intact.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Looks good to me,
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  block/bio.c         | 20 ++++++++++++++++++++
>  include/linux/bio.h |  1 +
>  2 files changed, 21 insertions(+)
> 
> diff --git a/block/bio.c b/block/bio.c
> index 5792a059ef2a..7f7654e60dd4 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -320,6 +320,26 @@ void bio_reuse(struct bio *bio, blk_opf_t opf)
>  }
>  EXPORT_SYMBOL_GPL(bio_reuse);
>  
> +/**
> + * bio_prepare_reissue - prepare a bio for reuissing the original I/O
> + * @bio:	bio to reuse
> + * @bdev:	block device to use the bio for
> + *
> + * Prepare @bio to be resubmitted to retry the original operation.
> + * The caller must reset bio->bi_iter to the original state.
> + */
> +void bio_prepare_reissue(struct bio *bio, struct block_device *bdev)
> +{
> +	bio->bi_bdev = bdev;
> +	bio_associate_blkg(bio);
> +	bio->bi_flags &=
> +		(BIO_PAGE_PINNED | BIO_CLONED | BIO_QUIET | BIO_REFFED);
> +	bio->bi_status = BLK_STS_OK;
> +	bio->bi_bvec_gap_bit = 0;
> +	atomic_set(&bio->__bi_remaining, 1);
> +}
> +EXPORT_SYMBOL_GPL(bio_prepare_reissue);
> +
>  static struct bio *__bio_chain_endio(struct bio *bio)
>  {
>  	struct bio *parent = bio->bi_private;
> diff --git a/include/linux/bio.h b/include/linux/bio.h
> index 584b6abf6baf..bfa3c0e97b6f 100644
> --- a/include/linux/bio.h
> +++ b/include/linux/bio.h
> @@ -479,6 +479,7 @@ static inline void bio_init_inline(struct bio *bio, struct block_device *bdev,
>  extern void bio_uninit(struct bio *);
>  void bio_reset(struct bio *bio, struct block_device *bdev, blk_opf_t opf);
>  void bio_reuse(struct bio *bio, blk_opf_t opf);
> +void bio_prepare_reissue(struct bio *bio, struct block_device *bdev);
>  void bio_chain(struct bio *, struct bio *);
>  void bio_await(struct bio *bio, void *priv,
>  	       void (*submit)(struct bio *bio, void *priv));
> -- 
> 2.53.0
> 
> 
```
