| /* |
| * 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> |
| #include <malloc.h> |
| #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; |
| } |