summaryrefslogtreecommitdiff
path: root/e2fsck/dirinfo.c
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2016-05-29 20:48:54 -0400
committerTheodore Ts'o <tytso@mit.edu>2016-05-29 21:52:52 -0400
commit749f07121d9c98c317987a87f44c458745f39f15 (patch)
tree521f98c9e7fe62598baf300b94d8b3ea0debead4 /e2fsck/dirinfo.c
parenta701823a31505c5765d327d02bb14aa43fc34ae5 (diff)
downloade2fsprogs-749f07121d9c98c317987a87f44c458745f39f15.tar.gz
Add configure --disable-tdb which disables e2fsck's scratch_files feature
The scratch_files feature is not really needed except on 32-bit platforms, since tdb's performance is pretty awful given how we are using it. Maybe SQLite would be faster, but for 64-bit platforms, enabling swap works fairly well, especially using the rbtree for the bitmap abstraction. We leave tdb for Android since it's unlikely that someone will be trying to connect petabyte+ sized file systems to a mobile handset. Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'e2fsck/dirinfo.c')
-rw-r--r--e2fsck/dirinfo.c67
1 files changed, 44 insertions, 23 deletions
diff --git a/e2fsck/dirinfo.c b/e2fsck/dirinfo.c
index 9b36ddc7..b29f7e92 100644
--- a/e2fsck/dirinfo.c
+++ b/e2fsck/dirinfo.c
@@ -21,13 +21,17 @@ struct dir_info_db {
int size;
struct dir_info *array;
struct dir_info *last_lookup;
+#ifdef CONFIG_TDB
char *tdb_fn;
TDB_CONTEXT *tdb;
+#endif
};
struct dir_info_iter {
int i;
+#ifdef CONFIG_TDB
TDB_DATA tdb_iter;
+#endif
};
struct dir_info_ent {
@@ -38,6 +42,7 @@ struct dir_info_ent {
static void e2fsck_put_dir_info(e2fsck_t ctx, struct dir_info *dir);
+#ifdef CONFIG_TDB
static void setup_tdb(e2fsck_t ctx, ext2_ino_t num_dirs)
{
struct dir_info_db *db = ctx->dir_info;
@@ -79,6 +84,7 @@ static void setup_tdb(e2fsck_t ctx, ext2_ino_t num_dirs)
O_RDWR | O_CREAT | O_TRUNC, 0600);
close(fd);
}
+#endif
static void setup_db(e2fsck_t ctx)
{
@@ -98,6 +104,7 @@ static void setup_db(e2fsck_t ctx)
if (retval)
num_dirs = 1024; /* Guess */
+#ifdef CONFIG_TDB
setup_tdb(ctx, num_dirs);
if (db->tdb) {
@@ -106,6 +113,7 @@ static void setup_db(e2fsck_t ctx)
#endif
return;
}
+#endif
db->size = num_dirs + 10;
db->array = (struct dir_info *)
@@ -121,8 +129,7 @@ static void setup_db(e2fsck_t ctx)
*/
void e2fsck_add_dir_info(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t parent)
{
- struct dir_info_db *db;
- struct dir_info *dir, ent, *old_array;
+ struct dir_info *dir, *old_array;
int i, j;
errcode_t retval;
unsigned long old_size;
@@ -132,7 +139,6 @@ void e2fsck_add_dir_info(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t parent)
#endif
if (!ctx->dir_info)
setup_db(ctx);
- db = ctx->dir_info;
if (ctx->dir_info->count >= ctx->dir_info->size) {
old_size = ctx->dir_info->size * sizeof(struct dir_info);
@@ -153,14 +159,17 @@ void e2fsck_add_dir_info(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t parent)
ctx->dir_info->last_lookup = NULL;
}
- ent.ino = ino;
- ent.parent = parent;
- ent.dotdot = parent;
+#ifdef CONFIG_TDB
+ if (ctx->dir_info->tdb) {
+ struct dir_info ent;
- if (db->tdb) {
+ ent.ino = ino;
+ ent.parent = parent;
+ ent.dotdot = parent;
e2fsck_put_dir_info(ctx, &ent);
return;
}
+#endif
/*
* Normally, add_dir_info is called with each inode in
@@ -196,8 +205,6 @@ 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;
- struct dir_info_ent *buf;
- static struct dir_info ret_dir_info;
if (!db)
return 0;
@@ -206,8 +213,11 @@ static struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ext2_ino_t ino)
printf("e2fsck_get_dir_info %d...", ino);
#endif
+#ifdef CONFIG_TDB
if (db->tdb) {
+ static struct dir_info ret_dir_info;
TDB_DATA key, data;
+ struct dir_info_ent *buf;
key.dptr = (unsigned char *) &ino;
key.dsize = sizeof(ext2_ino_t);
@@ -230,6 +240,7 @@ static struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ext2_ino_t ino)
free(data.dptr);
return &ret_dir_info;
}
+#endif
if (db->last_lookup && db->last_lookup->ino == ino)
return db->last_lookup;
@@ -273,17 +284,21 @@ static struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ext2_ino_t ino)
return 0;
}
-static void e2fsck_put_dir_info(e2fsck_t ctx, struct dir_info *dir)
+static void e2fsck_put_dir_info(e2fsck_t ctx EXT2FS_NO_TDB_UNUSED,
+ struct dir_info *dir EXT2FS_NO_TDB_UNUSED)
{
+#ifdef CONFIG_TDB
struct dir_info_db *db = ctx->dir_info;
struct dir_info_ent buf;
TDB_DATA key, data;
+#endif
#ifdef DIRINFO_DEBUG
printf("e2fsck_put_dir_info (%d, %d, %d)...", dir->ino, dir->dotdot,
dir->parent);
#endif
+#ifdef CONFIG_TDB
if (!db->tdb)
return;
@@ -298,7 +313,7 @@ static void e2fsck_put_dir_info(e2fsck_t ctx, struct dir_info *dir)
if (tdb_store(db->tdb, key, data, TDB_REPLACE) == -1) {
printf("store failed: %s\n", tdb_errorstr(db->tdb));
}
- return;
+#endif
}
/*
@@ -307,12 +322,14 @@ static void e2fsck_put_dir_info(e2fsck_t ctx, struct dir_info *dir)
void e2fsck_free_dir_info(e2fsck_t ctx)
{
if (ctx->dir_info) {
+#ifdef CONFIG_TDB
if (ctx->dir_info->tdb)
tdb_close(ctx->dir_info->tdb);
if (ctx->dir_info->tdb_fn) {
unlink(ctx->dir_info->tdb_fn);
free(ctx->dir_info->tdb_fn);
}
+#endif
if (ctx->dir_info->array)
ext2fs_free_mem(&ctx->dir_info->array);
ctx->dir_info->array = 0;
@@ -334,13 +351,14 @@ int e2fsck_get_num_dirinfo(e2fsck_t ctx)
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;
iter = e2fsck_allocate_memory(ctx, sizeof(struct dir_info_iter),
"dir_info iterator");
- if (db->tdb)
- iter->tdb_iter = tdb_firstkey(db->tdb);
+#ifdef CONFIG_TDB
+ if (ctx->dir_info->tdb)
+ iter->tdb_iter = tdb_firstkey(ctx->dir_info->tdb);
+#endif
return iter;
}
@@ -348,7 +366,9 @@ struct dir_info_iter *e2fsck_dir_info_iter_begin(e2fsck_t ctx)
void e2fsck_dir_info_iter_end(e2fsck_t ctx EXT2FS_ATTR((unused)),
struct dir_info_iter *iter)
{
+#ifdef CONFIG_TDB
free(iter->tdb_iter.dptr);
+#endif
ext2fs_free_mem(&iter);
}
@@ -357,33 +377,34 @@ void e2fsck_dir_info_iter_end(e2fsck_t ctx EXT2FS_ATTR((unused)),
*/
struct dir_info *e2fsck_dir_info_iter(e2fsck_t ctx, struct dir_info_iter *iter)
{
- TDB_DATA data, key;
- struct dir_info_db *db = ctx->dir_info;
- struct dir_info_ent *buf;
- static struct dir_info ret_dir_info;
-
if (!ctx->dir_info || !iter)
return 0;
- if (db->tdb) {
+#ifdef CONFIG_TDB
+ if (ctx->dir_info->tdb) {
+ static struct dir_info ret_dir_info;
+ struct dir_info_ent *buf;
+ TDB_DATA data, key;
+
if (iter->tdb_iter.dptr == 0)
return 0;
key = iter->tdb_iter;
- data = tdb_fetch(db->tdb, key);
+ data = tdb_fetch(ctx->dir_info->tdb, key);
if (!data.dptr) {
printf("iter fetch failed: %s\n",
- tdb_errorstr(db->tdb));
+ tdb_errorstr(ctx->dir_info->tdb));
return 0;
}
buf = (struct dir_info_ent *) data.dptr;
ret_dir_info.ino = *((ext2_ino_t *) iter->tdb_iter.dptr);
ret_dir_info.dotdot = buf->dotdot;
ret_dir_info.parent = buf->parent;
- iter->tdb_iter = tdb_nextkey(db->tdb, key);
+ iter->tdb_iter = tdb_nextkey(ctx->dir_info->tdb, key);
free(key.dptr);
free(data.dptr);
return &ret_dir_info;
}
+#endif
if (iter->i >= ctx->dir_info->count)
return 0;