]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
iov_iter: iov_iter_copy_from_user() should use non-atomic copy
authorDave Kleikamp <dave.kleikamp@oracle.com>
Fri, 14 Jun 2013 20:54:09 +0000 (15:54 -0500)
committerDave Kleikamp <dave.kleikamp@oracle.com>
Fri, 9 Aug 2013 21:43:28 +0000 (16:43 -0500)
Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
fs/iov-iter.c

index 52c23d9a1e12c13cd520c1bef0b1a3d8f4670456..563a6bab0a810129d3833fc514e05d6169b02c7e 100644 (file)
@@ -6,8 +6,8 @@
 #include <linux/highmem.h>
 #include <linux/pagemap.h>
 
-static size_t __iovec_copy_from_user_inatomic(char *vaddr,
-                       const struct iovec *iov, size_t base, size_t bytes)
+static size_t __iovec_copy_from_user(char *vaddr, const struct iovec *iov,
+                                    size_t base, size_t bytes, int atomic)
 {
        size_t copied = 0, left = 0;
 
@@ -16,7 +16,10 @@ static size_t __iovec_copy_from_user_inatomic(char *vaddr,
                int copy = min(bytes, iov->iov_len - base);
 
                base = 0;
-               left = __copy_from_user_inatomic(vaddr, buf, copy);
+               if (atomic)
+                       left = __copy_from_user_inatomic(vaddr, buf, copy);
+               else
+                       left = __copy_from_user(vaddr, buf, copy);
                copied += copy;
                bytes -= copy;
                vaddr += copy;
@@ -47,8 +50,8 @@ size_t iov_iter_copy_from_user_atomic(struct page *page,
                left = __copy_from_user_inatomic(kaddr + offset, buf, bytes);
                copied = bytes - left;
        } else {
-               copied = __iovec_copy_from_user_inatomic(kaddr + offset,
-                                               i->iov, i->iov_offset, bytes);
+               copied = __iovec_copy_from_user(kaddr + offset, i->iov,
+                                               i->iov_offset, bytes, 1);
        }
        kunmap_atomic(kaddr);
 
@@ -75,8 +78,8 @@ size_t iov_iter_copy_from_user(struct page *page,
                left = __copy_from_user(kaddr + offset, buf, bytes);
                copied = bytes - left;
        } else {
-               copied = __iovec_copy_from_user_inatomic(kaddr + offset,
-                                               i->iov, i->iov_offset, bytes);
+               copied = __iovec_copy_from_user(kaddr + offset, i->iov,
+                                               i->iov_offset, bytes, 0);
        }
        kunmap(page);
        return copied;