diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/dev.c | 16 | ||||
| -rw-r--r-- | net/core/failover.c | 6 |
2 files changed, 18 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index fdcff29df915..f409406254dd 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1184,7 +1184,21 @@ int dev_change_name(struct net_device *dev, const char *newname) | |||
| 1184 | BUG_ON(!dev_net(dev)); | 1184 | BUG_ON(!dev_net(dev)); |
| 1185 | 1185 | ||
| 1186 | net = dev_net(dev); | 1186 | net = dev_net(dev); |
| 1187 | if (dev->flags & IFF_UP) | 1187 | |
| 1188 | /* Some auto-enslaved devices e.g. failover slaves are | ||
| 1189 | * special, as userspace might rename the device after | ||
| 1190 | * the interface had been brought up and running since | ||
| 1191 | * the point kernel initiated auto-enslavement. Allow | ||
| 1192 | * live name change even when these slave devices are | ||
| 1193 | * up and running. | ||
| 1194 | * | ||
| 1195 | * Typically, users of these auto-enslaving devices | ||
| 1196 | * don't actually care about slave name change, as | ||
| 1197 | * they are supposed to operate on master interface | ||
| 1198 | * directly. | ||
| 1199 | */ | ||
| 1200 | if (dev->flags & IFF_UP && | ||
| 1201 | likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK))) | ||
| 1188 | return -EBUSY; | 1202 | return -EBUSY; |
| 1189 | 1203 | ||
| 1190 | write_seqcount_begin(&devnet_rename_seq); | 1204 | write_seqcount_begin(&devnet_rename_seq); |
diff --git a/net/core/failover.c b/net/core/failover.c index 4a92a98ccce9..b5cd3c727285 100644 --- a/net/core/failover.c +++ b/net/core/failover.c | |||
| @@ -80,14 +80,14 @@ static int failover_slave_register(struct net_device *slave_dev) | |||
| 80 | goto err_upper_link; | 80 | goto err_upper_link; |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | slave_dev->priv_flags |= IFF_FAILOVER_SLAVE; | 83 | slave_dev->priv_flags |= (IFF_FAILOVER_SLAVE | IFF_LIVE_RENAME_OK); |
| 84 | 84 | ||
| 85 | if (fops && fops->slave_register && | 85 | if (fops && fops->slave_register && |
| 86 | !fops->slave_register(slave_dev, failover_dev)) | 86 | !fops->slave_register(slave_dev, failover_dev)) |
| 87 | return NOTIFY_OK; | 87 | return NOTIFY_OK; |
| 88 | 88 | ||
| 89 | netdev_upper_dev_unlink(slave_dev, failover_dev); | 89 | netdev_upper_dev_unlink(slave_dev, failover_dev); |
| 90 | slave_dev->priv_flags &= ~IFF_FAILOVER_SLAVE; | 90 | slave_dev->priv_flags &= ~(IFF_FAILOVER_SLAVE | IFF_LIVE_RENAME_OK); |
| 91 | err_upper_link: | 91 | err_upper_link: |
| 92 | netdev_rx_handler_unregister(slave_dev); | 92 | netdev_rx_handler_unregister(slave_dev); |
| 93 | done: | 93 | done: |
| @@ -121,7 +121,7 @@ int failover_slave_unregister(struct net_device *slave_dev) | |||
| 121 | 121 | ||
| 122 | netdev_rx_handler_unregister(slave_dev); | 122 | netdev_rx_handler_unregister(slave_dev); |
| 123 | netdev_upper_dev_unlink(slave_dev, failover_dev); | 123 | netdev_upper_dev_unlink(slave_dev, failover_dev); |
| 124 | slave_dev->priv_flags &= ~IFF_FAILOVER_SLAVE; | 124 | slave_dev->priv_flags &= ~(IFF_FAILOVER_SLAVE | IFF_LIVE_RENAME_OK); |
| 125 | 125 | ||
| 126 | if (fops && fops->slave_unregister && | 126 | if (fops && fops->slave_unregister && |
| 127 | !fops->slave_unregister(slave_dev, failover_dev)) | 127 | !fops->slave_unregister(slave_dev, failover_dev)) |
