summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2021-05-11 14:44:20 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2021-05-14 18:19:38 +0200
commit3c4450aa4da19e5057b9ca8b15f8f196ca02c7cb (patch)
treea398a77c4e3955a8a5fe257b703abccc4e700221
parent5dc6d73243572bb36dc0a3049a770d7004a1faf7 (diff)
downloadNetworkManager-3c4450aa4da19e5057b9ca8b15f8f196ca02c7cb.tar.gz
core: don't reset assume state too earlybg/assume
If the device is still unmanaged by platform-init (which means that udev didn't emit the event for the interface) when the device gets realized, we currently clear the assume state. Later, when the device becomes managed, NM is not able to properly assume the device using the UUID. This situation arises, for example, when NM already configured the device in initrd; after NM is restarted in the real root, udev events can be delayed causing this race condition. Among all unamanaged flags, platform-init is the only one that can be delayed externally. We should not clear the assume state if the device has only platform-init in the unmanaged flags.
-rw-r--r--src/core/devices/nm-device.c2
-rw-r--r--src/core/nm-manager.c10
2 files changed, 9 insertions, 3 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index 42c0d067f6..14a47a013c 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -5385,11 +5385,11 @@ device_link_changed(NMDevice *self)
/* Ensure the assume check is queued before any queued state changes
* from the transition to UNAVAILABLE.
*/
- nm_device_queue_recheck_assume(self);
reason = NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED;
}
}
+ nm_device_queue_recheck_assume(self);
nm_device_set_unmanaged_by_flags(self, NM_UNMANAGED_PLATFORM_INIT, FALSE, reason);
}
diff --git a/src/core/nm-manager.c b/src/core/nm-manager.c
index 75a0a076e5..8024513959 100644
--- a/src/core/nm-manager.c
+++ b/src/core/nm-manager.c
@@ -2839,7 +2839,10 @@ recheck_assume_connection(NMManager *self, NMDevice *device)
g_return_val_if_fail(NM_IS_DEVICE(device), FALSE);
if (!nm_device_get_managed(device, FALSE)) {
- nm_device_assume_state_reset(device);
+ /* If the device is only unmanaged by NM_UNMANAGED_PLATFORM_INIT,
+ * don't reset the state now but wait until it becomes managed. */
+ if (nm_device_get_unmanaged_flags(device, NM_UNMANAGED_ALL) != NM_UNMANAGED_PLATFORM_INIT)
+ nm_device_assume_state_reset(device);
_LOG2D(LOGD_DEVICE, device, "assume: don't assume because %s", "not managed");
return FALSE;
}
@@ -3161,7 +3164,10 @@ _device_realize_finish(NMManager *self, NMDevice *device, const NMPlatformLink *
nm_device_realize_finish(device, plink);
if (!nm_device_get_managed(device, FALSE)) {
- nm_device_assume_state_reset(device);
+ /* If the device is only unmanaged by NM_UNMANAGED_PLATFORM_INIT,
+ * don't reset the state now but wait until it becomes managed. */
+ if (nm_device_get_unmanaged_flags(device, NM_UNMANAGED_ALL) != NM_UNMANAGED_PLATFORM_INIT)
+ nm_device_assume_state_reset(device);
return;
}