Re: [PATCH 1/9] block: fix data loss and stale date exposure problems during append write
Andreas Gruenbacher <[email protected]>
| Newsgroups | dev.linux.lists.gfs2,dev.linux.lists.ntfs3,dev.linux.lists.nvdimm,dev.linux.lists.virtualization,org.infradead.lists.linux-nvme,org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-xfs |
|---|---|
| Message-ID | <CAHc6FU7NpnmbOGZB8Z7VwOBoZLm8jZkcAk_2yPANy9=DYS67-A@mail.gmail.com> |
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? 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? Thanks, Andreas