diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c index c77e0d6143..d46f280bf4 100644 --- a/src/quotacheck/quotacheck.c +++ b/src/quotacheck/quotacheck.c @@ -12,11 +12,15 @@ #include "proc-cmdline.h" #include "process-util.h" #include "signal-util.h" +#include "static-destruct.h" #include "string-util.h" +static char *arg_path = NULL; static bool arg_skip = false; static bool arg_force = false; +STATIC_DESTRUCTOR_REGISTER(arg_path, freep); + static int parse_proc_cmdline_item(const char *key, const char *value, void *data) { if (streq(key, "quotacheck.mode")) { @@ -31,12 +35,12 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat else if (streq(value, "skip")) arg_skip = true; else - log_warning("Invalid quotacheck.mode= parameter '%s'. Ignoring.", value); + log_warning("Invalid quotacheck.mode= value, ignoring: %s", value); } #if HAVE_SYSV_COMPAT else if (streq(key, "forcequotacheck") && !value) { - log_warning("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line."); + log_warning("Please use 'quotacheck.mode=force' rather than 'forcequotacheck' on the kernel command line. Proceeding anyway."); arg_force = true; } #endif @@ -48,7 +52,7 @@ static void test_files(void) { #if HAVE_SYSV_COMPAT if (access("/forcequotacheck", F_OK) >= 0) { - log_error("Please pass 'quotacheck.mode=force' on the kernel command line rather than creating /forcequotacheck on the root file system."); + log_error("Please pass 'quotacheck.mode=force' on the kernel command line rather than creating /forcequotacheck on the root file system. Proceeding anyway."); arg_force = true; } #endif @@ -56,8 +60,6 @@ static void test_files(void) { static int run(int argc, char *argv[]) { int r; - _cleanup_free_ char *fspath = NULL; - bool quota_check_all = false; log_setup(); @@ -77,26 +79,31 @@ static int run(int argc, char *argv[]) { if (arg_skip) return 0; - if (access("/run/systemd/quotacheck", F_OK) < 0) + /* This is created by systemd-fsck when fsck detected and corrected errors. In normal + * operations quotacheck is not needed. */ + if (access("/run/systemd/quotacheck", F_OK) < 0) { + if (errno != ENOENT) + log_warning_errno(errno, + "Failed to check whether /run/systemd/quotacheck exists, ignoring: %m"); + return 0; + } } if (argc == 2) { - fspath = strdup(argv[1]); - if (!fspath) + arg_path = strdup(argv[1]); + if (!arg_path) return log_oom(); - } else - quota_check_all = true; + } r = safe_fork("(quotacheck)", FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_RLIMIT_NOFILE_SAFE|FORK_WAIT|FORK_LOG, NULL); if (r < 0) return r; - if (r == 0) { const char *cmdline[] = { QUOTACHECK, - quota_check_all ? "-anug" : "-nug", - fspath, + arg_path ? "-nug" : "-anug", /* Check all file systems if path isn't specified */ + arg_path, NULL }; diff --git a/units/quotaon@.service.in b/units/quotaon@.service.in index 136060a9a1..23f365ae2c 100644 --- a/units/quotaon@.service.in +++ b/units/quotaon@.service.in @@ -14,9 +14,9 @@ Documentation=man:quotaon(8) ConditionPathExists={{QUOTAON}} ConditionPathExists=!/etc/initrd-release -After=%i.mount -After=systemd-quotacheck@%i.service DefaultDependencies=no +BindsTo=%i.mount +After=systemd-quotacheck@%i.service %i.mount Before=shutdown.target Conflicts=shutdown.target diff --git a/units/systemd-quotacheck@.service.in b/units/systemd-quotacheck@.service.in index dddce2ee83..f2b8db7abb 100644 --- a/units/systemd-quotacheck@.service.in +++ b/units/systemd-quotacheck@.service.in @@ -15,6 +15,7 @@ ConditionPathExists={{QUOTACHECK}} ConditionPathExists=!/etc/initrd-release DefaultDependencies=no +BindsTo=%i.mount After=%i.mount Before=shutdown.target Conflicts=shutdown.target