From e3dc14b86182a82d99faaa5979846750d937160e Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 15 Nov 2013 09:59:09 -0800 Subject: [PATCH] Add I/O Read/Write Accounting Because ZFS bypasses the page cache we don't inherit per-task I/O accounting for free. However, the Linux kernel does provide helper functions allow us to perform our own accounting. These are most commonly used for direct IO which also bypasses the page cache, but they can be used for the common read/write call paths as well. Signed-off-by: Pavel Snajdr Signed-off-by: Brian Behlendorf Closes #313 Closes #1275 --- include/sys/zpl.h | 1 + module/zfs/zpl_file.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/sys/zpl.h b/include/sys/zpl.h index d513785c411d..5a7e23d46c07 100644 --- a/include/sys/zpl.h +++ b/include/sys/zpl.h @@ -32,6 +32,7 @@ #include #include #include +#include /* zpl_inode.c */ extern void zpl_vap_init(vattr_t *vap, struct inode *dir, diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c index 6598c177971d..8054645c1e4d 100644 --- a/module/zfs/zpl_file.c +++ b/module/zfs/zpl_file.c @@ -170,6 +170,7 @@ zpl_read_common(struct inode *ip, const char *buf, size_t len, loff_t pos, uio_seg_t segment, int flags, cred_t *cr) { int error; + ssize_t read; struct iovec iov; uio_t uio; @@ -187,7 +188,10 @@ zpl_read_common(struct inode *ip, const char *buf, size_t len, loff_t pos, if (error < 0) return (error); - return (len - uio.uio_resid); + read = len - uio.uio_resid; + task_io_account_read(read); + + return (read); } static ssize_t @@ -213,6 +217,7 @@ zpl_write_common(struct inode *ip, const char *buf, size_t len, loff_t pos, uio_seg_t segment, int flags, cred_t *cr) { int error; + ssize_t wrote; struct iovec iov; uio_t uio; @@ -230,7 +235,10 @@ zpl_write_common(struct inode *ip, const char *buf, size_t len, loff_t pos, if (error < 0) return (error); - return (len - uio.uio_resid); + wrote = len - uio.uio_resid; + task_io_account_write(wrote); + + return (wrote); } static ssize_t