diff options
-rw-r--r-- | include/linux/fs.h | 3 | ||||
-rw-r--r-- | mm/fadvise.c | 10 | ||||
-rw-r--r-- | mm/readahead.c | 6 |
3 files changed, 18 insertions, 1 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 45689621a851..be87edcaba06 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -87,6 +87,9 @@ struct inodes_stat_t { | |||
87 | */ | 87 | */ |
88 | #define FMODE_NOCMTIME ((__force fmode_t)2048) | 88 | #define FMODE_NOCMTIME ((__force fmode_t)2048) |
89 | 89 | ||
90 | /* Expect random access pattern */ | ||
91 | #define FMODE_RANDOM ((__force fmode_t)4096) | ||
92 | |||
90 | /* | 93 | /* |
91 | * The below are the various read and write types that we support. Some of | 94 | * The below are the various read and write types that we support. Some of |
92 | * them include behavioral modifiers that send information down to the | 95 | * them include behavioral modifiers that send information down to the |
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 | } |