ext4_journal: some reworks to stale metadata protection
[lwext4.git] / fs_test / lwext4_mkfs.c
index 1808682c9e09dfeb5d31d34073b31852e17fd9bc..7579c8d05ff85bd4dc42dc9bf3bc0bcb62f8a9c4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)
+ * Copyright (c) 2015 Grzegorz Kostka (kostka.grzegorz@gmail.com)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -51,9 +51,12 @@ static struct ext4_blockdev *bd;
 /**@brief   Indicates that input is windows partition.*/
 static bool winpart = false;
 
-static struct ext4_fs fs;
+static int fs_type = F_SET_EXT4;
 
-static struct ext4_mkfs_info info;
+static struct ext4_fs fs;
+static struct ext4_mkfs_info info = {
+       .block_size = 1024,
+};
 
 static bool verbose = false;
 
@@ -64,6 +67,8 @@ Usage:                                                          \n\
 [-i] --input   - input file name (or blockdevice)               \n\
 [-w] --wpart   - windows partition mode                         \n\
 [-v] --verbose - verbose mode                                  \n\
+[-b] --block   - block size: 1024, 2048, 4096 (default 1024)    \n\
+[-e] --ext     - fs type (ext2: 2, ext3: 3 ext4: 4))           \n\
 \n";
 
 
@@ -97,15 +102,7 @@ static bool open_windows(void)
 
 static bool open_filedev(void)
 {
-       if (winpart) {
-               if (!open_windows())
-                       return false;
-       } else {
-               if (!open_linux())
-                       return false;
-       }
-
-       return true;
+       return winpart ? open_windows() : open_linux();
 }
 
 static bool parse_opt(int argc, char **argv)
@@ -115,49 +112,111 @@ static bool parse_opt(int argc, char **argv)
 
        static struct option long_options[] = {
            {"input", required_argument, 0, 'i'},
+           {"block", required_argument, 0, 'b'},
+           {"ext", required_argument, 0, 'e'},
            {"wpart", no_argument, 0, 'w'},
            {"verbose", no_argument, 0, 'v'},
+           {"version", no_argument, 0, 'x'},
            {0, 0, 0, 0}};
 
-       while (-1 != (c = getopt_long(argc, argv, "i:wv",
+       while (-1 != (c = getopt_long(argc, argv, "i:b:e:wvx",
                                      long_options, &option_index))) {
 
                switch (c) {
                case 'i':
                        input_name = optarg;
                        break;
+               case 'b':
+                       info.block_size = atoi(optarg);
+                       break;
+               case 'e':
+                       fs_type = atoi(optarg);
+                       break;
                case 'w':
                        winpart = true;
                        break;
                case 'v':
                        verbose = true;
                        break;
+               case 'x':
+                       puts(VERSION);
+                       exit(0);
+                       break;
                default:
                        printf("%s", usage);
                        return false;
                }
        }
+
+       switch (info.block_size) {
+       case 1024:
+       case 2048:
+       case 4096:
+               break;
+       default:
+               printf("parse_opt: block_size = %"PRIu32" unsupported\n",
+                               info.block_size);
+               return false;
+       }
+
+       switch (fs_type) {
+       case F_SET_EXT2:
+       case F_SET_EXT3:
+       case F_SET_EXT4:
+               break;
+       default:
+               printf("parse_opt: fs_type = %"PRIu32" unsupported\n", fs_type);
+               return false;
+       }
+
        return true;
 }
 
 int main(int argc, char **argv)
 {
-       if (!parse_opt(argc, argv))
+       int r;
+       if (!parse_opt(argc, argv)){
+               printf("parse_opt error\n");
                return EXIT_FAILURE;
+       }
 
-       if (!open_filedev())
+       if (!open_filedev()) {
+               printf("open_filedev error\n");
                return EXIT_FAILURE;
+       }
 
        if (verbose)
                ext4_dmask_set(DEBUG_ALL);
 
-       printf("ext4_mkfs\n");
-       int r = ext4_mkfs(&fs, bd, &info);
+       printf("ext4_mkfs: ext%d\n", fs_type);
+       r = ext4_mkfs(&fs, bd, &info, fs_type);
+       if (r != EOK) {
+               printf("ext4_mkfs error: %d\n", r);
+               return EXIT_FAILURE;
+       }
+
+       memset(&info, 0, sizeof(struct ext4_mkfs_info));
+       r = ext4_mkfs_read_info(bd, &info);
        if (r != EOK) {
-               printf("ERROR: %d\n", r);
+               printf("ext4_mkfs_read_info error: %d\n", r);
                return EXIT_FAILURE;
        }
 
-       printf("OK\n");
+       printf("Created filesystem with parameters:\n");
+       printf("Size: %"PRIu64"\n", info.len);
+       printf("Block size: %"PRIu32"\n", info.block_size);
+       printf("Blocks per group: %"PRIu32"\n", info.blocks_per_group);
+       printf("Inodes per group: %"PRIu32"\n", info.inodes_per_group);
+       printf("Inode size: %"PRIu32"\n", info.inode_size);
+       printf("Inodes: %"PRIu32"\n", info.inodes);
+       printf("Journal blocks: %"PRIu32"\n", info.journal_blocks);
+       printf("Features ro_compat: 0x%x\n", info.feat_ro_compat);
+       printf("Features compat: 0x%x\n", info.feat_compat);
+       printf("Features incompat: 0x%x\n", info.feat_incompat);
+       printf("BG desc reserve: %"PRIu32"\n", info.bg_desc_reserve_blocks);
+       printf("Descriptor size: %"PRIu32"\n",info.dsc_size);
+       printf("Label: %s\n", info.label);
+
+       printf("\nDone ...\n");
        return EXIT_SUCCESS;
 }