From 52fc28893f5df384ea3fd86ec4ca4860f1e0ec4b Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Tue, 26 Apr 2016 10:21:51 +0200 Subject: [PATCH] linux-platform: re-read the link type if the name changed For some device types, we use the DEVTYPE from sysfs to determine the link type. However, the way we read from sysfs can race with device renames and we could miss the chance to read DEVTYPE correctly. This doesn't completely fix the sysfs race, but cures the boot-time race with systemd renaming the device while we are initializing the link. We ideally should use GUDev for all sysfs accesses, but that would need some more work for this particular case as currently we need the link type before we have an udev device instance. https://bugzilla.gnome.org/show_bug.cgi?id=764803 Co-Authored-By: Beniamino Galvani (cherry picked from commit dd4d8b24da29abfc786ce0b3030c74559b93d034) --- src/platform/nm-linux-platform.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 254f9c855d..c5045503ab 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -632,7 +632,9 @@ _linktype_get_type (NMPlatform *platform, obj = _lookup_cached_link (cache, ifindex, completed_from_cache, link_cached); /* If we detected the link type before, we stick to that - * decision unless the "kind" changed. + * decision unless the "kind" no "name" changed. If "name" changed, + * it means that their type may not have been determined correctly + * due to race conditions while accessing sysfs. * * This way, we save edditional ethtool/sysctl lookups, but moreover, * we keep the linktype stable and don't change it as long as the link @@ -643,6 +645,7 @@ _linktype_get_type (NMPlatform *platform, * of messing stuff up. */ if ( obj && !NM_IN_SET (obj->link.type, NM_LINK_TYPE_UNKNOWN, NM_LINK_TYPE_NONE) + && !g_strcmp0 (ifname, obj->link.name) && ( !kind || !g_strcmp0 (kind, obj->link.kind))) { nm_assert (obj->link.kind == g_intern_string (obj->link.kind));