]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
Rename the feature "fname_encoding" to be "casefold".
authorTheodore Ts'o <tytso@mit.edu>
Fri, 3 May 2019 17:16:29 +0000 (13:16 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 3 May 2019 17:16:29 +0000 (13:16 -0400)
Also change mke2fs so that the encoding and encoding flags are
specified in mke2fs.conf in the fs_types and defaults stanzas instead
of the options stanza.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
14 files changed:
e2fsck/unix.c
lib/e2p/encoding.c
lib/e2p/feature.c
lib/e2p/ls.c
lib/ext2fs/ext2_fs.h
lib/ext2fs/ext2fs.h
lib/ext2fs/initialize.c
lib/ext2fs/openfs.c
misc/chattr.1.in
misc/ext4.5.in
misc/mke2fs.8.in
misc/mke2fs.c
misc/mke2fs.conf.5.in
misc/tune2fs.c

index 7c24f2e31e4f81d8e68f3e41eac58c60cf6efad9..37fca0f187ba21b7101b956f1b895f5f8e990f3c 100644 (file)
@@ -1784,7 +1784,7 @@ print_unsupp_features:
                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;
index ccd9582e53489a37865f0575b29585ced7edd74d..24266fcd210d3f82cc809c5d0027049a280e0562 100644 (file)
@@ -90,6 +90,8 @@ int e2p_str2encoding_flags(int encoding, char *param, __u16 *flags)
        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)) {
index ded87f5611dc86c2e3cd741942fd15058c1ffb6d..117acf25c8aa7865901f19524adfc9beab4d3785 100644 (file)
@@ -109,7 +109,9 @@ static struct feature feature_list[] = {
                        "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 },
 };
index 11e7415bedc44194f2dfb4bef135d07d7171fc5f..5a4461781e6b382072438adbceb3b876dccfb9b8 100644 (file)
@@ -470,7 +470,7 @@ void list_super2(struct ext2_super_block * sb, FILE *f)
        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));
 }
index ffcacafe8296a11154c2fba5d8ad829772407142..cbb44bdb6b0bbe3cc828f1199803990a5a952ded 100644 (file)
@@ -849,7 +849,7 @@ struct ext2_super_block {
 #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) \
@@ -943,7 +943,7 @@ EXT4_FEATURE_INCOMPAT_FUNCS(csum_seed,              4, CSUM_SEED)
 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| \
index 5cbee6e0d33909f165adcfa3a1fdd89f0f548212..c3be2c5c85c1d2b6f5bdd1dcc9cf259e95a8bb9a 100644 (file)
@@ -642,7 +642,7 @@ typedef struct ext2_icount *ext2_icount_t;
                                         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)
 
index daff4b3c10f8e60aa4849e75d7f8e07e4818cf22..96ec1cffd82c8faac95e191f9a79f76e5fbc8bcd 100644 (file)
@@ -190,7 +190,7 @@ errcode_t ext2fs_initialize(const char *name, int flags,
        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) {
index 3e229b9e00e8699c184ef48fc7f57cac2e2faeb1..51b54a4492eaf67c2d82613ce46fcb7d1b0c0901 100644 (file)
@@ -501,7 +501,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
                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;
index 5949d096687b7bac5b4dd863e4281d87f59191cd..1c9e89646d2d7da637d08e58f20fa8b74b2fe51e 100644 (file)
@@ -123,7 +123,7 @@ although it can be displayed by
 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
index 2a8ce1e2f8e82a14bd43c9a88f6630275e9d1286..01dab48a43761c883ae6587c8855c9cef7983c38 100644 (file)
@@ -151,7 +151,7 @@ can be specified using the
 .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
index 7162494acaae3dc5188a05ea2fb3cdbcba7f90c3..5bcee25ec786fd6b8704a82ad384fe44394fce10 100644 (file)
@@ -280,9 +280,9 @@ option is still accepted for backwards compatibility, but is deprecated.
 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
@@ -291,7 +291,7 @@ is not specified, the encoding defined in
 .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
index be3586cf75570c53f7679b74470ee1104fbfc76d..91523609e35c65491cdff1bf46bffa7543fbb8c3 100644 (file)
@@ -1058,15 +1058,10 @@ static void parse_extended_opts(struct ext2_super_block *param,
                        }
                } 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);
@@ -1076,8 +1071,8 @@ static void parse_extended_opts(struct ext2_super_block *param,
                                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;
@@ -1107,8 +1102,8 @@ static void parse_extended_opts(struct ext2_super_block *param,
                        "\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);
@@ -1120,7 +1115,7 @@ static void parse_extended_opts(struct ext2_super_block *param,
                                  "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);
 
@@ -1160,7 +1155,7 @@ static __u32 ok_features[3] = {
                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 */
@@ -1567,8 +1562,6 @@ static void PRS(int argc, char *argv[])
        int             use_bsize;
        char            *newpath;
        int             pathlen = sizeof(PATH_SET) + 1;
-       char            *encoding_name = NULL;
-       int             encoding;
 
        if (oldpath)
                pathlen += strlen(oldpath);
@@ -2077,7 +2070,7 @@ profile_error:
                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);
@@ -2393,24 +2386,29 @@ profile_error:
        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 */
@@ -2457,10 +2455,10 @@ profile_error:
                }
        }
 
-       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);
index cdebf08cf2686b51f0ea000afdff26e92dfadfc8..08bb948886db943ba2e253a06b0535cb957622fe 100644 (file)
@@ -97,10 +97,6 @@ The following relations are defined in the
 .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
@@ -522,6 +518,17 @@ to false, this step will always be skipped, which can be useful if it is
 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]
index fbdf78a8f849d130a1e1625eca86b52e87620668..7d2d38d7d4b7b02c59335b576521201414842ec2 100644 (file)
@@ -1401,7 +1401,7 @@ mmp_error:
        }
 
        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);