mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-28 08:40:49 +01:00
core: don't reset assume state too early
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.
(cherry picked from commit 3c4450aa4d)
This commit is contained in:
parent
efe8046c1d
commit
18022299bf
2 changed files with 9 additions and 3 deletions
|
|
@ -5414,11 +5414,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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -3160,7 +3163,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue