OSDN Git Service

hypfs: switch to read_iter/write_iter
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 4 Feb 2015 21:17:45 +0000 (16:17 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 20 Feb 2015 09:56:28 +0000 (04:56 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/s390/hypfs/inode.c

index 4c8008d..67a0014 100644 (file)
@@ -144,36 +144,32 @@ static int hypfs_open(struct inode *inode, struct file *filp)
        return nonseekable_open(inode, filp);
 }
 
-static ssize_t hypfs_aio_read(struct kiocb *iocb, const struct iovec *iov,
-                             unsigned long nr_segs, loff_t offset)
+static ssize_t hypfs_read_iter(struct kiocb *iocb, struct iov_iter *to)
 {
-       char *data;
-       ssize_t ret;
-       struct file *filp = iocb->ki_filp;
-       /* XXX: temporary */
-       char __user *buf = iov[0].iov_base;
-       size_t count = iov[0].iov_len;
-
-       if (nr_segs != 1)
-               return -EINVAL;
-
-       data = filp->private_data;
-       ret = simple_read_from_buffer(buf, count, &offset, data, strlen(data));
-       if (ret <= 0)
-               return ret;
+       struct file *file = iocb->ki_filp;
+       char *data = file->private_data;
+       size_t available = strlen(data);
+       loff_t pos = iocb->ki_pos;
+       size_t count;
 
-       iocb->ki_pos += ret;
-       file_accessed(filp);
-
-       return ret;
+       if (pos < 0)
+               return -EINVAL;
+       if (pos >= available || !iov_iter_count(to))
+               return 0;
+       count = copy_to_iter(data + pos, available - pos, to);
+       if (!count)
+               return -EFAULT;
+       iocb->ki_pos = pos + count;
+       file_accessed(file);
+       return count;
 }
-static ssize_t hypfs_aio_write(struct kiocb *iocb, const struct iovec *iov,
-                             unsigned long nr_segs, loff_t offset)
+
+static ssize_t hypfs_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
        int rc;
        struct super_block *sb = file_inode(iocb->ki_filp)->i_sb;
        struct hypfs_sb_info *fs_info = sb->s_fs_info;
-       size_t count = iov_length(iov, nr_segs);
+       size_t count = iov_iter_count(from);
 
        /*
         * Currently we only allow one update per second for two reasons:
@@ -202,6 +198,7 @@ static ssize_t hypfs_aio_write(struct kiocb *iocb, const struct iovec *iov,
        }
        hypfs_update_update(sb);
        rc = count;
+       iov_iter_advance(from, count);
 out:
        mutex_unlock(&fs_info->lock);
        return rc;
@@ -440,10 +437,10 @@ struct dentry *hypfs_create_str(struct dentry *dir,
 static const struct file_operations hypfs_file_ops = {
        .open           = hypfs_open,
        .release        = hypfs_release,
-       .read           = do_sync_read,
-       .write          = do_sync_write,
-       .aio_read       = hypfs_aio_read,
-       .aio_write      = hypfs_aio_write,
+       .read           = new_sync_read,
+       .write          = new_sync_write,
+       .read_iter      = hypfs_read_iter,
+       .write_iter     = hypfs_write_iter,
        .llseek         = no_llseek,
 };