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 <anpr...@redhat.com>
---
 gfs2/mkfs/main_mkfs.c | 27 +++++++++++++++++++++++++++
 tests/mkfs.at         | 16 ++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
index 7d5b8c25..c9c7a1fb 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 298daf3d..7064a9e2 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
-- 
2.39.0

Reply via email to