Loading fs/fuse/file.c +7 −23 Original line number Diff line number Diff line Loading @@ -2339,31 +2339,15 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov, while (iov_iter_count(&ii)) { struct page *page = pages[page_idx++]; size_t todo = min_t(size_t, PAGE_SIZE, iov_iter_count(&ii)); void *kaddr; kaddr = kmap(page); while (todo) { char __user *uaddr = ii.iov->iov_base + ii.iov_offset; size_t iov_len = ii.iov->iov_len - ii.iov_offset; size_t copy = min(todo, iov_len); size_t left; size_t copied; if (!to_user) left = copy_from_user(kaddr, uaddr, copy); copied = copy_page_from_iter(page, 0, PAGE_SIZE, &ii); else left = copy_to_user(uaddr, kaddr, copy); copied = copy_page_to_iter(page, 0, PAGE_SIZE, &ii); if (unlikely(left)) if (unlikely(copied != PAGE_SIZE && iov_iter_count(&ii))) return -EFAULT; iov_iter_advance(&ii, copy); todo -= copy; kaddr += copy; } kunmap(page); } return 0; Loading Loading
fs/fuse/file.c +7 −23 Original line number Diff line number Diff line Loading @@ -2339,31 +2339,15 @@ static int fuse_ioctl_copy_user(struct page **pages, struct iovec *iov, while (iov_iter_count(&ii)) { struct page *page = pages[page_idx++]; size_t todo = min_t(size_t, PAGE_SIZE, iov_iter_count(&ii)); void *kaddr; kaddr = kmap(page); while (todo) { char __user *uaddr = ii.iov->iov_base + ii.iov_offset; size_t iov_len = ii.iov->iov_len - ii.iov_offset; size_t copy = min(todo, iov_len); size_t left; size_t copied; if (!to_user) left = copy_from_user(kaddr, uaddr, copy); copied = copy_page_from_iter(page, 0, PAGE_SIZE, &ii); else left = copy_to_user(uaddr, kaddr, copy); copied = copy_page_to_iter(page, 0, PAGE_SIZE, &ii); if (unlikely(left)) if (unlikely(copied != PAGE_SIZE && iov_iter_count(&ii))) return -EFAULT; iov_iter_advance(&ii, copy); todo -= copy; kaddr += copy; } kunmap(page); } return 0; Loading