Message ID | 5bf2b0f08ec25fa649f04c0847722c6b028f660c.1724297388.git.asml.silence@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | implement async block discards/etc. via io_uring | expand |
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@gmail.com> > --- > 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.
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, + iocb->ki_flags & IOCB_NOWAIT); +} EXPORT_SYMBOL_GPL(kiocb_invalidate_pages); /**
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@gmail.com> --- include/linux/pagemap.h | 2 ++ mm/filemap.c | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-)