diff options
-rw-r--r-- | lib/ext2fs/ChangeLog | 12 | ||||
-rw-r--r-- | lib/ext2fs/ext2_err.et.in | 3 | ||||
-rw-r--r-- | lib/ext2fs/initialize.c | 2 | ||||
-rw-r--r-- | lib/ext2fs/res_gdt.c | 16 |
4 files changed, 30 insertions, 3 deletions
diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index 4e96b6b8..2df731a2 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,15 @@ +2004-12-23 Theodore Ts'o <tytso@mit.edu> + + * initialize.c (calc_reserved_gdt_blocks): #ifdef out all + debugging printf statements. + + * res_gdt.c (ext2fs_create_resize_inode): Return + EXT2_ET_RESIZE_INODE_CORRUPT if the resize inode is not + what we expect. #ifdef out all debugging printf + statements. + + * ext2_err.et.in (EXT2_ET_RESIZE_INODE_CORRUPT): Add new error code. + 2004-12-22 Theodore Ts'o <tytso@mit.edu> * swapfs.c (ext2fs_swap_super): Byteswap the reserved_gdt_blocks diff --git a/lib/ext2fs/ext2_err.et.in b/lib/ext2fs/ext2_err.et.in index 99ffa2ec..5314c6c5 100644 --- a/lib/ext2fs/ext2_err.et.in +++ b/lib/ext2fs/ext2_err.et.in @@ -290,5 +290,8 @@ ec EXT2_ET_NOT_IMAGE_FILE, ec EXT2_ET_RES_GDT_BLOCKS, "Too many reserved group descriptor blocks" +ec EXT2_ET_RESIZE_INODE_CORRUPT, + "Resize inode is corrupt" + end diff --git a/lib/ext2fs/initialize.c b/lib/ext2fs/initialize.c index 3b80f468..82cd9f1d 100644 --- a/lib/ext2fs/initialize.c +++ b/lib/ext2fs/initialize.c @@ -81,8 +81,10 @@ static int calc_reserved_gdt_blocks(ext2_filsys fs) rsv_gdb = (rsv_groups + gdpb - 1) / gdpb - fs->desc_blocks; 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", max_blocks, rsv_groups, rsv_gdb); +#endif return rsv_gdb; } diff --git a/lib/ext2fs/res_gdt.c b/lib/ext2fs/res_gdt.c index e9262429..4706589d 100644 --- a/lib/ext2fs/res_gdt.c +++ b/lib/ext2fs/res_gdt.c @@ -88,7 +88,9 @@ errcode_t ext2fs_create_resize_inode(ext2_filsys fs) apb = EXT2_ADDR_PER_BLOCK(sb); rsv_add = fs->blocksize / 512; if ((dindir_blk = inode.i_block[EXT2_DIND_BLOCK])) { +#ifdef RES_GDT_DEBUG printf("reading GDT dindir %u\n", dindir_blk); +#endif retval = io_channel_read_blk(fs->io, dindir_blk, 1, dindir_buf); if (retval) goto out_inode; @@ -120,7 +122,7 @@ errcode_t ext2fs_create_resize_inode(ext2_filsys fs) } for (rsv_off = 0, gdt_off = fs->desc_blocks, - gdt_blk = sb->s_first_data_block + 1 + gdt_off; + gdt_blk = sb->s_first_data_block + 1 + fs->desc_blocks; rsv_off < sb->s_reserved_gdt_blocks; rsv_off++, gdt_off++, gdt_blk++) { unsigned int three = 1, five = 5, seven = 7; @@ -149,14 +151,18 @@ errcode_t ext2fs_create_resize_inode(ext2_filsys fs) gdt_blk, dindir_blk, gdt_off); #endif } else if (dindir_buf[gdt_off] == gdt_blk) { +#ifdef RES_GDT_DEBUG printf("reading primary GDT block %u\n", gdt_blk); +#endif retval = io_channel_read_blk(fs->io,gdt_blk,1,gdt_buf); if (retval) goto out_dindir; } else { +#ifdef RES_GDT_DEBUG printf("bad primary GDT %u != %u at %u[%u]\n", dindir_buf[gdt_off], gdt_blk,dindir_blk,gdt_off); - retval = -1; // XXX +#endif + retval = EXT2_ET_RESIZE_INODE_CORRUPT; goto out_dindir; } @@ -173,9 +179,11 @@ errcode_t ext2fs_create_resize_inode(ext2_filsys fs) inode.i_blocks += rsv_add; gdt_dirty = inode_dirty = 1; } else if (gdt_buf[last] != expect) { +#ifdef RES_GDT_DEBUG printf("bad backup GDT %u != %u at %u[%u]\n", gdt_buf[last], expect, gdt_blk, last); - retval = -1; // XXX +#endif + retval = EXT2_ET_RESIZE_INODE_CORRUPT; goto out_dindir; } last++; @@ -197,8 +205,10 @@ out_dindir: retval = retval2; } out_inode: +#ifdef RES_GDT_DEBUG printf("inode.i_blocks = %u, i_size = %u\n", inode.i_blocks, inode.i_size); +#endif if (inode_dirty) { inode.i_atime = inode.i_mtime = time(0); retval2 = ext2fs_write_inode(fs, EXT2_RESIZE_INO, &inode); |