#undef DIRINFO_DEBUG
+#include "config.h"
#include "e2fsck.h"
#include <sys/stat.h>
#include <fcntl.h>
+#include "uuid/uuid.h"
#include <ext2fs/tdb.h>
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);
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;
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;
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)
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);
{
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);
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);
}