Daniel Drake 2f2cea1
From 2e767e2399f5049b8bb5e7d9a02c78bdb962bb26 Mon Sep 17 00:00:00 2001
Daniel Drake 2f2cea1
From: Daniel Drake <dsd@laptop.org>
Daniel Drake 2f2cea1
Date: Mon, 26 Nov 2012 13:09:35 -0600
Daniel Drake 2f2cea1
Subject: [PATCH] core: don't activate uninitialized devices from udev
Daniel Drake 2f2cea1
Daniel Drake 2f2cea1
libgudev's device matching here by default can return devices which
Daniel Drake 2f2cea1
udev has not yet finished initializing.
Daniel Drake 2f2cea1
Daniel Drake 2f2cea1
This was frequently causing boot-time races on the OLPC XO, where
Daniel Drake 2f2cea1
NetworkManager would bring a device up before udev had renamed it,
Daniel Drake 2f2cea1
causing the later rename to fail.
Daniel Drake 2f2cea1
Daniel Drake 2f2cea1
To solve this, filter the enumeration matches to only include
Daniel Drake 2f2cea1
initialized devices. The devices that are present but uninitialized
Daniel Drake 2f2cea1
at this time will arrive a short time later, via a uevent.
Daniel Drake 2f2cea1
Daniel Drake 2f2cea1
https://bugs.freedesktop.org/show_bug.cgi?id=56929
Daniel Drake 2f2cea1
---
Daniel Drake 2f2cea1
 src/nm-udev-manager.c | 14 ++++++++++++--
Daniel Drake 2f2cea1
 1 file changed, 12 insertions(+), 2 deletions(-)
Daniel Drake 2f2cea1
Daniel Drake 2f2cea1
diff --git a/src/nm-udev-manager.c b/src/nm-udev-manager.c
Daniel Drake 2f2cea1
index 792e53b..60f41aa 100644
Daniel Drake 2f2cea1
--- a/src/nm-udev-manager.c
Daniel Drake 2f2cea1
+++ b/src/nm-udev-manager.c
Daniel Drake 2f2cea1
@@ -515,25 +515,35 @@ void
Daniel Drake 2f2cea1
 nm_udev_manager_query_devices (NMUdevManager *self)
Daniel Drake 2f2cea1
 {
Daniel Drake 2f2cea1
 	NMUdevManagerPrivate *priv = NM_UDEV_MANAGER_GET_PRIVATE (self);
Daniel Drake 2f2cea1
+	GUdevEnumerator *enumerator;
Daniel Drake 2f2cea1
 	GList *devices, *iter;
Daniel Drake 2f2cea1
 
Daniel Drake 2f2cea1
 	g_return_if_fail (self != NULL);
Daniel Drake 2f2cea1
 	g_return_if_fail (NM_IS_UDEV_MANAGER (self));
Daniel Drake 2f2cea1
 
Daniel Drake 2f2cea1
-	devices = g_udev_client_query_by_subsystem (priv->client, "net");
Daniel Drake 2f2cea1
+	enumerator = g_udev_enumerator_new (priv->client);
Daniel Drake 2f2cea1
+	g_udev_enumerator_add_match_subsystem (enumerator, "net");
Daniel Drake 2f2cea1
+	g_udev_enumerator_add_match_is_initialized (enumerator);
Daniel Drake 2f2cea1
+
Daniel Drake 2f2cea1
+	devices = g_udev_enumerator_execute (enumerator);
Daniel Drake 2f2cea1
 	for (iter = devices; iter; iter = g_list_next (iter)) {
Daniel Drake 2f2cea1
 		net_add (self, G_UDEV_DEVICE (iter->data));
Daniel Drake 2f2cea1
 		g_object_unref (G_UDEV_DEVICE (iter->data));
Daniel Drake 2f2cea1
 	}
Daniel Drake 2f2cea1
 	g_list_free (devices);
Daniel Drake 2f2cea1
+	g_object_unref (enumerator);
Daniel Drake 2f2cea1
 
Daniel Drake 2f2cea1
 
Daniel Drake 2f2cea1
-	devices = g_udev_client_query_by_subsystem (priv->client, "atm");
Daniel Drake 2f2cea1
+	enumerator = g_udev_enumerator_new (priv->client);
Daniel Drake 2f2cea1
+	g_udev_enumerator_add_match_subsystem (enumerator, "atm");
Daniel Drake 2f2cea1
+	g_udev_enumerator_add_match_is_initialized (enumerator);
Daniel Drake 2f2cea1
+	devices = g_udev_enumerator_execute (enumerator);
Daniel Drake 2f2cea1
 	for (iter = devices; iter; iter = g_list_next (iter)) {
Daniel Drake 2f2cea1
 		adsl_add (self, G_UDEV_DEVICE (iter->data));
Daniel Drake 2f2cea1
 		g_object_unref (G_UDEV_DEVICE (iter->data));
Daniel Drake 2f2cea1
 	}
Daniel Drake 2f2cea1
 	g_list_free (devices);
Daniel Drake 2f2cea1
+	g_object_unref (enumerator);
Daniel Drake 2f2cea1
 }
Daniel Drake 2f2cea1
 
Daniel Drake 2f2cea1
 static void
Daniel Drake 2f2cea1
-- 
Daniel Drake 2f2cea1
1.7.11.7
Daniel Drake 2f2cea1