diff options
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/loop.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index d1f168b73634..c4fd1e45ce1e 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -75,6 +75,7 @@ | |||
75 | #include <linux/sysfs.h> | 75 | #include <linux/sysfs.h> |
76 | #include <linux/miscdevice.h> | 76 | #include <linux/miscdevice.h> |
77 | #include <linux/falloc.h> | 77 | #include <linux/falloc.h> |
78 | #include <linux/uio.h> | ||
78 | #include "loop.h" | 79 | #include "loop.h" |
79 | 80 | ||
80 | #include <asm/uaccess.h> | 81 | #include <asm/uaccess.h> |
@@ -229,13 +230,14 @@ lo_do_transfer(struct loop_device *lo, int cmd, | |||
229 | static int __do_lo_send_write(struct file *file, | 230 | static int __do_lo_send_write(struct file *file, |
230 | u8 *buf, const int len, loff_t pos) | 231 | u8 *buf, const int len, loff_t pos) |
231 | { | 232 | { |
233 | struct kvec kvec = {.iov_base = buf, .iov_len = len}; | ||
234 | struct iov_iter from; | ||
232 | ssize_t bw; | 235 | ssize_t bw; |
233 | mm_segment_t old_fs = get_fs(); | 236 | |
237 | iov_iter_kvec(&from, ITER_KVEC | WRITE, &kvec, 1, len); | ||
234 | 238 | ||
235 | file_start_write(file); | 239 | file_start_write(file); |
236 | set_fs(get_ds()); | 240 | bw = vfs_iter_write(file, &from, &pos); |
237 | bw = file->f_op->write(file, buf, len, &pos); | ||
238 | set_fs(old_fs); | ||
239 | file_end_write(file); | 241 | file_end_write(file); |
240 | if (likely(bw == len)) | 242 | if (likely(bw == len)) |
241 | return 0; | 243 | return 0; |
@@ -767,7 +769,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, | |||
767 | goto out_putf; | 769 | goto out_putf; |
768 | 770 | ||
769 | if (!(file->f_mode & FMODE_WRITE) || !(mode & FMODE_WRITE) || | 771 | if (!(file->f_mode & FMODE_WRITE) || !(mode & FMODE_WRITE) || |
770 | !file->f_op->write) | 772 | !file->f_op->write_iter) |
771 | lo_flags |= LO_FLAGS_READ_ONLY; | 773 | lo_flags |= LO_FLAGS_READ_ONLY; |
772 | 774 | ||
773 | lo_blocksize = S_ISBLK(inode->i_mode) ? | 775 | lo_blocksize = S_ISBLK(inode->i_mode) ? |