Fix systemd v257+ inhibitors

Fixes: https://issues.redhat.com/browse/RHEL-86871
This commit is contained in:
Adrian Vovk 2025-04-14 13:34:23 -04:00
parent 0436e2f58a
commit f0d00f4351
No known key found for this signature in database
GPG Key ID: 90A7B546533E15FB
2 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,109 @@
From adfe5778edea1273076ed19c51875d5d4a062693 Mon Sep 17 00:00:00 2001
From: Adrian Vovk <adrianvovk@gmail.com>
Date: Tue, 8 Apr 2025 11:13:57 -0400
Subject: [PATCH] systemd: Drop blocking inhibitors before shutdown
Starting in systemd v257, systemd simplified the logic it uses for
inhibitors. It'll now enforce blocking inhibitors, even for processes
running as the same user that took them. So, gnome-session needs to make
sure it's not holding any blocking inhibitors when it's time to shutdown,
otherwise systemd will refuse to shutdown.
Fixes: https://gitlab.gnome.org/GNOME/gnome-session/-/issues/142
---
gnome-session/gsm-systemd.c | 51 +++++++++++++++++++++++++++----------
1 file changed, 38 insertions(+), 13 deletions(-)
diff --git a/gnome-session/gsm-systemd.c b/gnome-session/gsm-systemd.c
index 9361496e..362491b4 100644
--- a/gnome-session/gsm-systemd.c
+++ b/gnome-session/gsm-systemd.c
@@ -913,6 +913,25 @@ inhibit_done (GObject *source,
}
}
+static void
+gsm_systemd_call_inhibit (GsmSystemd *manager,
+ char *what)
+{
+ g_dbus_proxy_call_with_unix_fd_list (manager->priv->sd_proxy,
+ "Inhibit",
+ g_variant_new ("(ssss)",
+ what,
+ g_get_user_name (),
+ "user session inhibited",
+ "block"),
+ 0,
+ G_MAXINT,
+ NULL,
+ NULL,
+ inhibit_done,
+ manager);
+}
+
static void
gsm_systemd_set_inhibitors (GsmSystem *system,
GsmInhibitorFlag flags)
@@ -936,19 +955,19 @@ gsm_systemd_set_inhibitors (GsmSystem *system,
if (locks != NULL) {
g_debug ("Adding system inhibitor on %s", locks);
- g_dbus_proxy_call_with_unix_fd_list (manager->priv->sd_proxy,
- "Inhibit",
- g_variant_new ("(ssss)",
- locks,
- g_get_user_name (),
- "user session inhibited",
- "block"),
- 0,
- G_MAXINT,
- NULL,
- NULL,
- inhibit_done,
- manager);
+ gsm_systemd_call_inhibit (manager, locks);
+ } else {
+ drop_system_inhibitor (manager);
+ }
+}
+
+static void
+gsm_systemd_reacquire_inhibitors (GsmSystemd *manager)
+{
+ const gchar *locks = manager->priv->inhibit_locks;
+ if (locks != NULL) {
+ g_debug ("Reacquiring system inhibitor on %s", locks);
+ gsm_systemd_call_inhibit (manager, locks);
} else {
drop_system_inhibitor (manager);
}
@@ -976,6 +995,7 @@ reboot_or_poweroff_done (GObject *source,
g_debug ("GsmSystemd: shutdown preparation failed");
systemd->priv->prepare_for_shutdown_expected = FALSE;
g_signal_emit_by_name (systemd, "shutdown-prepared", FALSE);
+ gsm_systemd_reacquire_inhibitors (systemd);
} else {
g_variant_unref (result);
}
@@ -993,6 +1013,10 @@ gsm_systemd_prepare_shutdown (GsmSystem *system,
g_debug ("GsmSystemd: prepare shutdown");
+ /* if we're holding a blocking inhibitor to inhibit shutdown, systemd
+ * will prevent us from shutting down */
+ drop_system_inhibitor (systemd);
+
res = g_dbus_proxy_call_with_unix_fd_list_sync (systemd->priv->sd_proxy,
"Inhibit",
g_variant_new ("(ssss)",
@@ -1010,6 +1034,7 @@ gsm_systemd_prepare_shutdown (GsmSystem *system,
g_warning ("Failed to get delay inhibitor: %s", error->message);
g_error_free (error);
g_signal_emit_by_name (systemd, "shutdown-prepared", FALSE);
+ gsm_systemd_reacquire_inhibitors (systemd);
return;
}
--
2.47.1

View File

@ -24,6 +24,8 @@ Patch: 0001-check-accelerated-gles-Use-eglGetPlatformDisplay-EXT.patch
# For https://fedoraproject.org/w/index.php?title=Changes/HiddenGrubMenu
# This should go upstream once systemd has a generic interface for this
Patch: 0001-Fedora-Set-grub-boot-flags-on-shutdown-reboot.patch
# https://issues.redhat.com/browse/RHEL-86871
Patch: 0001-systemd-Drop-blocking-inhibitors-before-shutdown.patch
Patch: subscription-manager.patch