]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/dbus-manager: propagate meaningful dbus errors from EnqueueMarkedJobs
authorFranck Bui <fbui@suse.com>
Wed, 14 Jan 2026 09:40:46 +0000 (10:40 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 16 Jan 2026 13:36:40 +0000 (14:36 +0100)
Previously, when `systemctl reload-or-restart --marked` failed the following
error was shown:

  Failed to start jobs: Failed to enqueue some jobs, see logs for details: Invalid argument

but no details were actually logged.

This change records failure reasons in the journal to help users identify root causes:

  # journalctl -b -e
  [...]
  systemd[1]: Queuing reload/restart jobs for marked units…
  systemd[1]: Operation refused, unit klogd.service may be requested by dependency only (it is configured to refuse manual start/stop).

src/core/dbus-manager.c

index a2fd58898380fc53ff6bfd2a6579beecd5100703..5bd52edc34105ffa537b3c89dd137bef0bcf3a5c 100644 (file)
@@ -2125,6 +2125,8 @@ static int method_enqueue_marked_jobs(sd_bus_message *message, void *userdata, s
         char *k;
         int ret = 0;
         HASHMAP_FOREACH_KEY(u, k, m->units) {
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+
                 /* ignore aliases */
                 if (u->id != k)
                         continue;
@@ -2137,17 +2139,16 @@ static int method_enqueue_marked_jobs(sd_bus_message *message, void *userdata, s
                 else
                         continue;
 
-                r = mac_selinux_unit_access_check(u, message, "start", reterr_error);
+                r = mac_selinux_unit_access_check(u, message, "start", &error);
                 if (r >= 0)
                         r = bus_unit_queue_job_one(message, u,
                                                    JOB_TRY_RESTART, JOB_FAIL, flags,
-                                                   reply, reterr_error);
+                                                   reply, &error);
                 if (ERRNO_IS_NEG_RESOURCE(r))
                         return r;
                 if (r < 0) {
-                        if (ret >= 0)
-                                ret = r;
-                        sd_bus_error_free(reterr_error);
+                        RET_GATHER(ret, r);
+                        log_warning_errno(r, "%s", bus_error_message(&error, r));
                 }
         }