OSDN Git Service

libext2fs: Add EXT2_DESC_SIZE and EXT2_DESC_PER_BLOCK macros
authorValerie Clement <valerie.clement@bull.net>
Thu, 30 Aug 2007 15:38:13 +0000 (17:38 +0200)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 15 Oct 2007 02:08:35 +0000 (22:08 -0400)
Add macros to support variable-length group descriptors for ext4.

Signed-off-by: Valerie Clement <valerie.clement@bull.net>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ext2fs/closefs.c
lib/ext2fs/ext2_fs.h
lib/ext2fs/initialize.c
lib/ext2fs/openfs.c
misc/mke2fs.c
resize/resize2fs.c

index 2086331..c8ef6ef 100644 (file)
@@ -80,7 +80,7 @@ int ext2fs_super_and_bgd_loc(ext2_filsys fs,
                super_blk = group_block;
                numblocks--;
        }
-       meta_bg_size = (fs->blocksize / sizeof (struct ext2_group_desc));
+       meta_bg_size = EXT2_DESC_PER_BLOCK(fs->super);
        meta_bg = group / meta_bg_size;
 
        if (!(fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) ||
index a316665..36e7c8c 100644 (file)
@@ -217,6 +217,13 @@ struct ext2_dx_countlimit {
 /*
  * Macro-instructions used to manage group descriptors
  */
+#define EXT2_MIN_DESC_SIZE             32
+#define EXT2_MIN_DESC_SIZE_64BIT       64
+#define EXT2_MAX_DESC_SIZE             EXT2_MIN_BLOCK_SIZE
+#define EXT2_DESC_SIZE(s)                                                \
+       ((EXT2_SB(s)->s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) ? \
+       (s)->s_desc_size : EXT2_MIN_DESC_SIZE)
+
 #define EXT2_BLOCKS_PER_GROUP(s)       (EXT2_SB(s)->s_blocks_per_group)
 #define EXT2_INODES_PER_GROUP(s)       (EXT2_SB(s)->s_inodes_per_group)
 #define EXT2_INODES_PER_BLOCK(s)       (EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
@@ -227,7 +234,7 @@ struct ext2_dx_countlimit {
 #define EXT2_DESC_PER_BLOCK(s)         (EXT2_SB(s)->s_desc_per_block)
 #define EXT2_DESC_PER_BLOCK_BITS(s)    (EXT2_SB(s)->s_desc_per_block_bits)
 #else
-#define EXT2_DESC_PER_BLOCK(s)         (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
+#define EXT2_DESC_PER_BLOCK(s)         (EXT2_BLOCK_SIZE(s) / EXT2_DESC_SIZE(s))
 #endif
 
 /*
index 16e9eaa..a7f777b 100644 (file)
@@ -67,7 +67,7 @@ static unsigned int calc_reserved_gdt_blocks(ext2_filsys fs)
 {
        struct ext2_super_block *sb = fs->super;
        unsigned long bpg = sb->s_blocks_per_group;
-       unsigned int gdpb = fs->blocksize / sizeof(struct ext2_group_desc);
+       unsigned int gdpb = EXT2_DESC_PER_BLOCK(sb);
        unsigned long max_blocks = 0xffffffff;
        unsigned long rsv_groups;
        unsigned int rsv_gdb;
index 2cc0336..0c38b17 100644 (file)
@@ -39,7 +39,7 @@ blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block, dgrp_t i)
            (i < fs->super->s_first_meta_bg))
                return (group_block + i + 1);
 
-       bg = (fs->blocksize / sizeof (struct ext2_group_desc)) * i;
+       bg = EXT2_DESC_PER_BLOCK(fs->super) * i;
        if (ext2fs_bg_has_super(fs, bg))
                has_super = 1;
        ret_blk = ext2fs_group_first_block(fs, bg) + has_super;
@@ -287,7 +287,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
        if (!group_block)
                group_block = fs->super->s_first_data_block;
        dest = (char *) fs->group_desc;
-       groups_per_block = fs->blocksize / sizeof(struct ext2_group_desc);
+       groups_per_block = EXT2_DESC_PER_BLOCK(fs->super);
        for (i=0 ; i < fs->desc_blocks; i++) {
                blk = ext2fs_descriptor_block_loc(fs, group_block, i);
                retval = io_channel_read_blk(fs->io, blk, 1, dest);
index 4a6cace..be40fcd 100644 (file)
@@ -693,8 +693,7 @@ static void show_stats(ext2_filsys fs)
        if (s->s_reserved_gdt_blocks)
                printf(_("Maximum filesystem blocks=%lu\n"),
                       (s->s_reserved_gdt_blocks + fs->desc_blocks) *
-                      (fs->blocksize / sizeof(struct ext2_group_desc)) *
-                      s->s_blocks_per_group);
+                      EXT2_DESC_PER_BLOCK(s) * s->s_blocks_per_group);
        if (fs->group_desc_count > 1)
                printf(_("%u block groups\n"), fs->group_desc_count);
        else
@@ -826,7 +825,7 @@ static void parse_extended_opts(struct ext2_super_block *param,
                        bpg = param->s_blocks_per_group;
                        if (!bpg)
                                bpg = blocksize * 8;
-                       gdpb = blocksize / sizeof(struct ext2_group_desc);
+                       gdpb = EXT2_DESC_PER_BLOCK(param);
                        group_desc_count = 
                                ext2fs_div_ceil(param->s_blocks_count, bpg);
                        desc_blocks = (group_desc_count +
index 0d6a082..12bdd89 100644 (file)
@@ -383,8 +383,7 @@ retry:
                        ext2fs_mark_block_bitmap(fs->block_map, group_block);
                        adjblocks++;
                }
-               meta_bg_size = (fs->blocksize /
-                               sizeof (struct ext2_group_desc));
+               meta_bg_size = EXT2_DESC_PER_BLOCK(fs->super);
                meta_bg = i / meta_bg_size;
                if (!(fs->super->s_feature_incompat &
                      EXT2_FEATURE_INCOMPAT_META_BG) ||
@@ -550,7 +549,7 @@ static errcode_t mark_table_blocks(ext2_filsys fs,
        unsigned long           meta_bg_size;
        unsigned int            old_desc_blocks;
 
-       meta_bg_size = (fs->blocksize / sizeof (struct ext2_group_desc));
+       meta_bg_size = EXT2_DESC_PER_BLOCK(fs->super);
        if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG)
                old_desc_blocks = fs->super->s_first_meta_bg;
        else
@@ -717,7 +716,7 @@ static errcode_t blocks_to_move(ext2_resize_t rfs)
         * If we're increasing the number of descriptor blocks, life
         * gets interesting....  
         */
-       meta_bg_size = (fs->blocksize / sizeof (struct ext2_group_desc));
+       meta_bg_size = EXT2_DESC_PER_BLOCK(fs->super);
        for (i = 0; i < max_groups; i++) {
                has_super = ext2fs_bg_has_super(fs, i);
                if (has_super)