summaryrefslogtreecommitdiff
path: root/mm/filemap.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2017-09-06 16:21:18 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-06 17:27:26 -0700
commitd72dc8a25afc71ce90ee92bdd77550e9beb85d4d (patch)
treeda47df20fe7bd2672f8368a2545f82e17703820b /mm/filemap.c
parent26b433d0da062d6e19d75350c0171d3cf8ff560d (diff)
downloadlwn-d72dc8a25afc71ce90ee92bdd77550e9beb85d4d.tar.gz
lwn-d72dc8a25afc71ce90ee92bdd77550e9beb85d4d.zip
mm: make pagevec_lookup() update index
Make pagevec_lookup() (and underlying find_get_pages()) update index to the next page where iteration should continue. Most callers want this and also pagevec_lookup_tag() already does this. Link: http://lkml.kernel.org/r/20170726114704.7626-3-jack@suse.cz Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r--mm/filemap.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index dad935769055..ab9011408d81 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -403,7 +403,7 @@ bool filemap_range_has_page(struct address_space *mapping,
return false;
pagevec_init(&pvec, 0);
- if (!pagevec_lookup(&pvec, mapping, index, 1))
+ if (!pagevec_lookup(&pvec, mapping, &index, 1))
return false;
ret = (pvec.pages[0]->index <= end);
pagevec_release(&pvec);
@@ -1569,10 +1569,11 @@ export:
*
* The search returns a group of mapping-contiguous pages with ascending
* indexes. There may be holes in the indices due to not-present pages.
+ * We also update @start to index the next page for the traversal.
*
* find_get_pages() returns the number of pages which were found.
*/
-unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
+unsigned find_get_pages(struct address_space *mapping, pgoff_t *start,
unsigned int nr_pages, struct page **pages)
{
struct radix_tree_iter iter;
@@ -1583,7 +1584,7 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
return 0;
rcu_read_lock();
- radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
+ radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, *start) {
struct page *head, *page;
repeat:
page = radix_tree_deref_slot(slot);
@@ -1625,6 +1626,10 @@ repeat:
}
rcu_read_unlock();
+
+ if (ret)
+ *start = pages[ret - 1]->index + 1;
+
return ret;
}