openvswitch: properly refcount vport-vxlan module
After614732eaa1
, 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:614732eaa1
("openvswitch: Use regular VXLAN net_device device") Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
fbca9d2d35
Коммит
83e4bf7a74
|
@ -117,7 +117,6 @@ static struct vport_ops ovs_geneve_vport_ops = {
|
||||||
.destroy = ovs_netdev_tunnel_destroy,
|
.destroy = ovs_netdev_tunnel_destroy,
|
||||||
.get_options = geneve_get_options,
|
.get_options = geneve_get_options,
|
||||||
.send = dev_queue_xmit,
|
.send = dev_queue_xmit,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ovs_geneve_tnl_init(void)
|
static int __init ovs_geneve_tnl_init(void)
|
||||||
|
|
|
@ -89,7 +89,6 @@ static struct vport_ops ovs_gre_vport_ops = {
|
||||||
.create = gre_create,
|
.create = gre_create,
|
||||||
.send = dev_queue_xmit,
|
.send = dev_queue_xmit,
|
||||||
.destroy = ovs_netdev_tunnel_destroy,
|
.destroy = ovs_netdev_tunnel_destroy,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ovs_gre_tnl_init(void)
|
static int __init ovs_gre_tnl_init(void)
|
||||||
|
|
|
@ -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)];
|
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;
|
int err = -EEXIST;
|
||||||
struct vport_ops *o;
|
struct vport_ops *o;
|
||||||
|
@ -87,7 +87,7 @@ errout:
|
||||||
ovs_unlock();
|
ovs_unlock();
|
||||||
return err;
|
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)
|
void ovs_vport_ops_unregister(struct vport_ops *ops)
|
||||||
{
|
{
|
||||||
|
|
|
@ -196,7 +196,13 @@ static inline const char *ovs_vport_name(struct vport *vport)
|
||||||
return vport->dev->name;
|
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);
|
void ovs_vport_ops_unregister(struct vport_ops *ops);
|
||||||
|
|
||||||
static inline struct rtable *ovs_tunnel_route_lookup(struct net *net,
|
static inline struct rtable *ovs_tunnel_route_lookup(struct net *net,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче