summaryrefslogtreecommitdiffstats
path: root/mm/readahead.c
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2012-06-04 00:35:19 -0400
committerLen Brown <len.brown@intel.com>2012-06-04 00:35:19 -0400
commit7e1bd6e38b1f30860ce25a014c6d6adfb0079f4a (patch)
tree65c5898ba93007d4399150c7a127a670bcfbc30d /mm/readahead.c
parent301f33fbcf4ced53b3de114846ecece5d6aafeeb (diff)
parentf8f5701bdaf9134b1f90e5044a82c66324d2073f (diff)
downloadtalos-op-linux-7e1bd6e38b1f30860ce25a014c6d6adfb0079f4a.tar.gz
talos-op-linux-7e1bd6e38b1f30860ce25a014c6d6adfb0079f4a.zip
Merge branch 'upstream' into bugfix-video
Update bugfix-video branch to 2.5-rc1 so I don't have to again resolve the conflict in these patches vs. upstream. Conflicts: drivers/gpu/drm/gma500/psb_drv.c text conflict: add comment vs delete neighboring line keep just this: /* igd_opregion_init(&dev_priv->opregion_dev); */ /* acpi_video_register(); */ Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'mm/readahead.c')
-rw-r--r--mm/readahead.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/mm/readahead.c b/mm/readahead.c
index cbcbb02f3e28..ea8f8fa21649 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -17,6 +17,8 @@
#include <linux/task_io_accounting_ops.h>
#include <linux/pagevec.h>
#include <linux/pagemap.h>
+#include <linux/syscalls.h>
+#include <linux/file.h>
/*
* Initialise a struct file's readahead state. Assumes that the caller has
@@ -562,3 +564,41 @@ page_cache_async_readahead(struct address_space *mapping,
ondemand_readahead(mapping, ra, filp, true, offset, req_size);
}
EXPORT_SYMBOL_GPL(page_cache_async_readahead);
+
+static ssize_t
+do_readahead(struct address_space *mapping, struct file *filp,
+ pgoff_t index, unsigned long nr)
+{
+ if (!mapping || !mapping->a_ops || !mapping->a_ops->readpage)
+ return -EINVAL;
+
+ force_page_cache_readahead(mapping, filp, index, nr);
+ return 0;
+}
+
+SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)
+{
+ ssize_t ret;
+ struct file *file;
+
+ ret = -EBADF;
+ file = fget(fd);
+ if (file) {
+ if (file->f_mode & FMODE_READ) {
+ struct address_space *mapping = file->f_mapping;
+ pgoff_t start = offset >> PAGE_CACHE_SHIFT;
+ pgoff_t end = (offset + count - 1) >> PAGE_CACHE_SHIFT;
+ unsigned long len = end - start + 1;
+ ret = do_readahead(mapping, file, start, len);
+ }
+ fput(file);
+ }
+ return ret;
+}
+#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
+asmlinkage long SyS_readahead(long fd, loff_t offset, long count)
+{
+ return SYSC_readahead((int) fd, offset, (size_t) count);
+}
+SYSCALL_ALIAS(sys_readahead, SyS_readahead);
+#endif
OpenPOWER on IntegriCloud