]> err.no Git - linux-2.6/commit
NFS: Prevent nfs_getattr() hang during heavy write workloads
authorChuck Lever <chuck.lever@oracle.com>
Fri, 26 Oct 2007 17:32:13 +0000 (13:32 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 30 Jan 2008 07:05:45 +0000 (02:05 -0500)
commit28c494c5c8d425e15b7b82571e4df6d6bc34594d
treecbd7902da8f467182b1d5faed90349329cb8d042
parent464ad6b1ade186b53a1dae863361853326b85694
NFS: Prevent nfs_getattr() hang during heavy write workloads

POSIX requires that ctime and mtime, as reported by the stat(2) call,
reflect the activity of the most recent write(2).  To that end, nfs_getattr()
flushes pending dirty writes to a file before doing a GETATTR to allow the
NFS server to set the file's size, ctime, and mtime properly.

However, nfs_getattr() can be starved when a constant stream of application
writes to a file prevents nfs_wb_nocommit() from completing.  This usually
results in hangs of programs doing a stat against an NFS file that is being
written.  "ls -l" is a common victim of this behavior.

To prevent starvation, hold the file's i_mutex in nfs_getattr() to
freeze applications writes temporarily so the client can more quickly obtain
clean values for a file's size, mtime, and ctime.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/inode.c