• C
    NFS: Prevent nfs_getattr() hang during heavy write workloads · 28c494c5
    Chuck Lever 提交于
    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: NChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
    28c494c5
inode.c 35.1 KB