diff options
Diffstat (limited to 'drivers/net/veth.c')
| -rw-r--r-- | drivers/net/veth.c | 16 | 
1 files changed, 9 insertions, 7 deletions
| diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 38f0f03a29c8..f5438d0978ca 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -222,7 +222,6 @@ static int veth_dev_init(struct net_device *dev)  static void veth_dev_free(struct net_device *dev)  {  	free_percpu(dev->vstats); -	free_netdev(dev);  }  #ifdef CONFIG_NET_POLL_CONTROLLER @@ -317,7 +316,8 @@ static void veth_setup(struct net_device *dev)  			       NETIF_F_HW_VLAN_STAG_TX |  			       NETIF_F_HW_VLAN_CTAG_RX |  			       NETIF_F_HW_VLAN_STAG_RX); -	dev->destructor = veth_dev_free; +	dev->needs_free_netdev = true; +	dev->priv_destructor = veth_dev_free;  	dev->max_mtu = ETH_MAX_MTU;  	dev->hw_features = VETH_FEATURES; @@ -329,7 +329,8 @@ static void veth_setup(struct net_device *dev)   * netlink interface   */ -static int veth_validate(struct nlattr *tb[], struct nlattr *data[]) +static int veth_validate(struct nlattr *tb[], struct nlattr *data[], +			 struct netlink_ext_ack *extack)  {  	if (tb[IFLA_ADDRESS]) {  		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) @@ -347,7 +348,8 @@ static int veth_validate(struct nlattr *tb[], struct nlattr *data[])  static struct rtnl_link_ops veth_link_ops;  static int veth_newlink(struct net *src_net, struct net_device *dev, -			 struct nlattr *tb[], struct nlattr *data[]) +			struct nlattr *tb[], struct nlattr *data[], +			struct netlink_ext_ack *extack)  {  	int err;  	struct net_device *peer; @@ -373,7 +375,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,  		if (err < 0)  			return err; -		err = veth_validate(peer_tb, NULL); +		err = veth_validate(peer_tb, NULL, extack);  		if (err < 0)  			return err; @@ -383,7 +385,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,  		tbp = tb;  	} -	if (tbp[IFLA_IFNAME]) { +	if (ifmp && tbp[IFLA_IFNAME]) {  		nla_strlcpy(ifname, tbp[IFLA_IFNAME], IFNAMSIZ);  		name_assign_type = NET_NAME_USER;  	} else { @@ -402,7 +404,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,  		return PTR_ERR(peer);  	} -	if (tbp[IFLA_ADDRESS] == NULL) +	if (!ifmp || !tbp[IFLA_ADDRESS])  		eth_hw_addr_random(peer);  	if (ifmp && (dev->ifindex != 0)) | 
