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