[CIFS] remove redundant path walking in dfs_do_refmount
authorSteve French <sfrench@us.ibm.com>
Mon, 26 Jul 2010 18:20:16 +0000 (18:20 +0000)
committerSteve French <sfrench@us.ibm.com>
Mon, 2 Aug 2010 12:40:40 +0000 (12:40 +0000)
Reviewed-by: Dave Howells <dhowells@redhat.com>
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifs_dfs_ref.c

index ac19a6f3dae079c3b1caa34d0157e3536e609ba8..dc1ed50ea06e2ad7b23e7a547e793b1f48718b21 100644 (file)
@@ -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);