Re: [PATCH] cifs: Don't replace dentries for dfs mounts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux