diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/file.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index abbc20281ea4..ae8d02294e46 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -601,6 +601,7 @@ static ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov, | |||
601 | { | 601 | { |
602 | struct dentry * dentry = iocb->ki_filp->f_path.dentry; | 602 | struct dentry * dentry = iocb->ki_filp->f_path.dentry; |
603 | struct inode * inode = dentry->d_inode; | 603 | struct inode * inode = dentry->d_inode; |
604 | unsigned long written = 0; | ||
604 | ssize_t result; | 605 | ssize_t result; |
605 | size_t count = iov_length(iov, nr_segs); | 606 | size_t count = iov_length(iov, nr_segs); |
606 | 607 | ||
@@ -627,14 +628,18 @@ static ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov, | |||
627 | if (!count) | 628 | if (!count) |
628 | goto out; | 629 | goto out; |
629 | 630 | ||
630 | nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, count); | ||
631 | result = generic_file_aio_write(iocb, iov, nr_segs, pos); | 631 | result = generic_file_aio_write(iocb, iov, nr_segs, pos); |
632 | if (result > 0) | ||
633 | written = result; | ||
634 | |||
632 | /* Return error values for O_DSYNC and IS_SYNC() */ | 635 | /* Return error values for O_DSYNC and IS_SYNC() */ |
633 | if (result >= 0 && nfs_need_sync_write(iocb->ki_filp, inode)) { | 636 | if (result >= 0 && nfs_need_sync_write(iocb->ki_filp, inode)) { |
634 | int err = nfs_do_fsync(nfs_file_open_context(iocb->ki_filp), inode); | 637 | int err = nfs_do_fsync(nfs_file_open_context(iocb->ki_filp), inode); |
635 | if (err < 0) | 638 | if (err < 0) |
636 | result = err; | 639 | result = err; |
637 | } | 640 | } |
641 | if (result > 0) | ||
642 | nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, written); | ||
638 | out: | 643 | out: |
639 | return result; | 644 | return result; |
640 | 645 | ||
@@ -649,6 +654,7 @@ static ssize_t nfs_file_splice_write(struct pipe_inode_info *pipe, | |||
649 | { | 654 | { |
650 | struct dentry *dentry = filp->f_path.dentry; | 655 | struct dentry *dentry = filp->f_path.dentry; |
651 | struct inode *inode = dentry->d_inode; | 656 | struct inode *inode = dentry->d_inode; |
657 | unsigned long written = 0; | ||
652 | ssize_t ret; | 658 | ssize_t ret; |
653 | 659 | ||
654 | dprintk("NFS splice_write(%s/%s, %lu@%llu)\n", | 660 | dprintk("NFS splice_write(%s/%s, %lu@%llu)\n", |
@@ -659,14 +665,17 @@ static ssize_t nfs_file_splice_write(struct pipe_inode_info *pipe, | |||
659 | * The combination of splice and an O_APPEND destination is disallowed. | 665 | * The combination of splice and an O_APPEND destination is disallowed. |
660 | */ | 666 | */ |
661 | 667 | ||
662 | nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, count); | ||
663 | |||
664 | ret = generic_file_splice_write(pipe, filp, ppos, count, flags); | 668 | ret = generic_file_splice_write(pipe, filp, ppos, count, flags); |
669 | if (ret > 0) | ||
670 | written = ret; | ||
671 | |||
665 | if (ret >= 0 && nfs_need_sync_write(filp, inode)) { | 672 | if (ret >= 0 && nfs_need_sync_write(filp, inode)) { |
666 | int err = nfs_do_fsync(nfs_file_open_context(filp), inode); | 673 | int err = nfs_do_fsync(nfs_file_open_context(filp), inode); |
667 | if (err < 0) | 674 | if (err < 0) |
668 | ret = err; | 675 | ret = err; |
669 | } | 676 | } |
677 | if (ret > 0) | ||
678 | nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, written); | ||
670 | return ret; | 679 | return ret; |
671 | } | 680 | } |
672 | 681 | ||