diff --git a/0001-systemd-Drop-blocking-inhibitors-before-shutdown.patch b/0001-systemd-Drop-blocking-inhibitors-before-shutdown.patch new file mode 100644 index 0000000..a4227f7 --- /dev/null +++ b/0001-systemd-Drop-blocking-inhibitors-before-shutdown.patch @@ -0,0 +1,109 @@ +From adfe5778edea1273076ed19c51875d5d4a062693 Mon Sep 17 00:00:00 2001 +From: Adrian Vovk +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 + diff --git a/gnome-session.spec b/gnome-session.spec index e4875ca..30ce659 100644 --- a/gnome-session.spec +++ b/gnome-session.spec @@ -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