|
@@ -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);
|
|
|
|