Re: [PATCH] cifs: fix charset issue in reconnection

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Winston Wen <wentao@xxxxxxxxxxxxx> writes:

> We need to specify charset, like "iocharset=utf-8", in mount options for
> Chinese path if the nls_default don't support it, such as iso8859-1, the
> default value for CONFIG_NLS_DEFAULT.
>
> But now in reconnection the nls_default is used, instead of the one we
> specified and used in mount, and this can lead to mount failure.
>
> Signed-off-by: Winston Wen <wentao@xxxxxxxxxxxxx>
> ---
>  fs/smb/client/cifsglob.h | 1 +
>  fs/smb/client/connect.c  | 6 ++++++
>  fs/smb/client/smb2pdu.c  | 3 +--
>  3 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h
> index c9a87d0123ce..31cadf9b2a98 100644
> --- a/fs/smb/client/cifsglob.h
> +++ b/fs/smb/client/cifsglob.h
> @@ -1062,6 +1062,7 @@ struct cifs_ses {
>  	unsigned long chans_need_reconnect;
>  	/* ========= end: protected by chan_lock ======== */
>  	struct cifs_ses *dfs_root_ses;
> +	struct nls_table *local_nls;
>  };
>  
>  static inline bool
> diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
> index 5dd09c6d762e..abb69a6d4fce 100644
> --- a/fs/smb/client/connect.c
> +++ b/fs/smb/client/connect.c
> @@ -1842,6 +1842,10 @@ static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx)
>  			    CIFS_MAX_PASSWORD_LEN))
>  			return 0;
>  	}
> +
> +	if (strcmp(ctx->local_nls->charset, ses->local_nls->charset))
> +		return 0;
> +
>  	return 1;
>  }
>  
> @@ -2027,6 +2031,7 @@ void __cifs_put_smb_ses(struct cifs_ses *ses)
>  		}
>  	}
>  
> +	unload_nls(ses->local_nls);

Please move this call to sesInfoFree().

cifs_reconnect_tcon() also needs to be fixed by using @ses->local_nls
rather than load_nls_default().

Otherwise, looks good te me.  Thanks!



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux