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