aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macvlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/macvlan.c')
-rw-r--r--drivers/net/macvlan.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index ef8a5c20236a..60e4ca01ccbb 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -45,10 +45,9 @@ struct macvlan_port {
45 struct sk_buff_head bc_queue; 45 struct sk_buff_head bc_queue;
46 struct work_struct bc_work; 46 struct work_struct bc_work;
47 bool passthru; 47 bool passthru;
48 int count;
48}; 49};
49 50
50#define MACVLAN_PORT_IS_EMPTY(port) list_empty(&port->vlans)
51
52struct macvlan_skb_cb { 51struct macvlan_skb_cb {
53 const struct macvlan_dev *src; 52 const struct macvlan_dev *src;
54}; 53};
@@ -667,7 +666,8 @@ static void macvlan_uninit(struct net_device *dev)
667 666
668 free_percpu(vlan->pcpu_stats); 667 free_percpu(vlan->pcpu_stats);
669 668
670 if (MACVLAN_PORT_IS_EMPTY(port)) 669 port->count -= 1;
670 if (!port->count)
671 macvlan_port_destroy(port->dev); 671 macvlan_port_destroy(port->dev);
672} 672}
673 673
@@ -1020,12 +1020,13 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
1020 vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); 1020 vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
1021 1021
1022 if (vlan->mode == MACVLAN_MODE_PASSTHRU) { 1022 if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
1023 if (!MACVLAN_PORT_IS_EMPTY(port)) 1023 if (port->count)
1024 return -EINVAL; 1024 return -EINVAL;
1025 port->passthru = true; 1025 port->passthru = true;
1026 eth_hw_addr_inherit(dev, lowerdev); 1026 eth_hw_addr_inherit(dev, lowerdev);
1027 } 1027 }
1028 1028
1029 port->count += 1;
1029 err = register_netdevice(dev); 1030 err = register_netdevice(dev);
1030 if (err < 0) 1031 if (err < 0)
1031 goto destroy_port; 1032 goto destroy_port;
@@ -1043,7 +1044,8 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
1043unregister_netdev: 1044unregister_netdev:
1044 unregister_netdevice(dev); 1045 unregister_netdevice(dev);
1045destroy_port: 1046destroy_port:
1046 if (MACVLAN_PORT_IS_EMPTY(port)) 1047 port->count -= 1;
1048 if (!port->count)
1047 macvlan_port_destroy(lowerdev); 1049 macvlan_port_destroy(lowerdev);
1048 1050
1049 return err; 1051 return err;