mirror of
https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
synced 2025-01-01 14:13:26 +08:00
1b6bf1759a
pass*.c, super.c: Massive changes to avoid using printf and com_err routines. All diagnostic messages are now routed through the fix_problem interface. pass2.c (check_dir_block): Check for duplicate '.' and '..' entries. problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and PR_2_DUP_DOT_DOT. problem.c: Added new problem codes for some of the superblock corruption checks, and for the pass header messages. ("Pass 1: xxxxx") util.c (print_resource_track): Now takes a description argument. super.c, unix.c, e2fsck.c: New files to separate out the operating-specific operations out from e2fsck.c. e2fsck.c now contains the global e2fsck context management routines, and super.c contains the "pass 0" initial validation of the superblock and global block group descriptors. pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate (nearly) all global variables and moved them to the e2fsck context structure. problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT, PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP, PR_0_FIRST_DATA_BLOCK expect.1, expect.2: Updated tests to align with e2fsck problem.c changes.
147 lines
2.7 KiB
C
147 lines
2.7 KiB
C
/*
|
|
* Test to see how quickly we can scan the inode table (not doing
|
|
* anything else)
|
|
*/
|
|
|
|
#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_ERRNO_H
|
|
#include <errno.h>
|
|
#endif
|
|
#ifdef HAVE_MNTENT_H
|
|
#include <mntent.h>
|
|
#endif
|
|
#include <sys/ioctl.h>
|
|
#include <malloc.h>
|
|
|
|
#include "et/com_err.h"
|
|
#include "e2fsck.h"
|
|
#include "../version.h"
|
|
|
|
extern int isatty(int);
|
|
|
|
const char * program_name = "iscan";
|
|
const char * device_name = NULL;
|
|
|
|
int yflag = 0;
|
|
int nflag = 0;
|
|
int preen = 0;
|
|
int inode_buffer_blocks = 0;
|
|
int invalid_bitmaps = 0;
|
|
|
|
struct resource_track global_rtrack;
|
|
|
|
static void usage(NOARGS)
|
|
{
|
|
fprintf(stderr,
|
|
"Usage: %s [-F] [-I inode_buffer_blocks] device\n",
|
|
program_name);
|
|
exit(1);
|
|
}
|
|
|
|
static void PRS(int argc, char *argv[])
|
|
{
|
|
int flush = 0;
|
|
char c;
|
|
#ifdef MTRACE
|
|
extern void *mallwatch;
|
|
#endif
|
|
|
|
setbuf(stdout, NULL);
|
|
setbuf(stderr, NULL);
|
|
initialize_ext2_error_table();
|
|
|
|
if (argc && *argv)
|
|
program_name = *argv;
|
|
while ((c = getopt (argc, argv, "FI")) != EOF)
|
|
switch (c) {
|
|
case 'F':
|
|
#ifdef BLKFLSBUF
|
|
flush = 1;
|
|
#else
|
|
fatal_error ("-F not supported");
|
|
#endif
|
|
break;
|
|
case 'I':
|
|
inode_buffer_blocks = atoi(optarg);
|
|
break;
|
|
default:
|
|
usage ();
|
|
}
|
|
device_name = argv[optind];
|
|
if (flush) {
|
|
#ifdef BLKFLSBUF
|
|
int fd = open(device_name, O_RDONLY, 0);
|
|
|
|
if (fd < 0) {
|
|
com_err("open", errno, "while opening %s for flushing",
|
|
device_name);
|
|
exit(FSCK_ERROR);
|
|
}
|
|
if (ioctl(fd, BLKFLSBUF, 0) < 0) {
|
|
com_err("BLKFLSBUF", errno, "while trying to flush %s",
|
|
device_name);
|
|
exit(FSCK_ERROR);
|
|
}
|
|
close(fd);
|
|
#else
|
|
fatal_error ("BLKFLSBUF not supported");
|
|
#endif /* BLKFLSBUF */
|
|
}
|
|
}
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
errcode_t retval = 0;
|
|
int exit_value = FSCK_OK;
|
|
ext2_filsys fs;
|
|
ino_t ino;
|
|
int num_inodes = 0;
|
|
struct ext2_inode inode;
|
|
ext2_inode_scan scan;
|
|
|
|
init_resource_track(&global_rtrack);
|
|
|
|
PRS(argc, argv);
|
|
|
|
retval = ext2fs_open(device_name, 0,
|
|
0, 0, unix_io_manager, &fs);
|
|
if (retval) {
|
|
com_err(program_name, retval, "while trying to open %s",
|
|
device_name);
|
|
exit(1);
|
|
}
|
|
|
|
ehandler_init(fs->io);
|
|
|
|
retval = ext2fs_open_inode_scan(fs, inode_buffer_blocks, &scan);
|
|
if (retval) {
|
|
com_err(program_name, retval, "while opening inode scan");
|
|
fatal_error(0);
|
|
}
|
|
|
|
while (1) {
|
|
retval = ext2fs_get_next_inode(scan, &ino, &inode);
|
|
if (retval) {
|
|
com_err(program_name, retval,
|
|
"while getting next inode");
|
|
fatal_error(0);
|
|
}
|
|
if (ino == 0)
|
|
break;
|
|
num_inodes++;
|
|
}
|
|
|
|
print_resource_track(NULL, &global_rtrack);
|
|
printf("%d inodes scanned.\n", num_inodes);
|
|
|
|
exit(0);
|
|
}
|