diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-03-07 17:28:10 -0900 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-09-17 21:29:06 -0800 |
commit | 347ac669bb8b00defcf04fa3648f2668bdd3d835 (patch) | |
tree | b5f402a017f70daaba57f2f7b211ad2aa2f158b3 | |
parent | e297a6a11c0554aa20dfc48f2d21d11f99872a02 (diff) |
btrfs: simplify btrfs_page_exists_in_range()
this removes the last usage of radix_tree_gang_lookup_slot()
-rw-r--r-- | fs/btrfs/inode.c | 69 |
1 files changed, 7 insertions, 62 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 4421954720b8..75832fd13ac6 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7376,71 +7376,16 @@ out: bool btrfs_page_exists_in_range(struct inode *inode, loff_t start, loff_t end) { - struct radix_tree_root *root = &inode->i_mapping->page_tree; - int found = false; - void **pagep = NULL; - struct page *page = NULL; - int start_idx; - int end_idx; - - start_idx = start >> PAGE_SHIFT; - - /* - * end is the last byte in the last page. end == start is legal - */ - end_idx = end >> PAGE_SHIFT; - - rcu_read_lock(); - - /* Most of the code in this while loop is lifted from - * find_get_page. It's been modified to begin searching from a - * page and return just the first page found in that range. If the - * found idx is less than or equal to the end idx then we know that - * a page exists. If no pages are found or if those pages are - * outside of the range then we're fine (yay!) */ - while (page == NULL && - radix_tree_gang_lookup_slot(root, &pagep, NULL, start_idx, 1)) { - page = radix_tree_deref_slot(pagep); - if (unlikely(!page)) - break; - - if (radix_tree_exception(page)) { - if (radix_tree_deref_retry(page)) { - page = NULL; - continue; - } - /* - * Otherwise, shmem/tmpfs must be storing a swap entry - * here as an exceptional entry: so return it without - * attempting to raise page count. - */ - page = NULL; - break; /* TODO: Is this relevant for this use case? */ - } - - if (!page_cache_get_speculative(page)) { - page = NULL; - continue; - } - - /* - * Has the page moved? - * This is part of the lockless pagecache protocol. See - * include/linux/pagemap.h for details. - */ - if (unlikely(page != *pagep)) { - put_page(page); - page = NULL; - } - } + struct page *page; + int found; - if (page) { - if (page->index <= end_idx) - found = true; + found = __find_get_pages(inode->i_mapping, + start >> PAGE_SHIFT, + end >> PAGE_SHIFT, + 1, &page, NULL, 0) != 0; + if (found) put_page(page); - } - rcu_read_unlock(); return found; } |