Andreas Gruenbacher <[email protected]> 于2025年11月22日周六 00:13写道: > > On Fri, Nov 21, 2025 at 11:38 AM Christoph Hellwig <[email protected]> wrote: > > On Fri, Nov 21, 2025 at 04:17:40PM +0800, zhangshida wrote: > > > From: Shida Zhang <[email protected]> > > > > > > Signed-off-by: Shida Zhang <[email protected]> > > > --- > > > block/bio.c | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/block/bio.c b/block/bio.c > > > index b3a79285c27..55c2c1a0020 100644 > > > --- a/block/bio.c > > > +++ b/block/bio.c > > > @@ -322,7 +322,7 @@ static struct bio *__bio_chain_endio(struct bio *bio) > > > > > > static void bio_chain_endio(struct bio *bio) > > > { > > > - bio_endio(__bio_chain_endio(bio)); > > > + bio_endio(bio); > > > > I don't see how this can work. bio_chain_endio is called literally > > as the result of calling bio_endio, so you recurse into that. > > Hmm, I don't actually see where: bio_endio() only calls > __bio_chain_endio(), which is fine. > > Once bio_chain_endio() only calls bio_endio(), it can probably be > removed in a follow-up patch. > > Also, loosely related, what I find slightly odd is this code in > __bio_chain_endio(): > > if (bio->bi_status && !parent->bi_status) > parent->bi_status = bio->bi_status; > > I don't think it really matters whether or not parent->bi_status is > already set here? >
>From what I understand, it wants to pass the bi_status to the very last bio because end_io is only called for that final one. This allows the end_io function to know the overall status of the entire I/O chain. > Also, multiple completions can race setting bi_status, so shouldn't we > at least have a WRITE_ONCE() here and in the other places that set > bi_status? > Great, that means I could add two more patches to this series: one to remove __bio_chain_endio() and another to use WRITE_ONCE()? This gives me the feeling of becoming rich overnight, since I'm making so many patch contributions this time! :) Thanks, shida > Thanks, > Andreas >
