119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * scantest.c - test the speed of the inode scan routine
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h>
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ctype.h>
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <termios.h>
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h>
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h>
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_MNTENT_H
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <mntent.h>
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h>
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_MALLOC_H
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <malloc.h>
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/resource.h>
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "et/com_err.h"
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "../version.h"
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h>
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h>
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/time.h>
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs/ext2_fs.h"
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs/ext2fs.h"
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int isatty(int);
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char * device_name = NULL;
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This structure is used for keeping track of how much resources have
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * been used for a particular pass of e2fsck.
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct resource_track {
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct timeval time_start;
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct timeval user_start;
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct timeval system_start;
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	void	*brk_start;
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct resource_track	global_rtrack;
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid init_resource_track(struct resource_track *track)
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct rusage r;
583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	track->brk_start = sbrk(0);
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	gettimeofday(&track->time_start, 0);
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	getrusage(RUSAGE_SELF, &r);
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	track->user_start = r.ru_utime;
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	track->system_start = r.ru_stime;
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __inline__ float timeval_subtract(struct timeval *tv1,
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					 struct timeval *tv2)
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return ((tv1->tv_sec - tv2->tv_sec) +
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000);
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_resource_track(struct resource_track *track)
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct rusage r;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct timeval time_end;
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	gettimeofday(&time_end, 0);
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	getrusage(RUSAGE_SELF, &r);
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf(_("Memory used: %d, elapsed time: %6.3f/%6.3f/%6.3f\n"),
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       (int) (((char *) sbrk(0)) - ((char *) track->brk_start)),
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       timeval_subtract(&time_end, &track->time_start),
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       timeval_subtract(&r.ru_utime, &track->user_start),
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       timeval_subtract(&r.ru_stime, &track->system_start));
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main (int argc, char *argv[])
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval = 0;
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		exit_value = 0;
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		i;
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_filsys	fs;
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_inode_scan	scan;
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_ino_t	ino;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ext2_inode inode;
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf(_("size of inode=%d\n"), sizeof(inode));
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	device_name = "/dev/hda3";
1033984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	init_resource_track(&global_rtrack);
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_open(device_name, 0,
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			     0, 0, unix_io_manager, &fs);
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval) {
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		com_err(argv[0], retval, _("while trying to open %s"),
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			device_name);
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_open_inode_scan(fs, 0, &scan);
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval) {
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		com_err(argv[0], retval, _("while opening inode scan"));
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_get_next_inode(scan, &ino, &inode);
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval) {
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		com_err(argv[0], retval, _("while starting inode scan"));
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (ino) {
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!inode.i_links_count)
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			goto next;
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf("%lu\n", inode.i_blocks);
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	next:
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		retval = ext2fs_get_next_inode(scan, &ino, &inode);
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (retval) {
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			com_err(argv[0], retval,
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				_("while doing inode scan"));
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(1);
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
1363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2fs_close(fs);
1393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	print_resource_track(&global_rtrack);
1413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return exit_value;
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
144