drop unused dentry argument to ->fsync
[safe/jmp/linux-2.6] / fs / nfs / file.c
index 57cf94f..36a5e74 100644 (file)
@@ -24,9 +24,9 @@
 #include <linux/nfs_fs.h>
 #include <linux/nfs_mount.h>
 #include <linux/mm.h>
-#include <linux/slab.h>
 #include <linux/pagemap.h>
 #include <linux/aio.h>
+#include <linux/gfp.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -53,7 +53,7 @@ static ssize_t nfs_file_splice_write(struct pipe_inode_info *pipe,
 static ssize_t nfs_file_write(struct kiocb *, const struct iovec *iov,
                                unsigned long nr_segs, loff_t pos);
 static int  nfs_file_flush(struct file *, fl_owner_t id);
-static int  nfs_file_fsync(struct file *, struct dentry *dentry, int datasync);
+static int  nfs_file_fsync(struct file *, int datasync);
 static int nfs_check_flags(int flags);
 static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl);
 static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl);
@@ -161,14 +161,17 @@ static int nfs_revalidate_file_size(struct inode *inode, struct file *filp)
        struct nfs_server *server = NFS_SERVER(inode);
        struct nfs_inode *nfsi = NFS_I(inode);
 
-       if (server->flags & NFS_MOUNT_NOAC)
-               goto force_reval;
+       if (nfs_have_delegated_attributes(inode))
+               goto out_noreval;
+
        if (filp->f_flags & O_DIRECT)
                goto force_reval;
-       if (nfsi->npages != 0)
-               return 0;
-       if (!(nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) && !nfs_attribute_timeout(inode))
-               return 0;
+       if (nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE)
+               goto force_reval;
+       if (nfs_attribute_timeout(inode))
+               goto force_reval;
+out_noreval:
+       return 0;
 force_reval:
        return __nfs_revalidate_inode(server, inode);
 }
@@ -262,9 +265,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 +287,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;
 }
 
@@ -314,8 +322,9 @@ nfs_file_mmap(struct file * file, struct vm_area_struct * vma)
  * whether any write errors occurred for this process.
  */
 static int
-nfs_file_fsync(struct file *file, struct dentry *dentry, int datasync)
+nfs_file_fsync(struct file *file, int datasync)
 {
+       struct dentry *dentry = file->f_path.dentry;
        struct nfs_open_context *ctx = nfs_file_open_context(file);
        struct inode *inode = dentry->d_inode;
 
@@ -486,7 +495,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp)
 {
        dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
 
-       if (gfp & __GFP_WAIT)
+       /* Only do I/O if gfp is a superset of GFP_KERNEL */
+       if ((gfp & GFP_KERNEL) == GFP_KERNEL)
                nfs_wb_page(page->mapping->host, page);
        /* If PagePrivate() is set, then the page is not freeable */
        if (PagePrivate(page))
@@ -596,6 +606,7 @@ static ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
 {
        struct dentry * dentry = iocb->ki_filp->f_path.dentry;
        struct inode * inode = dentry->d_inode;
+       unsigned long written = 0;
        ssize_t result;
        size_t count = iov_length(iov, nr_segs);
 
@@ -622,14 +633,18 @@ static ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
        if (!count)
                goto out;
 
-       nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, count);
        result = generic_file_aio_write(iocb, iov, nr_segs, pos);
+       if (result > 0)
+               written = result;
+
        /* Return error values for O_DSYNC and IS_SYNC() */
        if (result >= 0 && nfs_need_sync_write(iocb->ki_filp, inode)) {
                int err = nfs_do_fsync(nfs_file_open_context(iocb->ki_filp), inode);
                if (err < 0)
                        result = err;
        }
+       if (result > 0)
+               nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, written);
 out:
        return result;
 
@@ -644,6 +659,7 @@ static ssize_t nfs_file_splice_write(struct pipe_inode_info *pipe,
 {
        struct dentry *dentry = filp->f_path.dentry;
        struct inode *inode = dentry->d_inode;
+       unsigned long written = 0;
        ssize_t ret;
 
        dprintk("NFS splice_write(%s/%s, %lu@%llu)\n",
@@ -654,14 +670,17 @@ static ssize_t nfs_file_splice_write(struct pipe_inode_info *pipe,
         * The combination of splice and an O_APPEND destination is disallowed.
         */
 
-       nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, count);
-
        ret = generic_file_splice_write(pipe, filp, ppos, count, flags);
+       if (ret > 0)
+               written = ret;
+
        if (ret >= 0 && nfs_need_sync_write(filp, inode)) {
                int err = nfs_do_fsync(nfs_file_open_context(filp), inode);
                if (err < 0)
                        ret = err;
        }
+       if (ret > 0)
+               nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, written);
        return ret;
 }