test_lwext4: add journaling to generic test module
[lwext4.git] / fs_test / lwext4_mkfs.c
index ddeeb6904d328b9de089a845b202d74ef7b8ebd1..b7ff601a0f09d3a63d15beb2af65f721a2e52963 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,12 +51,24 @@ static struct ext4_blockdev *bd;
 /**@brief   Indicates that input is windows partition.*/
 static bool winpart = false;
 
+static int fs_type = F_SET_EXT4;
+
+static struct ext4_fs fs;
+static struct ext4_mkfs_info info = {
+       .block_size = 1024,
+};
+
+static bool verbose = false;
+
 static const char *usage = "                                    \n\
 Welcome in lwext4_mkfs tool .                                   \n\
 Copyright (c) 2015 Grzegorz Kostka (kostka.grzegorz@gmail.com)  \n\
 Usage:                                                          \n\
-[-i] --input  - input file name (or blockdevice)                \n\
-[-w] --wpart  - windows partition mode                          \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";
 
 
@@ -101,7 +113,6 @@ static bool open_filedev(void)
        return true;
 }
 
-
 static bool parse_opt(int argc, char **argv)
 {
        int option_index = 0;
@@ -109,41 +120,106 @@ 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'},
            {0, 0, 0, 0}};
 
-       while (-1 != (c = getopt_long(argc, argv, "i:w",
+       while (-1 != (c = getopt_long(argc, argv, "i:b:e:wv",
                                      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;
                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;
+       }
 
-       ext4_dmask_set(DEBUG_ALL);
+       if (verbose)
+               ext4_dmask_set(DEBUG_ALL);
 
-       static struct ext4_mkfs_info info;
-       int r = ext4_mkfs(bd, &info);
-       if (r != EOK)
+       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("ext4_mkfs_read_info error: %d\n", r);
+               return EXIT_FAILURE;
+       }
 
+       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;
 }