at v3.11 1.1 kB view raw
1#include <linux/uaccess.h> 2#include <linux/export.h> 3#include <linux/uio.h> 4 5/* 6 * Copy iovec to kernel. Returns -EFAULT on error. 7 * 8 * Note: this modifies the original iovec. 9 */ 10 11int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len) 12{ 13 while (len > 0) { 14 if (iov->iov_len) { 15 int copy = min_t(unsigned int, len, iov->iov_len); 16 if (copy_from_user(kdata, iov->iov_base, copy)) 17 return -EFAULT; 18 len -= copy; 19 kdata += copy; 20 iov->iov_base += copy; 21 iov->iov_len -= copy; 22 } 23 iov++; 24 } 25 26 return 0; 27} 28EXPORT_SYMBOL(memcpy_fromiovec); 29 30/* 31 * Copy kernel to iovec. Returns -EFAULT on error. 32 * 33 * Note: this modifies the original iovec. 34 */ 35 36int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len) 37{ 38 while (len > 0) { 39 if (iov->iov_len) { 40 int copy = min_t(unsigned int, iov->iov_len, len); 41 if (copy_to_user(iov->iov_base, kdata, copy)) 42 return -EFAULT; 43 kdata += copy; 44 len -= copy; 45 iov->iov_len -= copy; 46 iov->iov_base += copy; 47 } 48 iov++; 49 } 50 51 return 0; 52} 53EXPORT_SYMBOL(memcpy_toiovec);