diff options
author | Jens Axboe <axboe@kernel.dk> | 2021-10-28 08:47:05 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-12-03 14:51:26 -0700 |
commit | 4bdcd1dd4d2f973b1a89fb20ba720d879e9e506b (patch) | |
tree | 011d7dac62f5256fa9a320bd91fb5a1a59546307 /include/linux/pagemap.h | |
parent | a08ed9aae8a3d2321ef378d6581cc87a3fb75b44 (diff) | |
download | linux-stable-4bdcd1dd4d2f973b1a89fb20ba720d879e9e506b.tar.gz linux-stable-4bdcd1dd4d2f973b1a89fb20ba720d879e9e506b.tar.bz2 linux-stable-4bdcd1dd4d2f973b1a89fb20ba720d879e9e506b.zip |
mm: move filemap_range_needs_writeback() into header
No functional changes in this patch, just in preparation for efficiently
calling this light function from the block O_DIRECT handling.
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'include/linux/pagemap.h')
-rw-r--r-- | include/linux/pagemap.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 605246452305..274a0710f2c5 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -963,6 +963,35 @@ static inline int add_to_page_cache(struct page *page, int __filemap_add_folio(struct address_space *mapping, struct folio *folio, pgoff_t index, gfp_t gfp, void **shadowp); +bool filemap_range_has_writeback(struct address_space *mapping, + loff_t start_byte, loff_t end_byte); + +/** + * filemap_range_needs_writeback - check if range potentially needs writeback + * @mapping: address space within which to check + * @start_byte: offset in bytes where the range starts + * @end_byte: offset in bytes where the range ends (inclusive) + * + * Find at least one page in the range supplied, usually used to check if + * direct writing in this range will trigger a writeback. Used by O_DIRECT + * read/write with IOCB_NOWAIT, to see if the caller needs to do + * filemap_write_and_wait_range() before proceeding. + * + * Return: %true if the caller should do filemap_write_and_wait_range() before + * doing O_DIRECT to a page in this range, %false otherwise. + */ +static inline bool filemap_range_needs_writeback(struct address_space *mapping, + loff_t start_byte, + loff_t end_byte) +{ + if (!mapping->nrpages) + return false; + if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY) && + !mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) + return false; + return filemap_range_has_writeback(mapping, start_byte, end_byte); +} + /** * struct readahead_control - Describes a readahead request. * |