]> git.karo-electronics.de Git - karo-tx-linux.git/blob - lib/iovec.c
Merge branch 'for-3.14/core' of git://git.kernel.dk/linux-block
[karo-tx-linux.git] / lib / iovec.c
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
11 int 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 }
28 EXPORT_SYMBOL(memcpy_fromiovec);
29
30 /*
31  *      Copy kernel to iovec. Returns -EFAULT on error.
32  *
33  *      Note: this modifies the original iovec.
34  */
35
36 int 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 }
53 EXPORT_SYMBOL(memcpy_toiovec);