summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2002-07-20 00:28:07 -0400
committerTheodore Ts'o <tytso@mit.edu>2002-07-20 00:28:07 -0400
commitb7a00563b22b0ea47ddc7117508c0b8e0d65df43 (patch)
tree47abfe8f090b00cc4facfc946ef7e19bec2f9f9d /lib
parent3ea1f0fb45d5d3ec81370efc3c1c0759a4d88675 (diff)
downloade2fsprogs-b7a00563b22b0ea47ddc7117508c0b8e0d65df43.tar.gz
Add support to e2fsck to reindex directories to use hash trees.
Diffstat (limited to 'lib')
-rw-r--r--lib/ext2fs/ChangeLog6
-rw-r--r--lib/ext2fs/badblocks.c99
-rw-r--r--lib/ext2fs/ext2_fs.h7
-rw-r--r--lib/ext2fs/ext2fs.h26
-rw-r--r--lib/ext2fs/ext2fsP.h12
-rw-r--r--lib/ext2fs/freefs.c8
6 files changed, 120 insertions, 38 deletions
diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog
index 711daa96..4bbbca22 100644
--- a/lib/ext2fs/ChangeLog
+++ b/lib/ext2fs/ChangeLog
@@ -1,5 +1,11 @@
2002-07-19 Theodore Ts'o <tytso@mit.edu>
+ * ext2_fs.h: Add s_hash_seed and s_def_hash_version to the
+ superblock definition.
+
+ * badblocks.c, freefs.c, ext2fs.h: Use the badblocks functions to
+ create a set of u32_list functions.
+
* dirhash.c (halfMD4Transform): Shift the hash by one bit,
since that's required by the directory indexing code.
diff --git a/lib/ext2fs/badblocks.c b/lib/ext2fs/badblocks.c
index 4e94e8c8..6f9ef95b 100644
--- a/lib/ext2fs/badblocks.c
+++ b/lib/ext2fs/badblocks.c
@@ -29,17 +29,17 @@
/*
* Helper function for making a badblocks list
*/
-static errcode_t make_badblocks_list(int size, int num, blk_t *list,
- ext2_badblocks_list *ret)
+static errcode_t make_u32_list(int size, int num, __u32 *list,
+ ext2_u32_list *ret)
{
- ext2_badblocks_list bb;
- errcode_t retval;
+ ext2_u32_list bb;
+ errcode_t retval;
- retval = ext2fs_get_mem(sizeof(struct ext2_struct_badblocks_list),
+ retval = ext2fs_get_mem(sizeof(struct ext2_struct_u32_list),
(void **) &bb);
if (retval)
return retval;
- memset(bb, 0, sizeof(struct ext2_struct_badblocks_list));
+ memset(bb, 0, sizeof(struct ext2_struct_u32_list));
bb->magic = EXT2_ET_MAGIC_BADBLOCKS_LIST;
bb->size = size ? size : 10;
bb->num = num;
@@ -58,29 +58,42 @@ static errcode_t make_badblocks_list(int size, int num, blk_t *list,
/*
+ * This procedure creates an empty u32 list.
+ */
+errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size)
+{
+ return make_u32_list(size, 0, 0, ret);
+}
+
+/*
* This procedure creates an empty badblocks list.
*/
errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret, int size)
{
- return make_badblocks_list(size, 0, 0, ret);
+ return make_u32_list(size, 0, 0, (ext2_badblocks_list *) ret);
}
+
/*
* This procedure copies a badblocks list
*/
-errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
- ext2_badblocks_list *dest)
+errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest)
{
errcode_t retval;
- retval = make_badblocks_list(src->size, src->num, src->list,
- dest);
+ retval = make_u32_list(src->size, src->num, src->list, dest);
if (retval)
return retval;
(*dest)->badblocks_flags = src->badblocks_flags;
return 0;
}
+errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
+ ext2_badblocks_list *dest)
+{
+ return ext2fs_u32_copy((ext2_u32_list) src,
+ (ext2_u32_list *) dest);
+}
/*
* This procedure frees a badblocks list.
@@ -92,7 +105,7 @@ errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
/*
* This procedure adds a block to a badblocks list.
*/
-errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk)
+errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk)
{
errcode_t retval;
int i, j;
@@ -101,9 +114,9 @@ errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk)
EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST);
if (bb->num >= bb->size) {
- old_size = bb->size * sizeof(blk_t);
+ old_size = bb->size * sizeof(__u32);
bb->size += 100;
- retval = ext2fs_resize_mem(old_size, bb->size * sizeof(blk_t),
+ retval = ext2fs_resize_mem(old_size, bb->size * sizeof(__u32),
(void **) &bb->list);
if (retval) {
bb->size -= 100;
@@ -138,11 +151,18 @@ errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk)
return 0;
}
+errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk)
+{
+ return ext2fs_u32_list_add((ext2_u32_list) bb, (__u32) blk);
+}
+
+
+
/*
* This procedure tests to see if a particular block is on a badblocks
* list.
*/
-int ext2fs_badblocks_list_test(ext2_badblocks_list bb, blk_t blk)
+int ext2fs_u32_list_test(ext2_u32_list bb, __u32 blk)
{
int low, high, mid;
@@ -173,15 +193,21 @@ int ext2fs_badblocks_list_test(ext2_badblocks_list bb, blk_t blk)
return 0;
}
-errcode_t ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
- ext2_badblocks_iterate *ret)
+int ext2fs_badblocks_list_test(ext2_badblocks_list bb, blk_t blk)
+{
+ return ext2fs_u32_list_test((ext2_u32_list) bb, (__u32) blk);
+}
+
+
+errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
+ ext2_u32_iterate *ret)
{
- ext2_badblocks_iterate iter;
+ ext2_u32_iterate iter;
errcode_t retval;
EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST);
- retval = ext2fs_get_mem(sizeof(struct ext2_struct_badblocks_iterate),
+ retval = ext2fs_get_mem(sizeof(struct ext2_struct_u32_iterate),
(void **) &iter);
if (retval)
return retval;
@@ -193,9 +219,17 @@ errcode_t ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
return 0;
}
-int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter, blk_t *blk)
+errcode_t ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
+ ext2_badblocks_iterate *ret)
{
- ext2_badblocks_list bb;
+ return ext2fs_u32_list_iterate_begin((ext2_u32_list) bb,
+ (ext2_u32_iterate *) ret);
+}
+
+
+int ext2fs_u32_list_iterate(ext2_u32_iterate iter, __u32 *blk)
+{
+ ext2_u32_list bb;
if (iter->magic != EXT2_ET_MAGIC_BADBLOCKS_ITERATE)
return 0;
@@ -213,7 +247,14 @@ int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter, blk_t *blk)
return 0;
}
-void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter)
+int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter, blk_t *blk)
+{
+ return ext2fs_u32_list_iterate((ext2_u32_iterate) iter,
+ (__u32 *) blk);
+}
+
+
+void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter)
{
if (!iter || (iter->magic != EXT2_ET_MAGIC_BADBLOCKS_ITERATE))
return;
@@ -222,7 +263,13 @@ void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter)
ext2fs_free_mem((void **) &iter);
}
-int ext2fs_badblocks_equal(ext2_badblocks_list bb1, ext2_badblocks_list bb2)
+void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter)
+{
+ ext2fs_u32_list_iterate_end((ext2_u32_iterate) iter);
+}
+
+
+int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2)
{
EXT2_CHECK_MAGIC(bb1, EXT2_ET_MAGIC_BADBLOCKS_LIST);
EXT2_CHECK_MAGIC(bb2, EXT2_ET_MAGIC_BADBLOCKS_LIST);
@@ -234,3 +281,9 @@ int ext2fs_badblocks_equal(ext2_badblocks_list bb1, ext2_badblocks_list bb2)
return 0;
return 1;
}
+
+int ext2fs_badblocks_equal(ext2_badblocks_list bb1, ext2_badblocks_list bb2)
+{
+ return ext2fs_u32_list_equal((ext2_u32_list) bb1,
+ (ext2_u32_list) bb2);
+}
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 677805ac..c53b13c7 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -435,8 +435,11 @@ struct ext2_super_block {
__u32 s_journal_inum; /* inode number of journal file */
__u32 s_journal_dev; /* device number of journal file */
__u32 s_last_orphan; /* start of list of inodes to delete */
- __u32 s_hash_seed[4]; /* HTREE hash */
- __u32 s_reserved[193]; /* Padding to the end of the block */
+ __u32 s_hash_seed[4]; /* HTREE hash seed */
+ __u8 s_def_hash_version; /* Default hash version to use */
+ __u8 s_reserved_char_pad;
+ __u16 s_reserved_word_pad;
+ __u32 s_reserved[192]; /* Padding to the end of the block */
};
/*
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index b7f5ff21..60021930 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -118,12 +118,15 @@ typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
* badblocks list definitions
*/
-typedef struct ext2_struct_badblocks_list *ext2_badblocks_list;
-typedef struct ext2_struct_badblocks_iterate *ext2_badblocks_iterate;
+typedef struct ext2_struct_u32_list *ext2_badblocks_list;
+typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;
+
+typedef struct ext2_struct_u32_list *ext2_u32_list;
+typedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
/* old */
-typedef struct ext2_struct_badblocks_list *badblocks_list;
-typedef struct ext2_struct_badblocks_iterate *badblocks_iterate;
+typedef struct ext2_struct_u32_list *badblocks_list;
+typedef struct ext2_struct_u32_iterate *badblocks_iterate;
#define BADBLOCKS_FLAG_DIRTY 1
@@ -210,7 +213,7 @@ struct struct_ext2_filsys {
struct ext2_inode *inode);
errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
struct ext2_inode *inode);
- badblocks_list badblocks;
+ ext2_badblocks_list badblocks;
ext2_dblist dblist;
__u32 stride; /* for mke2fs */
struct ext2_super_block * orig_super;
@@ -462,6 +465,16 @@ extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
ext2fs_block_bitmap bmap);
/* badblocks.c */
+extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
+extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
+extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
+extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
+ ext2_u32_iterate *ret);
+extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
+extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
+extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
+extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
+
extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
int size);
extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
@@ -678,7 +691,8 @@ extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
extern void ext2fs_free_dblist(ext2_dblist dblist);
-extern void ext2fs_badblocks_list_free(badblocks_list bb);
+extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
+extern void ext2fs_u32_list_free(ext2_u32_list bb);
/* getsize.c */
extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
diff --git a/lib/ext2fs/ext2fsP.h b/lib/ext2fs/ext2fsP.h
index 57833546..eea32d63 100644
--- a/lib/ext2fs/ext2fsP.h
+++ b/lib/ext2fs/ext2fsP.h
@@ -14,18 +14,18 @@
/*
* Badblocks list
*/
-struct ext2_struct_badblocks_list {
+struct ext2_struct_u32_list {
int magic;
int num;
int size;
- blk_t *list;
+ __u32 *list;
int badblocks_flags;
};
-struct ext2_struct_badblocks_iterate {
- int magic;
- badblocks_list bb;
- int ptr;
+struct ext2_struct_u32_iterate {
+ int magic;
+ ext2_u32_list bb;
+ int ptr;
};
diff --git a/lib/ext2fs/freefs.c b/lib/ext2fs/freefs.c
index 5cb3cf8b..37de8692 100644
--- a/lib/ext2fs/freefs.c
+++ b/lib/ext2fs/freefs.c
@@ -107,7 +107,7 @@ static void ext2fs_free_inode_cache(struct ext2_inode_cache *icache)
/*
* This procedure frees a badblocks list.
*/
-void ext2fs_badblocks_list_free(ext2_badblocks_list bb)
+void ext2fs_u32_list_free(ext2_u32_list bb)
{
if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST)
return;
@@ -118,6 +118,12 @@ void ext2fs_badblocks_list_free(ext2_badblocks_list bb)
ext2fs_free_mem((void **) &bb);
}
+void ext2fs_badblocks_list_free(ext2_badblocks_list bb)
+{
+ ext2fs_u32_list_free((ext2_u32_list) bb);
+}
+
+
/*
* Free a directory block list
*/