Skip to content

Commit a12c883

Browse files
isilenceaxboe
authored andcommitted
filemap: introduce filemap_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 <[email protected]> Link: https://lore.kernel.org/r/f81374b52c92d0dce0f01a279d1eed42b54056aa.1726072086.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <[email protected]>
1 parent a6ccb48 commit a12c883

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

include/linux/pagemap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
3232
pgoff_t start, pgoff_t end);
3333
int kiocb_invalidate_pages(struct kiocb *iocb, size_t count);
3434
void kiocb_invalidate_post_direct_write(struct kiocb *iocb, size_t count);
35+
int filemap_invalidate_pages(struct address_space *mapping,
36+
loff_t pos, loff_t end, bool nowait);
3537

3638
int write_inode_now(struct inode *, int sync);
3739
int filemap_fdatawrite(struct address_space *);

mm/filemap.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2712,14 +2712,12 @@ int kiocb_write_and_wait(struct kiocb *iocb, size_t count)
27122712
}
27132713
EXPORT_SYMBOL_GPL(kiocb_write_and_wait);
27142714

2715-
int kiocb_invalidate_pages(struct kiocb *iocb, size_t count)
2715+
int filemap_invalidate_pages(struct address_space *mapping,
2716+
loff_t pos, loff_t end, bool nowait)
27162717
{
2717-
struct address_space *mapping = iocb->ki_filp->f_mapping;
2718-
loff_t pos = iocb->ki_pos;
2719-
loff_t end = pos + count - 1;
27202718
int ret;
27212719

2722-
if (iocb->ki_flags & IOCB_NOWAIT) {
2720+
if (nowait) {
27232721
/* we could block if there are any pages in the range */
27242722
if (filemap_range_has_page(mapping, pos, end))
27252723
return -EAGAIN;
@@ -2738,6 +2736,15 @@ int kiocb_invalidate_pages(struct kiocb *iocb, size_t count)
27382736
return invalidate_inode_pages2_range(mapping, pos >> PAGE_SHIFT,
27392737
end >> PAGE_SHIFT);
27402738
}
2739+
2740+
int kiocb_invalidate_pages(struct kiocb *iocb, size_t count)
2741+
{
2742+
struct address_space *mapping = iocb->ki_filp->f_mapping;
2743+
2744+
return filemap_invalidate_pages(mapping, iocb->ki_pos,
2745+
iocb->ki_pos + count - 1,
2746+
iocb->ki_flags & IOCB_NOWAIT);
2747+
}
27412748
EXPORT_SYMBOL_GPL(kiocb_invalidate_pages);
27422749

27432750
/**

0 commit comments

Comments
 (0)