The iov_iter based calls seems to already handle the kernel memory as
source or destination, when iov_iter is created from iov_iter_kvec(),
so there is no need to use the set_fs()-based API to let the called
functions access userspace. Those set_fs() calls were there from the
beginning of the merged kdbus code. They might be an artifact left from
kdbus v2 (where they seems to be really needed) to v3 (which use the
iov_iter and kvec API) update:
https://lore.kernel.org/all/
1421435777-25306-5-git-send-email-gregkh@linuxfoundation.org/
https://lore.kernel.org/all/
1416546149-24799-5-git-send-email-gregkh@linuxfoundation.org/
Change-Id: I25fe3066f073677a00f719af13e9c2ced5b89a47
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
size_t kvec_len, size_t total_len)
{
struct iov_iter iter;
- mm_segment_t old_fs;
ssize_t len;
if (WARN_ON(off + total_len > slice->size))
off += slice->off;
iov_iter_kvec(&iter, WRITE, kvec, kvec_len, total_len);
- old_fs = get_fs();
- set_fs(KERNEL_DS);
len = vfs_iter_write(slice->pool->f, &iter, &off, 0);
- set_fs(old_fs);
return (len >= 0 && len != total_len) ? -EFAULT : len;
}
unsigned long len = slice_src->size;
loff_t off_src = slice_src->off;
loff_t off_dst = slice_dst->off;
- mm_segment_t old_fs;
int ret = 0;
if (WARN_ON(slice_src->size != slice_dst->size) ||
return -EINVAL;
inode_lock(i_dst);
- old_fs = get_fs();
- set_fs(KERNEL_DS);
while (len > 0) {
unsigned long page_off;
unsigned long copy_len;
off_dst += copy_len;
len -= copy_len;
}
- set_fs(old_fs);
inode_unlock(i_dst);
return ret;