diff options
| -rw-r--r-- | fs/cifs/connect.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 511176903e57..6ec366ff28b3 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -65,6 +65,8 @@ static int ip_connect(struct TCP_Server_Info *server); | |||
| 65 | static int generic_ip_connect(struct TCP_Server_Info *server); | 65 | static int generic_ip_connect(struct TCP_Server_Info *server); |
| 66 | static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink); | 66 | static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink); |
| 67 | static void cifs_prune_tlinks(struct work_struct *work); | 67 | static void cifs_prune_tlinks(struct work_struct *work); |
| 68 | static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data, | ||
| 69 | const char *devname); | ||
| 68 | 70 | ||
| 69 | /* | 71 | /* |
| 70 | * cifs tcp session reconnection | 72 | * cifs tcp session reconnection |
| @@ -2830,12 +2832,9 @@ is_path_accessible(int xid, struct cifs_tcon *tcon, | |||
| 2830 | return rc; | 2832 | return rc; |
| 2831 | } | 2833 | } |
| 2832 | 2834 | ||
| 2833 | void | 2835 | static void |
| 2834 | cifs_cleanup_volume_info(struct smb_vol *volume_info) | 2836 | cleanup_volume_info_contents(struct smb_vol *volume_info) |
| 2835 | { | 2837 | { |
| 2836 | if (!volume_info) | ||
| 2837 | return; | ||
| 2838 | |||
| 2839 | kfree(volume_info->username); | 2838 | kfree(volume_info->username); |
| 2840 | kzfree(volume_info->password); | 2839 | kzfree(volume_info->password); |
| 2841 | kfree(volume_info->UNC); | 2840 | kfree(volume_info->UNC); |
| @@ -2843,10 +2842,18 @@ cifs_cleanup_volume_info(struct smb_vol *volume_info) | |||
| 2843 | kfree(volume_info->domainname); | 2842 | kfree(volume_info->domainname); |
| 2844 | kfree(volume_info->iocharset); | 2843 | kfree(volume_info->iocharset); |
| 2845 | kfree(volume_info->prepath); | 2844 | kfree(volume_info->prepath); |
| 2845 | } | ||
| 2846 | |||
| 2847 | void | ||
| 2848 | cifs_cleanup_volume_info(struct smb_vol *volume_info) | ||
| 2849 | { | ||
| 2850 | if (!volume_info) | ||
| 2851 | return; | ||
| 2852 | cleanup_volume_info_contents(volume_info); | ||
| 2846 | kfree(volume_info); | 2853 | kfree(volume_info); |
| 2847 | return; | ||
| 2848 | } | 2854 | } |
| 2849 | 2855 | ||
| 2856 | |||
| 2850 | #ifdef CONFIG_CIFS_DFS_UPCALL | 2857 | #ifdef CONFIG_CIFS_DFS_UPCALL |
| 2851 | /* build_path_to_root returns full path to root when | 2858 | /* build_path_to_root returns full path to root when |
| 2852 | * we do not have an exiting connection (tcon) */ | 2859 | * we do not have an exiting connection (tcon) */ |
| @@ -2915,15 +2922,18 @@ expand_dfs_referral(int xid, struct cifs_ses *pSesInfo, | |||
| 2915 | &fake_devname); | 2922 | &fake_devname); |
| 2916 | 2923 | ||
| 2917 | free_dfs_info_array(referrals, num_referrals); | 2924 | free_dfs_info_array(referrals, num_referrals); |
| 2918 | kfree(fake_devname); | ||
| 2919 | |||
| 2920 | if (cifs_sb->mountdata != NULL) | ||
| 2921 | kfree(cifs_sb->mountdata); | ||
| 2922 | 2925 | ||
| 2923 | if (IS_ERR(mdata)) { | 2926 | if (IS_ERR(mdata)) { |
| 2924 | rc = PTR_ERR(mdata); | 2927 | rc = PTR_ERR(mdata); |
| 2925 | mdata = NULL; | 2928 | mdata = NULL; |
| 2929 | } else { | ||
| 2930 | cleanup_volume_info_contents(volume_info); | ||
| 2931 | memset(volume_info, '\0', sizeof(*volume_info)); | ||
| 2932 | rc = cifs_setup_volume_info(volume_info, mdata, | ||
| 2933 | fake_devname); | ||
| 2926 | } | 2934 | } |
| 2935 | kfree(fake_devname); | ||
| 2936 | kfree(cifs_sb->mountdata); | ||
| 2927 | cifs_sb->mountdata = mdata; | 2937 | cifs_sb->mountdata = mdata; |
| 2928 | } | 2938 | } |
| 2929 | kfree(full_path); | 2939 | kfree(full_path); |
