device: fix releasing slaves

Not all masters type have a platform link and so it's wrong to check
for it to decide whether the slave should be really released. Move the
check to master devices that need it (bond, bridge and team).

OVS ports don't need the check because they don't call to platform to
remove a slave.

https://bugzilla.redhat.com/show_bug.cgi?id=1733709
(cherry picked from commit 57e3734b6c)
(cherry picked from commit ec1b5fb019)
(cherry picked from commit f6a90b899a)
(cherry picked from commit af2a126dc0)
(cherry picked from commit f568538904)
This commit is contained in:
Beniamino Galvani 2019-07-31 11:40:35 +02:00
parent 08f5f630be
commit 426ac8329d
4 changed files with 19 additions and 5 deletions

View file

@ -436,6 +436,12 @@ release_slave (NMDevice *device,
NMDeviceBond *self = NM_DEVICE_BOND (device);
gboolean success, no_firmware = FALSE;
gs_free char *address = NULL;
int ifindex;
ifindex = nm_device_get_ifindex (device);
if ( ifindex <= 0
|| !nm_platform_link_get (nm_device_get_platform (device), ifindex))
configure = FALSE;
if (configure) {
/* When the last slave is released the bond MAC will be set to a random

View file

@ -403,6 +403,12 @@ release_slave (NMDevice *device,
{
NMDeviceBridge *self = NM_DEVICE_BRIDGE (device);
gboolean success;
int ifindex;
ifindex = nm_device_get_ifindex (device);
if ( ifindex <= 0
|| !nm_platform_link_get (nm_device_get_platform (device), ifindex))
configure = FALSE;
if (configure) {
success = nm_platform_link_release (nm_device_get_platform (device),

View file

@ -4580,7 +4580,6 @@ nm_device_master_release_slaves (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMDeviceStateReason reason;
gboolean configure = TRUE;
CList *iter, *safe;
/* Don't release the slaves if this connection doesn't belong to NM. */
@ -4591,13 +4590,10 @@ nm_device_master_release_slaves (NMDevice *self)
if (priv->state == NM_DEVICE_STATE_FAILED)
reason = NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED;
if (!nm_platform_link_get (nm_device_get_platform (self), priv->ifindex))
configure = FALSE;
c_list_for_each_safe (iter, safe, &priv->slaves) {
SlaveInfo *info = c_list_entry (iter, SlaveInfo, lst_slave);
nm_device_master_release_one_slave (self, info->slave, configure, reason);
nm_device_master_release_one_slave (self, info->slave, TRUE, reason);
}
}

View file

@ -763,6 +763,12 @@ release_slave (NMDevice *device,
NMDeviceTeam *self = NM_DEVICE_TEAM (device);
NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE (self);
gboolean success, no_firmware = FALSE;
int ifindex;
ifindex = nm_device_get_ifindex (device);
if ( ifindex <= 0
|| !nm_platform_link_get (nm_device_get_platform (device), ifindex))
configure = FALSE;
if (configure) {
success = nm_platform_link_release (nm_device_get_platform (device),