• NeilBrown's avatar
    NFS: revalidate "." etc correctly on "open". · b688741c
    NeilBrown authored
    For correct close-to-open semantics, NFS must validate
    the change attribute of a directory (or file) on open.
    
    Since commit ecf3d1f1 ("vfs: kill FS_REVAL_DOT by adding a
    d_weak_revalidate dentry op"), open() of "." or a path ending ".." is
    not revalidated reliably (except when that direct is a mount point).
    
    Prior to that commit, "." was revalidated using nfs_lookup_revalidate()
    which checks the LOOKUP_OPEN flag and forces revalidation if the flag is
    set.
    Since that commit, nfs_weak_revalidate() is used for NFSv3 (which
    ignores the flags) and nothing is used for NFSv4.
    
    This is fixed by using nfs_lookup_verify_inode() in
    nfs_weak_revalidate().  This does the revalidation exactly when needed.
    Also, add a definition of .d_weak_revalidate for NFSv4.
    
    The incorrect behavior is easily demonstrated by running "echo *" in
    some non-mountpoint NFS directory while watching network traffic.
    Without this patch, "echo *" sometimes doesn't produce any traffic.
    With the patch it always does.
    
    Fixes: ecf3d1f1 ("vfs: kill FS_REVAL_DOT by adding a d_weak_revalidate dentry op")
    cc: stable@vger.kernel.org (3.9+)
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    b688741c
dir.c 64.7 KB