From 5f1e36e02612a565d653c2cd76e1f37fb8c9af8e Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 16 Nov 2016 11:46:29 +0100 Subject: [PATCH] manager: fix state transition on resuming from sleep When going to sleep, we unmanage devices setting the unmanaged flags immediately but delaying the state transition (because we do it from another state transition). The signal handler can be executed after the wake and, especially, after we have already re-managed the device, making the device unmanaged again. Detect such situation and force the state to UNMANAGED (which will also clear any pending state change), so that later we manage the device again and it will try to activate any available connection. Fixes: 81ea812362de2757979e2c675774fc445400c59f https://bugzilla.redhat.com/show_bug.cgi?id=1382526 --- src/nm-manager.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index a67b41105d..8414f18802 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -4125,16 +4125,26 @@ do_sleep_wake (NMManager *self, gboolean sleeping_changed) if (waking_from_suspend) { sleep_devices_clear (self); - /* Belatedly take down Wake-on-LAN devices; ideally we wouldn't have to do this - * but for now it's the only way to make sure we re-check their connectivity. - */ for (iter = priv->devices; iter; iter = iter->next) { NMDevice *device = iter->data; if (nm_device_is_software (device)) continue; + + /* Belatedly take down Wake-on-LAN devices; ideally we wouldn't have to do this + * but for now it's the only way to make sure we re-check their connectivity. + */ if (device_is_wake_on_lan (device)) nm_device_set_unmanaged_by_flags (device, NM_UNMANAGED_SLEEPING, TRUE, NM_DEVICE_STATE_REASON_SLEEPING); + + /* Check if the device is unmanaged but the state transition is still pending. + * If so, change state now so that later we re-manage the device forcing a + * re-check of available connections. + */ + if ( !nm_device_get_managed (device, FALSE) + && nm_device_get_state (device) != NM_DEVICE_STATE_UNMANAGED) { + nm_device_state_changed (device, NM_DEVICE_STATE_UNMANAGED, NM_DEVICE_STATE_REASON_SLEEPING); + } } }