fs: use pagevec_lookup_range() in page_cache_seek_hole_data()
[sfrench/cifs-2.6.git] / fs / buffer.c
index 5715dac7821fe1c49a1c1ecd8f6b12192f3f1d1c..8770b58ca56979441c21e0fe3652fecb24ee2c83 100644 (file)
@@ -1627,20 +1627,18 @@ void clean_bdev_aliases(struct block_device *bdev, sector_t block, sector_t len)
        struct pagevec pvec;
        pgoff_t index = block >> (PAGE_SHIFT - bd_inode->i_blkbits);
        pgoff_t end;
-       int i;
+       int i, count;
        struct buffer_head *bh;
        struct buffer_head *head;
 
        end = (block + len - 1) >> (PAGE_SHIFT - bd_inode->i_blkbits);
        pagevec_init(&pvec, 0);
-       while (index <= end && pagevec_lookup(&pvec, bd_mapping, index,
-                       min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1)) {
-               for (i = 0; i < pagevec_count(&pvec); i++) {
+       while (pagevec_lookup_range(&pvec, bd_mapping, &index, end,
+                                   PAGEVEC_SIZE)) {
+               count = pagevec_count(&pvec);
+               for (i = 0; i < count; i++) {
                        struct page *page = pvec.pages[i];
 
-                       index = page->index;
-                       if (index > end)
-                               break;
                        if (!page_has_buffers(page))
                                continue;
                        /*
@@ -1670,7 +1668,9 @@ unlock_page:
                }
                pagevec_release(&pvec);
                cond_resched();
-               index++;
+               /* End of range already reached? */
+               if (index > end || !index)
+                       break;
        }
 }
 EXPORT_SYMBOL(clean_bdev_aliases);
@@ -3549,10 +3549,10 @@ page_cache_seek_hole_data(struct inode *inode, loff_t offset, loff_t length,
        pagevec_init(&pvec, 0);
 
        do {
-               unsigned want, nr_pages, i;
+               unsigned nr_pages, i;
 
-               want = min_t(unsigned, end - index, PAGEVEC_SIZE);
-               nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index, want);
+               nr_pages = pagevec_lookup_range(&pvec, inode->i_mapping, &index,
+                                               end - 1, PAGEVEC_SIZE);
                if (nr_pages == 0)
                        break;
 
@@ -3573,10 +3573,6 @@ page_cache_seek_hole_data(struct inode *inode, loff_t offset, loff_t length,
                            lastoff < page_offset(page))
                                goto check_range;
 
-                       /* Searching done if the page index is out of range. */
-                       if (page->index >= end)
-                               goto not_found;
-
                        lock_page(page);
                        if (likely(page->mapping == inode->i_mapping) &&
                            page_has_buffers(page)) {
@@ -3589,12 +3585,6 @@ page_cache_seek_hole_data(struct inode *inode, loff_t offset, loff_t length,
                        unlock_page(page);
                        lastoff = page_offset(page) + PAGE_SIZE;
                }
-
-               /* Searching done if fewer pages returned than wanted. */
-               if (nr_pages < want)
-                       break;
-
-               index = pvec.pages[i - 1]->index + 1;
                pagevec_release(&pvec);
        } while (index < end);