tags 346580 +pending thanks On Sun, Jan 08, 2006 at 11:56:19PM +0100, Tore Anderson wrote: > [EMAIL PROTECTED] :) sudo mke2fs -O resize_inode -j /dev/pride/rt > mke2fs 1.39-WIP (31-Dec-2005) > /dev/pride/rt: Too many reserved group descriptor blocks while setting up > superblock > [EMAIL PROTECTED] :(
Thanks for reporting this bug. It was a signed vs unsigned problem which only shows up on large filesystem. It will be fixed with the following patch. - Ted # HG changeset patch # User [EMAIL PROTECTED] # Node ID 47163421072881af2b98f7d659cfd663fbfb7ba5 # Parent 8539debc19fe0f295e53a78f21c6b701b3a31e2c Fix a signed vs unsigned bug in calc_reserved_gdt_blocks() This fixes mke2fs -O resize_inode for very large filesystems (i.e., 20GB). Addresses Debian Bug #346580 Signed-off-by: "Theodore Ts'o" <[EMAIL PROTECTED]> diff -r 8539debc19fe -r 471634210728 lib/ext2fs/ChangeLog --- a/lib/ext2fs/ChangeLog Fri Mar 17 19:45:45 2006 -0500 +++ b/lib/ext2fs/ChangeLog Fri Mar 17 20:39:52 2006 -0500 @@ -1,4 +1,9 @@ 2006-03-17 Theodore Ts'o <[EMAIL PROTECTED]> + + * initialize.c (calc_reserved_gdt_blocks): Fix a signed vs + unsigned problem which caused mke2fs -O resize_inode to + bomb out on large filesystems. (Addresses Debian Bug + #346580) * ext2_fs.h (EXT2_IOC_GETVERSION_NEW, EXT2_IOC_SETVERSION_NEW, EXT2_IOC_GROUP_EXTEND, EXT2_IOC_GROUP_ADD): Add ioctl diff -r 8539debc19fe -r 471634210728 lib/ext2fs/initialize.c --- a/lib/ext2fs/initialize.c Fri Mar 17 19:45:45 2006 -0500 +++ b/lib/ext2fs/initialize.c Fri Mar 17 20:39:52 2006 -0500 @@ -63,14 +63,14 @@ * The absolute maximum number of GDT blocks we can reserve is determined by * the number of block pointers that can fit into a single block. */ -static int calc_reserved_gdt_blocks(ext2_filsys fs) +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 long max_blocks = 0xffffffff; unsigned long rsv_groups; - int rsv_gdb; + unsigned int rsv_gdb; /* We set it at 1024x the current filesystem size, or * the upper block count limit (2^32), whichever is lower. @@ -79,10 +79,10 @@ max_blocks = sb->s_blocks_count * 1024; rsv_groups = (max_blocks - sb->s_first_data_block + bpg - 1) / bpg; rsv_gdb = (rsv_groups + gdpb - 1) / gdpb - fs->desc_blocks; - if (rsv_gdb > (int) EXT2_ADDR_PER_BLOCK(sb)) + if (rsv_gdb > EXT2_ADDR_PER_BLOCK(sb)) rsv_gdb = EXT2_ADDR_PER_BLOCK(sb); #ifdef RES_GDT_DEBUG - printf("max_blocks %lu, rsv_groups = %lu, rsv_gdb = %lu\n", + printf("max_blocks %lu, rsv_groups = %lu, rsv_gdb = %u\n", max_blocks, rsv_groups, rsv_gdb); #endif -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]