mirror of https://gitee.com/openkylin/linux.git
[PATCH] Add find_get_pages_contig(): contiguous variant of find_get_pages()
find_get_pages_contig() will break out if we hit a hole in the page cache. From Andrew Morton, small modifications and documentation by me. Signed-off-by: Jens Axboe <axboe@suse.de>
This commit is contained in:
parent
eb645a24de
commit
ebf43500ef
|
@ -78,6 +78,8 @@ extern struct page * find_or_create_page(struct address_space *mapping,
|
|||
unsigned long index, gfp_t gfp_mask);
|
||||
unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
|
||||
unsigned int nr_pages, struct page **pages);
|
||||
unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
|
||||
unsigned int nr_pages, struct page **pages);
|
||||
unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
|
||||
int tag, unsigned int nr_pages, struct page **pages);
|
||||
|
||||
|
|
32
mm/filemap.c
32
mm/filemap.c
|
@ -697,6 +697,38 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* find_get_pages_contig - gang contiguous pagecache lookup
|
||||
* @mapping: The address_space to search
|
||||
* @index: The starting page index
|
||||
* @nr_pages: The maximum number of pages
|
||||
* @pages: Where the resulting pages are placed
|
||||
*
|
||||
* find_get_pages_contig() works exactly like find_get_pages(), except
|
||||
* that the returned number of pages are guaranteed to be contiguous.
|
||||
*
|
||||
* find_get_pages_contig() returns the number of pages which were found.
|
||||
*/
|
||||
unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t index,
|
||||
unsigned int nr_pages, struct page **pages)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int ret;
|
||||
|
||||
read_lock_irq(&mapping->tree_lock);
|
||||
ret = radix_tree_gang_lookup(&mapping->page_tree,
|
||||
(void **)pages, index, nr_pages);
|
||||
for (i = 0; i < ret; i++) {
|
||||
if (pages[i]->mapping == NULL || pages[i]->index != index)
|
||||
break;
|
||||
|
||||
page_cache_get(pages[i]);
|
||||
index++;
|
||||
}
|
||||
read_unlock_irq(&mapping->tree_lock);
|
||||
return i;
|
||||
}
|
||||
|
||||
/*
|
||||
* Like find_get_pages, except we only return pages which are tagged with
|
||||
* `tag'. We update *index to index the next page for the traversal.
|
||||
|
|
Loading…
Reference in New Issue