diff options
Diffstat (limited to 'lib/ext2fs/tst_bitmaps.c')
-rw-r--r-- | lib/ext2fs/tst_bitmaps.c | 167 |
1 files changed, 154 insertions, 13 deletions
diff --git a/lib/ext2fs/tst_bitmaps.c b/lib/ext2fs/tst_bitmaps.c index 27722e53..4e02aded 100644 --- a/lib/ext2fs/tst_bitmaps.c +++ b/lib/ext2fs/tst_bitmaps.c @@ -151,7 +151,7 @@ int check_fs_open(char *name) static void setup_filesystem(const char *name, unsigned int blocks, unsigned int inodes, - unsigned int type) + unsigned int type, int flags) { struct ext2_super_block param; errcode_t retval; @@ -160,7 +160,7 @@ static void setup_filesystem(const char *name, ext2fs_blocks_count_set(¶m, blocks); param.s_inodes_count = inodes; - retval = ext2fs_initialize("test fs", EXT2_FLAG_64BITS, ¶m, + retval = ext2fs_initialize("test fs", flags, ¶m, test_io_manager, &test_fs); if (retval) { @@ -193,11 +193,11 @@ errout: void setup_cmd(int argc, char **argv) { - errcode_t retval; - int i, c, err; + int c, err; unsigned int blocks = 128; unsigned int inodes = 0; unsigned int type = EXT2FS_BMAP64_BITARRAY; + int flags = EXT2_FLAG_64BITS; if (test_fs) { ext2fs_close(test_fs); @@ -205,7 +205,7 @@ void setup_cmd(int argc, char **argv) } reset_getopt(); - while ((c = getopt(argc, argv, "b:i:t:")) != EOF) { + while ((c = getopt(argc, argv, "b:i:lt:")) != EOF) { switch (c) { case 'b': blocks = parse_ulong(optarg, argv[0], @@ -219,6 +219,9 @@ void setup_cmd(int argc, char **argv) if (err) return; break; + case 'l': /* Legacy bitmaps */ + flags = 0; + break; case 't': type = parse_ulong(optarg, argv[0], "bitmap backend type", &err); @@ -231,7 +234,7 @@ void setup_cmd(int argc, char **argv) return; } } - setup_filesystem(argv[0], blocks, inodes, type); + setup_filesystem(argv[0], blocks, inodes, type, flags); } void close_cmd(int argc, char **argv) @@ -266,6 +269,7 @@ void dump_bitmap(ext2fs_generic_bitmap bmap, unsigned int start, unsigned num) for (i=0; i < len; i++) printf("%02x", buf[i]); printf("\n"); + printf("bits set: %u\n", ext2fs_bitcount(buf, len)); free(buf); } @@ -368,7 +372,7 @@ void do_testb(int argc, char *argv[]) { unsigned int block, num; int err; - int test_result, op_result; + int test_result; if (check_fs_open(argv[0])) return; @@ -399,6 +403,73 @@ void do_testb(int argc, char *argv[]) printf("Block %u is %s\n", block, test_result ? "set" : "clear"); } +void do_ffzb(int argc, char *argv[]) +{ + unsigned int start, end; + int err; + errcode_t retval; + blk64_t out; + + if (check_fs_open(argv[0])) + return; + + if (argc != 3 && argc != 3) { + com_err(argv[0], 0, "Usage: ffzb <start> <end>"); + return; + } + + start = parse_ulong(argv[1], argv[0], "start", &err); + if (err) + return; + + end = parse_ulong(argv[2], argv[0], "end", &err); + if (err) + return; + + retval = ext2fs_find_first_zero_block_bitmap2(test_fs->block_map, + start, end, &out); + if (retval) { + printf("ext2fs_find_first_zero_block_bitmap2() returned %s\n", + error_message(retval)); + return; + } + printf("First unmarked block is %llu\n", out); +} + +void do_ffsb(int argc, char *argv[]) +{ + unsigned int start, end; + int err; + errcode_t retval; + blk64_t out; + + if (check_fs_open(argv[0])) + return; + + if (argc != 3 && argc != 3) { + com_err(argv[0], 0, "Usage: ffsb <start> <end>"); + return; + } + + start = parse_ulong(argv[1], argv[0], "start", &err); + if (err) + return; + + end = parse_ulong(argv[2], argv[0], "end", &err); + if (err) + return; + + retval = ext2fs_find_first_set_block_bitmap2(test_fs->block_map, + start, end, &out); + if (retval) { + printf("ext2fs_find_first_set_block_bitmap2() returned %s\n", + error_message(retval)); + return; + } + printf("First marked block is %llu\n", out); +} + + void do_zerob(int argc, char *argv[]) { if (check_fs_open(argv[0])) @@ -470,7 +541,7 @@ void do_testi(int argc, char *argv[]) { unsigned int inode; int err; - int test_result, op_result; + int test_result; if (check_fs_open(argv[0])) return; @@ -488,6 +559,72 @@ void do_testi(int argc, char *argv[]) printf("Inode %u is %s\n", inode, test_result ? "set" : "clear"); } +void do_ffzi(int argc, char *argv[]) +{ + unsigned int start, end; + int err; + errcode_t retval; + ext2_ino_t out; + + if (check_fs_open(argv[0])) + return; + + if (argc != 3 && argc != 3) { + com_err(argv[0], 0, "Usage: ffzi <start> <end>"); + return; + } + + start = parse_ulong(argv[1], argv[0], "start", &err); + if (err) + return; + + end = parse_ulong(argv[2], argv[0], "end", &err); + if (err) + return; + + retval = ext2fs_find_first_zero_inode_bitmap2(test_fs->inode_map, + start, end, &out); + if (retval) { + printf("ext2fs_find_first_zero_inode_bitmap2() returned %s\n", + error_message(retval)); + return; + } + printf("First unmarked inode is %u\n", out); +} + +void do_ffsi(int argc, char *argv[]) +{ + unsigned int start, end; + int err; + errcode_t retval; + ext2_ino_t out; + + if (check_fs_open(argv[0])) + return; + + if (argc != 3 && argc != 3) { + com_err(argv[0], 0, "Usage: ffsi <start> <end>"); + return; + } + + start = parse_ulong(argv[1], argv[0], "start", &err); + if (err) + return; + + end = parse_ulong(argv[2], argv[0], "end", &err); + if (err) + return; + + retval = ext2fs_find_first_set_inode_bitmap2(test_fs->inode_map, + start, end, &out); + if (retval) { + printf("ext2fs_find_first_set_inode_bitmap2() returned %s\n", + error_message(retval)); + return; + } + printf("First marked inode is %u\n", out); +} + void do_zeroi(int argc, char *argv[]) { if (check_fs_open(argv[0])) @@ -506,28 +643,32 @@ int main(int argc, char **argv) char *request = (char *)NULL; char *cmd_file = 0; int sci_idx; + int flags = EXT2_FLAG_64BITS; add_error_table(&et_ss_error_table); add_error_table(&et_ext2_error_table); - while ((c = getopt (argc, argv, "b:i:t:R:f:")) != EOF) { + while ((c = getopt (argc, argv, "b:i:lt:R:f:")) != EOF) { switch (c) { case 'b': blocks = parse_ulong(optarg, argv[0], "number of blocks", &err); if (err) - return; + exit(1); break; case 'i': inodes = parse_ulong(optarg, argv[0], "number of blocks", &err); if (err) - return; + exit(1); + break; + case 'l': /* Legacy bitmaps */ + flags = 0; break; case 't': type = parse_ulong(optarg, argv[0], "bitmap backend type", &err); if (err) - return; + exit(1); break; case 'R': request = optarg; @@ -558,7 +699,7 @@ int main(int argc, char **argv) printf("%s %s. Type '?' for a list of commands.\n\n", subsystem_name, version); - setup_filesystem(argv[0], blocks, inodes, type); + setup_filesystem(argv[0], blocks, inodes, type, flags); if (request) { code = ss_execute_line(sci_idx, request); |