X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=e2fsck%2Fdirinfo.c;h=c81777a50ad494cb949a741ee3723d95b136a18a;hb=be1e74c1c78c00bc9a31c4fe5cabd4f923c0cdd3;hp=487a08641bd8b4797047f31ca9aaa277e9002688;hpb=a1f642728fe6fd2c361343fec349808ea8a524f4;p=tools%2Fe2fsprogs.git diff --git a/e2fsck/dirinfo.c b/e2fsck/dirinfo.c index 487a086..c81777a 100644 --- a/e2fsck/dirinfo.c +++ b/e2fsck/dirinfo.c @@ -7,9 +7,11 @@ #undef DIRINFO_DEBUG +#include "config.h" #include "e2fsck.h" #include #include +#include "uuid/uuid.h" #include @@ -38,14 +40,15 @@ static void e2fsck_put_dir_info(e2fsck_t ctx, struct dir_info *dir); static void setup_tdb(e2fsck_t ctx, ext2_ino_t num_dirs) { struct dir_info_db *db = ctx->dir_info; + unsigned int threshold; errcode_t retval; char *tdb_dir, uuid[40]; - int fd, threshold, enable; + int fd, enable; profile_get_string(ctx->profile, "scratch_files", "directory", 0, 0, &tdb_dir); - profile_get_integer(ctx->profile, "scratch_files", - "numdirs_threshold", 0, 0, &threshold); + profile_get_uint(ctx->profile, "scratch_files", + "numdirs_threshold", 0, 0, &threshold); profile_get_boolean(ctx->profile, "scratch_files", "dirinfo", 0, 1, &enable); @@ -60,12 +63,20 @@ static void setup_tdb(e2fsck_t ctx, ext2_ino_t num_dirs) uuid_unparse(ctx->fs->super->s_uuid, uuid); sprintf(db->tdb_fn, "%s/%s-dirinfo-XXXXXX", tdb_dir, uuid); fd = mkstemp(db->tdb_fn); - db->tdb = tdb_open(db->tdb_fn, 0, TDB_CLEAR_IF_FIRST, + if (fd < 0) { + db->tdb = NULL; + return; + } + + if (num_dirs < 99991) + num_dirs = 99991; /* largest 5 digit prime */ + + db->tdb = tdb_open(db->tdb_fn, num_dirs, TDB_NOLOCK | TDB_NOSYNC, O_RDWR | O_CREAT | O_TRUNC, 0600); close(fd); } -void setup_db(e2fsck_t ctx) +static void setup_db(e2fsck_t ctx) { struct dir_info_db *db; ext2_ino_t num_dirs; @@ -124,7 +135,7 @@ void e2fsck_add_dir_info(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t parent) ctx->dir_info->size += 10; retval = ext2fs_resize_mem(old_size, ctx->dir_info->size * sizeof(struct dir_info), - &ctx->dir_info); + &ctx->dir_info->array); if (retval) { ctx->dir_info->size -= 10; return; @@ -173,8 +184,8 @@ void e2fsck_add_dir_info(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t parent) static struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ext2_ino_t ino) { struct dir_info_db *db = ctx->dir_info; - int low, high, mid, ret; - struct dir_info_ent *buf; + int low, high, mid; + struct dir_info_ent *buf; static struct dir_info ret_dir_info; if (!db) @@ -291,6 +302,9 @@ void e2fsck_free_dir_info(e2fsck_t ctx) unlink(ctx->dir_info->tdb_fn); free(ctx->dir_info->tdb_fn); } + if (ctx->dir_info->array) + ext2fs_free_mem(&ctx->dir_info->array); + ctx->dir_info->array = 0; ctx->dir_info->size = 0; ctx->dir_info->count = 0; ext2fs_free_mem(&ctx->dir_info); @@ -310,11 +324,9 @@ extern struct dir_info_iter *e2fsck_dir_info_iter_begin(e2fsck_t ctx) { struct dir_info_iter *iter; struct dir_info_db *db = ctx->dir_info; - int ret; iter = e2fsck_allocate_memory(ctx, sizeof(struct dir_info_iter), "dir_info iterator"); - memset(iter, 0, sizeof(iter)); if (db->tdb) iter->tdb_iter = tdb_firstkey(db->tdb); @@ -322,11 +334,10 @@ extern struct dir_info_iter *e2fsck_dir_info_iter_begin(e2fsck_t ctx) return iter; } -extern void e2fsck_dir_info_iter_end(e2fsck_t ctx, +extern void e2fsck_dir_info_iter_end(e2fsck_t ctx EXT2FS_ATTR((unused)), struct dir_info_iter *iter) { - if (iter->tdb_iter.dptr) - free(iter->tdb_iter.dptr); + free(iter->tdb_iter.dptr); ext2fs_free_mem(&iter); }