From 3a6be7bc18f593789728fa9887bc74c9bf9d1930 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sun, 29 Nov 2009 01:12:12 -0500 Subject: e2fsck: Fix block allocation for holes in extent-mapped directories In pass 2, when allocating new blocks for holes in directories, use ext2fs_set_bmap() instead of ext2fs_block_iterate2() with a helper function so that the newly allocated directory blocks are correctly assigned in extent-mapped directories. Signed-off-by: "Theodore Ts'o" --- e2fsck/pass2.c | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c index 889e39d1..761c2f1f 100644 --- a/e2fsck/pass2.c +++ b/e2fsck/pass2.c @@ -66,12 +66,6 @@ static int check_dir_block(ext2_filsys fs, static int allocate_dir_block(e2fsck_t ctx, struct ext2_db_entry *dir_blocks_info, char *buf, struct problem_context *pctx); -static int update_dir_block(ext2_filsys fs, - blk_t *block_nr, - e2_blkcnt_t blockcnt, - blk_t ref_block, - int ref_offset, - void *priv_data); static void clear_htree(e2fsck_t ctx, ext2_ino_t ino); static int htree_depth(struct dx_dir_info *dx_dir, struct dx_dirblock_info *dx_db); @@ -1463,8 +1457,8 @@ static int allocate_dir_block(e2fsck_t ctx, * Finally, update the block pointers for the inode */ db->blk = blk; - pctx->errcode = ext2fs_block_iterate2(fs, db->ino, BLOCK_FLAG_HOLE, - 0, update_dir_block, db); + pctx->errcode = ext2fs_bmap(fs, db->ino, &inode, 0, BMAP_SET, + db->blockcnt, &blk); if (pctx->errcode) { pctx->str = "ext2fs_block_iterate"; fix_problem(ctx, PR_2_ALLOC_DIRBOCK, pctx); @@ -1473,23 +1467,3 @@ static int allocate_dir_block(e2fsck_t ctx, return 0; } - -/* - * This is a helper function for allocate_dir_block(). - */ -static int update_dir_block(ext2_filsys fs EXT2FS_ATTR((unused)), - blk_t *block_nr, - e2_blkcnt_t blockcnt, - blk_t ref_block EXT2FS_ATTR((unused)), - int ref_offset EXT2FS_ATTR((unused)), - void *priv_data) -{ - struct ext2_db_entry *db; - - db = (struct ext2_db_entry *) priv_data; - if (db->blockcnt == (int) blockcnt) { - *block_nr = db->blk; - return BLOCK_CHANGED; - } - return 0; -} -- cgit v1.2.3