]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/nfs/file.c
NFS: Account for NFS bytes read via the splice API
[mv-sheeva.git] / fs / nfs / file.c
index 6b891328f332cfcf73e1e965a0e4b3912c56dce1..abbc20281ea4695c2af105e558e996b227bf8633 100644 (file)
@@ -123,11 +123,11 @@ nfs_file_open(struct inode *inode, struct file *filp)
                        filp->f_path.dentry->d_parent->d_name.name,
                        filp->f_path.dentry->d_name.name);
 
+       nfs_inc_stats(inode, NFSIOS_VFSOPEN);
        res = nfs_check_flags(filp->f_flags);
        if (res)
                return res;
 
-       nfs_inc_stats(inode, NFSIOS_VFSOPEN);
        res = nfs_open(inode, filp);
        return res;
 }
@@ -237,9 +237,9 @@ nfs_file_flush(struct file *file, fl_owner_t id)
                        dentry->d_parent->d_name.name,
                        dentry->d_name.name);
 
+       nfs_inc_stats(inode, NFSIOS_VFSFLUSH);
        if ((file->f_mode & FMODE_WRITE) == 0)
                return 0;
-       nfs_inc_stats(inode, NFSIOS_VFSFLUSH);
 
        /* Flush writes to the server and return any errors */
        return nfs_do_fsync(ctx, inode);
@@ -262,9 +262,11 @@ nfs_file_read(struct kiocb *iocb, const struct iovec *iov,
                (unsigned long) count, (unsigned long) pos);
 
        result = nfs_revalidate_mapping(inode, iocb->ki_filp->f_mapping);
-       nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, count);
-       if (!result)
+       if (!result) {
                result = generic_file_aio_read(iocb, iov, nr_segs, pos);
+               if (result > 0)
+                       nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, result);
+       }
        return result;
 }
 
@@ -282,8 +284,11 @@ nfs_file_splice_read(struct file *filp, loff_t *ppos,
                (unsigned long) count, (unsigned long long) *ppos);
 
        res = nfs_revalidate_mapping(inode, filp->f_mapping);
-       if (!res)
+       if (!res) {
                res = generic_file_splice_read(filp, ppos, pipe, count, flags);
+               if (res > 0)
+                       nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, res);
+       }
        return res;
 }
 
@@ -486,6 +491,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp)
 {
        dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
 
+       if (gfp & __GFP_WAIT)
+               nfs_wb_page(page->mapping->host, page);
        /* If PagePrivate() is set, then the page is not freeable */
        if (PagePrivate(page))
                return 0;