1/* 2 * Test to see how quickly we can scan the inode table (not doing 3 * anything else) 4 */ 5 6#include <string.h> 7#include <fcntl.h> 8#include <ctype.h> 9#include <termios.h> 10#include <time.h> 11#ifdef HAVE_GETOPT_H 12#include <getopt.h> 13#endif 14#include <unistd.h> 15#ifdef HAVE_ERRNO_H 16#include <errno.h> 17#endif 18#include <sys/ioctl.h> 19#ifdef HAVE_MALLOC_H 20#include <malloc.h> 21#endif 22 23#include "et/com_err.h" 24#include "e2fsck.h" 25#include "../version.h" 26 27extern int isatty(int); 28 29const char * program_name = "iscan"; 30const char * device_name = NULL; 31 32int yflag = 0; 33int nflag = 0; 34int preen = 0; 35int inode_buffer_blocks = 0; 36int invalid_bitmaps = 0; 37 38struct resource_track global_rtrack; 39 40static void usage(void) 41{ 42 fprintf(stderr, 43 _("Usage: %s [-F] [-I inode_buffer_blocks] device\n"), 44 program_name); 45 exit(1); 46} 47 48static void PRS(int argc, char *argv[]) 49{ 50 int flush = 0; 51 int c; 52#ifdef MTRACE 53 extern void *mallwatch; 54#endif 55 errcode_t retval; 56 57 setbuf(stdout, NULL); 58 setbuf(stderr, NULL); 59 initialize_ext2_error_table(); 60 61 if (argc && *argv) 62 program_name = *argv; 63 while ((c = getopt (argc, argv, "FI")) != EOF) 64 switch (c) { 65 case 'F': 66 flush = 1; 67 break; 68 case 'I': 69 inode_buffer_blocks = atoi(optarg); 70 break; 71 default: 72 usage (); 73 } 74 device_name = argv[optind]; 75 if (flush) { 76 int fd = open(device_name, O_RDONLY, 0); 77 78 if (fd < 0) { 79 com_err("open", errno, 80 _("while opening %s for flushing"), device_name); 81 exit(FSCK_ERROR); 82 } 83 if ((retval = ext2fs_sync_device(fd, 1))) { 84 com_err("ext2fs_sync_device", retval, 85 _("while trying to flush %s"), device_name); 86 exit(FSCK_ERROR); 87 } 88 close(fd); 89 } 90} 91 92int main (int argc, char *argv[]) 93{ 94 errcode_t retval = 0; 95 int exit_value = FSCK_OK; 96 ext2_filsys fs; 97 ext2_ino_t ino; 98 __u32 num_inodes = 0; 99 struct ext2_inode inode; 100 ext2_inode_scan scan; 101 102 init_resource_track(&global_rtrack); 103 104 PRS(argc, argv); 105 106 retval = ext2fs_open(device_name, 0, 107 0, 0, unix_io_manager, &fs); 108 if (retval) { 109 com_err(program_name, retval, _("while trying to open '%s'"), 110 device_name); 111 exit(1); 112 } 113 114 ehandler_init(fs->io); 115 116 retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan); 117 if (retval) { 118 com_err(program_name, retval, _("while opening inode scan")); 119 exit(1); 120 } 121 122 while (1) { 123 retval = ext2fs_get_next_inode(scan, &ino, &inode); 124 if (retval) { 125 com_err(program_name, retval, 126 _("while getting next inode")); 127 exit(1); 128 } 129 if (ino == 0) 130 break; 131 num_inodes++; 132 } 133 134 print_resource_track(NULL, &global_rtrack); 135 printf(_("%u inodes scanned.\n"), num_inodes); 136 137 exit(0); 138} 139