|
@@ -44,9 +44,10 @@ struct macvlan_port {
|
|
|
struct sk_buff_head bc_queue;
|
|
|
struct work_struct bc_work;
|
|
|
bool passthru;
|
|
|
- int count;
|
|
|
};
|
|
|
|
|
|
+#define MACVLAN_PORT_IS_EMPTY(port) list_empty(&port->vlans)
|
|
|
+
|
|
|
struct macvlan_skb_cb {
|
|
|
const struct macvlan_dev *src;
|
|
|
};
|
|
@@ -628,8 +629,7 @@ static void macvlan_uninit(struct net_device *dev)
|
|
|
|
|
|
free_percpu(vlan->pcpu_stats);
|
|
|
|
|
|
- port->count -= 1;
|
|
|
- if (!port->count)
|
|
|
+ if (MACVLAN_PORT_IS_EMPTY(port))
|
|
|
macvlan_port_destroy(port->dev);
|
|
|
}
|
|
|
|
|
@@ -931,13 +931,12 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
|
|
|
vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
|
|
|
|
|
|
if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
|
|
|
- if (port->count)
|
|
|
+ if (!MACVLAN_PORT_IS_EMPTY(port))
|
|
|
return -EINVAL;
|
|
|
port->passthru = true;
|
|
|
eth_hw_addr_inherit(dev, lowerdev);
|
|
|
}
|
|
|
|
|
|
- port->count += 1;
|
|
|
err = register_netdevice(dev);
|
|
|
if (err < 0)
|
|
|
goto destroy_port;
|
|
@@ -955,8 +954,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
|
|
|
unregister_netdev:
|
|
|
unregister_netdevice(dev);
|
|
|
destroy_port:
|
|
|
- port->count -= 1;
|
|
|
- if (!port->count)
|
|
|
+ if (MACVLAN_PORT_IS_EMPTY(port))
|
|
|
macvlan_port_destroy(lowerdev);
|
|
|
|
|
|
return err;
|