Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23289a37 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: add a list_head parameter to dellink() method



Adding a list_head parameter to rtnl_link_ops->dellink() methods
allow us to queue devices on a list, in order to dismantle
them all at once.

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9b5e383c
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -555,13 +555,13 @@ static int macvlan_newlink(struct net_device *dev,
	return 0;
}

static void macvlan_dellink(struct net_device *dev)
static void macvlan_dellink(struct net_device *dev, struct list_head *head)
{
	struct macvlan_dev *vlan = netdev_priv(dev);
	struct macvlan_port *port = vlan->port;

	list_del(&vlan->list);
	unregister_netdevice(dev);
	unregister_netdevice_queue(dev, head);

	if (list_empty(&port->vlans))
		macvlan_port_destroy(port->dev);
@@ -601,7 +601,7 @@ static int macvlan_device_event(struct notifier_block *unused,
		break;
	case NETDEV_UNREGISTER:
		list_for_each_entry_safe(vlan, next, &port->vlans, list)
			macvlan_dellink(vlan->dev);
			macvlan_dellink(vlan->dev, NULL);
		break;
	}
	return NOTIFY_DONE;
+1 −1
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ static int veth_newlink(struct net_device *dev,
	return err;
}

static void veth_dellink(struct net_device *dev)
static void veth_dellink(struct net_device *dev, struct list_head *head)
{
	struct veth_priv *priv;
	struct net_device *peer;
+2 −1
Original line number Diff line number Diff line
@@ -61,7 +61,8 @@ struct rtnl_link_ops {
	int			(*changelink)(struct net_device *dev,
					      struct nlattr *tb[],
					      struct nlattr *data[]);
	void			(*dellink)(struct net_device *dev);
	void			(*dellink)(struct net_device *dev,
					   struct list_head *head);

	size_t			(*get_size)(const struct net_device *dev);
	int			(*fill_info)(struct sk_buff *skb,
+4 −4
Original line number Diff line number Diff line
@@ -140,7 +140,7 @@ static void vlan_rcu_free(struct rcu_head *rcu)
	vlan_group_free(container_of(rcu, struct vlan_group, rcu));
}

void unregister_vlan_dev(struct net_device *dev)
void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
{
	struct vlan_dev_info *vlan = vlan_dev_info(dev);
	struct net_device *real_dev = vlan->real_dev;
@@ -164,7 +164,7 @@ void unregister_vlan_dev(struct net_device *dev)

	synchronize_net();

	unregister_netdevice(dev);
	unregister_netdevice_queue(dev, head);

	/* If the group is now empty, kill off the group. */
	if (grp->nr_vlans == 0) {
@@ -535,7 +535,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
			if (grp->nr_vlans == 1)
				i = VLAN_GROUP_ARRAY_LEN;

			unregister_vlan_dev(vlandev);
			unregister_vlan_dev(vlandev, NULL);
		}
		break;
	}
@@ -642,7 +642,7 @@ static int vlan_ioctl_handler(struct net *net, void __user *arg)
		err = -EPERM;
		if (!capable(CAP_NET_ADMIN))
			break;
		unregister_vlan_dev(dev);
		unregister_vlan_dev(dev, NULL);
		err = 0;
		break;

+1 −1
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ void vlan_dev_get_realdev_name(const struct net_device *dev, char *result);
int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id);
void vlan_setup(struct net_device *dev);
int register_vlan_dev(struct net_device *dev);
void unregister_vlan_dev(struct net_device *dev);
void unregister_vlan_dev(struct net_device *dev, struct list_head *head);

static inline u32 vlan_get_ingress_priority(struct net_device *dev,
					    u16 vlan_tci)
Loading