Allow specifying reserved blocks percentage
authorJo-Philipp Wich <jow@openwrt.org>
Wed, 8 Apr 2015 05:45:53 +0000 (07:45 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Wed, 8 Apr 2015 05:51:39 +0000 (07:51 +0200)
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
ext4_sb.h
ext4_utils.c
make_ext4fs.c
make_ext4fs_main.c

index 832fa3337f7269509f960b5199ce950fd8a1ee63..d6416a71a6dc39c4e57501a64df3742b1b6d4dcd 100644 (file)
--- a/ext4_sb.h
+++ b/ext4_sb.h
@@ -39,6 +39,7 @@ struct fs_info {
        uint16_t feat_compat;
        uint16_t feat_incompat;
        uint32_t bg_desc_reserve_blocks;
+       uint32_t reserve_pcnt;
        const char *label;
        uint8_t no_journal;
 };
index ef77b72fe989c406cac521d15506bb0ddbb377a0..2f1dbb2baf772b44b3211b1d32b3004b3375b8b0 100644 (file)
@@ -191,7 +191,7 @@ void ext4_fill_in_sb()
 
        sb->s_inodes_count = info.inodes_per_group * aux_info.groups;
        sb->s_blocks_count_lo = aux_info.len_blocks;
-       sb->s_r_blocks_count_lo = 0;
+       sb->s_r_blocks_count_lo = (aux_info.len_blocks / 100) * info.reserve_pcnt;
        sb->s_free_blocks_count_lo = 0;
        sb->s_free_inodes_count = 0;
        sb->s_first_data_block = aux_info.first_data_block;
@@ -533,4 +533,3 @@ int read_ext(int fd, int verbose)
 
        return 0;
 }
-
index d25dc0ce0cd3479da921731a0d60b8ba1305479b..edfa25cd623586b1f313e5b311cdbfd98aad2bed 100644 (file)
@@ -456,6 +456,7 @@ int make_ext4fs_internal(int fd, const char *_directory,
 
        printf("    Blocks: %"PRIu64"\n", aux_info.len_blocks);
        printf("    Block groups: %d\n", aux_info.groups);
+       printf("    Reserved blocks: %"PRIu64"\n",  (aux_info.len_blocks / 100) * info.reserve_pcnt);
        printf("    Reserved block group size: %d\n", info.bg_desc_reserve_blocks);
 
        ext4_sparse_file = sparse_file_new(info.block_size, info.len);
index b0edaa5d3cda108fff8bc4af982a21ca9b38a7b8..88254c321a7808558f55ee2a184c65aa65c75d14 100644 (file)
@@ -35,7 +35,7 @@ static void usage(char *path)
 {
        fprintf(stderr, "%s [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ]\n", basename(path));
        fprintf(stderr, "    [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ]\n");
-       fprintf(stderr, "    [ -L <label> ] [ -f ]\n");
+       fprintf(stderr, "    [ -m <reserved blocks percent> ] [ -L <label> ] [ -f ]\n");
        fprintf(stderr, "    [ -S file_contexts ] [ -C fs_config ] [ -T timestamp ]\n");
        fprintf(stderr, "    [ -z | -s ] [ -w ] [ -c ] [ -J ] [ -v ] [ -B <block_list_file> ]\n");
        fprintf(stderr, "    <filename> [<directory>]\n");
@@ -58,7 +58,7 @@ int main(int argc, char **argv)
        time_t fixed_time = -1;
        FILE* block_list_file = NULL;
 
-       while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:T:C:B:fwzJsctv")) != -1) {
+       while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:T:C:B:m:fwzJsctv")) != -1) {
                switch (opt) {
                case 'l':
                        info.len = parse_num(optarg);
@@ -118,6 +118,9 @@ int main(int argc, char **argv)
                                exit(EXIT_FAILURE);
                        }
                        break;
+               case 'm':
+                       info.reserve_pcnt = strtoul(optarg, NULL, 0);
+                       break;
                default: /* '?' */
                        usage(argv[0]);
                        exit(EXIT_FAILURE);