From bf88eb25cf6acf87ac4cb084bc69ce7beb99bd85 Mon Sep 17 00:00:00 2001 From: Andrew Price Date: Jan 20 2023 13:43:40 +0000 Subject: mkfs.gfs2: Add a root_inherit_jdata extended option Add an extended option to allow the GFS2_DIF_INHERIT_JDATA flag to be set on the root dinode at mkfs time. This option is only to be used for testing so it is not documented. Signed-off-by: Andrew Price --- diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c index 7d5b8c2..c9c7a1f 100644 --- a/gfs2/mkfs/main_mkfs.c +++ b/gfs2/mkfs/main_mkfs.c @@ -128,6 +128,7 @@ struct mkfs_opts { const char *uuid; struct mkfs_dev dev; unsigned discard:1; + unsigned root_inherit_jd:1; unsigned got_bsize:1; unsigned got_qcsize:1; @@ -312,6 +313,25 @@ static int parse_format(struct mkfs_opts *opts, char *str) return 0; } +static int parse_root_inherit_jd(struct mkfs_opts *opts, const char *str) +{ + unsigned long n = 0; + + if (str == NULL) { /* -o root_inherit_jdata */ + opts->root_inherit_jd = 1; + return 0; + } + /* -o root_inherit_jdata=N */ + if (parse_ulong(opts, "root_inherit_jdata", str, &n) != 0) + return -1; + if (n > 1) { + fprintf(stderr, _("Invalid root_inherit_jdata argument '%s'. Must be 0 or 1\n"), str); + return -1; + } + opts->root_inherit_jd = (unsigned)n; + return 0; +} + static int opt_parse_extended(char *str, struct mkfs_opts *opts) { char *opt; @@ -341,6 +361,9 @@ static int opt_parse_extended(char *str, struct mkfs_opts *opts) } else if (strcmp("format", key) == 0) { if (parse_format(opts, val) != 0) return -1; + } else if (strcmp("root_inherit_jdata", key) == 0) { + if (parse_root_inherit_jd(opts, val) != 0) + return -1; } else if (strcmp("help", key) == 0) { print_ext_opts(); return 1; @@ -1364,6 +1387,10 @@ int main(int argc, char *argv[]) printf("%s", _("Done\n")); lgfs2_build_root(&sbd); + if (opts.root_inherit_jd) { + sbd.md.rooti->i_flags |= GFS2_DIF_INHERIT_JDATA; + lgfs2_dinode_out(sbd.md.rooti, sbd.md.rooti->i_bh->b_data); + } if (opts.debug) { printf("\nRoot directory:\n"); dinode_print(sbd.md.rooti->i_bh->b_data); diff --git a/tests/mkfs.at b/tests/mkfs.at index 298daf3..7064a9e 100644 --- a/tests/mkfs.at +++ b/tests/mkfs.at @@ -198,3 +198,19 @@ AT_CHECK([$GFS_MKFS -p lock_nolock -U 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb4 $GFS AT_CHECK([$GFS_MKFS -p lock_nolock -U 1b4e28ba-2fa1-11d2-883f-b9a761bde3f $GFS_TGT], 255, [ignore], [ignore]) GFS_FSCK_CHECK([$GFS_MKFS -p lock_nolock -U 1b4e28ba-2fa1-11d2-883f-b9a761bde3fb $GFS_TGT]) AT_CLEANUP + +AT_SETUP([Root jdata inheritance]) +AT_KEYWORDS(mkfs.gfs2 mkfs) +GFS_TGT_REGEN +AT_CHECK([$GFS_MKFS -p lock_nolock -o root_inherit_jdata= $GFS_TGT], 255, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -o root_inherit_jdata=42 $GFS_TGT], 255, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -o root_inherit_jdata=X $GFS_TGT], 255, [ignore], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -o root_inherit_jdata $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([gfs2_edit -x -p root field di_flags $GFS_TGT | tr -d '\n'], 0, [80000001], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -o root_inherit_jdata=1 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([gfs2_edit -x -p root field di_flags $GFS_TGT | tr -d '\n'], 0, [80000001], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock -o root_inherit_jdata=0 $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([gfs2_edit -x -p root field di_flags $GFS_TGT | tr -d '\n'], 0, [1], [ignore]) +AT_CHECK([$GFS_MKFS -p lock_nolock $GFS_TGT], 0, [ignore], [ignore]) +AT_CHECK([gfs2_edit -x -p root field di_flags $GFS_TGT | tr -d '\n'], 0, [1], [ignore]) +AT_CLEANUP