readahead: remove redundant test in shrink_readahead_size_eio()
[safe/jmp/linux-2.6] / mm / filemap.c
index 8275364..2e9bcc2 100644 (file)
@@ -1004,9 +1004,6 @@ EXPORT_SYMBOL(grab_cache_page_nowait);
 static void shrink_readahead_size_eio(struct file *filp,
                                        struct file_ra_state *ra)
 {
-       if (!ra->ra_pages)
-               return;
-
        ra->ra_pages /= 4;
 }
 
@@ -1472,7 +1469,8 @@ static void do_sync_mmap_readahead(struct vm_area_struct *vma,
        if (VM_RandomReadHint(vma))
                return;
 
-       if (VM_SequentialReadHint(vma)) {
+       if (VM_SequentialReadHint(vma) ||
+                       offset - 1 == (ra->prev_pos >> PAGE_CACHE_SHIFT)) {
                page_cache_sync_readahead(mapping, ra, file, offset, 1);
                return;
        }
@@ -1487,13 +1485,15 @@ static void do_sync_mmap_readahead(struct vm_area_struct *vma,
        if (ra->mmap_miss > MMAP_LOTSAMISS)
                return;
 
+       /*
+        * mmap read-around
+        */
        ra_pages = max_sane_readahead(ra->ra_pages);
        if (ra_pages) {
-               pgoff_t start = 0;
-
-               if (offset > ra_pages / 2)
-                       start = offset - ra_pages / 2;
-               do_page_cache_readahead(mapping, file, start, ra_pages);
+               ra->start = max_t(long, 0, offset - ra_pages/2);
+               ra->size = ra_pages;
+               ra->async_size = 0;
+               ra_submit(ra, mapping, file);
        }
 }
 
@@ -1515,7 +1515,8 @@ static void do_async_mmap_readahead(struct vm_area_struct *vma,
        if (ra->mmap_miss > 0)
                ra->mmap_miss--;
        if (PageReadahead(page))
-               page_cache_async_readahead(mapping, ra, file, page, offset, 1);
+               page_cache_async_readahead(mapping, ra, file,
+                                          page, offset, ra->ra_pages);
 }
 
 /**