summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2016-04-26 10:21:51 +0200
committerLubomir Rintel <lkundrak@v3.sk>2016-04-26 12:20:42 +0200
commitdd4d8b24da29abfc786ce0b3030c74559b93d034 (patch)
tree210590281ec40e8e1f5f678a6edd0271c40b2677
parent8c8a577a30acc0b5f1d4765493f6547f275477b0 (diff)
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 <bgalvani@redhat.com>
-rw-r--r--src/platform/nm-linux-platform.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 4164e0c091..118df9918d 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -642,7 +642,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
@@ -653,6 +655,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));