mm: move readahead syscall to mm/readahead.c
It is better to define readahead(2) in mm/readahead.c than in mm/filemap.c. Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Cc: Fengguang Wu <fengguang.wu@intel.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4fb5ef089b
commit
782182e53a
39
mm/filemap.c
39
mm/filemap.c
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/pagevec.h>
|
#include <linux/pagevec.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/syscalls.h>
|
|
||||||
#include <linux/cpuset.h>
|
#include <linux/cpuset.h>
|
||||||
#include <linux/hardirq.h> /* for BUG_ON(!in_atomic()) only */
|
#include <linux/hardirq.h> /* for BUG_ON(!in_atomic()) only */
|
||||||
#include <linux/memcontrol.h>
|
#include <linux/memcontrol.h>
|
||||||
|
@ -1478,44 +1477,6 @@ out:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(generic_file_aio_read);
|
EXPORT_SYMBOL(generic_file_aio_read);
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
/**
|
/**
|
||||||
* page_cache_read - adds requested page to the page cache if not already there
|
* page_cache_read - adds requested page to the page cache if not already there
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <linux/task_io_accounting_ops.h>
|
#include <linux/task_io_accounting_ops.h>
|
||||||
#include <linux/pagevec.h>
|
#include <linux/pagevec.h>
|
||||||
#include <linux/pagemap.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
|
* 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);
|
ondemand_readahead(mapping, ra, filp, true, offset, req_size);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(page_cache_async_readahead);
|
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
|
||||||
|
|
Loading…
Reference in New Issue