!27 resize.f2fs支持传参使能projquota/casefold特性

Merge pull request !27 from 范威威/master
This commit is contained in:
openharmony_ci 2023-09-05 04:52:12 +00:00 committed by Gitee
commit fcc0fd642f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 62 additions and 1 deletions

View File

@ -123,6 +123,8 @@ void resize_usage()
MSG(0, " -i extended node bitmap, node ratio is 20%% by default\n"); MSG(0, " -i extended node bitmap, node ratio is 20%% by default\n");
MSG(0, " -s safe resize (Does not resize metadata)"); MSG(0, " -s safe resize (Does not resize metadata)");
MSG(0, " -t target sectors [default: device size]\n"); MSG(0, " -t target sectors [default: device size]\n");
MSG(0, " -O feature1[,feature2,...] e.g. \"fsprojquota,fscasefold\"\n");
MSG(0, " -C [encoding[:flag1,...]] Support casefolding with optional flags\n");
MSG(0, " -V print the version number and exit\n"); MSG(0, " -V print the version number and exit\n");
exit(1); exit(1);
} }
@ -527,7 +529,9 @@ void f2fs_parse_options(int argc, char *argv[])
#endif #endif
} else if (!strcmp("resize.f2fs", prog)) { } else if (!strcmp("resize.f2fs", prog)) {
#ifdef WITH_RESIZE #ifdef WITH_RESIZE
const char *option_string = "d:fst:iV"; const char *option_string = "d:fst:O:C:iV";
int val;
char *token;
c.func = RESIZE; c.func = RESIZE;
while ((option = getopt(argc, argv, option_string)) != EOF) { while ((option = getopt(argc, argv, option_string)) != EOF) {
@ -561,6 +565,24 @@ void f2fs_parse_options(int argc, char *argv[])
case 'i': case 'i':
c.large_nat_bitmap = 1; c.large_nat_bitmap = 1;
break; break;
case 'O':
if (parse_feature(feature_table, optarg))
resize_usage();
break;
case 'C':
token = strtok(optarg, ":");
val = f2fs_str2encoding(token);
if (val < 0) {
MSG(0, "\tError: Unknown encoding %s\n", token);
}
c.s_encoding = val;
token = strtok(NULL, "");
val = f2fs_str2encoding_flags(&token, &c.s_encoding_flags);
if (val) {
MSG(0, "\tError: Unknown flag %s\n",token);
}
c.feature |= cpu_to_le32(F2FS_FEATURE_CASEFOLD);
break;
case 'V': case 'V':
show_version(prog); show_version(prog);
exit(0); exit(0);

View File

@ -940,6 +940,44 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
return 0; return 0;
} }
static int check_and_set_one_feature(struct f2fs_sb_info *sbi, int feature)
{
if (c.feature & cpu_to_le32(feature)) {
if (!(sbi->raw_super->feature & cpu_to_le32(feature))) {
sbi->raw_super->feature |= cpu_to_le32(feature);
return 1;
}
}
return 0;
}
static void check_and_set_features(struct f2fs_sb_info *sbi, enum SB_ADDR sb_addr)
{
bool need_fix = false;
if (check_and_set_one_feature(sbi, F2FS_FEATURE_EXTRA_ATTR)) {
MSG(0, "Fix set feature: extra_attr\n");
need_fix = true;
}
if (check_and_set_one_feature(sbi, F2FS_FEATURE_PRJQUOTA)) {
MSG(0, "Fix set feature: project_quota\n");
need_fix = true;
}
if (check_and_set_one_feature(sbi, F2FS_FEATURE_CASEFOLD)) {
struct f2fs_super_block *sb = sbi->raw_super;
set_sb(s_encoding, c.s_encoding);
set_sb(s_encoding_flags, c.s_encoding_flags);
MSG(0, "Fix set feature: casefold, s_encoding: %d, s_encoding_flags: %d\n",
c.s_encoding, c.s_encoding_flags);
need_fix = true;
}
if (need_fix) {
update_superblock(sbi->raw_super, SB_MASK(sb_addr));
}
}
#define CHECK_PERIOD (3600 * 24 * 30) // one month by default #define CHECK_PERIOD (3600 * 24 * 30) // one month by default
int validate_super_block(struct f2fs_sb_info *sbi, enum SB_ADDR sb_addr) int validate_super_block(struct f2fs_sb_info *sbi, enum SB_ADDR sb_addr)
@ -957,6 +995,7 @@ int validate_super_block(struct f2fs_sb_info *sbi, enum SB_ADDR sb_addr)
sizeof(struct f2fs_super_block)); sizeof(struct f2fs_super_block));
if (!sanity_check_raw_super(sbi->raw_super, sb_addr)) { if (!sanity_check_raw_super(sbi->raw_super, sb_addr)) {
check_and_set_features(sbi, sb_addr);
/* get kernel version */ /* get kernel version */
if (c.kd >= 0) { if (c.kd >= 0) {
dev_read_version(c.version, 0, VERSION_NAME_LEN); dev_read_version(c.version, 0, VERSION_NAME_LEN);