linux/fs/nfs
Chuck Lever 65d269538a NFS: Too many GETATTR and ACCESS calls after direct I/O
The cached read and write paths initialize fattr->time_start in their
setup procedures.  The value of fattr->time_start is propagated to
read_cache_jiffies by nfs_update_inode().  Subsequent calls to
nfs_attribute_timeout() will then use a good time stamp when
computing the attribute cache timeout, and squelch unneeded GETATTR
calls.

Since the direct I/O paths erroneously leave the inode's
fattr->time_start field set to zero, read_cache_jiffies for that inode
is set to zero after any direct read or write operation.  This
triggers an otw GETATTR or ACCESS call to update the file's attribute
and access caches properly, even when the NFS READ or WRITE replies
have usable post-op attributes.

Make sure the direct read and write setup code performs the same fattr
initialization as the cached I/O paths to prevent unnecessary GETATTR
calls.

This was likely introduced by commit 0e574af1 in 2.6.15, which appears
to add new nfs_fattr_init() call sites in the cached read and write
paths, but not in the equivalent places in fs/nfs/direct.c.  A
subsequent commit in the same series, 33801147, introduces the
fattr->time_start field.

Interestingly, the direct write reschedule path already has a call to
nfs_fattr_init() in the right place.

Reported-by: Quentin Barnes <qbarnes@yahoo-inc.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: stable@kernel.org
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-02-15 19:53:43 -08:00
..
Kconfig nfs: new subdir Documentation/filesystems/nfs 2009-10-27 19:34:04 -04:00
Makefile NFS: Add a dns resolver for use with NFSv4 referrals and migration 2009-08-19 18:22:15 -04:00
cache_lib.c NFS: Add a dns resolver for use with NFSv4 referrals and migration 2009-08-19 18:22:15 -04:00
cache_lib.h NFS: Add a dns resolver for use with NFSv4 referrals and migration 2009-08-19 18:22:15 -04:00
callback.c nfs41: add support for callback with RPC version number 4 2009-12-05 13:19:01 -05:00
callback.h nfs41: v2 fix cb_recall bug 2009-12-05 13:48:55 -05:00
callback_proc.c nfs41: v2 fix cb_recall bug 2009-12-05 13:48:55 -05:00
callback_xdr.c nfs41: V2 initial support for CB_RECALL_ANY 2009-12-05 13:27:02 -05:00
client.c nfs41: V2 adjust max_rqst_sz, max_resp_sz w.r.t to rsize, wsize 2009-12-05 13:36:55 -05:00
delegation.c nfs41: v2 fix cb_recall bug 2009-12-05 13:48:55 -05:00
delegation.h nfs41: v2 fix cb_recall bug 2009-12-05 13:48:55 -05:00
dir.c nfs: fix oops in nfs_rename() 2010-01-06 18:48:26 -05:00
direct.c NFS: Too many GETATTR and ACCESS calls after direct I/O 2010-02-15 19:53:43 -08:00
dns_resolve.c NFSv4: Ensure nfs_dns_lookup() and nfs_dns_update() are declared static 2009-12-03 15:54:01 -05:00
dns_resolve.h NFS: Add a dns resolver for use with NFSv4 referrals and migration 2009-08-19 18:22:15 -04:00
file.c NFS: Try to commit unstable writes in nfs_release_page() 2010-01-26 15:41:53 -05:00
fscache-index.c NFS: Add read context retention for FS-Cache to call back with 2009-04-03 16:42:44 +01:00
fscache.c NFS: Fix a bug in nfs_fscache_release_page() 2010-02-09 14:29:10 -05:00
fscache.h NFS: Propagate 'fsc' mount option through automounts 2009-09-23 14:36:39 -04:00
getroot.c headers: mnt_namespace.h redux 2009-07-08 09:31:56 -07:00
idmap.c SUNRPC: Replace rpc_client->cl_dentry and cl_mnt, with a cl_path 2009-08-09 15:14:24 -04:00
inode.c NFS: Don't clobber the attribute type in nfs_update_inode() 2010-02-03 08:27:35 -05:00
internal.h NFS: Fix up the declaration of nfs4_restart_rpc when NFSv4 not configured 2009-12-07 09:00:24 -05:00
iostat.h this_cpu: Use this_cpu operations for NFS statistics 2009-10-03 19:48:22 +09:00
mount_clnt.c NFS: Fix the mapping of the NFSERR_SERVERFAULT error 2010-02-09 14:29:29 -05:00
namespace.c NFS: Fix nfs_path() to always return a '/' at the beginning of the path 2009-06-22 21:28:25 -07:00
nfs2xdr.c NFS: Fix the mapping of the NFSERR_SERVERFAULT error 2010-02-09 14:29:29 -05:00
nfs3acl.c nfs: remove unnecessary NFS_INO_INVALID_ACL checks 2009-06-17 18:02:14 -07:00
nfs3proc.c headers: utsname.h redux 2009-09-23 18:13:10 -07:00
nfs3xdr.c headers: utsname.h redux 2009-09-23 18:13:10 -07:00
nfs4_fs.h NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly 2010-01-26 15:42:47 -05:00
nfs4namespace.c NFSv4: Fix the referral mount code 2009-10-06 15:42:20 -04:00
nfs4proc.c NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly 2010-01-26 15:42:47 -05:00
nfs4renewd.c NFSv4: Kill nfs4_renewd_prepare_shutdown() 2009-10-08 11:50:55 -04:00
nfs4state.c NFS: Ensure that we handle NFS4ERR_STALE_STATEID correctly 2010-01-26 15:42:47 -05:00
nfs4xdr.c NFS: Fix the mapping of the NFSERR_SERVERFAULT error 2010-02-09 14:29:29 -05:00
nfsroot.c NFS: Update MNT and MNT3 reply decoding functions 2009-06-17 18:02:13 -07:00
pagelist.c NFS: Fix an Oops when truncating a file 2010-02-03 08:27:22 -05:00
proc.c headers: utsname.h redux 2009-09-23 18:13:10 -07:00
read.c NFS: Fix up the declaration of nfs4_restart_rpc when NFSv4 not configured 2009-12-07 09:00:24 -05:00
super.c NFS: Fix a umount race 2010-02-03 08:27:35 -05:00
symlink.c nfs: remove unnecessary NFS_NEED_* defines 2008-04-23 16:13:37 -04:00
sysctl.c NFS: Avoid warnings when CONFIG_NFS_V4=n 2010-01-26 15:42:11 -05:00
unlink.c NFS: Fix up the declaration of nfs4_restart_rpc when NFSv4 not configured 2009-12-07 09:00:24 -05:00
write.c NFS: Remove a redundant check for PageFsCache in nfs_migrate_page() 2010-02-09 14:29:21 -05:00