diff options
author | Goldwyn Rodrigues <rgoldwyn@suse.com> | 2017-06-20 08:05:41 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-06-20 09:12:03 -0400 |
commit | 7fc9e4722435cd8459182c4975f48934f2bb1274 (patch) | |
tree | 44a50b5cfa0379939111ef900f73b4c2657c83a4 /mm/filemap.c | |
parent | fdd2f5b7de2afaa931e5f7bad7bcda35d1f1b479 (diff) |
fs: Introduce filemap_range_has_page()
filemap_range_has_page() return true if the file's mapping has
a page within the range mentioned. This function will be used
to check if a write() call will cause a writeback of previous
writes.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 6f1be573a5e6..9b39a2390b9e 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -376,6 +376,38 @@ int filemap_flush(struct address_space *mapping) | |||
376 | } | 376 | } |
377 | EXPORT_SYMBOL(filemap_flush); | 377 | EXPORT_SYMBOL(filemap_flush); |
378 | 378 | ||
379 | /** | ||
380 | * filemap_range_has_page - check if a page exists in range. | ||
381 | * @mapping: address space within which to check | ||
382 | * @start_byte: offset in bytes where the range starts | ||
383 | * @end_byte: offset in bytes where the range ends (inclusive) | ||
384 | * | ||
385 | * Find at least one page in the range supplied, usually used to check if | ||
386 | * direct writing in this range will trigger a writeback. | ||
387 | */ | ||
388 | bool filemap_range_has_page(struct address_space *mapping, | ||
389 | loff_t start_byte, loff_t end_byte) | ||
390 | { | ||
391 | pgoff_t index = start_byte >> PAGE_SHIFT; | ||
392 | pgoff_t end = end_byte >> PAGE_SHIFT; | ||
393 | struct pagevec pvec; | ||
394 | bool ret; | ||
395 | |||
396 | if (end_byte < start_byte) | ||
397 | return false; | ||
398 | |||
399 | if (mapping->nrpages == 0) | ||
400 | return false; | ||
401 | |||
402 | pagevec_init(&pvec, 0); | ||
403 | if (!pagevec_lookup(&pvec, mapping, index, 1)) | ||
404 | return false; | ||
405 | ret = (pvec.pages[0]->index <= end); | ||
406 | pagevec_release(&pvec); | ||
407 | return ret; | ||
408 | } | ||
409 | EXPORT_SYMBOL(filemap_range_has_page); | ||
410 | |||
379 | static int __filemap_fdatawait_range(struct address_space *mapping, | 411 | static int __filemap_fdatawait_range(struct address_space *mapping, |
380 | loff_t start_byte, loff_t end_byte) | 412 | loff_t start_byte, loff_t end_byte) |
381 | { | 413 | { |