goto get_newer;
}
- if (ext2fs_has_feature_fname_encoding(sb) && !fs->encoding) {
+ if (ext2fs_has_feature_casefold(sb) && !fs->encoding) {
log_err(ctx, _("%s has unsupported encoding: %0x\n"),
ctx->filesystem_name, sb->s_encoding);
goto get_newer;
const struct enc_flags *fl;
unsigned int i, neg = 0;
+ if (encoding != EXT4_ENC_UTF8_12_1)
+ return -EINVAL;
while (f) {
neg = 0;
if (!strncmp("no", f, 2)) {
"inline_data"},
{ E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_ENCRYPT,
"encrypt"},
- { E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_FNAME_ENCODING,
+ { E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_CASEFOLD,
+ "casefold"},
+ { E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_CASEFOLD,
"fname_encoding"},
{ 0, 0, 0 },
};
if (ext2fs_has_feature_csum_seed(sb))
fprintf(f, "Checksum seed: 0x%08x\n",
sb->s_checksum_seed);
- if (ext2fs_has_feature_fname_encoding(sb))
+ if (ext2fs_has_feature_casefold(sb))
fprintf(f, "Character encoding: %s\n",
e2p_encoding2str(sb->s_encoding));
}
#define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000 /* >2GB or 3-lvl htree */
#define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000 /* data in inode */
#define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000
-#define EXT4_FEATURE_INCOMPAT_FNAME_ENCODING 0x20000
+#define EXT4_FEATURE_INCOMPAT_CASEFOLD 0x20000
#define EXT4_FEATURE_COMPAT_FUNCS(name, ver, flagname) \
static inline int ext2fs_has_feature_##name(struct ext2_super_block *sb) \
EXT4_FEATURE_INCOMPAT_FUNCS(largedir, 4, LARGEDIR)
EXT4_FEATURE_INCOMPAT_FUNCS(inline_data, 4, INLINE_DATA)
EXT4_FEATURE_INCOMPAT_FUNCS(encrypt, 4, ENCRYPT)
-EXT4_FEATURE_INCOMPAT_FUNCS(fname_encoding, 4, FNAME_ENCODING)
+EXT4_FEATURE_INCOMPAT_FUNCS(casefold, 4, CASEFOLD)
#define EXT2_FEATURE_COMPAT_SUPP 0
#define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \
EXT4_FEATURE_INCOMPAT_64BIT|\
EXT4_FEATURE_INCOMPAT_INLINE_DATA|\
EXT4_FEATURE_INCOMPAT_ENCRYPT|\
- EXT4_FEATURE_INCOMPAT_FNAME_ENCODING|\
+ EXT4_FEATURE_INCOMPAT_CASEFOLD|\
EXT4_FEATURE_INCOMPAT_CSUM_SEED|\
EXT4_FEATURE_INCOMPAT_LARGEDIR)
assign_field(s_encoding);
assign_field(s_encoding_flags);
- if (ext2fs_has_feature_fname_encoding(param))
+ if (ext2fs_has_feature_casefold(param))
fs->encoding = ext2fs_load_nls_table(param->s_encoding);
if (super->s_feature_incompat & ~EXT2_LIB_FEATURE_INCOMPAT_SUPP) {
ext2fs_set_feature_shared_blocks(fs->super);
}
- if (ext2fs_has_feature_fname_encoding(fs->super))
+ if (ext2fs_has_feature_casefold(fs->super))
fs->encoding = ext2fs_load_nls_table(fs->super->s_encoding);
fs->flags &= ~EXT2_FLAG_NOFREE_ON_ERROR;
A directory with the 'F' attribute set indicates that all the path
lookups inside that directory are made in a case-insensitive fashion.
This attribute can only be changed in empty directories on file systems
-with the fname_encoding feature enabled.
+with the casefold feature enabled.
.PP
A file with the 'i' attribute cannot be modified: it cannot be deleted or
renamed, no link can be created to this file, most of the file's
.B \-G
option.
.TP
-.B fname_encoding
+.B casefold
.br
This ext4 feature provides file system level character encoding support
for directories with the casefold (+F) flag enabled. This feature is
The following extended options are supported:
.RS 1.2i
.TP
-.BI fname_encoding= encoding-name
+.BI encoding= encoding-name
Enable the
-.I fname_encoding
+.I casefold
feature in the super block and set
.I encoding-name
as the encoding to be used. If
.BR mke2fs.conf (5)
is used.
.TP
-.BI fname_encoding_flags= encoding-flags
+.BI encoding_flags= encoding-flags
Define parameters for file name character encoding operations. If a
flag is not changed using this parameter, its default value is used.
.I encoding-flags
}
} else if (!strcmp(token, "android_sparse")) {
android_sparse_file = 1;
- } else if (!strcmp(token, "fname_encoding")) {
+ } else if (!strcmp(token, "encoding")) {
if (!arg) {
- profile_get_string(profile, "options",
- "fname_encoding", 0, 0,
- &arg);
- if (!arg) {
- r_usage++;
- continue;
- }
+ r_usage++;
+ continue;
}
encoding = e2p_str2encoding(arg);
continue;
}
param->s_encoding = encoding;
- ext2fs_set_feature_fname_encoding(param);
- } else if (!strcmp(token, "fname_encoding_flags")) {
+ ext2fs_set_feature_casefold(param);
+ } else if (!strcmp(token, "encoding_flags")) {
if (!arg) {
r_usage++;
continue;
"\ttest_fs\n"
"\tdiscard\n"
"\tnodiscard\n"
- "\tfname_encoding=<encoding>\n"
- "\tfname_encoding_flags=<flags>\n"
+ "\encoding=<encoding>\n"
+ "\tencoding_flags=<flags>\n"
"\tquotatype=<quota type(s) to be enabled>\n\n"),
badopt ? badopt : "");
free(buf);
"multiple of stride %u.\n\n"),
param->s_raid_stripe_width, param->s_raid_stride);
- if (ext2fs_has_feature_fname_encoding(param)) {
+ if (ext2fs_has_feature_casefold(param)) {
param->s_encoding_flags =
e2p_get_encoding_flags(param->s_encoding);
EXT4_FEATURE_INCOMPAT_64BIT|
EXT4_FEATURE_INCOMPAT_INLINE_DATA|
EXT4_FEATURE_INCOMPAT_ENCRYPT |
- EXT4_FEATURE_INCOMPAT_FNAME_ENCODING |
+ EXT4_FEATURE_INCOMPAT_CASEFOLD |
EXT4_FEATURE_INCOMPAT_CSUM_SEED |
EXT4_FEATURE_INCOMPAT_LARGEDIR,
/* R/O compat */
int use_bsize;
char *newpath;
int pathlen = sizeof(PATH_SET) + 1;
- char *encoding_name = NULL;
- int encoding;
if (oldpath)
pathlen += strlen(oldpath);
ext2fs_clear_feature_huge_file(&fs_param);
ext2fs_clear_feature_metadata_csum(&fs_param);
ext2fs_clear_feature_ea_inode(&fs_param);
- ext2fs_clear_feature_fname_encoding(&fs_param);
+ ext2fs_clear_feature_casefold(&fs_param);
}
edit_feature(fs_features ? fs_features : tmp,
&fs_param.s_feature_compat);
if (packed_meta_blocks)
journal_location = 0;
- if (ext2fs_has_feature_fname_encoding(&fs_param)) {
- profile_get_string(profile, "options", "fname_encoding",
- 0, 0, &encoding_name);
- if (!encoding_name) {
- com_err(program_name, 0, "%s",
- _("Filename encoding type must be specified\n"
- "Use -E fname_encoding=<name> instead"));
- exit(1);
- }
- encoding = e2p_str2encoding(encoding_name);
+ if (ext2fs_has_feature_casefold(&fs_param)) {
+ char *ef, *en = get_string_from_profile(fs_types,
+ "encoding", "utf8");
+ int encoding = e2p_str2encoding(en);
+
if (encoding < 0) {
- com_err(program_name, 0, "%s",
- _("Unknown default filename encoding\n"
- "Use -E fname_encoding=<name> instead"));
+ com_err(program_name, 0,
+ _("Unknown filename encoding from profile: %s"),
+ en);
exit(1);
}
fs_param.s_encoding = encoding;
- fs_param.s_encoding_flags = e2p_get_encoding_flags(encoding);
+ ef = get_string_from_profile(fs_types, "encoding_flags", NULL);
+ if (ef) {
+ if (e2p_str2encoding_flags(encoding, ef,
+ &fs_param.s_encoding_flags) < 0) {
+ com_err(program_name, 0,
+ _("Unknown encoding flags from profile: %s"), ef);
+ exit(1);
+ }
+ } else
+ fs_param.s_encoding_flags =
+ e2p_get_encoding_flags(encoding);
}
/* Get options from profile */
}
}
- if (ext2fs_has_feature_fname_encoding(&fs_param) &&
+ if (ext2fs_has_feature_casefold(&fs_param) &&
ext2fs_has_feature_encrypt(&fs_param)) {
com_err(program_name, 0, "%s",
- _("The encrypt and encoding features are not "
+ _("The encrypt and casefold features are not "
"compatible.\nThey can not be both enabled "
"simultaneously.\n"));
exit (1);
.I [options]
stanza.
.TP
-.I fname_encoding
-This relation defines the file name encoding to be used by mke2fs, in
-case the user doesn't specify an encoding in the command line.
-.TP
.I proceed_delay
If this relation is set to a positive integer, then mke2fs will
wait
known that the disk has been previously erased, or if the user programs
that will have access to the huge files are trusted to not reveal stale
data.
+.TP
+.I encoding
+This relation defines the file name encoding to be used if the casefold
+feature is enabled. Currently the only valid encoding is utf8-12.1 or
+utf8, which requests the most recent Unicode version; since 12.1 is the only
+available Unicode version, utf8 and utf8-12.1 have the same result.
+.I encoding_flags
+This relation defines encoding-specific flags. For utf8 encodings, the
+only available flag is strict, which will cause attempts to create file
+names containing invalid Unicode characters to be rejected by the
+kernel. Strict mode is not enabled by default.
.SH THE [devices] STANZA
Each tag in the
.I [devices]
}
if (FEATURE_ON(E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_ENCRYPT)) {
- if (ext2fs_has_feature_fname_encoding(sb)) {
+ if (ext2fs_has_feature_casefold(sb)) {
fputs(_("Cannot enable encrypt feature on filesystems "
"with the encoding feature enabled.\n"),
stderr);