Cross Memory Attach v4
Subsystems (11)
PATCH 1/1 Cross Memory Attach v4
Hi Andrew,
Here's an updated version of the Cross Memory Attach patch. Changes since the v3:
- Adds x86_64 specific wire up
- Changes behaviour so process_vm_readv and process_vm_writev return the number of bytes successfully read or written even if an error occurs
- Adds more kernel doc interface comments
- rename of some internal functions (process_vm_rw_check_iovecs, process_vm_rw) so they make more sense.
Still need to do benchmarking to see if the optimisation for small copies using a local on-stack array in process_vm_rw_core is worth it.
Regards,
Chris
Signature · 1 line
[email protected]
arch/powerpc/include/asm/systbl.h +2 -0
@@ -354,3 +354,5 @@ COMPAT_SYS_SPU(clock_adjtime) SYSCALL_SPU(syncfs) COMPAT_SYS_SPU(sendmmsg) SYSCALL_SPU(setns) +COMPAT_SYS(process_vm_readv) +COMPAT_SYS(process_vm_writev)
arch/powerpc/include/asm/unistd.h +3 -1
@@ -373,10 +373,12 @@#define __NR_syncfs 348#define __NR_sendmmsg 349#define __NR_setns 350 +#define __NR_process_vm_readv 351 +#define __NR_process_vm_writev 352#ifdef __KERNEL__ -#define __NR_syscalls 351 +#define __NR_syscalls 353#define __NR__exit __NR_exit#define NR_syscalls __NR_syscalls
arch/x86/ia32/ia32entry.S +2 -0
@@ -850,4 +850,6 @@ ia32_sys_call_table: .quad sys_syncfs .quad compat_sys_sendmmsg /* 345 */ .quad sys_setns + .quad compat_sys_process_vm_readv + .quad compat_sys_process_vm_writev ia32_syscall_end:
arch/x86/include/asm/unistd_32.h +3 -1
@@ -352,10 +352,12 @@#define __NR_syncfs 344#define __NR_sendmmsg 345#define __NR_setns 346 +#define __NR_process_vm_readv 347 +#define __NR_process_vm_writev 348#ifdef __KERNEL__ -#define NR_syscalls 347 +#define NR_syscalls 349#define __ARCH_WANT_IPC_PARSE_VERSION#define __ARCH_WANT_OLD_READDIR
arch/x86/include/asm/unistd_64.h +4 -0
@@ -681,6 +681,10 @@ __SYSCALL(__NR_syncfs, sys_syncfs) __SYSCALL(__NR_sendmmsg, sys_sendmmsg)#define __NR_setns 308 __SYSCALL(__NR_setns, sys_setns) +#define __NR_process_vm_readv 309 +__SYSCALL(__NR_process_vm_readv, sys_process_vm_readv) +#define __NR_process_vm_writev 310 +__SYSCALL(__NR_process_vm_writev, sys_process_vm_writev)#ifndef __NO_STUBS#define __ARCH_WANT_OLD_READDIR
arch/x86/kernel/syscall_table_32.S +2 -0
@@ -346,3 +346,5 @@ ENTRY(sys_call_table) .long sys_syncfs .long sys_sendmmsg /* 345 */ .long sys_setns + .long sys_process_vm_readv + .long sys_process_vm_writev
fs/aio.c +2 -2
@@ -1387,13 +1387,13 @@ static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb, bool compat) ret =compat_rw_copy_check_uvector (type, (struct compat_iovec __user *)kiocb->ki_buf, kiocb->ki_nbytes,1 , &kiocb->ki_inline_vec, - &kiocb->ki_iovec); + &kiocb->ki_iovec,1 ); else#endif ret =rw_copy_check_uvector (type, (struct iovec __user *)kiocb->ki_buf, kiocb->ki_nbytes,1 , &kiocb->ki_inline_vec, - &kiocb->ki_iovec); + &kiocb->ki_iovec,1 );if (ret <0 ) goto out;
fs/compat.c +4 -3
@@ -550,7 +550,7 @@ out:ssize_t compat_rw_copy_check_uvector (int type,const struct compat_iovec __user *uvector,unsigned long nr_segs,unsigned long fast_segs,struct iovec *fast_pointer, -struct iovec **ret_pointer) +struct iovec **ret_pointer,int check_access) {compat_ssize_t tot_len;struct iovec *iov = *ret_pointer = fast_pointer;
@@ -597,7 +597,8 @@ ssize_t compat_rw_copy_check_uvector(int type, }if (len <0 )/* size_t not fitting in compat_ssize_t .. */ goto out; -if (!access_ok (vrfy_dir (type),compat_ptr (buf), len)) { +if (check_access && + !access_ok (vrfy_dir (type),compat_ptr (buf), len)) { ret = -EFAULT ; goto out; }
@@ -1111,7 +1112,7 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, goto out; tot_len =compat_rw_copy_check_uvector (type, uvector, nr_segs, -UIO_FASTIOV , iovstack, &iov); +UIO_FASTIOV , iovstack, &iov,1 );if (tot_len ==0 ) { ret =0 ; goto out;
fs/read_write.c +5 -3
@@ -575,7 +575,8 @@ ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,ssize_t rw_copy_check_uvector (int type,const struct iovec __user * uvector,unsigned long nr_segs,unsigned long fast_segs,struct iovec *fast_pointer, -struct iovec **ret_pointer) +struct iovec **ret_pointer, +int check_access) {unsigned long seg;ssize_t ret;
@@ -631,7 +632,8 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, ret = -EINVAL ; goto out; } -if (unlikely (!access_ok (vrfy_dir (type), buf, len))) { +if (check_access + &&unlikely (!access_ok (vrfy_dir (type), buf, len))) { ret = -EFAULT ; goto out; }
@@ -663,7 +665,7 @@ static ssize_t do_readv_writev(int type, struct file *file, } ret =rw_copy_check_uvector (type, uvector, nr_segs, -ARRAY_SIZE (iovstack), iovstack, &iov); +ARRAY_SIZE (iovstack), iovstack, &iov,1 );if (ret <=0 ) goto out;
include/linux/compat.h +2 -1
@@ -557,7 +557,8 @@ extern ssize_t compat_rw_copy_check_uvector(int type,const struct compat_iovec __user *uvector, unsigned long nr_segs, unsigned long fast_segs, struct iovec *fast_pointer, - struct iovec **ret_pointer); + struct iovec **ret_pointer, + int check_access);extern void __user *compat_alloc_user_space (unsigned long len);
include/linux/fs.h +4 -3
@@ -1608,9 +1608,10 @@ struct inode_operations {struct seq_file ;ssize_t rw_copy_check_uvector (int type,const struct iovec __user * uvector, -unsigned long nr_segs,unsigned long fast_segs, -struct iovec *fast_pointer, -struct iovec **ret_pointer); +unsigned long nr_segs,unsigned long fast_segs, +struct iovec *fast_pointer, +struct iovec **ret_pointer, +int check_access);extern ssize_t vfs_read (struct file *,char __user *,size_t ,loff_t *);extern ssize_t vfs_write (struct file *,const char __user *,size_t ,loff_t *);
include/linux/syscalls.h +13 -0
@@ -847,4 +847,17 @@ asmlinkage long sys_open_by_handle_at(int mountdirfd,struct file_handle __user *handle, int flags);asmlinkage long sys_setns (int fd,int nstype); +asmlinkage long sys_process_vm_readv (pid_t pid, +const struct iovec __user *lvec, +unsigned long liovcnt, +const struct iovec __user *rvec, +unsigned long riovcnt, +unsigned long flags); +asmlinkage long sys_process_vm_writev (pid_t pid, +const struct iovec __user *lvec, +unsigned long liovcnt, +const struct iovec __user *rvec, +unsigned long riovcnt, +unsigned long flags); +#endif
kernel/sys_ni.c +4 -0
@@ -146,6 +146,10 @@ cond_syscall(sys_io_submit);cond_syscall (sys_io_cancel);cond_syscall (sys_io_getevents);cond_syscall (sys_syslog); +cond_syscall (sys_process_vm_readv); +cond_syscall (sys_process_vm_writev); +cond_syscall (compat_sys_process_vm_readv); +cond_syscall (compat_sys_process_vm_writev);/* arch-specific weak syscall entries */ cond_syscall (sys_pciconfig_read);
mm/Makefile +2 -1
@@ -5,7 +5,8 @@ mmu-y := nommu.o mmu-$(CONFIG_MMU) := fremap.o highmem.o madvise.o memory.o mincore.o \ mlock.o mmap.o mprotect.o mremap.o msync.o rmap.o \ - vmalloc.o pagewalk.o pgtable-generic.o + vmalloc.o pagewalk.o pgtable-generic.o \ + process_vm_access.o obj-y := filemap.o mempool.o oom_kill.o fadvise.o \ maccess.o page_alloc.o page-writeback.o \
mm/process_vm_access.c new file +482 -0
482 lines not on this page · raw message
security/keys/compat.c +1 -1
@@ -38,7 +38,7 @@ long compat_keyctl_instantiate_key_iov( ret =compat_rw_copy_check_uvector (WRITE , _payload_iov, ioc,ARRAY_SIZE (iovstack), - iovstack, &iov); + iovstack, &iov,1 );if (ret <0 )return ret;if (ret ==0 )
security/keys/keyctl.c +1 -1
@@ -1065,7 +1065,7 @@ long keyctl_instantiate_key_iov(key_serial_t id, goto no_payload; ret =rw_copy_check_uvector (WRITE , _payload_iov, ioc, -ARRAY_SIZE (iovstack), iovstack, &iov); +ARRAY_SIZE (iovstack), iovstack, &iov,1 );if (ret <0 )return ret;if (ret ==0 )
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 13 lines · On Wed, 27 Jul 2011 12:53:42 +0930 Christopher Yeoh wrote:
Hi Andrew,
Here's an updated version of the Cross Memory Attach patch. Changes since the v3:
- Adds
x86_64specific wire up
- Changes behaviour soprocess_vm_readvandprocess_vm_writevreturn the number of bytes successfully read or written even if an error occurs
- Adds more kernel doc interface comments
- rename of some internal functions (process_vm_rw_check_iovecs,process_vm_rw) so they make more sense.
Quoted 2 lines
Still need to do benchmarking to see if the optimisation for small copies using a local on-stack array in
process_vm_rw_coreis worth it.
It's nice to include a diffstat so that people can get a quick patch summary and see what files are touched.
Quoted 1 line
diffstat -w 70 -p 1 cma-v4.patch
arch/powerpc/include/asm/systbl.h | 2 arch/powerpc/include/asm/unistd.h | 4 arch/x86/ia32/ia32entry.S | 2 arch/x86/include/asm/unistd_32.h | 4 arch/x86/include/asm/unistd_64.h | 4 arch/x86/kernel/syscall_table_32.S | 2 fs/aio.c | 4 fs/compat.c | 7 fs/read_write.c | 8 include/linux/compat.h | 3 include/linux/fs.h | 7 include/linux/syscalls.h | 13 kernel/sys_ni.c | 4 mm/Makefile | 3 mm/process_vm_access.c | 482 +++++++++++++++++++++++++++ security/keys/compat.c | 2 security/keys/keyctl.c | 2 17 files changed, 536 insertions(+), 17 deletions(-)
mm/process_vm_access.c line 4
Quoted 10 lines
mm/process_vm_access.c new file +4
-0@@ -0,0 +1,482 @@ +/* +* linux/mm/process_vm_access.c +* +* Copyright (C) 2010-2011 Christopher Yeoh <[email protected]>, IBM Corp.
Any license for this file? maybe GPL?
Quoted 5 lines
mm/process_vm_access.c new file +5
-0+*/ + +#include <linux/mm.h> +#include <linux/uio.h> +#include <linux/sched.h>
mm/process_vm_access.c line 19
Quoted 10 lines
mm/process_vm_access.c new file +10
-0+#include <linux/highmem.h> +#include <linux/ptrace.h> +#include <linux/slab.h> +#include <linux/syscalls.h> + +#ifdef CONFIG_COMPAT +#include <linux/compat.h> +#endif + +/*
Any problem with using
/**
so that these are proper kernel-doc notation? (for all [4] functions here that have such notation)
Quoted 21 lines
mm/process_vm_access.c new file +21
-0+* process_vm_rw_pages - read/write pages from task specified +* @task: task to read/write from +* @mm: mm for task +* @process_pages: struct pages area that can store at least +* nr_pages_to_copy struct page pointers +* @pa: address of page in task to start copying from/to +* @start_offset: offset in page to start copying from/to +* @len: number of bytes to copy +* @lvec: iovec array specifying where to copy to/from +* @lvec_cnt: number of elements in iovec array +* @lvec_current: index in iovec array we are up to +* @lvec_offset: offset in bytes from current iovec iov_base we are up to +* @vm_write: 0 means copy from, 1 means copy to +* @nr_pages_to_copy: number of pages to copy +* @bytes_copied: returns number of bytes successfully copied +* Returns 0 on success, error code otherwise +*/ +static int process_vm_rw_pages(struct task_struct *task, + struct mm_struct *mm, + struct page **process_pages, + unsigned long pa,
mm/process_vm_access.c line 50
Quoted 10 lines
mm/process_vm_access.c new file +10
-0+unsigned long start_offset, + unsigned long len, + const struct iovec *lvec, + unsigned long lvec_cnt, + unsigned long *lvec_current, + size_t *lvec_offset, + int vm_write, + unsigned int nr_pages_to_copy, + ssize_t *bytes_copied) +{
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code *** --
To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Cross Memory Attach v4 (patch updated)
Quoted 15 lines · On Tue, 26 Jul 2011 21:55:54 -0700 Randy Dunlap <[email protected]> wrote:
Quoted 13 lines · On Wed, 27 Jul 2011 12:53:42 +0930 Christopher Yeoh wrote:
Hi Andrew,
Here's an updated version of the Cross Memory Attach patch. Changes since the v3:
- Adds
x86_64specific wire up
- Changes behaviour soprocess_vm_readvandprocess_vm_writevreturn the number of bytes successfully read or written even if an error occurs
- Adds more kernel doc interface comments
- rename of some internal functions (process_vm_rw_check_iovecs,process_vm_rw) so they make more sense.
Quoted 7 lines
Quoted 3 lines
Still need to do benchmarking to see if the optimisation for small copies using a local on-stack array in
process_vm_rw_coreis worth it.It's nice to include a diffstat so that people can get a quick patch summary and see what files are touched.
Thanks. Updated patch below. Only changes are:
- Adds licence message
- Fixed kernel-doc comment format
--- arch/powerpc/include/asm/systbl.h | 2 arch/powerpc/include/asm/unistd.h | 4 arch/x86/ia32/ia32entry.S | 2 arch/x86/include/asm/unistd_32.h | 4 arch/x86/include/asm/unistd_64.h | 4 arch/x86/kernel/syscall_table_32.S | 2 fs/aio.c | 4 fs/compat.c | 7 fs/read_write.c | 8 include/linux/compat.h | 3 include/linux/fs.h | 7 include/linux/syscalls.h | 13 kernel/sys_ni.c | 4 mm/Makefile | 3 mm/process_vm_access.c | 487 +++++++++++++++++++++++++++++++++++++ security/keys/compat.c | 2 security/keys/keyctl.c | 2 17 files changed, 541 insertions(+), 17 deletions(-)
arch/powerpc/include/asm/systbl.h +2 -0
@@ -354,3 +354,5 @@ COMPAT_SYS_SPU(clock_adjtime) SYSCALL_SPU(syncfs) COMPAT_SYS_SPU(sendmmsg) SYSCALL_SPU(setns) +COMPAT_SYS(process_vm_readv) +COMPAT_SYS(process_vm_writev)
arch/powerpc/include/asm/unistd.h +3 -1
@@ -373,10 +373,12 @@#define __NR_syncfs 348#define __NR_sendmmsg 349#define __NR_setns 350 +#define __NR_process_vm_readv 351 +#define __NR_process_vm_writev 352#ifdef __KERNEL__ -#define __NR_syscalls 351 +#define __NR_syscalls 353#define __NR__exit __NR_exit#define NR_syscalls __NR_syscalls
arch/x86/ia32/ia32entry.S +2 -0
@@ -850,4 +850,6 @@ ia32_sys_call_table: .quad sys_syncfs .quad compat_sys_sendmmsg /* 345 */ .quad sys_setns + .quad compat_sys_process_vm_readv + .quad compat_sys_process_vm_writev ia32_syscall_end:
arch/x86/include/asm/unistd_32.h +3 -1
@@ -352,10 +352,12 @@#define __NR_syncfs 344#define __NR_sendmmsg 345#define __NR_setns 346 +#define __NR_process_vm_readv 347 +#define __NR_process_vm_writev 348#ifdef __KERNEL__ -#define NR_syscalls 347 +#define NR_syscalls 349#define __ARCH_WANT_IPC_PARSE_VERSION#define __ARCH_WANT_OLD_READDIR
arch/x86/include/asm/unistd_64.h +4 -0
@@ -681,6 +681,10 @@ __SYSCALL(__NR_syncfs, sys_syncfs) __SYSCALL(__NR_sendmmsg, sys_sendmmsg)#define __NR_setns 308 __SYSCALL(__NR_setns, sys_setns) +#define __NR_process_vm_readv 309 +__SYSCALL(__NR_process_vm_readv, sys_process_vm_readv) +#define __NR_process_vm_writev 310 +__SYSCALL(__NR_process_vm_writev, sys_process_vm_writev)#ifndef __NO_STUBS#define __ARCH_WANT_OLD_READDIR
arch/x86/kernel/syscall_table_32.S +2 -0
@@ -346,3 +346,5 @@ ENTRY(sys_call_table) .long sys_syncfs .long sys_sendmmsg /* 345 */ .long sys_setns + .long sys_process_vm_readv + .long sys_process_vm_writev
fs/aio.c +2 -2
@@ -1387,13 +1387,13 @@ static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb, bool compat) ret =compat_rw_copy_check_uvector (type, (struct compat_iovec __user *)kiocb->ki_buf, kiocb->ki_nbytes,1 , &kiocb->ki_inline_vec, - &kiocb->ki_iovec); + &kiocb->ki_iovec,1 ); else#endif ret =rw_copy_check_uvector (type, (struct iovec __user *)kiocb->ki_buf, kiocb->ki_nbytes,1 , &kiocb->ki_inline_vec, - &kiocb->ki_iovec); + &kiocb->ki_iovec,1 );if (ret <0 ) goto out;
fs/compat.c +4 -3
@@ -550,7 +550,7 @@ out:ssize_t compat_rw_copy_check_uvector (int type,const struct compat_iovec __user *uvector,unsigned long nr_segs,unsigned long fast_segs,struct iovec *fast_pointer, -struct iovec **ret_pointer) +struct iovec **ret_pointer,int check_access) {compat_ssize_t tot_len;struct iovec *iov = *ret_pointer = fast_pointer;
@@ -597,7 +597,8 @@ ssize_t compat_rw_copy_check_uvector(int type, }if (len <0 )/* size_t not fitting in compat_ssize_t .. */ goto out; -if (!access_ok (vrfy_dir (type),compat_ptr (buf), len)) { +if (check_access && + !access_ok (vrfy_dir (type),compat_ptr (buf), len)) { ret = -EFAULT ; goto out; }
@@ -1111,7 +1112,7 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, goto out; tot_len =compat_rw_copy_check_uvector (type, uvector, nr_segs, -UIO_FASTIOV , iovstack, &iov); +UIO_FASTIOV , iovstack, &iov,1 );if (tot_len ==0 ) { ret =0 ; goto out;
fs/read_write.c +5 -3
@@ -575,7 +575,8 @@ ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,ssize_t rw_copy_check_uvector (int type,const struct iovec __user * uvector,unsigned long nr_segs,unsigned long fast_segs,struct iovec *fast_pointer, -struct iovec **ret_pointer) +struct iovec **ret_pointer, +int check_access) {unsigned long seg;ssize_t ret;
@@ -631,7 +632,8 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, ret = -EINVAL ; goto out; } -if (unlikely (!access_ok (vrfy_dir (type), buf, len))) { +if (check_access + &&unlikely (!access_ok (vrfy_dir (type), buf, len))) { ret = -EFAULT ; goto out; }
@@ -663,7 +665,7 @@ static ssize_t do_readv_writev(int type, struct file *file, } ret =rw_copy_check_uvector (type, uvector, nr_segs, -ARRAY_SIZE (iovstack), iovstack, &iov); +ARRAY_SIZE (iovstack), iovstack, &iov,1 );if (ret <=0 ) goto out;
include/linux/compat.h +2 -1
@@ -557,7 +557,8 @@ extern ssize_t compat_rw_copy_check_uvector(int type,const struct compat_iovec __user *uvector, unsigned long nr_segs, unsigned long fast_segs, struct iovec *fast_pointer, - struct iovec **ret_pointer); + struct iovec **ret_pointer, + int check_access);extern void __user *compat_alloc_user_space (unsigned long len);
include/linux/fs.h +4 -3
@@ -1608,9 +1608,10 @@ struct inode_operations {struct seq_file ;ssize_t rw_copy_check_uvector (int type,const struct iovec __user * uvector, -unsigned long nr_segs,unsigned long fast_segs, -struct iovec *fast_pointer, -struct iovec **ret_pointer); +unsigned long nr_segs,unsigned long fast_segs, +struct iovec *fast_pointer, +struct iovec **ret_pointer, +int check_access);extern ssize_t vfs_read (struct file *,char __user *,size_t ,loff_t *);extern ssize_t vfs_write (struct file *,const char __user *,size_t ,loff_t *);
include/linux/syscalls.h +13 -0
@@ -847,4 +847,17 @@ asmlinkage long sys_open_by_handle_at(int mountdirfd,struct file_handle __user *handle, int flags);asmlinkage long sys_setns (int fd,int nstype); +asmlinkage long sys_process_vm_readv (pid_t pid, +const struct iovec __user *lvec, +unsigned long liovcnt, +const struct iovec __user *rvec, +unsigned long riovcnt, +unsigned long flags); +asmlinkage long sys_process_vm_writev (pid_t pid, +const struct iovec __user *lvec, +unsigned long liovcnt, +const struct iovec __user *rvec, +unsigned long riovcnt, +unsigned long flags); +#endif
kernel/sys_ni.c +4 -0
@@ -146,6 +146,10 @@ cond_syscall(sys_io_submit);cond_syscall (sys_io_cancel);cond_syscall (sys_io_getevents);cond_syscall (sys_syslog); +cond_syscall (sys_process_vm_readv); +cond_syscall (sys_process_vm_writev); +cond_syscall (compat_sys_process_vm_readv); +cond_syscall (compat_sys_process_vm_writev);/* arch-specific weak syscall entries */ cond_syscall (sys_pciconfig_read);
mm/Makefile +2 -1
@@ -5,7 +5,8 @@ mmu-y := nommu.o mmu-$(CONFIG_MMU) := fremap.o highmem.o madvise.o memory.o mincore.o \ mlock.o mmap.o mprotect.o mremap.o msync.o rmap.o \ - vmalloc.o pagewalk.o pgtable-generic.o + vmalloc.o pagewalk.o pgtable-generic.o \ + process_vm_access.o obj-y := filemap.o mempool.o oom_kill.o fadvise.o \ maccess.o page_alloc.o page-writeback.o \
mm/process_vm_access.c new file +487 -0
487 lines not on this page · raw message
security/keys/compat.c +1 -1
@@ -38,7 +38,7 @@ long compat_keyctl_instantiate_key_iov( ret =compat_rw_copy_check_uvector (WRITE , _payload_iov, ioc,ARRAY_SIZE (iovstack), - iovstack, &iov); + iovstack, &iov,1 );if (ret <0 )return ret;if (ret ==0 )
security/keys/keyctl.c +1 -1
@@ -1065,7 +1065,7 @@ long keyctl_instantiate_key_iov(key_serial_t id, goto no_payload; ret =rw_copy_check_uvector (WRITE , _payload_iov, ioc, -ARRAY_SIZE (iovstack), iovstack, &iov); +ARRAY_SIZE (iovstack), iovstack, &iov,1 );if (ret <0 )return ret;if (ret ==0 )
Signature · 8 lines
[email protected] -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"[email protected]"> [email protected] </a>