NFS: Getattr doesn't require data sync semantics
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 25 Jun 2016 21:45:40 +0000 (17:45 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 5 Jul 2016 23:11:06 +0000 (19:11 -0400)
When retrieving stat() information, NFS unfortunately does require us to
sync writes to disk in order to ensure that mtime and ctime are up to
date. However we shouldn't have to ensure that those writes are persisted.

Relaxing that requirement does mean that we may see an mtime/ctime change
if the server reboots and forces us to replay all writes.

The exception to this rule are pNFS clients that are required to send
layoutcommit, however that is dealt with by the call to pnfs_sync_inode()
in _nfs_revalidate_inode().

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c

index 7688436b19ba1c98f72b9016208cda57596f318f..35fda08dc4f6d2168049ae27cd7090fc0d14800f 100644 (file)
@@ -661,9 +661,7 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
        trace_nfs_getattr_enter(inode);
        /* Flush out writes to the server in order to update c/mtime.  */
        if (S_ISREG(inode->i_mode)) {
-               inode_lock(inode);
-               err = nfs_sync_inode(inode);
-               inode_unlock(inode);
+               err = filemap_write_and_wait(inode->i_mapping);
                if (err)
                        goto out;
        }