fsck: dead code removal; also disable progress indicator code

(doesn't look good to me)
This commit is contained in:
Denis Vlasenko 2007-01-19 02:04:09 +00:00
parent e18a293a52
commit f8c11aa65d

View File

@ -26,6 +26,17 @@
* %End-Header% * %End-Header%
*/ */
/* All filesystem specific hooks have been removed.
* If filesystem cannot be determined, we will execute
* "fsck.auto". Currently this also happens if you specify
* UUID=xxx or LABEL=xxx as an object to check.
* Detection code for that is also probably has to be in fsck.auto.
*
* In other words, this is _really_ is just a driver program which
* spawns actual fsck.something for each filesystem to check.
* It doesn't guess filesystem types from on-disk format.
*/
#include "busybox.h" #include "busybox.h"
#define EXIT_OK 0 #define EXIT_OK 0
@ -36,12 +47,8 @@
#define EXIT_USAGE 16 #define EXIT_USAGE 16
#define FSCK_CANCELED 32 /* Aborted with a signal or ^C */ #define FSCK_CANCELED 32 /* Aborted with a signal or ^C */
#ifndef DEFAULT_FSTYPE
#define DEFAULT_FSTYPE "ext2"
#endif
/* /*
* Internal structure for mount tabel entries. * Internal structure for mount table entries.
*/ */
struct fs_info { struct fs_info {
@ -121,8 +128,16 @@ static smallint skip_root;
static smallint notitle; static smallint notitle;
static smallint parallel_root; static smallint parallel_root;
static smallint force_all_parallel; static smallint force_all_parallel;
/* "progress indicator" code is somewhat buggy and ext[23] specific.
* We should be filesystem agnostic. IOW: there should be a well-defined
* API for fsck.something, NOT ad-hoc hacks in generic fsck. */
#define DO_PROGRESS_INDICATOR 0
#if DO_PROGRESS_INDICATOR
static smallint progress; static smallint progress;
static int progress_fd; static int progress_fd;
#endif
static int num_running; static int num_running;
static int max_running; static int max_running;
static char *fstype; static char *fstype;
@ -333,7 +348,6 @@ static void parse_escape(char *word)
static int parse_fstab_line(char *line, struct fs_info **ret_fs) static int parse_fstab_line(char *line, struct fs_info **ret_fs)
{ {
/*char *dev;*/
char *device, *mntpnt, *type, *opts, *freq, *passno, *cp; char *device, *mntpnt, *type, *opts, *freq, *passno, *cp;
struct fs_info *fs; struct fs_info *fs;
@ -362,40 +376,16 @@ static int parse_fstab_line(char *line, struct fs_info **ret_fs)
parse_escape(freq); parse_escape(freq);
parse_escape(passno); parse_escape(passno);
/*
dev = blkid_get_devname(cache, device, NULL);
if (dev)
device = dev;*/
if (strchr(type, ',')) if (strchr(type, ','))
type = NULL; type = NULL;
fs = create_fs_device(device, mntpnt, type ? type : "auto", opts, fs = create_fs_device(device, mntpnt, type ? type : "auto", opts,
freq ? atoi(freq) : -1, freq ? atoi(freq) : -1,
passno ? atoi(passno) : -1); passno ? atoi(passno) : -1);
/*if (dev)
free(dev);*/
*ret_fs = fs; *ret_fs = fs;
return 0; return 0;
} }
#if 0
static void interpret_type(struct fs_info *fs)
{
char *t;
if (strcmp(fs->type, "auto") != 0)
return;
t = blkid_get_tag_value(cache, "TYPE", fs->device);
if (t) {
free(fs->type);
fs->type = t;
}
}
#endif
#define interpret_type(fs) ((void)0)
/* Load the filesystem database from /etc/fstab */ /* Load the filesystem database from /etc/fstab */
static void load_fs_info(const char *filename) static void load_fs_info(const char *filename)
{ {
@ -456,6 +446,7 @@ static struct fs_info *lookup(char *filesys)
return fs; return fs;
} }
#if DO_PROGRESS_INDICATOR
static int progress_active(void) static int progress_active(void)
{ {
struct fsck_instance *inst; struct fsck_instance *inst;
@ -468,6 +459,8 @@ static int progress_active(void)
} }
return 0; return 0;
} }
#endif
/* /*
* Send a signal to all outstanding fsck child processes * Send a signal to all outstanding fsck child processes
@ -497,7 +490,7 @@ static struct fsck_instance *wait_one(int flags)
{ {
int status; int status;
int sig; int sig;
struct fsck_instance *inst, *inst2, *prev; struct fsck_instance *inst, *prev;
pid_t pid; pid_t pid;
if (!instance_list) if (!instance_list)
@ -551,21 +544,23 @@ static struct fsck_instance *wait_one(int flags)
status = WEXITSTATUS(status); status = WEXITSTATUS(status);
else if (WIFSIGNALED(status)) { else if (WIFSIGNALED(status)) {
sig = WTERMSIG(status); sig = WTERMSIG(status);
if (sig == SIGINT) {
status = EXIT_UNCORRECTED; status = EXIT_UNCORRECTED;
} else { if (sig != SIGINT) {
printf("Warning... %s for device %s exited " printf("Warning... %s %s exited "
"with signal %d.\n", "with signal %d\n",
inst->prog, inst->device, sig); inst->prog, inst->device, sig);
status = EXIT_ERROR; status = EXIT_ERROR;
} }
} else { } else {
printf("%s %s: status is %x, should never happen.\n", printf("%s %s: status is %x, should never happen\n",
inst->prog, inst->device, status); inst->prog, inst->device, status);
status = EXIT_ERROR; status = EXIT_ERROR;
} }
inst->exit_status = status; inst->exit_status = status;
#if DO_PROGRESS_INDICATOR
if (progress && (inst->flags & FLAG_PROGRESS) && !progress_active()) { if (progress && (inst->flags & FLAG_PROGRESS) && !progress_active()) {
struct fsck_instance *inst2;
for (inst2 = instance_list; inst2; inst2 = inst2->next) { for (inst2 = instance_list; inst2; inst2 = inst2->next) {
if (inst2->flags & FLAG_DONE) if (inst2->flags & FLAG_DONE)
continue; continue;
@ -588,6 +583,8 @@ static struct fsck_instance *wait_one(int flags)
break; break;
} }
} }
#endif
ret_inst: ret_inst:
if (prev) if (prev)
prev->next = inst->next; prev->next = inst->next;
@ -629,13 +626,13 @@ static int wait_many(int flags)
* Execute a particular fsck program, and link it into the list of * Execute a particular fsck program, and link it into the list of
* child processes we are waiting for. * child processes we are waiting for.
*/ */
static int execute(const char *type, const char *device, const char *mntpt, static void execute(const char *type, const char *device, const char *mntpt,
int interactive) int interactive)
{ {
char *argv[num_args + 4]; /* see count below: */ char *argv[num_args + 4]; /* see count below: */
int argc; int argc;
int i; int i;
struct fsck_instance *inst, *p; struct fsck_instance *inst;
pid_t pid; pid_t pid;
inst = xzalloc(sizeof(*inst)); inst = xzalloc(sizeof(*inst));
@ -645,6 +642,7 @@ static int execute(const char *type, const char *device, const char *mntpt,
argv[i+1] = args[i]; /* num_args */ argv[i+1] = args[i]; /* num_args */
argc = num_args + 1; argc = num_args + 1;
#if DO_PROGRESS_INDICATOR
if (progress && !progress_active()) { if (progress && !progress_active()) {
if (strcmp(type, "ext2") == 0 if (strcmp(type, "ext2") == 0
|| strcmp(type, "ext3") == 0 || strcmp(type, "ext3") == 0
@ -653,6 +651,7 @@ static int execute(const char *type, const char *device, const char *mntpt,
inst->flags |= FLAG_PROGRESS; inst->flags |= FLAG_PROGRESS;
} }
} }
#endif
argv[argc++] = xstrdup(device); /* 1 */ argv[argc++] = xstrdup(device); /* 1 */
argv[argc] = NULL; /* 1 */ argv[argc] = NULL; /* 1 */
@ -673,8 +672,11 @@ static int execute(const char *type, const char *device, const char *mntpt,
bb_perror_msg_and_die("fork"); bb_perror_msg_and_die("fork");
if (pid == 0) { if (pid == 0) {
/* Child */ /* Child */
if (!interactive) if (!interactive) {
/* NB: e2fsck will complain because of this!
* Use "fsck -s" to avoid... */
close(0); close(0);
}
execvp(argv[0], argv); execvp(argv[0], argv);
bb_perror_msg_and_die("%s", argv[0]); bb_perror_msg_and_die("%s", argv[0]);
} }
@ -689,20 +691,11 @@ static int execute(const char *type, const char *device, const char *mntpt,
inst->device = xstrdup(device); inst->device = xstrdup(device);
inst->base_device = base_device(device); inst->base_device = base_device(device);
inst->start_time = time(NULL); inst->start_time = time(NULL);
inst->next = NULL;
/* /* Add to the list of running fsck's.
* Find the end of the list, so we add the instance on at the end. * (was adding to the end, but adding to the front is simpler...) */
*/ inst->next = instance_list;
if (!instance_list) {
instance_list = inst; instance_list = inst;
return 0;
}
p = instance_list;
while (p->next)
p = p->next;
p->next = inst;
return 0;
} }
/* /*
@ -713,33 +706,36 @@ static int execute(const char *type, const char *device, const char *mntpt,
* use that type regardless of what is specified in /etc/fstab. * use that type regardless of what is specified in /etc/fstab.
* *
* If the type isn't specified by the user, then use either the type * If the type isn't specified by the user, then use either the type
* specified in /etc/fstab, or DEFAULT_FSTYPE. * specified in /etc/fstab, or "auto".
*/ */
static void fsck_device(struct fs_info *fs, int interactive) static void fsck_device(struct fs_info *fs, int interactive)
{ {
const char *type; const char *type;
int retval;
interpret_type(fs); if (strcmp(fs->type, "auto") != 0) {
type = DEFAULT_FSTYPE;
if (strcmp(fs->type, "auto") != 0)
type = fs->type; type = fs->type;
else if (fstype if (verbose > 2)
bb_info_msg("using filesystem type '%s' %s",
type, "from fstab");
} else if (fstype
&& (fstype[0] != 'n' || fstype[1] != 'o') /* != "no" */ && (fstype[0] != 'n' || fstype[1] != 'o') /* != "no" */
&& strncmp(fstype, "opts=", 5) != 0 && strncmp(fstype, "opts=", 5) != 0
&& strncmp(fstype, "loop", 4) != 0 && strncmp(fstype, "loop", 4) != 0
&& !strchr(fstype, ',') && !strchr(fstype, ',')
) ) {
type = fstype; type = fstype;
if (verbose > 2)
bb_info_msg("using filesystem type '%s' %s",
type, "from -t");
} else {
type = "auto";
if (verbose > 2)
bb_info_msg("using filesystem type '%s' %s",
type, "(default)");
}
num_running++; num_running++;
retval = execute(type, fs->device, fs->mountpt, interactive); execute(type, fs->device, fs->mountpt, interactive);
if (retval) {
bb_error_msg("error %d while executing fsck.%s for %s",
retval, type, fs->device);
num_running--;
}
} }
/* /*
@ -859,8 +855,6 @@ static int ignore(struct fs_info *fs)
if (fs->passno == 0) if (fs->passno == 0)
return 1; return 1;
interpret_type(fs);
/* /*
* If a specific fstype is specified, and it doesn't match, * If a specific fstype is specified, and it doesn't match,
* ignore it. * ignore it.
@ -871,20 +865,7 @@ static int ignore(struct fs_info *fs)
/* Are we ignoring this type? */ /* Are we ignoring this type? */
if (index_in_str_array(ignored_types, fs->type) >= 0) if (index_in_str_array(ignored_types, fs->type) >= 0)
return 1; return 1;
#if 0
/* Do we really really want to check this fs? */
wanted = index_in_str_array(really_wanted, fs->type) >= 0;
/* See if the <fsck.fs> program is available. */
s = find_fsck(fs->type);
if (s == NULL) {
if (wanted)
bb_error_msg("cannot check %s: fsck.%s not found",
fs->device, fs->type);
return 1;
}
free(s);
#endif
/* We can and want to check this file system type. */ /* We can and want to check this file system type. */
return 0; return 0;
} }
@ -1074,7 +1055,7 @@ static void parse_args(int argc, char *argv[])
int optpos = 0; int optpos = 0;
int opts_for_fsck = 0; int opts_for_fsck = 0;
/* in bss /* in bss, so already zeroed
num_devices = 0; num_devices = 0;
num_args = 0; num_args = 0;
instance_list = NULL; instance_list = NULL;
@ -1083,45 +1064,23 @@ static void parse_args(int argc, char *argv[])
/* TODO: getopt32 */ /* TODO: getopt32 */
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
arg = argv[i]; arg = argv[i];
/* "/dev/blk" or "/path" or "UUID=xxx" or "LABEL=xxx" */ /* "/dev/blk" or "/path" or "UUID=xxx" or "LABEL=xxx" */
if ((arg[0] == '/' && !opts_for_fsck) || strchr(arg, '=')) { if ((arg[0] == '/' && !opts_for_fsck) || strchr(arg, '=')) {
#if 0
char *dev;
dev = blkid_get_devname(cache, arg, NULL);
if (!dev && strchr(arg, '=')) {
/*
* Check to see if we failed because
* /proc/partitions isn't found.
*/
if (access("/proc/partitions", R_OK) < 0) {
bb_perror_msg_and_die(
"cannot open /proc/partitions (is /proc mounted?)");
}
/*
* Check to see if this is because
* we're not running as root
*/
if (geteuid())
bb_error_msg_and_die(
"must be root to scan for matching filesystems: %s", arg);
else
bb_error_msg_and_die(
"cannot find matching filesystem: %s", arg);
}
devices = xrealloc(devices, (num_devices+1) * sizeof(devices[0]));
devices[num_devices++] = dev ? dev : xstrdup(arg);
#endif
// FIXME: must check that arg is a blkdev, or resolve // FIXME: must check that arg is a blkdev, or resolve
// "/path", "UUID=xxx" or "LABEL=xxx" into block device name // "/path", "UUID=xxx" or "LABEL=xxx" into block device name
// ("UUID=xxx"/"LABEL=xxx" can probably shifted to fsck.auto duties)
devices = xrealloc(devices, (num_devices+1) * sizeof(devices[0])); devices = xrealloc(devices, (num_devices+1) * sizeof(devices[0]));
devices[num_devices++] = xstrdup(arg); devices[num_devices++] = xstrdup(arg);
continue; continue;
} }
if (arg[0] != '-' || opts_for_fsck) { if (arg[0] != '-' || opts_for_fsck) {
args = xrealloc(args, (num_args+1) * sizeof(args[0])); args = xrealloc(args, (num_args+1) * sizeof(args[0]));
args[num_args++] = xstrdup(arg); args[num_args++] = xstrdup(arg);
continue; continue;
} }
for (j = 1; arg[j]; j++) { for (j = 1; arg[j]; j++) {
if (opts_for_fsck) { if (opts_for_fsck) {
optpos++; optpos++;
@ -1134,6 +1093,7 @@ static void parse_args(int argc, char *argv[])
case 'A': case 'A':
doall = 1; doall = 1;
break; break;
#if DO_PROGRESS_INDICATOR
case 'C': case 'C':
progress = 1; progress = 1;
if (arg[++j]) { /* -Cn */ if (arg[++j]) { /* -Cn */
@ -1143,6 +1103,7 @@ static void parse_args(int argc, char *argv[])
/* -C n */ /* -C n */
progress_fd = xatoi_u(argv[++i]); progress_fd = xatoi_u(argv[++i]);
goto next_arg; goto next_arg;
#endif
case 'V': case 'V':
verbose++; verbose++;
break; break;
@ -1215,24 +1176,18 @@ static void signal_cancel(int sig ATTRIBUTE_UNUSED)
int fsck_main(int argc, char *argv[]) int fsck_main(int argc, char *argv[])
{ {
int i, status = 0; int i, status = 0;
int interactive = 0; int interactive;
const char *fstab; const char *fstab;
struct fs_info *fs; struct fs_info *fs;
struct sigaction sa; struct sigaction sa;
/*
* Set up signal action
*/
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
sa.sa_handler = signal_cancel; sa.sa_handler = signal_cancel;
sigaction(SIGINT, &sa, 0); sigaction(SIGINT, &sa, 0);
sigaction(SIGTERM, &sa, 0); sigaction(SIGTERM, &sa, 0);
setbuf(stdout, NULL); setbuf(stdout, NULL);
/*setvbuf(stdout, NULL, _IONBF, BUFSIZ);*/
/*setvbuf(stderr, NULL, _IONBF, BUFSIZ);*/
/*blkid_get_cache(&cache, NULL);*/
parse_args(argc, argv); parse_args(argc, argv);
if (!notitle) if (!notitle)
@ -1245,8 +1200,7 @@ int fsck_main(int argc, char *argv[])
fstab = "/etc/fstab"; fstab = "/etc/fstab";
load_fs_info(fstab); load_fs_info(fstab);
if (num_devices == 1 || serialize) interactive = (num_devices == 1) | serialize;
interactive = 1;
/* If -A was specified ("check all"), do that! */ /* If -A was specified ("check all"), do that! */
if (doall) if (doall)
@ -1263,11 +1217,12 @@ int fsck_main(int argc, char *argv[])
kill_all_if_cancel_requested(); kill_all_if_cancel_requested();
break; break;
} }
fs = lookup(devices[i]); fs = lookup(devices[i]);
if (!fs) { if (!fs)
fs = create_fs_device(devices[i], 0, "auto", 0, -1, -1); fs = create_fs_device(devices[i], 0, "auto", 0, -1, -1);
}
fsck_device(fs, interactive); fsck_device(fs, interactive);
if (serialize if (serialize
|| (max_running && (num_running >= max_running)) || (max_running && (num_running >= max_running))
) { ) {
@ -1283,6 +1238,5 @@ int fsck_main(int argc, char *argv[])
} }
} }
status |= wait_many(FLAG_WAIT_ALL); status |= wait_many(FLAG_WAIT_ALL);
/*blkid_put_cache(cache);*/
return status; return status;
} }