• Sachin Prabhu's avatar
    cifs: Don't replace dentries for dfs mounts · f5d0684e
    Sachin Prabhu authored
    Doing a readdir on a dfs root can result in the dentries for directories
    with a dfs share mounted  being replaced by new dentries for objects
    returned by the readdir call. These new dentries on shares mounted with
    unix extenstions show up as symlinks pointing to the dfs share.
    
     # mount -t cifs -o sec=none  //vm140-31/dfsroot cifs
     # stat cifs/testlink/testfile; ls -l cifs
      File: ‘cifs/testlink/testfile’
      Size: 0         	Blocks: 0          IO Block: 16384  regular
    empty file
    Device: 27h/39d	Inode: 130120      Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2015-03-31 13:55:50.106018200 +0100
    Modify: 2015-03-31 13:55:50.106018200 +0100
    Change: 2015-03-31 13:55:50.106018200 +0100
     Birth: -
    total 0
    drwxr-xr-x 2 root root  0 Mar 31 13:54 testdir
    lrwxrwxrwx 1 root root 19 Mar 24 14:25 testlink -> \vm140-31\test
    
    In the example above, the stat command mounts the dfs share at
    cifs/testlink. The subsequent ls on the dfsroot directory replaces the
    dentry for testlink with a symlink.
    
    In the earlier code, the d_invalidate command returned an -EBUSY error
    when attempting to invalidate directories. This stopped the code from
    replacing the directories with symlinks returned by the readdir call.
    Changes were recently made to the d_invalidate() command so
    that it no longer returns an error code. This results in the directory
    with the mounted dfs share being replaced by a symlink which denotes a
    dfs share.
    Signed-off-by: default avatarSachin Prabhu <sprabhu@redhat.com>
    Reviewed-by: default avatarJeff Layton <jeff.layton@primarydata.com>
    Signed-off-by: default avatarSteve French <smfrench@gmail.com>
    f5d0684e
readdir.c 24.5 KB