diff options
Diffstat (limited to 'net/openvswitch/vport-netdev.c')
| -rw-r--r-- | net/openvswitch/vport-netdev.c | 16 | 
1 files changed, 13 insertions, 3 deletions
| diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index 09d93c13cfd6..d21f77d875ba 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c @@ -150,15 +150,25 @@ static void free_port_rcu(struct rcu_head *rcu)  	ovs_vport_free(vport_from_priv(netdev_vport));  } -static void netdev_destroy(struct vport *vport) +void ovs_netdev_detach_dev(struct vport *vport)  {  	struct netdev_vport *netdev_vport = netdev_vport_priv(vport); -	rtnl_lock(); +	ASSERT_RTNL();  	netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH;  	netdev_rx_handler_unregister(netdev_vport->dev); -	netdev_upper_dev_unlink(netdev_vport->dev, get_dpdev(vport->dp)); +	netdev_upper_dev_unlink(netdev_vport->dev, +				netdev_master_upper_dev_get(netdev_vport->dev));  	dev_set_promiscuity(netdev_vport->dev, -1); +} + +static void netdev_destroy(struct vport *vport) +{ +	struct netdev_vport *netdev_vport = netdev_vport_priv(vport); + +	rtnl_lock(); +	if (netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH) +		ovs_netdev_detach_dev(vport);  	rtnl_unlock();  	call_rcu(&netdev_vport->rcu, free_port_rcu); |