ext4: use pagevec_lookup_range() in ext4_find_unwritten_pgoff()
[sfrench/cifs-2.6.git] / fs / ext4 / file.c
index 0d7cf0cc9b87562bbc52b17224794d9147208910..7263448097212fba7e0cfbbe2adacbb01d2b1dac 100644 (file)
@@ -311,41 +311,11 @@ static int ext4_dax_fault(struct vm_fault *vmf)
        return ext4_dax_huge_fault(vmf, PE_SIZE_PTE);
 }
 
-/*
- * Handle write fault for VM_MIXEDMAP mappings. Similarly to ext4_dax_fault()
- * handler we check for races agaist truncate. Note that since we cycle through
- * i_mmap_sem, we are sure that also any hole punching that began before we
- * were called is finished by now and so if it included part of the file we
- * are working on, our pte will get unmapped and the check for pte_same() in
- * wp_pfn_shared() fails. Thus fault gets retried and things work out as
- * desired.
- */
-static int ext4_dax_pfn_mkwrite(struct vm_fault *vmf)
-{
-       struct inode *inode = file_inode(vmf->vma->vm_file);
-       struct super_block *sb = inode->i_sb;
-       loff_t size;
-       int ret;
-
-       sb_start_pagefault(sb);
-       file_update_time(vmf->vma->vm_file);
-       down_read(&EXT4_I(inode)->i_mmap_sem);
-       size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       if (vmf->pgoff >= size)
-               ret = VM_FAULT_SIGBUS;
-       else
-               ret = dax_pfn_mkwrite(vmf);
-       up_read(&EXT4_I(inode)->i_mmap_sem);
-       sb_end_pagefault(sb);
-
-       return ret;
-}
-
 static const struct vm_operations_struct ext4_dax_vm_ops = {
        .fault          = ext4_dax_fault,
        .huge_fault     = ext4_dax_huge_fault,
        .page_mkwrite   = ext4_dax_fault,
-       .pfn_mkwrite    = ext4_dax_pfn_mkwrite,
+       .pfn_mkwrite    = ext4_dax_fault,
 };
 #else
 #define ext4_dax_vm_ops        ext4_file_vm_ops
@@ -494,12 +464,11 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,
 
        pagevec_init(&pvec, 0);
        do {
-               int i, num;
+               int i;
                unsigned long nr_pages;
 
-               num = min_t(pgoff_t, end - index, PAGEVEC_SIZE - 1) + 1;
-               nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index,
-                                         (pgoff_t)num);
+               nr_pages = pagevec_lookup_range(&pvec, inode->i_mapping,
+                                       &index, end, PAGEVEC_SIZE);
                if (nr_pages == 0)
                        break;
 
@@ -518,9 +487,6 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,
                                goto out;
                        }
 
-                       if (page->index > end)
-                               goto out;
-
                        lock_page(page);
 
                        if (unlikely(page->mapping != inode->i_mapping)) {
@@ -563,14 +529,10 @@ next:
                        unlock_page(page);
                }
 
-               /* The no. of pages is less than our desired, we are done. */
-               if (nr_pages < num)
-                       break;
-
-               index = pvec.pages[i - 1]->index + 1;
                pagevec_release(&pvec);
        } while (index <= end);
 
+       /* There are no pages upto endoff - that would be a hole in there. */
        if (whence == SEEK_HOLE && lastoff < endoff) {
                found = 1;
                *offset = lastoff;