mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 00:00:52 +07:00
isofs: joliet: Fix iocharset=utf8 mount option
[ Upstream commit 28ce50f8d96ec9035f60c9348294ea26b94db944 ] Currently iocharset=utf8 mount option is broken. To use UTF-8 as iocharset, it is required to use utf8 mount option. Fix iocharset=utf8 mount option to use be equivalent to the utf8 mount option. If UTF-8 as iocharset is used then s_nls_iocharset is set to NULL. So simplify code around, remove s_utf8 field as to distinguish between UTF-8 and non-UTF-8 it is needed just to check if s_nls_iocharset is set to NULL or not. Link: https://lore.kernel.org/r/20210808162453.1653-5-pali@kernel.org Signed-off-by: Pali Rohár <pali@kernel.org> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
efce4dfa65
commit
19400bdf1c
@ -155,7 +155,6 @@ struct iso9660_options{
|
|||||||
unsigned int overriderockperm:1;
|
unsigned int overriderockperm:1;
|
||||||
unsigned int uid_set:1;
|
unsigned int uid_set:1;
|
||||||
unsigned int gid_set:1;
|
unsigned int gid_set:1;
|
||||||
unsigned int utf8:1;
|
|
||||||
unsigned char map;
|
unsigned char map;
|
||||||
unsigned char check;
|
unsigned char check;
|
||||||
unsigned int blocksize;
|
unsigned int blocksize;
|
||||||
@ -356,7 +355,6 @@ static int parse_options(char *options, struct iso9660_options *popt)
|
|||||||
popt->gid = GLOBAL_ROOT_GID;
|
popt->gid = GLOBAL_ROOT_GID;
|
||||||
popt->uid = GLOBAL_ROOT_UID;
|
popt->uid = GLOBAL_ROOT_UID;
|
||||||
popt->iocharset = NULL;
|
popt->iocharset = NULL;
|
||||||
popt->utf8 = 0;
|
|
||||||
popt->overriderockperm = 0;
|
popt->overriderockperm = 0;
|
||||||
popt->session=-1;
|
popt->session=-1;
|
||||||
popt->sbsector=-1;
|
popt->sbsector=-1;
|
||||||
@ -389,10 +387,13 @@ static int parse_options(char *options, struct iso9660_options *popt)
|
|||||||
case Opt_cruft:
|
case Opt_cruft:
|
||||||
popt->cruft = 1;
|
popt->cruft = 1;
|
||||||
break;
|
break;
|
||||||
case Opt_utf8:
|
|
||||||
popt->utf8 = 1;
|
|
||||||
break;
|
|
||||||
#ifdef CONFIG_JOLIET
|
#ifdef CONFIG_JOLIET
|
||||||
|
case Opt_utf8:
|
||||||
|
kfree(popt->iocharset);
|
||||||
|
popt->iocharset = kstrdup("utf8", GFP_KERNEL);
|
||||||
|
if (!popt->iocharset)
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
case Opt_iocharset:
|
case Opt_iocharset:
|
||||||
kfree(popt->iocharset);
|
kfree(popt->iocharset);
|
||||||
popt->iocharset = match_strdup(&args[0]);
|
popt->iocharset = match_strdup(&args[0]);
|
||||||
@ -495,7 +496,6 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
|
|||||||
if (sbi->s_nocompress) seq_puts(m, ",nocompress");
|
if (sbi->s_nocompress) seq_puts(m, ",nocompress");
|
||||||
if (sbi->s_overriderockperm) seq_puts(m, ",overriderockperm");
|
if (sbi->s_overriderockperm) seq_puts(m, ",overriderockperm");
|
||||||
if (sbi->s_showassoc) seq_puts(m, ",showassoc");
|
if (sbi->s_showassoc) seq_puts(m, ",showassoc");
|
||||||
if (sbi->s_utf8) seq_puts(m, ",utf8");
|
|
||||||
|
|
||||||
if (sbi->s_check) seq_printf(m, ",check=%c", sbi->s_check);
|
if (sbi->s_check) seq_printf(m, ",check=%c", sbi->s_check);
|
||||||
if (sbi->s_mapping) seq_printf(m, ",map=%c", sbi->s_mapping);
|
if (sbi->s_mapping) seq_printf(m, ",map=%c", sbi->s_mapping);
|
||||||
@ -518,9 +518,10 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
|
|||||||
seq_printf(m, ",fmode=%o", sbi->s_fmode);
|
seq_printf(m, ",fmode=%o", sbi->s_fmode);
|
||||||
|
|
||||||
#ifdef CONFIG_JOLIET
|
#ifdef CONFIG_JOLIET
|
||||||
if (sbi->s_nls_iocharset &&
|
if (sbi->s_nls_iocharset)
|
||||||
strcmp(sbi->s_nls_iocharset->charset, CONFIG_NLS_DEFAULT) != 0)
|
|
||||||
seq_printf(m, ",iocharset=%s", sbi->s_nls_iocharset->charset);
|
seq_printf(m, ",iocharset=%s", sbi->s_nls_iocharset->charset);
|
||||||
|
else
|
||||||
|
seq_puts(m, ",iocharset=utf8");
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -863,14 +864,13 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
|
|||||||
sbi->s_nls_iocharset = NULL;
|
sbi->s_nls_iocharset = NULL;
|
||||||
|
|
||||||
#ifdef CONFIG_JOLIET
|
#ifdef CONFIG_JOLIET
|
||||||
if (joliet_level && opt.utf8 == 0) {
|
if (joliet_level) {
|
||||||
char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
|
char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
|
||||||
sbi->s_nls_iocharset = load_nls(p);
|
if (strcmp(p, "utf8") != 0) {
|
||||||
if (! sbi->s_nls_iocharset) {
|
sbi->s_nls_iocharset = opt.iocharset ?
|
||||||
/* Fail only if explicit charset specified */
|
load_nls(opt.iocharset) : load_nls_default();
|
||||||
if (opt.iocharset)
|
if (!sbi->s_nls_iocharset)
|
||||||
goto out_freesbi;
|
goto out_freesbi;
|
||||||
sbi->s_nls_iocharset = load_nls_default();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -886,7 +886,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
|
|||||||
sbi->s_gid = opt.gid;
|
sbi->s_gid = opt.gid;
|
||||||
sbi->s_uid_set = opt.uid_set;
|
sbi->s_uid_set = opt.uid_set;
|
||||||
sbi->s_gid_set = opt.gid_set;
|
sbi->s_gid_set = opt.gid_set;
|
||||||
sbi->s_utf8 = opt.utf8;
|
|
||||||
sbi->s_nocompress = opt.nocompress;
|
sbi->s_nocompress = opt.nocompress;
|
||||||
sbi->s_overriderockperm = opt.overriderockperm;
|
sbi->s_overriderockperm = opt.overriderockperm;
|
||||||
/*
|
/*
|
||||||
|
@ -44,7 +44,6 @@ struct isofs_sb_info {
|
|||||||
unsigned char s_session;
|
unsigned char s_session;
|
||||||
unsigned int s_high_sierra:1;
|
unsigned int s_high_sierra:1;
|
||||||
unsigned int s_rock:2;
|
unsigned int s_rock:2;
|
||||||
unsigned int s_utf8:1;
|
|
||||||
unsigned int s_cruft:1; /* Broken disks with high byte of length
|
unsigned int s_cruft:1; /* Broken disks with high byte of length
|
||||||
* containing junk */
|
* containing junk */
|
||||||
unsigned int s_nocompress:1;
|
unsigned int s_nocompress:1;
|
||||||
|
@ -41,14 +41,12 @@ uni16_to_x8(unsigned char *ascii, __be16 *uni, int len, struct nls_table *nls)
|
|||||||
int
|
int
|
||||||
get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode)
|
get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode)
|
||||||
{
|
{
|
||||||
unsigned char utf8;
|
|
||||||
struct nls_table *nls;
|
struct nls_table *nls;
|
||||||
unsigned char len = 0;
|
unsigned char len = 0;
|
||||||
|
|
||||||
utf8 = ISOFS_SB(inode->i_sb)->s_utf8;
|
|
||||||
nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset;
|
nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset;
|
||||||
|
|
||||||
if (utf8) {
|
if (!nls) {
|
||||||
len = utf16s_to_utf8s((const wchar_t *) de->name,
|
len = utf16s_to_utf8s((const wchar_t *) de->name,
|
||||||
de->name_len[0] >> 1, UTF16_BIG_ENDIAN,
|
de->name_len[0] >> 1, UTF16_BIG_ENDIAN,
|
||||||
outname, PAGE_SIZE);
|
outname, PAGE_SIZE);
|
||||||
|
Loading…
Reference in New Issue
Block a user