]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: create btrfs_file_write_iter()
authorDave Kleikamp <dave.kleikamp@oracle.com>
Wed, 21 Mar 2012 20:06:42 +0000 (15:06 -0500)
committerDave Kleikamp <dave.kleikamp@oracle.com>
Wed, 21 Mar 2012 20:06:42 +0000 (15:06 -0500)
Since btrfs has it's own aio_write function, it needs a similar
write_iter. This patch patterns btrfs_file_write_iter on
btrfs_file_aio_write, then has the latter call the former.

Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
fs/btrfs/file.c

index 994ab5a1cd07cbbe5ac5ef63fcf7236c03f90120..0afdb8f81a2092e8fdd3a2905a2d054e98086028 100644 (file)
@@ -1282,20 +1282,17 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
 }
 
 static ssize_t __btrfs_direct_write(struct kiocb *iocb,
-                                   const struct iovec *iov,
-                                   unsigned long nr_segs, loff_t pos,
-                                   loff_t *ppos, size_t count, size_t ocount)
+                                   struct iov_iter *iter,
+                                   loff_t pos, loff_t *ppos, size_t count)
 {
        struct file *file = iocb->ki_filp;
        struct inode *inode = fdentry(file)->d_inode;
-       struct iov_iter i;
        ssize_t written;
        ssize_t written_buffered;
        loff_t endbyte;
        int err;
 
-       written = generic_file_direct_write(iocb, iov, &nr_segs, pos, ppos,
-                                           count, ocount);
+       written = generic_file_direct_write_iter(iocb, iter, pos, ppos, count);
 
        /*
         * the generic O_DIRECT will update in-memory i_size after the
@@ -1314,8 +1311,7 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb,
 
        pos += written;
        count -= written;
-       iov_iter_init(&i, iov, nr_segs, count, written);
-       written_buffered = __btrfs_buffered_write(file, &i, pos);
+       written_buffered = __btrfs_buffered_write(file, iter, pos);
        if (written_buffered < 0) {
                err = written_buffered;
                goto out;
@@ -1332,9 +1328,8 @@ out:
        return written ? written : err;
 }
 
-static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
-                                   const struct iovec *iov,
-                                   unsigned long nr_segs, loff_t pos)
+static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
+                                    struct iov_iter *iter, loff_t pos)
 {
        struct file *file = iocb->ki_filp;
        struct inode *inode = fdentry(file)->d_inode;
@@ -1343,18 +1338,13 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
        u64 start_pos;
        ssize_t num_written = 0;
        ssize_t err = 0;
-       size_t count, ocount;
+       size_t count;
 
        vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE);
 
        mutex_lock(&inode->i_mutex);
 
-       err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
-       if (err) {
-               mutex_unlock(&inode->i_mutex);
-               goto out;
-       }
-       count = ocount;
+       count = iov_iter_count(iter);
 
        current->backing_dev_info = inode->i_mapping->backing_dev_info;
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
@@ -1403,14 +1393,10 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
        }
 
        if (unlikely(file->f_flags & O_DIRECT)) {
-               num_written = __btrfs_direct_write(iocb, iov, nr_segs,
-                                                  pos, ppos, count, ocount);
+               num_written = __btrfs_direct_write(iocb, iter, pos, ppos,
+                                                  count);
        } else {
-               struct iov_iter i;
-
-               iov_iter_init(&i, iov, nr_segs, count, num_written);
-
-               num_written = __btrfs_buffered_write(file, &i, pos);
+               num_written = __btrfs_buffered_write(file, iter, pos);
                if (num_written > 0)
                        *ppos = pos + num_written;
        }
@@ -1440,6 +1426,23 @@ out:
        return num_written ? num_written : err;
 }
 
+static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
+                                   const struct iovec *iov,
+                                   unsigned long nr_segs, loff_t pos)
+{
+       struct iov_iter i;
+       int ret;
+       size_t count;
+
+       ret = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE);
+       if (ret)
+               return ret;
+
+       iov_iter_init(&i, iov, nr_segs, count, 0);
+
+       return btrfs_file_write_iter(iocb, &i, pos);
+}
+
 int btrfs_release_file(struct inode *inode, struct file *filp)
 {
        /*
@@ -1707,9 +1710,9 @@ const struct file_operations btrfs_file_operations = {
        .write          = do_sync_write,
        .aio_read       = generic_file_aio_read,
        .splice_read    = generic_file_splice_read,
-       .aio_write      = btrfs_file_aio_write,
        .read_iter      = generic_file_read_iter,
-       .write_iter     = generic_file_write_iter,
+       .aio_write      = btrfs_file_aio_write,
+       .write_iter     = btrfs_file_write_iter,
        .mmap           = btrfs_file_mmap,
        .open           = generic_file_open,
        .release        = btrfs_release_file,