X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=e2fsck%2Femptydir.c;h=7aea7b6f55592bb897eb712111b0b7499d62167e;hb=fae376acf0f5f7d5b5c7d1a0955fd763b8611138;hp=5dbf0214fc7e2cb18d040b19a8388d95918b1b77;hpb=d2b2a488f996871e6e40789a7890afc2f59730db;p=tools%2Fe2fsprogs.git diff --git a/e2fsck/emptydir.c b/e2fsck/emptydir.c index 5dbf021..7aea7b6 100644 --- a/e2fsck/emptydir.c +++ b/e2fsck/emptydir.c @@ -1,6 +1,6 @@ /* * emptydir.c --- clear empty directory blocks - * + * * Copyright (C) 1998 Theodore Ts'o * * %Begin-Header% @@ -12,6 +12,7 @@ * blocks and get rid of them. */ +#include "config.h" #include "e2fsck.h" #include "problem.h" @@ -25,8 +26,8 @@ struct empty_dir_info_struct { char *block_buf; ext2_ino_t ino; struct ext2_inode inode; - blk_t logblk; - blk_t freed_blocks; + blk64_t logblk; + blk64_t freed_blocks; }; typedef struct empty_dir_info_struct *empty_dir_info; @@ -34,7 +35,7 @@ typedef struct empty_dir_info_struct *empty_dir_info; extern empty_dir_info init_empty_dir(e2fsck_t ctx); extern void free_empty_dirblock(empty_dir_info edi); extern void add_empty_dirblock(empty_dir_info edi, - struct ext2_db_entry *db); + struct ext2_db_entry2 *db); extern void process_empty_dirblock(e2fsck_t ctx, empty_dir_info edi); @@ -43,16 +44,15 @@ empty_dir_info init_empty_dir(e2fsck_t ctx) empty_dir_info edi; errcode_t retval; - edi = malloc(sizeof(struct empty_dir_info_struct)); - if (!edi) + edi = e2fsck_allocate_memzero(ctx, sizeof(struct empty_dir_info_struct), + "empty dir info"); + if (retval) return NULL; - memset(edi, 0, sizeof(struct empty_dir_info_struct)); - retval = ext2fs_init_dblist(ctx->fs, &edi->empty_dblist); if (retval) goto errout; - + retval = ext2fs_allocate_block_bitmap(ctx->fs, _("empty dirblocks"), &edi->empty_dir_blocks); if (retval) @@ -82,11 +82,11 @@ void free_empty_dirblock(empty_dir_info edi) ext2fs_free_inode_bitmap(edi->dir_map); memset(edi, 0, sizeof(struct empty_dir_info_struct)); - free(edi); + ext2fs_free_mem(&edi); } void add_empty_dirblock(empty_dir_info edi, - struct ext2_db_entry *db) + struct ext2_db_entry2 *db) { if (!edi || !db) return; @@ -97,13 +97,13 @@ void add_empty_dirblock(empty_dir_info edi, printf(_("Empty directory block %u (#%d) in inode %u\n"), db->blk, db->blockcnt, db->ino); - ext2fs_mark_block_bitmap(edi->empty_dir_blocks, db->blk); + ext2fs_mark_block_bitmap2(edi->empty_dir_blocks, db->blk); if (ext2fs_test_inode_bitmap(edi->dir_map, db->ino)) return; ext2fs_mark_inode_bitmap(edi->dir_map, db->ino); - ext2fs_add_dir_block(edi->empty_dblist, db->ino, - db->blk, db->blockcnt); + ext2fs_add_dir_block2(edi->empty_dblist, db->ino, + db->blk, db->blockcnt); } /* @@ -116,26 +116,26 @@ void add_empty_dirblock(empty_dir_info edi, * * Also question --- how to free the indirect blocks. */ -int empty_pass1(ext2_filsys fs, blk_t *block_nr, e2_blkcnt_t blockcnt, - blk_t ref_block, int ref_offset, void *priv_data) +int empty_pass1(ext2_filsys fs, blk64_t *block_nr, e2_blkcnt_t blockcnt, + blk64_t ref_block, int ref_offset, void *priv_data) { empty_dir_info edi = (empty_dir_info) priv_data; - blk_t block, new_block; + blk64_t block, new_block; errcode_t retval; - + if (blockcnt < 0) return 0; block = *block_nr; do { - retval = ext2fs_bmap(fs, edi->ino, &edi->inode, - edi->block_buf, 0, edi->logblk, - &new_block); + retval = ext2fs_bmap2(fs, edi->ino, &edi->inode, + edi->block_buf, 0, edi->logblk, 0, + &new_block); if (retval) return DIRENT_ABORT; /* XXX what to do? */ if (new_block == 0) break; edi->logblk++; - } while (ext2fs_test_block_bitmap(edi->empty_dir_blocks, new_block)); + } while (ext2fs_test_block_bitmap2(edi->empty_dir_blocks, new_block)); if (new_block == block) return 0; @@ -146,11 +146,11 @@ int empty_pass1(ext2_filsys fs, blk_t *block_nr, e2_blkcnt_t blockcnt, } static int fix_directory(ext2_filsys fs, - struct ext2_db_entry *db, + struct ext2_db_entry2 *db, void *priv_data) { errcode_t retval; - + empty_dir_info edi = (empty_dir_info) priv_data; edi->logblk = 0; @@ -161,15 +161,14 @@ static int fix_directory(ext2_filsys fs, if (retval) return 0; - retval = ext2fs_block_iterate2(fs, db->ino, 0, edi->block_buf, + retval = ext2fs_block_iterate3(fs, db->ino, 0, edi->block_buf, empty_pass1, edi); if (retval) return 0; if (edi->freed_blocks) { edi->inode.i_size -= edi->freed_blocks * fs->blocksize; - edi->inode.i_blocks -= edi->freed_blocks * - (fs->blocksize / 512); + ext2fs_iblk_add_blocks(fs, &edi->inode, edi->freed_blocks); retval = ext2fs_write_inode(fs, db->ino, &edi->inode); if (retval) return 0; @@ -182,13 +181,14 @@ void process_empty_dirblock(e2fsck_t ctx, empty_dir_info edi) if (!edi) return; - edi->block_buf = malloc(ctx->fs->blocksize * 3); + retval = ext2f_get_mem(ctx, ctx->fs->blocksize * 3, + &edi->block_buf); if (edi->block_buf) { - (void) ext2fs_dblist_iterate(edi->empty_dblist, - fix_directory, &edi); + (void) ext2fs_dblist_iterate2(edi->empty_dblist, + fix_directory, &edi); } - free(edi->block_buf); + ext2fs_free_mem(&edi->block_buf); free_empty_dirblock(edi); }