diff options
Diffstat (limited to 'drivers/net/macvlan.c')
-rw-r--r-- | drivers/net/macvlan.c | 12 |
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 | |||
52 | struct macvlan_skb_cb { | 51 | struct 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, | |||
1043 | unregister_netdev: | 1044 | unregister_netdev: |
1044 | unregister_netdevice(dev); | 1045 | unregister_netdevice(dev); |
1045 | destroy_port: | 1046 | destroy_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; |