X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=misc%2Fmke2fs.c;h=d7cf257e9f350e75292900ea62ed4f54c4904173;hb=6dac306792b98ae9111e8da2b2f4341592812c5a;hp=57b5bbf9c33b3aefb091801da73fd8377cd7a6ce;hpb=61d16c39ff93f3da4ba9e2f6ee1359d48a2da969;p=tools%2Fe2fsprogs.git diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 57b5bbf..d7cf257 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -95,6 +95,7 @@ int journal_size; int journal_flags; static int lazy_itable_init; static int packed_meta_blocks; +int no_copy_xattrs; static char *bad_blocks_filename = NULL; static __u32 fs_stride; /* Initialize usr/grp quotas by default */ @@ -359,9 +360,15 @@ static void write_reserved_inodes(ext2_filsys fs) exit(1); } - for (ino = 1; ino < EXT2_FIRST_INO(fs->super); ino++) - ext2fs_write_inode_full(fs, ino, inode, - EXT2_INODE_SIZE(fs->super)); + for (ino = 1; ino < EXT2_FIRST_INO(fs->super); ino++) { + retval = ext2fs_write_inode_full(fs, ino, inode, + EXT2_INODE_SIZE(fs->super)); + if (retval) { + com_err("ext2fs_write_inode_full", retval, + _("while writing reserved inodes")); + exit(1); + } + } ext2fs_free_mem(&inode); } @@ -783,6 +790,8 @@ static void parse_extended_opts(struct ext2_super_block *param, int len; int r_usage = 0; int ret; + int encoding = -1; + char *encoding_flags = NULL; len = strlen(opts); buf = malloc(len+1); @@ -874,6 +883,9 @@ static void parse_extended_opts(struct ext2_super_block *param, r_usage++; continue; } + } else if (strcmp(token, "no_copy_xattrs") == 0) { + no_copy_xattrs = 1; + continue; } else if (strcmp(token, "num_backup_sb") == 0) { if (!arg) { r_usage++; @@ -1046,6 +1058,26 @@ static void parse_extended_opts(struct ext2_super_block *param, } } else if (!strcmp(token, "android_sparse")) { android_sparse_file = 1; + } else if (!strcmp(token, "encoding")) { + if (!arg) { + r_usage++; + continue; + } + + encoding = e2p_str2encoding(arg); + if (encoding < 0) { + fprintf(stderr, _("Invalid encoding: %s"), arg); + r_usage++; + continue; + } + param->s_encoding = encoding; + ext2fs_set_feature_casefold(param); + } else if (!strcmp(token, "encoding_flags")) { + if (!arg) { + r_usage++; + continue; + } + encoding_flags = arg; } else { r_usage++; badopt = token; @@ -1070,6 +1102,8 @@ static void parse_extended_opts(struct ext2_super_block *param, "\ttest_fs\n" "\tdiscard\n" "\tnodiscard\n" + "\tencoding=\n" + "\tencoding_flags=\n" "\tquotatype=\n\n"), badopt ? badopt : ""); free(buf); @@ -1081,6 +1115,25 @@ 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_casefold(param)) { + param->s_encoding_flags = + e2p_get_encoding_flags(param->s_encoding); + + if (encoding_flags && + e2p_str2encoding_flags(param->s_encoding, encoding_flags, + ¶m->s_encoding_flags)) { + fprintf(stderr, _("error: Invalid encoding flag: %s\n"), + encoding_flags); + free(buf); + exit(1); + } + } else if (encoding_flags) { + fprintf(stderr, _("error: An encoding must be explicitly " + "specified when passing encoding-flags\n")); + free(buf); + exit(1); + } + free(buf); } @@ -1102,6 +1155,7 @@ static __u32 ok_features[3] = { EXT4_FEATURE_INCOMPAT_64BIT| EXT4_FEATURE_INCOMPAT_INLINE_DATA| EXT4_FEATURE_INCOMPAT_ENCRYPT | + EXT4_FEATURE_INCOMPAT_CASEFOLD | EXT4_FEATURE_INCOMPAT_CSUM_SEED | EXT4_FEATURE_INCOMPAT_LARGEDIR, /* R/O compat */ @@ -1114,7 +1168,8 @@ static __u32 ok_features[3] = { EXT4_FEATURE_RO_COMPAT_BIGALLOC| EXT4_FEATURE_RO_COMPAT_QUOTA| EXT4_FEATURE_RO_COMPAT_METADATA_CSUM| - EXT4_FEATURE_RO_COMPAT_PROJECT + EXT4_FEATURE_RO_COMPAT_PROJECT| + EXT4_FEATURE_RO_COMPAT_VERITY }; @@ -2015,6 +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_casefold(&fs_param); } edit_feature(fs_features ? fs_features : tmp, &fs_param.s_feature_compat); @@ -2127,9 +2183,11 @@ profile_error: } /* * Guard against group descriptor count overflowing... Mostly to avoid - * strange results for absurdly large devices. + * strange results for absurdly large devices. This is in log2: + * (blocksize) * (bits per byte) * (maximum number of block groups) */ - if (fs_blocks_count > ((1ULL << (fs_param.s_log_block_size + 3 + 32)) - 1)) { + if (fs_blocks_count > + (1ULL << (EXT2_BLOCK_SIZE_BITS(&fs_param) + 3 + 32)) - 1) { fprintf(stderr, _("%s: Size of device (0x%llx blocks) %s " "too big to create\n\t" "a filesystem using a blocksize of %d.\n"), @@ -2330,6 +2388,33 @@ profile_error: if (packed_meta_blocks) journal_location = 0; + 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, + _("Unknown filename encoding from profile: %s"), + en); + exit(1); + } + free(en); + fs_param.s_encoding = 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); + } + free(ef); + } else + fs_param.s_encoding_flags = + e2p_get_encoding_flags(encoding); + } + /* Get options from profile */ for (cpp = fs_types; *cpp; cpp++) { tmp = NULL; @@ -2374,6 +2459,15 @@ profile_error: } } + if (ext2fs_has_feature_casefold(&fs_param) && + ext2fs_has_feature_encrypt(&fs_param)) { + com_err(program_name, 0, "%s", + _("The encrypt and casefold features are not " + "compatible.\nThey can not be both enabled " + "simultaneously.\n")); + exit (1); + } + /* Don't allow user to set both metadata_csum and uninit_bg bits. */ if (ext2fs_has_feature_metadata_csum(&fs_param) && ext2fs_has_feature_gdt_csum(&fs_param))