mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
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 <snajpa@snajpa.net> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #313 Closes #1275
This commit is contained in:
parent
29714574fa
commit
e3dc14b861
@ -32,6 +32,7 @@
|
|||||||
#include <linux/exportfs.h>
|
#include <linux/exportfs.h>
|
||||||
#include <linux/writeback.h>
|
#include <linux/writeback.h>
|
||||||
#include <linux/falloc.h>
|
#include <linux/falloc.h>
|
||||||
|
#include <linux/task_io_accounting_ops.h>
|
||||||
|
|
||||||
/* zpl_inode.c */
|
/* zpl_inode.c */
|
||||||
extern void zpl_vap_init(vattr_t *vap, struct inode *dir,
|
extern void zpl_vap_init(vattr_t *vap, struct inode *dir,
|
||||||
|
@ -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)
|
uio_seg_t segment, int flags, cred_t *cr)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
ssize_t read;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
uio_t uio;
|
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)
|
if (error < 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
return (len - uio.uio_resid);
|
read = len - uio.uio_resid;
|
||||||
|
task_io_account_read(read);
|
||||||
|
|
||||||
|
return (read);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
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)
|
uio_seg_t segment, int flags, cred_t *cr)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
ssize_t wrote;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
uio_t uio;
|
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)
|
if (error < 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
return (len - uio.uio_resid);
|
wrote = len - uio.uio_resid;
|
||||||
|
task_io_account_write(wrote);
|
||||||
|
|
||||||
|
return (wrote);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
Loading…
Reference in New Issue
Block a user