Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 8bacd36c2a21109f88c6a6764759e290 > files > 4

NetworkManager-0.6.4-8.el5.src.rpm

diff -up NetworkManager-0.6.4/src/NetworkManagerPolicy.c.change-check-race NetworkManager-0.6.4/src/NetworkManagerPolicy.c
--- NetworkManager-0.6.4/src/NetworkManagerPolicy.c.change-check-race	2008-01-09 15:30:11.000000000 -0500
+++ NetworkManager-0.6.4/src/NetworkManagerPolicy.c	2008-01-09 15:33:23.000000000 -0500
@@ -268,6 +268,8 @@ static NMDevice * nm_policy_auto_get_bes
 }
 
 
+static GStaticMutex dcc_mutex = G_STATIC_MUTEX_INIT;
+
 /*
  * nm_policy_device_change_check
  *
@@ -289,7 +291,9 @@ nm_policy_device_change_check (NMData *d
 
 	g_return_val_if_fail (data != NULL, FALSE);
 
+	g_static_mutex_lock (&dcc_mutex);
 	data->dev_change_check_idle_id = 0;
+	g_static_mutex_unlock (&dcc_mutex);
 
 	old_dev = nm_get_active_device (data);
 
@@ -298,11 +302,19 @@ nm_policy_device_change_check (NMData *d
 
 	if (old_dev)
 	{
+		gboolean has_link = TRUE;
 		guint32 caps = nm_device_get_capabilities (old_dev);
 
+		/* Ensure ethernet devices have a link before starting activation,
+		 * partially works around Fedora #194124.
+		 */
+		if (nm_device_is_802_3_ethernet (old_dev))
+			has_link = nm_device_has_active_link (old_dev);
+
 		/* Don't interrupt a currently activating device. */
 		if (   nm_device_is_activating (old_dev)
-		    && !nm_device_can_interrupt_activation (old_dev))
+		    && !nm_device_can_interrupt_activation (old_dev)
+		    && has_link)
 		{
 			nm_info ("Old device '%s' activating, won't change.", nm_device_get_iface (old_dev));
 			goto out;
@@ -311,13 +323,10 @@ nm_policy_device_change_check (NMData *d
 		/* Don't interrupt semi-supported devices either.  If the user chose one, they must
 		 * explicitly choose to move to another device, we're not going to move for them.
 		 */
-		if ((nm_device_is_802_3_ethernet (old_dev) && !(caps & NM_DEVICE_CAP_CARRIER_DETECT))
-			|| (nm_device_is_802_11_wireless (old_dev) && !(caps & NM_DEVICE_CAP_WIRELESS_SCAN)))
-		{
-			nm_info ("Old device '%s' was semi-supported and user chosen, won't change unless told to.",
-				nm_device_get_iface (old_dev));
+		if ((nm_device_is_802_3_ethernet (old_dev) && !(caps & NM_DEVICE_CAP_CARRIER_DETECT)))
+			goto out;
+		if (nm_device_is_802_11_wireless (old_dev) && !(caps & NM_DEVICE_CAP_WIRELESS_SCAN))
 			goto out;
-		}
 	}
 
 	new_dev = nm_policy_auto_get_best_device (data, &ap);
@@ -449,11 +458,9 @@ out:
  */
 void nm_policy_schedule_device_change_check (NMData *data)
 {
-	static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
-
 	g_return_if_fail (data != NULL);
 
-	g_static_mutex_lock (&mutex);
+	g_static_mutex_lock (&dcc_mutex);
 
 	if (data->dev_change_check_idle_id == 0)
 	{
@@ -463,8 +470,7 @@ void nm_policy_schedule_device_change_ch
 		data->dev_change_check_idle_id = g_source_attach (source, data->main_context);
 		g_source_unref (source);
 	}
-
-	g_static_mutex_unlock (&mutex);
+	g_static_mutex_unlock (&dcc_mutex);
 }