From 9013653e3c86d68263c01c380f65267f0d0c151c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 16 Nov 2018 11:14:16 +0100 Subject: [PATCH] fsck: configure logging before use and define main through macro There's a slight change in logic: before, when rebooting the machine, we could also request quotacheck (by touching /run/systemd/quotacheck) if the fsck helper set FSCK_ERROR_CORRECTED. This is just a race, and doesn't matter much in practice. --- src/fsck/fsck.c | 96 ++++++++++++++++++++++----------------------------------- 1 file changed, 36 insertions(+), 60 deletions(-) diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index 65928ed..54d6d26 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -260,7 +260,7 @@ static int fsck_progress_socket(void) { return TAKE_FD(fd); } -int main(int argc, char *argv[]) { +static int run(int argc, char *argv[]) { _cleanup_close_pair_ int progress_pipe[2] = { -1, -1 }; _cleanup_(sd_device_unrefp) sd_device *dev = NULL; const char *device, *type; @@ -269,15 +269,15 @@ int main(int argc, char *argv[]) { int r, exit_status; pid_t pid; - if (argc > 2) { - log_error("This program expects one or no arguments."); - return EXIT_FAILURE; - } - log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); + if (argc > 2) { + log_error("This program expects one or no arguments."); + return -EINVAL; + } + umask(0022); r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX); @@ -286,30 +286,23 @@ int main(int argc, char *argv[]) { test_files(); - if (!arg_force && arg_skip) { - r = 0; - goto finish; - } + if (!arg_force && arg_skip) + return 0; if (argc > 1) { device = argv[1]; - if (stat(device, &st) < 0) { - r = log_error_errno(errno, "Failed to stat %s: %m", device); - goto finish; - } + if (stat(device, &st) < 0) + return log_error_errno(errno, "Failed to stat %s: %m", device); if (!S_ISBLK(st.st_mode)) { log_error("%s is not a block device.", device); - r = -EINVAL; - goto finish; + return -EINVAL; } r = sd_device_new_from_devnum(&dev, 'b', st.st_rdev); - if (r < 0) { - log_error_errno(r, "Failed to detect device %s: %m", device); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to detect device %s: %m", device); root_directory = false; } else { @@ -317,16 +310,13 @@ int main(int argc, char *argv[]) { /* Find root device */ - if (stat("/", &st) < 0) { - r = log_error_errno(errno, "Failed to stat() the root directory: %m"); - goto finish; - } + if (stat("/", &st) < 0) + return log_error_errno(errno, "Failed to stat() the root directory: %m"); /* Virtual root devices don't need an fsck */ if (major(st.st_dev) == 0) { log_debug("Root directory is virtual or btrfs, skipping check."); - r = 0; - goto finish; + return 0; } /* check if we are already writable */ @@ -335,21 +325,16 @@ int main(int argc, char *argv[]) { if (utimensat(AT_FDCWD, "/", times, 0) == 0) { log_info("Root directory is writable, skipping check."); - r = 0; - goto finish; + return 0; } r = sd_device_new_from_devnum(&dev, 'b', st.st_dev); - if (r < 0) { - log_error_errno(r, "Failed to detect root device: %m"); - goto finish; - } + if (r < 0) + return log_error_errno(r, "Failed to detect root device: %m"); r = sd_device_get_devname(dev, &device); - if (r < 0) { - log_device_error_errno(dev, r, "Failed to detect device node of root directory: %m"); - goto finish; - } + if (r < 0) + return log_device_error_errno(dev, r, "Failed to detect device node of root directory: %m"); root_directory = true; } @@ -360,20 +345,17 @@ int main(int argc, char *argv[]) { log_device_warning_errno(dev, r, "Couldn't detect if fsck.%s may be used, proceeding: %m", type); else if (r == 0) { log_device_info(dev, "fsck.%s doesn't exist, not checking file system.", type); - goto finish; + return 0; } } - if (arg_show_progress) { - if (pipe(progress_pipe) < 0) { - r = log_error_errno(errno, "pipe(): %m"); - goto finish; - } - } + if (arg_show_progress && + pipe(progress_pipe) < 0) + return log_error_errno(errno, "pipe(): %m"); r = safe_fork("(fsck)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_LOG, &pid); if (r < 0) - goto finish; + return r; if (r == 0) { char dash_c[STRLEN("-C") + DECIMAL_STR_MAX(int) + 1]; int progress_socket = -1; @@ -425,35 +407,29 @@ int main(int argc, char *argv[]) { } progress_pipe[1] = safe_close(progress_pipe[1]); - (void) process_progress(progress_pipe[0]); - progress_pipe[0] = -1; + (void) process_progress(TAKE_FD(progress_pipe[0])); exit_status = wait_for_terminate_and_check("fsck", pid, WAIT_LOG_ABNORMAL); - if (exit_status < 0) { - r = exit_status; - goto finish; - } + if (exit_status < 0) + return exit_status; if (exit_status & ~1) { log_error("fsck failed with exit status %i.", exit_status); if ((exit_status & FSCK_SYSTEM_SHOULD_REBOOT) && root_directory) { /* System should be rebooted. */ start_target(SPECIAL_REBOOT_TARGET, "replace-irreversibly"); - r = -EINVAL; - } else if (exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED)) { + return -EINVAL; + } else if (exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED)) /* Some other problem */ start_target(SPECIAL_EMERGENCY_TARGET, "replace"); - r = -EINVAL; - } else { + else log_warning("Ignoring error."); - r = 0; - } - } else - r = 0; + } if (exit_status & FSCK_ERROR_CORRECTED) (void) touch("/run/systemd/quotacheck"); -finish: - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + return exit_status & (FSCK_SYSTEM_SHOULD_REBOOT | FSCK_ERRORS_LEFT_UNCORRECTED); } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); -- 2.7.4