Message ID | 20201016161426.21715-3-willy@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Killable synchronous BIO submission | expand |
On Fri, Oct 16, 2020 at 05:14:26PM +0100, Matthew Wilcox (Oracle) wrote: > + err = submit_bio_killable(args.bio, mpage_end_io); > + if (unlikely(err)) > + goto err; > + > + SetPageUptodate(page); On success, isn't the page already set up to date through the mpage_end_io() callback?
On Fri, Oct 16, 2020 at 09:56:08AM -0700, Keith Busch wrote: > On Fri, Oct 16, 2020 at 05:14:26PM +0100, Matthew Wilcox (Oracle) wrote: > > + err = submit_bio_killable(args.bio, mpage_end_io); > > + if (unlikely(err)) > > + goto err; > > + > > + SetPageUptodate(page); > > On success, isn't the page already set up to date through the > mpage_end_io() callback? On success, mpage_end_io() isn't called. And we don't want it to be because we don't want the page to be unlocked. I should probably have included a reference to https://lore.kernel.org/linux-fsdevel/20201016160443.18685-1-willy@infradead.org/
diff --git a/fs/mpage.c b/fs/mpage.c index 830e6cc2a9e7..88aba79a1861 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -406,11 +406,30 @@ int mpage_readpage(struct page *page, get_block_t get_block) .nr_pages = 1, .get_block = get_block, }; + int err; args.bio = do_mpage_readpage(&args); - if (args.bio) - mpage_bio_submit(REQ_OP_READ, 0, args.bio); - return 0; + /* + * XXX: We can't tell the difference between "fell back to + * block_read_full_page" and "this was a hole". If we could, + * we'd avoid unlocking the page in do_mpage_readpage() and + * return AOP_UPDATED_PAGE here. + */ + if (!args.bio) + return 0; + bio_set_op_attrs(args.bio, REQ_OP_READ, 0); + guard_bio_eod(args.bio); + err = submit_bio_killable(args.bio, mpage_end_io); + if (unlikely(err)) + goto err; + + SetPageUptodate(page); + return AOP_UPDATED_PAGE; + +err: + if (err != -ERESTARTSYS) + unlock_page(page); + return err; } EXPORT_SYMBOL(mpage_readpage);
A synchronous readpage lets us report the actual errno instead of ineffectively setting PageError. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/mpage.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)