/* * scantest.c - test the speed of the inode scan routine */ #include <string.h> #include <fcntl.h> #include <ctype.h> #include <termios.h> #include <time.h> #ifdef HAVE_GETOPT_H #include <getopt.h> #endif #include <unistd.h> #ifdef HAVE_MNTENT_H #include <mntent.h> #endif #include <sys/ioctl.h> #ifdef HAVE_MALLOC_H #include <malloc.h> #endif #include <sys/resource.h> #include "et/com_err.h" #include "../version.h" #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/time.h> #include "ext2fs/ext2_fs.h" #include "ext2fs/ext2fs.h" extern int isatty(int); const char * device_name = NULL; /* * This structure is used for keeping track of how much resources have * been used for a particular pass of e2fsck. */ struct resource_track { struct timeval time_start; struct timeval user_start; struct timeval system_start; void *brk_start; }; struct resource_track global_rtrack; void init_resource_track(struct resource_track *track) { struct rusage r; track->brk_start = sbrk(0); gettimeofday(&track->time_start, 0); getrusage(RUSAGE_SELF, &r); track->user_start = r.ru_utime; track->system_start = r.ru_stime; } static __inline__ float timeval_subtract(struct timeval *tv1, struct timeval *tv2) { return ((tv1->tv_sec - tv2->tv_sec) + ((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000); } static void print_resource_track(struct resource_track *track) { struct rusage r; struct timeval time_end; gettimeofday(&time_end, 0); getrusage(RUSAGE_SELF, &r); printf(_("Memory used: %d, elapsed time: %6.3f/%6.3f/%6.3f\n"), (int) (((char *) sbrk(0)) - ((char *) track->brk_start)), timeval_subtract(&time_end, &track->time_start), timeval_subtract(&r.ru_utime, &track->user_start), timeval_subtract(&r.ru_stime, &track->system_start)); } int main (int argc, char *argv[]) { errcode_t retval = 0; int exit_value = 0; int i; ext2_filsys fs; ext2_inode_scan scan; ext2_ino_t ino; struct ext2_inode inode; printf(_("size of inode=%d\n"), sizeof(inode)); device_name = "/dev/hda3"; init_resource_track(&global_rtrack); retval = ext2fs_open(device_name, 0, 0, 0, unix_io_manager, &fs); if (retval) { com_err(argv[0], retval, _("while trying to open %s"), device_name); exit(1); } retval = ext2fs_open_inode_scan(fs, 0, &scan); if (retval) { com_err(argv[0], retval, _("while opening inode scan")); exit(1); } retval = ext2fs_get_next_inode(scan, &ino, &inode); if (retval) { com_err(argv[0], retval, _("while starting inode scan")); exit(1); } while (ino) { if (!inode.i_links_count) goto next; printf("%lu\n", inode.i_blocks); next: retval = ext2fs_get_next_inode(scan, &ino, &inode); if (retval) { com_err(argv[0], retval, _("while doing inode scan")); exit(1); } } ext2fs_close(fs); print_resource_track(&global_rtrack); return exit_value; }