diff options
Diffstat (limited to 'fs/cifs/cifs_dfs_ref.c')
| -rw-r--r-- | fs/cifs/cifs_dfs_ref.c | 28 | 
1 files changed, 11 insertions, 17 deletions
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index ac19a6f3dae..dc1ed50ea06 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c @@ -230,28 +230,22 @@ compose_mount_options_err:  	goto compose_mount_options_out;  } - -static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent, -		struct dentry *dentry, const struct dfs_info3_param *ref) +/** + * cifs_dfs_do_refmount - mounts specified path using provided refferal + * @cifs_sb:		parent/root superblock + * @fullpath:		full path in UNC format + * @ref:		server's referral + */ +static struct vfsmount *cifs_dfs_do_refmount(struct cifs_sb_info *cifs_sb, +		const char *fullpath, const struct dfs_info3_param *ref)  { -	struct cifs_sb_info *cifs_sb;  	struct vfsmount *mnt;  	char *mountdata;  	char *devname = NULL; -	char *fullpath; - -	cifs_sb = CIFS_SB(dentry->d_inode->i_sb); -	/* -	 * this function gives us a path with a double backslash prefix. We -	 * require a single backslash for DFS. -	 */ -	fullpath = build_path_from_dentry(dentry); -	if (!fullpath) -		return ERR_PTR(-ENOMEM); +	/* strip first '\' from fullpath */  	mountdata = cifs_compose_mount_options(cifs_sb->mountdata,  			fullpath + 1, ref, &devname); -	kfree(fullpath);  	if (IS_ERR(mountdata))  		return (struct vfsmount *)mountdata; @@ -357,8 +351,8 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)  			rc = -EINVAL;  			goto out_err;  		} -		mnt = cifs_dfs_do_refmount(nd->path.mnt, -				nd->path.dentry, referrals + i); +		mnt = cifs_dfs_do_refmount(cifs_sb, +				full_path, referrals + i);  		cFYI(1, "%s: cifs_dfs_do_refmount:%s , mnt:%p", __func__,  					referrals[i].node_name, mnt);  |