All radix tree scanning code in truncate paths is interested only in
pages from given range. Convert them to pagevec_lookup_entries_range().

Signed-off-by: Jan Kara <j...@suse.cz>
---
 mm/truncate.c | 52 +++++++++-------------------------------------------
 1 file changed, 9 insertions(+), 43 deletions(-)

diff --git a/mm/truncate.c b/mm/truncate.c
index 9efc82f18b74..31d5c5f3da30 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -289,16 +289,11 @@ void truncate_inode_pages_range(struct address_space 
*mapping,
 
        pagevec_init(&pvec, 0);
        index = start;
-       while (index < end && pagevec_lookup_entries(&pvec, mapping, &index,
-                       min(end - index, (pgoff_t)PAGEVEC_SIZE),
-                       indices)) {
+       while (index < end && pagevec_lookup_entries_range(&pvec, mapping,
+                       &index, end - 1, PAGEVEC_SIZE, indices)) {
                for (i = 0; i < pagevec_count(&pvec); i++) {
                        struct page *page = pvec.pages[i];
 
-                       /* We rely upon deletion not changing page->index */
-                       if (indices[i] >= end)
-                               break;
-
                        if (radix_tree_exceptional_entry(page)) {
                                truncate_exceptional_entry(mapping, indices[i],
                                                           page);
@@ -352,20 +347,14 @@ void truncate_inode_pages_range(struct address_space 
*mapping,
                        put_page(page);
                }
        }
-       /*
-        * If the truncation happened within a single page no pages
-        * will be released, just zeroed, so we can bail out now.
-        */
-       if (start >= end)
-               goto out;
 
        index = start;
-       for ( ; ; ) {
+       while (index < end) {
                pgoff_t lookup_start = index;
 
                cond_resched();
-               if (!pagevec_lookup_entries(&pvec, mapping, &index,
-                       min(end - index, (pgoff_t)PAGEVEC_SIZE), indices)) {
+               if (!pagevec_lookup_entries_range(&pvec, mapping, &index,
+                                       end - 1, PAGEVEC_SIZE, indices)) {
                        /* If all gone from start onwards, we're done */
                        if (lookup_start == start)
                                break;
@@ -373,22 +362,9 @@ void truncate_inode_pages_range(struct address_space 
*mapping,
                        index = start;
                        continue;
                }
-               if (lookup_start == start && indices[0] >= end) {
-                       /* All gone out of hole to be punched, we're done */
-                       pagevec_remove_exceptionals(&pvec);
-                       pagevec_release(&pvec);
-                       break;
-               }
                for (i = 0; i < pagevec_count(&pvec); i++) {
                        struct page *page = pvec.pages[i];
 
-                       /* We rely upon deletion not changing page->index */
-                       if (indices[i] >= end) {
-                               /* Restart punch to make sure all gone */
-                               index = start;
-                               break;
-                       }
-
                        if (radix_tree_exceptional_entry(page)) {
                                truncate_exceptional_entry(mapping, indices[i],
                                                           page);
@@ -499,16 +475,11 @@ unsigned long invalidate_mapping_pages(struct 
address_space *mapping,
        int i;
 
        pagevec_init(&pvec, 0);
-       while (index <= end && pagevec_lookup_entries(&pvec, mapping, &index,
-                       min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1,
-                       indices)) {
+       while (index <= end && pagevec_lookup_entries_range(&pvec, mapping,
+                       &index, end, PAGEVEC_SIZE, indices)) {
                for (i = 0; i < pagevec_count(&pvec); i++) {
                        struct page *page = pvec.pages[i];
 
-                       /* We rely upon deletion not changing page->index */
-                       if (indices[i] > end)
-                               break;
-
                        if (radix_tree_exceptional_entry(page)) {
                                invalidate_exceptional_entry(mapping,
                                                             indices[i], page);
@@ -629,16 +600,11 @@ int invalidate_inode_pages2_range(struct address_space 
*mapping,
 
        pagevec_init(&pvec, 0);
        index = start;
-       while (index <= end && pagevec_lookup_entries(&pvec, mapping, &index,
-                       min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1,
-                       indices)) {
+       while (index <= end && pagevec_lookup_entries_range(&pvec, mapping,
+                       &index, end, PAGEVEC_SIZE, indices)) {
                for (i = 0; i < pagevec_count(&pvec); i++) {
                        struct page *page = pvec.pages[i];
 
-                       /* We rely upon deletion not changing page->index */
-                       if (indices[i] > end)
-                               break;
-
                        if (radix_tree_exceptional_entry(page)) {
                                if (!invalidate_exceptional_entry2(mapping,
                                                        indices[i], page))
-- 
2.12.3

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to