• Al Viro's avatar
    VFS: we need to set LOOKUP_JUMPED on mountpoint crossing · a3fbbde7
    Al Viro authored
    
    
    Mountpoint crossing is similar to following procfs symlinks - we do
    not get ->d_revalidate() called for dentry we have arrived at, with
    unpleasant consequences for NFS4.
    
    Simple way to reproduce the problem in mainline:
    
        cat >/tmp/a.c <<'EOF'
        #include <unistd.h>
        #include <fcntl.h>
        #include <stdio.h>
        main()
        {
                struct flock fl = {.l_type = F_RDLCK, .l_whence = SEEK_SET, .l_len = 1};
                if (fcntl(0, F_SETLK, &fl))
                        perror("setlk");
        }
        EOF
        cc /tmp/a.c -o /tmp/test
    
    then on nfs4:
    
        mount --bind file1 file2
        /tmp/test < file1		# ok
        /tmp/test < file2		# spews "setlk: No locks available"...
    
    What happens is the missing call of ->d_revalidate() after mountpoint
    crossing and that's where NFS4 would issue OPEN request to server.
    
    The fix is simple - treat mountpoint crossing the same way we deal with
    following procfs-style symlinks.  I.e.  set LOOKUP_JUMPED...
    
    Cc: stable@kernel.org
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a3fbbde7