diff options
Diffstat (limited to 'mm/readahead.c')
-rw-r--r-- | mm/readahead.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/mm/readahead.c b/mm/readahead.c index aa1aa2345235..dfa9a1a03a11 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/fs.h> | 11 | #include <linux/fs.h> |
12 | #include <linux/gfp.h> | ||
12 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
13 | #include <linux/module.h> | 14 | #include <linux/module.h> |
14 | #include <linux/blkdev.h> | 15 | #include <linux/blkdev.h> |
@@ -501,6 +502,12 @@ void page_cache_sync_readahead(struct address_space *mapping, | |||
501 | if (!ra->ra_pages) | 502 | if (!ra->ra_pages) |
502 | return; | 503 | return; |
503 | 504 | ||
505 | /* be dumb */ | ||
506 | if (filp && (filp->f_mode & FMODE_RANDOM)) { | ||
507 | force_page_cache_readahead(mapping, filp, offset, req_size); | ||
508 | return; | ||
509 | } | ||
510 | |||
504 | /* do read-ahead */ | 511 | /* do read-ahead */ |
505 | ondemand_readahead(mapping, ra, filp, false, offset, req_size); | 512 | ondemand_readahead(mapping, ra, filp, false, offset, req_size); |
506 | } | 513 | } |
@@ -547,5 +554,17 @@ page_cache_async_readahead(struct address_space *mapping, | |||
547 | 554 | ||
548 | /* do read-ahead */ | 555 | /* do read-ahead */ |
549 | ondemand_readahead(mapping, ra, filp, true, offset, req_size); | 556 | ondemand_readahead(mapping, ra, filp, true, offset, req_size); |
557 | |||
558 | #ifdef CONFIG_BLOCK | ||
559 | /* | ||
560 | * Normally the current page is !uptodate and lock_page() will be | ||
561 | * immediately called to implicitly unplug the device. However this | ||
562 | * is not always true for RAID conifgurations, where data arrives | ||
563 | * not strictly in their submission order. In this case we need to | ||
564 | * explicitly kick off the IO. | ||
565 | */ | ||
566 | if (PageUptodate(page)) | ||
567 | blk_run_backing_dev(mapping->backing_dev_info, NULL); | ||
568 | #endif | ||
550 | } | 569 | } |
551 | EXPORT_SYMBOL_GPL(page_cache_async_readahead); | 570 | EXPORT_SYMBOL_GPL(page_cache_async_readahead); |