fuse: Track process write operations in both direct and writethrough modes
[linux-2.6-block.git] / fs / fuse / file.c
index dc45cef2a36934fed72e4b7017cc743af7d01293..761ae81ef41d5d77a8e4ffa9baea29bfb9f3c2a3 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/fs.h>
 #include <linux/filelock.h>
 #include <linux/splice.h>
+#include <linux/task_io_accounting_ops.h>
 
 static int fuse_send_open(struct fuse_mount *fm, u64 nodeid,
                          unsigned int open_flags, int opcode,
@@ -1405,7 +1406,7 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
        struct address_space *mapping = file->f_mapping;
        ssize_t written = 0;
        struct inode *inode = mapping->host;
-       ssize_t err;
+       ssize_t err, count;
        struct fuse_conn *fc = get_fuse_conn(inode);
 
        if (fc->writeback_cache) {
@@ -1427,10 +1428,12 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
 writethrough:
        inode_lock(inode);
 
-       err = generic_write_checks(iocb, from);
+       err = count = generic_write_checks(iocb, from);
        if (err <= 0)
                goto out;
 
+       task_io_account_write(count);
+
        err = file_remove_privs(file);
        if (err)
                goto out;
@@ -1668,6 +1671,7 @@ static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from)
        fuse_dio_lock(iocb, from, &exclusive);
        res = generic_write_checks(iocb, from);
        if (res > 0) {
+               task_io_account_write(res);
                if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) {
                        res = fuse_direct_IO(iocb, from);
                } else {