On Wed, Jul 23, 2025 at 06:18:24PM +0800, Chi Zhiling wrote: > From: Chi Zhiling <chizhiling@xxxxxxxxxx> > > Setting IOCB_NOWAIT in filemap_get_pages() for AIO is only used to > indicate not to block in the filemap_update_page(), with no other purpose. > Moreover, in filemap_read(), IOCB_NOWAIT will be set again for AIO. > > Therefore, adding a parameter to the filemap_update_page function to > explicitly indicate not to block serves the same purpose as indicating > through iocb->ki_flags, thus avoiding modifications to iocb->ki_flags. > > This patch does not change the original logic and is preparation for the > next patch. Passing multiple booleans to a function is an antipattern. Particularly in this case, since we could just pass iocb->ki_flags to the function. But I think there's a less complicated way to do what you want. Just don't call filemap_update_page() if there are uptodate folios in the batch: +++ b/mm/filemap.c @@ -2616,9 +2616,10 @@ static int filemap_get_pages(struct kiocb *iocb, size_t count, goto err; } if (!folio_test_uptodate(folio)) { - if ((iocb->ki_flags & IOCB_WAITQ) && - folio_batch_count(fbatch) > 1) - iocb->ki_flags |= IOCB_NOWAIT; + if (folio_batch_count(fbatch) > 1) { + err = -EAGAIN; + goto err; + } err = filemap_update_page(iocb, mapping, count, folio, need_uptodate); if (err)