119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Test to see how quickly we can scan the inode table (not doing 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * anything else) 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <ctype.h> 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <termios.h> 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_ERRNO_H 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_MNTENT_H 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <mntent.h> 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_MALLOC_H 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <malloc.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "et/com_err.h" 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2fsck.h" 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "../version.h" 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int isatty(int); 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char * program_name = "iscan"; 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char * device_name = NULL; 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint yflag = 0; 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint nflag = 0; 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint preen = 0; 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint inode_buffer_blocks = 0; 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint invalid_bitmaps = 0; 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct resource_track global_rtrack; 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void usage(void) 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Usage: %s [-F] [-I inode_buffer_blocks] device\n"), 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project program_name); 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void PRS(int argc, char *argv[]) 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int flush = 0; 548558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall int c; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef MTRACE 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project extern void *mallwatch; 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setbuf(stdout, NULL); 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setbuf(stderr, NULL); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project initialize_ext2_error_table(); 633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc && *argv) 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project program_name = *argv; 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while ((c = getopt (argc, argv, "FI")) != EOF) 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (c) { 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'F': 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flush = 1; 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'I': 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode_buffer_blocks = atoi(optarg); 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage (); 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name = argv[optind]; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flush) { 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd = open(device_name, O_RDONLY, 0); 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd < 0) { 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("open", errno, 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while opening %s for flushing"), device_name); 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(FSCK_ERROR); 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_sync_device(fd, 1))) { 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_sync_device", retval, 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while trying to flush %s"), device_name); 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(FSCK_ERROR); 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main (int argc, char *argv[]) 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval = 0; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int exit_value = FSCK_OK; 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_filsys fs; 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t ino; 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 num_inodes = 0; 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_inode_scan scan; 1043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project init_resource_track(&global_rtrack); 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project PRS(argc, argv); 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_open(device_name, 0, 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 0, 0, unix_io_manager, &fs); 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, _("while trying to open %s"), 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ehandler_init(fs->io); 1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan); 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, _("while opening inode scan")); 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_next_inode(scan, &ino, &inode); 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while getting next inode")); 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ino == 0) 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num_inodes++; 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 1363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_resource_track(NULL, &global_rtrack); 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_("%u inodes scanned.\n"), num_inodes); 1393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 142