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!