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); }