tst_iscan.c revision 4cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3
1/* 2 * tst_inode.c --- this function tests the inode scan function 3 * 4 * Copyright (C) 1996 by Theodore Ts'o. 5 * 6 * %Begin-Header% 7 * This file may be redistributed under the terms of the GNU Public 8 * License. 9 * %End-Header% 10 */ 11 12#include <stdio.h> 13#include <string.h> 14#if HAVE_UNISTD_H 15#include <unistd.h> 16#endif 17#include <stdlib.h> 18#include <fcntl.h> 19#include <time.h> 20#include <sys/stat.h> 21#include <sys/types.h> 22#if HAVE_ERRNO_H 23#include <errno.h> 24#endif 25 26#include <linux/ext2_fs.h> 27 28#include "ext2fs.h" 29 30blk_t test_vec[] = { 8, 12, 24, 34, 43, 44, 100, 0 }; 31 32ext2_filsys test_fs; 33ext2fs_block_bitmap bad_block_map, touched_map; 34ext2fs_inode_bitmap bad_inode_map; 35badblocks_list test_badblocks; 36 37int first_no_comma = 1; 38int failed = 0; 39 40static void test_read_blk(unsigned long block, int count, errcode_t err) 41{ 42 int i; 43 44 if (first_no_comma) 45 first_no_comma = 0; 46 else 47 printf(", "); 48 49 if (count > 1) 50 printf("%lu-%lu", block, block+count-1); 51 else 52 printf("%lu", block); 53 54 for (i=0; i < count; i++, block++) { 55 if (ext2fs_test_block_bitmap(touched_map, block)) { 56 printf("\nDuplicate block?!? --- %lu\n", block); 57 failed++; 58 first_no_comma = 1; 59 } 60 ext2fs_mark_block_bitmap(touched_map, block); 61 } 62} 63 64/* 65 * Setup the variables for doing the inode scan test. 66 */ 67static void setup(void) 68{ 69 errcode_t retval; 70 int i; 71 struct ext2_super_block param; 72 73 initialize_ext2_error_table(); 74 75 memset(¶m, 0, sizeof(param)); 76 param.s_blocks_count = 12000; 77 78 79 test_io_cb_read_blk = test_read_blk; 80 81 retval = ext2fs_initialize("test fs", 0, ¶m, 82 test_io_manager, &test_fs); 83 if (retval) { 84 com_err("setup", retval, 85 "While initializing filesystem"); 86 exit(1); 87 } 88 retval = ext2fs_allocate_tables(test_fs); 89 if (retval) { 90 com_err("setup", retval, 91 "While allocating tables for test filesystem"); 92 exit(1); 93 } 94 retval = ext2fs_allocate_block_bitmap(test_fs, "bad block map", 95 &bad_block_map); 96 if (retval) { 97 com_err("setup", retval, 98 "While allocating bad_block bitmap"); 99 exit(1); 100 } 101 retval = ext2fs_allocate_block_bitmap(test_fs, "touched map", 102 &touched_map); 103 if (retval) { 104 com_err("setup", retval, 105 "While allocating touched block bitmap"); 106 exit(1); 107 } 108 retval = ext2fs_allocate_inode_bitmap(test_fs, "bad inode map", 109 &bad_inode_map); 110 if (retval) { 111 com_err("setup", retval, 112 "While allocating bad inode bitmap"); 113 exit(1); 114 } 115 116 retval = badblocks_list_create(&test_badblocks, 5); 117 if (retval) { 118 com_err("setup", retval, "while creating badblocks list"); 119 exit(1); 120 } 121 for (i=0; test_vec[i]; i++) { 122 retval = badblocks_list_add(test_badblocks, test_vec[i]); 123 if (retval) { 124 com_err("setup", retval, 125 "while adding test vector %d", i); 126 exit(1); 127 } 128 ext2fs_mark_block_bitmap(bad_block_map, test_vec[i]); 129 } 130 test_fs->badblocks = test_badblocks; 131} 132 133/* 134 * Iterate using inode_scan 135 */ 136static void iterate(void) 137{ 138 struct ext2_inode inode; 139 ext2_inode_scan scan; 140 errcode_t retval; 141 ino_t ino; 142 143 retval = ext2fs_open_inode_scan(test_fs, 8, &scan); 144 if (retval) { 145 com_err("iterate", retval, "While opening inode scan"); 146 exit(1); 147 } 148 printf("Reading blocks: "); 149 retval = ext2fs_get_next_inode(scan, &ino, &inode); 150 if (retval) { 151 com_err("iterate", retval, "while reading first inode"); 152 exit(1); 153 } 154 while (ino) { 155 retval = ext2fs_get_next_inode(scan, &ino, &inode); 156 if (retval == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE) { 157 ext2fs_mark_inode_bitmap(bad_inode_map, ino); 158 continue; 159 } 160 if (retval) { 161 com_err("iterate", retval, 162 "while getting next inode"); 163 exit(1); 164 } 165 } 166 printf("\n"); 167 ext2fs_close_inode_scan(scan); 168} 169 170/* 171 * Verify the touched map 172 */ 173static void check_map(void) 174{ 175 int i, j, first=1; 176 unsigned long blk; 177 178 for (i=0; test_vec[i]; i++) { 179 if (ext2fs_test_block_bitmap(touched_map, test_vec[i])) { 180 printf("Bad block was touched --- %d\n", test_vec[i]); 181 failed++; 182 first_no_comma = 1; 183 } 184 ext2fs_mark_block_bitmap(touched_map, test_vec[i]); 185 } 186 for (i = 0; i < test_fs->group_desc_count; i++) { 187 for (j=0, blk = test_fs->group_desc[i].bg_inode_table; 188 j < test_fs->inode_blocks_per_group; 189 j++, blk++) { 190 if (!ext2fs_test_block_bitmap(touched_map, blk) && 191 !ext2fs_test_block_bitmap(bad_block_map, blk)) { 192 printf("Missing block --- %lu\n", blk); 193 failed++; 194 } 195 } 196 } 197 printf("Bad inodes: "); 198 for (i=1; i <= test_fs->super->s_inodes_count; i++) { 199 if (ext2fs_test_inode_bitmap(bad_inode_map, i)) { 200 if (first) 201 first = 0; 202 else 203 printf(", "); 204 printf("%d", i); 205 } 206 } 207 printf("\n"); 208} 209 210 211int main(int argc, char **argv) 212{ 213 setup(); 214 iterate(); 215 check_map(); 216 if (!failed) 217 printf("Inode scan tested OK!\n"); 218 return failed; 219} 220 221