target: use vfs_iter_read/write in fd_do_rw
authorChristoph Hellwig <hch@lst.de>
Sun, 22 Feb 2015 16:48:41 +0000 (08:48 -0800)
committerNicholas Bellinger <nab@linux-iscsi.org>
Fri, 27 Feb 2015 19:20:30 +0000 (11:20 -0800)
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_file.c

index 44620fb6bd45e96eae5b13dac4b9582a0d86c85e..ea6e14e3ac5ab4e27caf63d51af6a9c741af9f52 100644 (file)
@@ -331,36 +331,33 @@ static int fd_do_rw(struct se_cmd *cmd, struct scatterlist *sgl,
        struct fd_dev *dev = FD_DEV(se_dev);
        struct file *fd = dev->fd_file;
        struct scatterlist *sg;
-       struct iovec *iov;
-       mm_segment_t old_fs;
+       struct iov_iter iter;
+       struct bio_vec *bvec;
+       ssize_t len = 0;
        loff_t pos = (cmd->t_task_lba * se_dev->dev_attrib.block_size);
        int ret = 0, i;
 
-       iov = kzalloc(sizeof(struct iovec) * sgl_nents, GFP_KERNEL);
-       if (!iov) {
+       bvec = kcalloc(sgl_nents, sizeof(struct bio_vec), GFP_KERNEL);
+       if (!bvec) {
                pr_err("Unable to allocate fd_do_readv iov[]\n");
                return -ENOMEM;
        }
 
        for_each_sg(sgl, sg, sgl_nents, i) {
-               iov[i].iov_len = sg->length;
-               iov[i].iov_base = kmap(sg_page(sg)) + sg->offset;
-       }
+               bvec[i].bv_page = sg_page(sg);
+               bvec[i].bv_len = sg->length;
+               bvec[i].bv_offset = sg->offset;
 
-       old_fs = get_fs();
-       set_fs(get_ds());
+               len += sg->length;
+       }
 
+       iov_iter_bvec(&iter, ITER_BVEC, bvec, sgl_nents, len);
        if (is_write)
-               ret = vfs_writev(fd, &iov[0], sgl_nents, &pos);
+               ret = vfs_iter_write(fd, &iter, &pos);
        else
-               ret = vfs_readv(fd, &iov[0], sgl_nents, &pos);
-
-       set_fs(old_fs);
-
-       for_each_sg(sgl, sg, sgl_nents, i)
-               kunmap(sg_page(sg));
+               ret = vfs_iter_read(fd, &iter, &pos);
 
-       kfree(iov);
+       kfree(bvec);
 
        if (is_write) {
                if (ret < 0 || ret != cmd->data_length) {