diff options
author | Paulo Alcantara <palcantara@suse.de> | 2018-11-14 16:53:52 -0200 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2018-12-28 10:10:29 -0600 |
commit | 4a367dc0443566f87d73f2cdb94703b0e1374315 (patch) | |
tree | 056bdad61133a901b35093e69987b6abe0c4a6fd /fs/cifs/cifs_dfs_ref.c | |
parent | 5a650501eb8cb785593155441c5b0b9900edfcdf (diff) | |
download | lwn-4a367dc0443566f87d73f2cdb94703b0e1374315.tar.gz lwn-4a367dc0443566f87d73f2cdb94703b0e1374315.zip |
cifs: Add support for failover in cifs_mount()
This patch adds support for failover when failing to connect in
cifs_mount().
Signed-off-by: Paulo Alcantara <palcantara@suse.de>
Reviewed-by: Aurelien Aptel <aaptel@suse.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/cifs/cifs_dfs_ref.c')
-rw-r--r-- | fs/cifs/cifs_dfs_ref.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 8bd6f6b76da8..d9b99abe1243 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c @@ -255,20 +255,30 @@ static struct vfsmount *cifs_dfs_do_refmount(struct dentry *mntpt, { struct vfsmount *mnt; char *mountdata; - char *devname = NULL; + char *devname; + + /* + * Always pass down the DFS full path to smb3_do_mount() so we + * can use it later for failover. + */ + devname = kstrndup(fullpath, strlen(fullpath), GFP_KERNEL); + if (!devname) + return ERR_PTR(-ENOMEM); + + convert_delimiter(devname, '/'); /* strip first '\' from fullpath */ mountdata = cifs_compose_mount_options(cifs_sb->mountdata, - fullpath + 1, ref, &devname); - - if (IS_ERR(mountdata)) + fullpath + 1, ref, NULL); + if (IS_ERR(mountdata)) { + kfree(devname); return (struct vfsmount *)mountdata; + } mnt = vfs_submount(mntpt, &cifs_fs_type, devname, mountdata); kfree(mountdata); kfree(devname); return mnt; - } static void dump_referral(const struct dfs_info3_param *ref) |