On Fri, 2015-04-03 at 20:57 -0500, Steve French wrote: > Looks reasonable but fails on SMB3 - we need to fix lines 133 and 134 > of smb2pdu.c as well Hello Steve, I am not sure I understand how these lines are involved. The patch fixes behaviour for readdir where the lookup data doesn't contain any information indicating that the directory leads to a DFS lookup. Sachin Prabhu > > On Fri, Apr 3, 2015 at 7:14 AM, Jeff Layton <jeff.layton@xxxxxxxxxxxxxxx> wrote: > > On Thu, 2 Apr 2015 14:51:35 +0100 > > Sachin Prabhu <sprabhu@xxxxxxxxxx> wrote: > > > >> 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: Sachin Prabhu <sprabhu@xxxxxxxxxx> > >> --- > >> fs/cifs/readdir.c | 2 ++ > >> 1 file changed, 2 insertions(+) > >> > >> diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c > >> index c295338..b4bda47 100644 > >> --- a/fs/cifs/readdir.c > >> +++ b/fs/cifs/readdir.c > >> @@ -90,6 +90,8 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, > >> if (dentry) { > >> inode = dentry->d_inode; > >> if (inode) { > >> + if (d_mountpoint(dentry)) > >> + goto out; > >> /* > >> * If we're generating inode numbers, then we don't > >> * want to clobber the existing one with the one that > > > > > > Looks right. > > > > Reviewed-by: Jeff Layton <jeff.layton@xxxxxxxxxxxxxxx> > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html