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

Commit 83e4bf7a authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller
Browse files

openvswitch: properly refcount vport-vxlan module



After 614732ea, no refcount is maintained for the vport-vxlan module.
This allows the userspace to remove such module while vport-vxlan
devices still exist, which leads to later oops.

v1 -> v2:
 - move vport 'owner' initialization in ovs_vport_ops_register()
   and make such function a macro

Fixes: 614732ea ("openvswitch: Use regular VXLAN net_device device")
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fbca9d2d
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -117,7 +117,6 @@ static struct vport_ops ovs_geneve_vport_ops = {
	.destroy	= ovs_netdev_tunnel_destroy,
	.get_options	= geneve_get_options,
	.send		= dev_queue_xmit,
	.owner          = THIS_MODULE,
};

static int __init ovs_geneve_tnl_init(void)
+0 −1
Original line number Diff line number Diff line
@@ -89,7 +89,6 @@ static struct vport_ops ovs_gre_vport_ops = {
	.create		= gre_create,
	.send		= dev_queue_xmit,
	.destroy	= ovs_netdev_tunnel_destroy,
	.owner		= THIS_MODULE,
};

static int __init ovs_gre_tnl_init(void)
+2 −2
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ static struct hlist_head *hash_bucket(const struct net *net, const char *name)
	return &dev_table[hash & (VPORT_HASH_BUCKETS - 1)];
}

int ovs_vport_ops_register(struct vport_ops *ops)
int __ovs_vport_ops_register(struct vport_ops *ops)
{
	int err = -EEXIST;
	struct vport_ops *o;
@@ -87,7 +87,7 @@ int ovs_vport_ops_register(struct vport_ops *ops)
	ovs_unlock();
	return err;
}
EXPORT_SYMBOL_GPL(ovs_vport_ops_register);
EXPORT_SYMBOL_GPL(__ovs_vport_ops_register);

void ovs_vport_ops_unregister(struct vport_ops *ops)
{
+7 −1
Original line number Diff line number Diff line
@@ -196,7 +196,13 @@ static inline const char *ovs_vport_name(struct vport *vport)
	return vport->dev->name;
}

int ovs_vport_ops_register(struct vport_ops *ops);
int __ovs_vport_ops_register(struct vport_ops *ops);
#define ovs_vport_ops_register(ops)		\
	({					\
		(ops)->owner = THIS_MODULE;	\
		__ovs_vport_ops_register(ops);	\
	})

void ovs_vport_ops_unregister(struct vport_ops *ops);

static inline struct rtable *ovs_tunnel_route_lookup(struct net *net,