diff options
Diffstat (limited to 'mm/nommu.c')
-rw-r--r-- | mm/nommu.c | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/mm/nommu.c b/mm/nommu.c index f59e1424d3db..c4c542c736a9 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -1842,10 +1842,6 @@ int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, | |||
1842 | } | 1842 | } |
1843 | EXPORT_SYMBOL(remap_vmalloc_range); | 1843 | EXPORT_SYMBOL(remap_vmalloc_range); |
1844 | 1844 | ||
1845 | void swap_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) | ||
1846 | { | ||
1847 | } | ||
1848 | |||
1849 | unsigned long arch_get_unmapped_area(struct file *file, unsigned long addr, | 1845 | unsigned long arch_get_unmapped_area(struct file *file, unsigned long addr, |
1850 | unsigned long len, unsigned long pgoff, unsigned long flags) | 1846 | unsigned long len, unsigned long pgoff, unsigned long flags) |
1851 | { | 1847 | { |
@@ -1963,7 +1959,7 @@ error: | |||
1963 | return -ENOMEM; | 1959 | return -ENOMEM; |
1964 | } | 1960 | } |
1965 | 1961 | ||
1966 | int in_gate_area_no_task(unsigned long addr) | 1962 | int in_gate_area_no_mm(unsigned long addr) |
1967 | { | 1963 | { |
1968 | return 0; | 1964 | return 0; |
1969 | } | 1965 | } |
@@ -1975,21 +1971,10 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1975 | } | 1971 | } |
1976 | EXPORT_SYMBOL(filemap_fault); | 1972 | EXPORT_SYMBOL(filemap_fault); |
1977 | 1973 | ||
1978 | /* | 1974 | static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, |
1979 | * Access another process' address space. | 1975 | unsigned long addr, void *buf, int len, int write) |
1980 | * - source/target buffer must be kernel space | ||
1981 | */ | ||
1982 | int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) | ||
1983 | { | 1976 | { |
1984 | struct vm_area_struct *vma; | 1977 | struct vm_area_struct *vma; |
1985 | struct mm_struct *mm; | ||
1986 | |||
1987 | if (addr + len < addr) | ||
1988 | return 0; | ||
1989 | |||
1990 | mm = get_task_mm(tsk); | ||
1991 | if (!mm) | ||
1992 | return 0; | ||
1993 | 1978 | ||
1994 | down_read(&mm->mmap_sem); | 1979 | down_read(&mm->mmap_sem); |
1995 | 1980 | ||
@@ -2014,6 +1999,43 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in | |||
2014 | } | 1999 | } |
2015 | 2000 | ||
2016 | up_read(&mm->mmap_sem); | 2001 | up_read(&mm->mmap_sem); |
2002 | |||
2003 | return len; | ||
2004 | } | ||
2005 | |||
2006 | /** | ||
2007 | * @access_remote_vm - access another process' address space | ||
2008 | * @mm: the mm_struct of the target address space | ||
2009 | * @addr: start address to access | ||
2010 | * @buf: source or destination buffer | ||
2011 | * @len: number of bytes to transfer | ||
2012 | * @write: whether the access is a write | ||
2013 | * | ||
2014 | * The caller must hold a reference on @mm. | ||
2015 | */ | ||
2016 | int access_remote_vm(struct mm_struct *mm, unsigned long addr, | ||
2017 | void *buf, int len, int write) | ||
2018 | { | ||
2019 | return __access_remote_vm(NULL, mm, addr, buf, len, write); | ||
2020 | } | ||
2021 | |||
2022 | /* | ||
2023 | * Access another process' address space. | ||
2024 | * - source/target buffer must be kernel space | ||
2025 | */ | ||
2026 | int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) | ||
2027 | { | ||
2028 | struct mm_struct *mm; | ||
2029 | |||
2030 | if (addr + len < addr) | ||
2031 | return 0; | ||
2032 | |||
2033 | mm = get_task_mm(tsk); | ||
2034 | if (!mm) | ||
2035 | return 0; | ||
2036 | |||
2037 | len = __access_remote_vm(tsk, mm, addr, buf, len, write); | ||
2038 | |||
2017 | mmput(mm); | 2039 | mmput(mm); |
2018 | return len; | 2040 | return len; |
2019 | } | 2041 | } |