[PATCH RFC net-next] net: Allow name change of IFF_UP interfaces
From: Vitaly Kuznetsov
Date: Wed Aug 09 2017 - 06:42:13 EST
Recent 'transparenf VF' changes to netvsc driver made VF interfaces
register as netvsc interface slaves upon appearance. This led to udev
not being able to rename the interface according to the 'predictable
interface names' scheme:
kernel: mlx4_core 0002:00:02.0 eth2: joined to eth1
kernel: hv_netvsc 33b7a6f9-6736-451f-8fce-b382eaa50bee eth1: VF
registering: eth2
kernel: mlx4_en: eth2: Link Up
kernel: hv_netvsc 33b7a6f9-6736-451f-8fce-b382eaa50bee eth1: Data path
switched to VF: eth2
systemd-udevd[1785]: Error changing net interface name 'eth2' to
'enP2p0s2': Device or resource busy
systemd-udevd[1785]: could not rename interface '5' from 'eth2' to
'enP2p0s2': Device or resource busy
What happens is: __netvsc_vf_setup() does dev_open() for the VF device and
the consecutive dev_change_name() fails with -EBUSY because of the
(dev->flags & IFF_UP) check. The history of this code predates git so I
wasn't able to figure out when and why the check was added, everything
seems to work fine without it. dev_change_name() has only two call sites,
both hold rtnl_lock.
Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>
---
RFC: I'm probably miossing something obvious and the check can't be just
dropped. Stephen suggested a different solution to the isuue:
https://www.spinics.net/lists/netdev/msg448243.html but it has its own
drawbacks.
---
net/core/dev.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 1d75499add72..c608e233a78a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1186,8 +1186,6 @@ int dev_change_name(struct net_device *dev, const char *newname)
BUG_ON(!dev_net(dev));
net = dev_net(dev);
- if (dev->flags & IFF_UP)
- return -EBUSY;
write_seqcount_begin(&devnet_rename_seq);
--
2.13.4