diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/fadvise.c | 10 | ||||
-rw-r--r-- | mm/readahead.c | 6 |
2 files changed, 15 insertions, 1 deletions
diff --git a/mm/fadvise.c b/mm/fadvise.c index e43359214f6f..8d723c9e8b75 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c | |||
@@ -77,12 +77,20 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) | |||
77 | switch (advice) { | 77 | switch (advice) { |
78 | case POSIX_FADV_NORMAL: | 78 | case POSIX_FADV_NORMAL: |
79 | file->f_ra.ra_pages = bdi->ra_pages; | 79 | file->f_ra.ra_pages = bdi->ra_pages; |
80 | spin_lock(&file->f_lock); | ||
81 | file->f_mode &= ~FMODE_RANDOM; | ||
82 | spin_unlock(&file->f_lock); | ||
80 | break; | 83 | break; |
81 | case POSIX_FADV_RANDOM: | 84 | case POSIX_FADV_RANDOM: |
82 | file->f_ra.ra_pages = 0; | 85 | spin_lock(&file->f_lock); |
86 | file->f_mode |= FMODE_RANDOM; | ||
87 | spin_unlock(&file->f_lock); | ||
83 | break; | 88 | break; |
84 | case POSIX_FADV_SEQUENTIAL: | 89 | case POSIX_FADV_SEQUENTIAL: |
85 | file->f_ra.ra_pages = bdi->ra_pages * 2; | 90 | file->f_ra.ra_pages = bdi->ra_pages * 2; |
91 | spin_lock(&file->f_lock); | ||
92 | file->f_mode &= ~FMODE_RANDOM; | ||
93 | spin_unlock(&file->f_lock); | ||
86 | break; | 94 | break; |
87 | case POSIX_FADV_WILLNEED: | 95 | case POSIX_FADV_WILLNEED: |
88 | if (!mapping->a_ops->readpage) { | 96 | if (!mapping->a_ops->readpage) { |
diff --git a/mm/readahead.c b/mm/readahead.c index 033bc135a41f..337b20e946f6 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -501,6 +501,12 @@ void page_cache_sync_readahead(struct address_space *mapping, | |||
501 | if (!ra->ra_pages) | 501 | if (!ra->ra_pages) |
502 | return; | 502 | return; |
503 | 503 | ||
504 | /* be dumb */ | ||
505 | if (filp->f_mode & FMODE_RANDOM) { | ||
506 | force_page_cache_readahead(mapping, filp, offset, req_size); | ||
507 | return; | ||
508 | } | ||
509 | |||
504 | /* do read-ahead */ | 510 | /* do read-ahead */ |
505 | ondemand_readahead(mapping, ra, filp, false, offset, req_size); | 511 | ondemand_readahead(mapping, ra, filp, false, offset, req_size); |
506 | } | 512 | } |