Fix systemd v257+ inhibitors
Fixes: https://issues.redhat.com/browse/RHEL-86871
This commit is contained in:
parent
0436e2f58a
commit
f0d00f4351
109
0001-systemd-Drop-blocking-inhibitors-before-shutdown.patch
Normal file
109
0001-systemd-Drop-blocking-inhibitors-before-shutdown.patch
Normal 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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user