diff options
author | Thomas Haller <thaller@redhat.com> | 2019-08-22 13:21:38 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-08-28 16:27:00 +0200 |
commit | 5b677d5a3bed37ea89c1f89333d0d8a25ff91fda (patch) | |
tree | 1200fb8c914c6d615963f0b275108142bb3b14b0 | |
parent | 29562a9751d97eb56bb5b56f3d36a96345559a5f (diff) | |
download | NetworkManager-5b677d5a3bed37ea89c1f89333d0d8a25ff91fda.tar.gz |
device: move check for master from nm_device_activate_schedule_stage2_device_config() to end of stage1
Note that by now no callers of nm_device_activate_schedule_stage2_device_config()
are left. All previous callers now re-schedule stage1 instead of directly
scheduling stage2.
Note that if stage2 later also gets re-factored to re-enter itself
instead of scheduling stage3 right away, the function will be used
again.
That means, we can move the check for the master where it belongs: as
part (and at the end of) stage1.
Also, slightly simplify the code. The handler master_ready_cb()
no longer directly calls master_ready(). It's enough to always
enter stage1 again.
Also drop master_ready_handled. We don't need to remember that this
condition was satsified. We can just check it always when we reach
the place in activate_stage1_device_prepare().
-rw-r--r-- | src/devices/nm-device.c | 91 |
1 files changed, 39 insertions, 52 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 1fa23fb05c..5e6607d9b1 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -404,7 +404,6 @@ typedef struct _NMDevicePrivate { NMDeviceAutoconnectBlockedFlags autoconnect_blocked_flags:5; bool is_enslaved:1; - bool master_ready_handled:1; bool ipv6ll_handle:1; /* TRUE if NM handles the device's IPv6LL address */ bool ipv6ll_has:1; @@ -6268,22 +6267,18 @@ master_ready (NMDevice *self, NMActiveConnection *master_connection; NMDevice *master; - g_return_if_fail (priv->state == NM_DEVICE_STATE_PREPARE); - g_return_if_fail (!priv->master_ready_handled); - /* Notify a master device that it has a new slave */ - g_return_if_fail (nm_active_connection_get_master_ready (active)); - master_connection = nm_active_connection_get_master (active); + nm_assert (nm_active_connection_get_master_ready (active)); - priv->master_ready_handled = TRUE; - nm_clear_g_signal_handler (active, &priv->master_ready_id); + master_connection = nm_active_connection_get_master (active); master = nm_active_connection_get_device (master_connection); _LOGD (LOGD_DEVICE, "master connection ready; master device %s", nm_device_get_iface (master)); - if (priv->master && priv->master != master) + if ( priv->master + && priv->master != master) nm_device_master_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED); /* If the master didn't change, add-slave only rechecks whether to assume a connection. */ @@ -6297,8 +6292,12 @@ master_ready_cb (NMActiveConnection *active, GParamSpec *pspec, NMDevice *self) { - master_ready (self, active); - nm_device_activate_schedule_stage2_device_config (self); + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + + nm_assert (nm_active_connection_get_master_ready (active)); + + if (priv->state == NM_DEVICE_STATE_PREPARE) + nm_device_activate_schedule_stage1_device_prepare (self); } static void @@ -6460,6 +6459,8 @@ activate_stage1_device_prepare (NMDevice *self) { NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); NMActStageReturn ret = NM_ACT_STAGE_RETURN_SUCCESS; + NMActiveConnection *active; + NMActiveConnection *master; priv->v4_route_table_initialized = FALSE; priv->v6_route_table_initialized = FALSE; @@ -6560,6 +6561,30 @@ activate_stage1_device_prepare (NMDevice *self) } } + active = NM_ACTIVE_CONNECTION (priv->act_request.obj); + master = nm_active_connection_get_master (active); + if (master) { + /* If the master connection is ready for slaves, attach ourselves */ + if (!nm_active_connection_get_master_ready (active)) { + if (nm_active_connection_get_state (master) >= NM_ACTIVE_CONNECTION_STATE_DEACTIVATING) { + _LOGD (LOGD_DEVICE, "master connection is deactivating"); + nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED); + return; + } + if (priv->master_ready_id == 0) { + _LOGD (LOGD_DEVICE, "waiting for master connection to become ready"); + priv->master_ready_id = g_signal_connect (active, + "notify::" NM_ACTIVE_CONNECTION_INT_MASTER_READY, + (GCallback) master_ready_cb, + self); + } + return; + } + } + nm_clear_g_signal_handler (priv->act_request.obj, &priv->master_ready_id); + if (master) + master_ready (self, active); + nm_device_activate_schedule_stage2_device_config (self); } @@ -6951,44 +6976,8 @@ activate_stage2_device_config (NMDevice *self) void nm_device_activate_schedule_stage2_device_config (NMDevice *self) { - NMDevicePrivate *priv; - g_return_if_fail (NM_IS_DEVICE (self)); - priv = NM_DEVICE_GET_PRIVATE (self); - g_return_if_fail (priv->act_request.obj); - - if (!priv->master_ready_handled) { - NMActiveConnection *active = NM_ACTIVE_CONNECTION (priv->act_request.obj); - NMActiveConnection *master; - - master = nm_active_connection_get_master (active); - - if (!master) { - g_warn_if_fail (!priv->master_ready_id); - priv->master_ready_handled = TRUE; - } else { - /* If the master connection is ready for slaves, attach ourselves */ - if (nm_active_connection_get_master_ready (active)) - master_ready (self, active); - else if (nm_active_connection_get_state (master) >= NM_ACTIVE_CONNECTION_STATE_DEACTIVATING) { - _LOGD (LOGD_DEVICE, "master connection is deactivating"); - nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED); - } else { - _LOGD (LOGD_DEVICE, "waiting for master connection to become ready"); - - if (priv->master_ready_id == 0) { - priv->master_ready_id = g_signal_connect (active, - "notify::" NM_ACTIVE_CONNECTION_INT_MASTER_READY, - (GCallback) master_ready_cb, - self); - } - /* Postpone */ - return; - } - } - } - activation_source_schedule (self, activate_stage2_device_config, AF_INET); } @@ -14717,10 +14706,7 @@ _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type) if (priv->act_request.obj) { nm_active_connection_set_default (NM_ACTIVE_CONNECTION (priv->act_request.obj), AF_INET, FALSE); - - priv->master_ready_handled = FALSE; nm_clear_g_signal_handler (priv->act_request.obj, &priv->master_ready_id); - act_request_set (self, NULL); } @@ -16663,14 +16649,15 @@ dispose (GObject *object) _cleanup_generic_pre (self, CLEANUP_TYPE_KEEP); - g_warn_if_fail (c_list_is_empty (&priv->slaves)); - g_assert (priv->master_ready_id == 0); + nm_assert (c_list_is_empty (&priv->slaves)); /* Let the kernel manage IPv6LL again */ set_nm_ipv6ll (self, FALSE); _cleanup_generic_post (self, CLEANUP_TYPE_KEEP); + nm_assert (priv->master_ready_id == 0); + g_hash_table_remove_all (priv->ip6_saved_properties); nm_clear_g_source (&priv->recheck_assume_id); |