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