• Miklos Szeredi's avatar
    nfs: don't open in ->d_revalidate · 0ef97dcf
    Miklos Szeredi authored
    NFSv4 can't do reliable opens in d_revalidate, since it cannot know whether a
    mount needs to be followed or not.  It does check d_mountpoint() on the dentry,
    which can result in a weird error if the VFS found that the mount does not in
    fact need to be followed, e.g.:
    
      # mount --bind /mnt/nfs /mnt/nfs-clone
      # echo something > /mnt/nfs/tmp/bar
      # echo x > /tmp/file
      # mount --bind /tmp/file /mnt/nfs-clone/tmp/bar
      # cat  /mnt/nfs/tmp/bar
      cat: /mnt/nfs/tmp/bar: Not a directory
    
    Which should, by any sane filesystem, result in "something" being printed.
    
    So instead do the open in f_op->open() and in the unlikely case that the cached
    dentry turned out to be invalid, drop the dentry and return EOPENSTALE to let
    the VFS retry.
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
    CC: Trond Myklebust <Trond.Myklebust@netapp.com>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    0ef97dcf
file.c 25.4 KB