diff options
author | Steve French <sfrench@us.ibm.com> | 2010-07-26 14:20:16 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2010-08-02 08:40:40 -0400 |
commit | f67909cf80051e8510194a51f88c4de323b92071 (patch) | |
tree | 06a172ec4e51a4531acd810c1159dbd647036a48 /fs/cifs | |
parent | f636a34802e3913415410c6e595df2bf84851cff (diff) |
[CIFS] remove redundant path walking in dfs_do_refmount
Reviewed-by: Dave Howells <dhowells@redhat.com>
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs')
-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 ac19a6f3dae0..dc1ed50ea06e 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -230,28 +230,22 @@ compose_mount_options_err: | |||
230 | goto compose_mount_options_out; | 230 | goto compose_mount_options_out; |
231 | } | 231 | } |
232 | 232 | ||
233 | 233 | /** | |
234 | static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent, | 234 | * cifs_dfs_do_refmount - mounts specified path using provided refferal |
235 | struct dentry *dentry, const struct dfs_info3_param *ref) | 235 | * @cifs_sb: parent/root superblock |
236 | * @fullpath: full path in UNC format | ||
237 | * @ref: server's referral | ||
238 | */ | ||
239 | static struct vfsmount *cifs_dfs_do_refmount(struct cifs_sb_info *cifs_sb, | ||
240 | const char *fullpath, const struct dfs_info3_param *ref) | ||
236 | { | 241 | { |
237 | struct cifs_sb_info *cifs_sb; | ||
238 | struct vfsmount *mnt; | 242 | struct vfsmount *mnt; |
239 | char *mountdata; | 243 | char *mountdata; |
240 | char *devname = NULL; | 244 | char *devname = NULL; |
241 | char *fullpath; | ||
242 | |||
243 | cifs_sb = CIFS_SB(dentry->d_inode->i_sb); | ||
244 | /* | ||
245 | * this function gives us a path with a double backslash prefix. We | ||
246 | * require a single backslash for DFS. | ||
247 | */ | ||
248 | fullpath = build_path_from_dentry(dentry); | ||
249 | if (!fullpath) | ||
250 | return ERR_PTR(-ENOMEM); | ||
251 | 245 | ||
246 | /* strip first '\' from fullpath */ | ||
252 | mountdata = cifs_compose_mount_options(cifs_sb->mountdata, | 247 | mountdata = cifs_compose_mount_options(cifs_sb->mountdata, |
253 | fullpath + 1, ref, &devname); | 248 | fullpath + 1, ref, &devname); |
254 | kfree(fullpath); | ||
255 | 249 | ||
256 | if (IS_ERR(mountdata)) | 250 | if (IS_ERR(mountdata)) |
257 | return (struct vfsmount *)mountdata; | 251 | return (struct vfsmount *)mountdata; |
@@ -357,8 +351,8 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
357 | rc = -EINVAL; | 351 | rc = -EINVAL; |
358 | goto out_err; | 352 | goto out_err; |
359 | } | 353 | } |
360 | mnt = cifs_dfs_do_refmount(nd->path.mnt, | 354 | mnt = cifs_dfs_do_refmount(cifs_sb, |
361 | nd->path.dentry, referrals + i); | 355 | full_path, referrals + i); |
362 | cFYI(1, "%s: cifs_dfs_do_refmount:%s , mnt:%p", __func__, | 356 | cFYI(1, "%s: cifs_dfs_do_refmount:%s , mnt:%p", __func__, |
363 | referrals[i].node_name, mnt); | 357 | referrals[i].node_name, mnt); |
364 | 358 | ||