On Thu, Aug 22, 2024 at 04:35:53AM +0100, Pavel Begunkov wrote: > kiocb_invalidate_pages() is useful for the write path, however not > everything is backed by kiocb and we want to reuse the function for bio > based discard implementation. Extract and and reuse a new helper called > filemap_invalidate_pages(), which takes a argument indicating whether it > should be non-blocking and might return -EAGAIN. > > Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > --- > include/linux/pagemap.h | 2 ++ > mm/filemap.c | 18 +++++++++++++----- > 2 files changed, 15 insertions(+), 5 deletions(-) > > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h > index d9c7edb6422b..e39c3a7ce33c 100644 > --- a/include/linux/pagemap.h > +++ b/include/linux/pagemap.h > @@ -32,6 +32,8 @@ int invalidate_inode_pages2_range(struct address_space *mapping, > pgoff_t start, pgoff_t end); > int kiocb_invalidate_pages(struct kiocb *iocb, size_t count); > void kiocb_invalidate_post_direct_write(struct kiocb *iocb, size_t count); > +int filemap_invalidate_pages(struct address_space *mapping, > + loff_t pos, loff_t end, bool nowait); > > int write_inode_now(struct inode *, int sync); > int filemap_fdatawrite(struct address_space *); > diff --git a/mm/filemap.c b/mm/filemap.c > index d62150418b91..74baec119239 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -2712,14 +2712,12 @@ int kiocb_write_and_wait(struct kiocb *iocb, size_t count) > } > EXPORT_SYMBOL_GPL(kiocb_write_and_wait); > > -int kiocb_invalidate_pages(struct kiocb *iocb, size_t count) > +int filemap_invalidate_pages(struct address_space *mapping, > + loff_t pos, loff_t end, bool nowait) > { > - struct address_space *mapping = iocb->ki_filp->f_mapping; > - loff_t pos = iocb->ki_pos; > - loff_t end = pos + count - 1; > int ret; > > - if (iocb->ki_flags & IOCB_NOWAIT) { > + if (nowait) { > /* we could block if there are any pages in the range */ > if (filemap_range_has_page(mapping, pos, end)) > return -EAGAIN; > @@ -2738,6 +2736,16 @@ int kiocb_invalidate_pages(struct kiocb *iocb, size_t count) > return invalidate_inode_pages2_range(mapping, pos >> PAGE_SHIFT, > end >> PAGE_SHIFT); > } > + > +int kiocb_invalidate_pages(struct kiocb *iocb, size_t count) > +{ > + struct address_space *mapping = iocb->ki_filp->f_mapping; > + loff_t pos = iocb->ki_pos; > + loff_t end = pos + count - 1; > + > + return filemap_invalidate_pages(mapping, pos, end, No real need for the end variable here. And maybe not for pos either.