NOMMU: implement access_remote_vm
Recent vm changes brought in a new function which the core procfs code utilizes. So implement it for nommu systems too to avoid link failures. Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: David Howells <dhowells@redhat.com> Tested-by: Simon Horman <horms@verge.net.au> Tested-by: Ithamar Adema <ithamar.adema@team-embedded.nl> Acked-by: Greg Ungerer <gerg@uclinux.org>
This commit is contained in:
parent
b554cb426a
commit
f55f199b7d
52
mm/nommu.c
52
mm/nommu.c
|
@ -1971,21 +1971,10 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(filemap_fault);
|
EXPORT_SYMBOL(filemap_fault);
|
||||||
|
|
||||||
/*
|
static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
|
||||||
* Access another process' address space.
|
unsigned long addr, void *buf, int len, int write)
|
||||||
* - source/target buffer must be kernel space
|
|
||||||
*/
|
|
||||||
int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write)
|
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
struct mm_struct *mm;
|
|
||||||
|
|
||||||
if (addr + len < addr)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
mm = get_task_mm(tsk);
|
|
||||||
if (!mm)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
down_read(&mm->mmap_sem);
|
down_read(&mm->mmap_sem);
|
||||||
|
|
||||||
|
@ -2010,6 +1999,43 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in
|
||||||
}
|
}
|
||||||
|
|
||||||
up_read(&mm->mmap_sem);
|
up_read(&mm->mmap_sem);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @access_remote_vm - access another process' address space
|
||||||
|
* @mm: the mm_struct of the target address space
|
||||||
|
* @addr: start address to access
|
||||||
|
* @buf: source or destination buffer
|
||||||
|
* @len: number of bytes to transfer
|
||||||
|
* @write: whether the access is a write
|
||||||
|
*
|
||||||
|
* The caller must hold a reference on @mm.
|
||||||
|
*/
|
||||||
|
int access_remote_vm(struct mm_struct *mm, unsigned long addr,
|
||||||
|
void *buf, int len, int write)
|
||||||
|
{
|
||||||
|
return __access_remote_vm(NULL, mm, addr, buf, len, write);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Access another process' address space.
|
||||||
|
* - source/target buffer must be kernel space
|
||||||
|
*/
|
||||||
|
int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write)
|
||||||
|
{
|
||||||
|
struct mm_struct *mm;
|
||||||
|
|
||||||
|
if (addr + len < addr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
mm = get_task_mm(tsk);
|
||||||
|
if (!mm)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = __access_remote_vm(tsk, mm, addr, buf, len, write);
|
||||||
|
|
||||||
mmput(mm);
|
mmput(mm);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue