diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index c423aff5ddd..65859eaa9fc 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -13,6 +13,7 @@ #include "bus-error.h" #include "bus-locator.h" #include "bus-util.h" +#include "bus-wait-for-jobs.h" #include "chase.h" #include "copy.h" #include "creds-util.h" @@ -1588,6 +1589,9 @@ static int reload_system_manager(sd_bus **bus) { static int reload_vconsole(sd_bus **bus) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; + _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL; + const char *object; int r; assert(bus); @@ -1598,10 +1602,22 @@ static int reload_vconsole(sd_bus **bus) { return bus_log_connect_error(r, BUS_TRANSPORT_LOCAL); } - r = bus_call_method(*bus, bus_systemd_mgr, "RestartUnit", &error, NULL, "ss", "systemd-vconsole-setup.service", "replace"); + r = bus_wait_for_jobs_new(*bus, &w); + if (r < 0) + return log_error_errno(r, "Could not watch jobs: %m"); + + r = bus_call_method(*bus, bus_systemd_mgr, "RestartUnit", &error, &reply, + "ss", "systemd-vconsole-setup.service", "replace"); if (r < 0) return log_error_errno(r, "Failed to issue method call: %s", bus_error_message(&error, r)); - log_info("Requested vconsole setup to apply key map configuration."); + + r = sd_bus_message_read(reply, "o", &object); + if (r < 0) + return bus_log_parse_error(r); + + r = bus_wait_for_jobs_one(w, object, false, NULL); + if (r < 0) + return log_error_errno(r, "Failed to wait for systemd-vconsole-setup.service/restart: %m"); return 0; } diff --git a/src/run/run.c b/src/run/run.c index 5124436a051..7dcd37cedd2 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -1483,7 +1483,7 @@ static int start_transient_scope(sd_bus *bus) { r = bus_wait_for_jobs_new(bus, &w); if (r < 0) - return log_oom(); + return log_error_errno(r, "Could not watch jobs: %m"); if (arg_unit) { r = unit_name_mangle_with_suffix(arg_unit, "as unit", @@ -1725,7 +1725,7 @@ static int start_transient_trigger(sd_bus *bus, const char *suffix) { r = bus_wait_for_jobs_new(bus, &w); if (r < 0) - return log_oom(); + return log_error_errno(r, "Could not watch jobs: %m"); if (arg_unit) { switch (unit_name_to_type(arg_unit)) { diff --git a/src/shared/tests.c b/src/shared/tests.c index 8884c8e90e6..ce72be1776b 100644 --- a/src/shared/tests.c +++ b/src/shared/tests.c @@ -213,7 +213,7 @@ static int allocate_scope(void) { r = bus_wait_for_jobs_new(bus, &w); if (r < 0) - return log_oom(); + return log_error_errno(r, "Could not watch jobs: %m"); if (asprintf(&scope, "%s-%" PRIx64 ".scope", program_invocation_short_name, random_u64()) < 0) return log_oom(); diff --git a/units/systemd-firstboot.service b/units/systemd-firstboot.service index 5fee85a2873..984ebf282ad 100644 --- a/units/systemd-firstboot.service +++ b/units/systemd-firstboot.service @@ -15,9 +15,9 @@ ConditionPathIsReadWrite=/etc ConditionFirstBoot=yes DefaultDependencies=no -After=systemd-remount-fs.service -Before=systemd-vconsole-setup.service sysinit.target first-boot-complete.target +After=systemd-remount-fs.service systemd-sysusers.service systemd-tmpfiles-setup.service Wants=first-boot-complete.target +Before=first-boot-complete.target sysinit.target Conflicts=shutdown.target Before=shutdown.target