Whamcloud - gitweb
util: change git-ver to only use a version tag to describe git version
[tools/e2fsprogs.git] / e2fsck / emptydir.c
index 3ee3413..7aea7b6 100644 (file)
@@ -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;
@@ -94,16 +94,16 @@ void add_empty_dirblock(empty_dir_info edi,
        if (db->ino == 11)
                return;         /* Inode number 11 is usually lost+found */
 
-       printf(_("Empty directory block %d (#%d) in inode %d\n"),
+       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,16 +161,17 @@ 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);
-               (void) ext2fs_write_inode(fs, db->ino, &edi->inode);
+               ext2fs_iblk_add_blocks(fs, &edi->inode, edi->freed_blocks);
+               retval = ext2fs_write_inode(fs, db->ino, &edi->inode);
+               if (retval)
+                       return 0;
        }
        return 0;
 }
@@ -180,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);
 }