From: Pravin B Shelar Date: Tue, 8 Dec 2015 02:23:19 +0000 (-0800) Subject: datapath: Backport: openvswitch: properly refcount vport-vxlan module X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=f07995ef94c582946e8c28ccbae1b525bfaea7ed datapath: Backport: openvswitch: properly refcount vport-vxlan module Upstream commit: After 614732eaa12d, 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: 614732eaa12d ("openvswitch: Use regular VXLAN net_device device") Signed-off-by: Paolo Abeni Signed-off-by: David S. Miller Upstream: 83e4bf7a74 ("openvswitch: properly refcount vport-vxlan module"). Signed-off-by: Pravin B Shelar Acked-by: Jesse Gross --- diff --git a/datapath/vport-geneve.c b/datapath/vport-geneve.c index 3b5c1ab32..392d7503a 100644 --- a/datapath/vport-geneve.c +++ b/datapath/vport-geneve.c @@ -129,7 +129,6 @@ static struct vport_ops ovs_geneve_vport_ops = { .destroy = ovs_netdev_tunnel_destroy, .get_options = geneve_get_options, .send = geneve_xmit, - .owner = THIS_MODULE, .get_egress_tun_info = geneve_get_egress_tun_info, }; diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index a9ac0d48a..50aaba593 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -97,7 +97,6 @@ static struct vport_ops ovs_gre_vport_ops = { .send = gre_fb_xmit, .get_egress_tun_info = gre_get_egress_tun_info, .destroy = ovs_netdev_tunnel_destroy, - .owner = THIS_MODULE, }; static int __init ovs_gre_tnl_init(void) diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c index e6c00facd..3ce8613ae 100644 --- a/datapath/vport-lisp.c +++ b/datapath/vport-lisp.c @@ -129,7 +129,6 @@ static struct vport_ops ovs_lisp_vport_ops = { .destroy = ovs_netdev_tunnel_destroy, .get_options = lisp_get_options, .send = lisp_xmit, - .owner = THIS_MODULE, .get_egress_tun_info = lisp_get_egress_tun_info, }; diff --git a/datapath/vport-stt.c b/datapath/vport-stt.c index 9e2079a16..b8e0c8839 100644 --- a/datapath/vport-stt.c +++ b/datapath/vport-stt.c @@ -131,7 +131,6 @@ static struct vport_ops ovs_stt_vport_ops = { .destroy = ovs_netdev_tunnel_destroy, .get_options = stt_get_options, .send = ovs_stt_xmit, - .owner = THIS_MODULE, .get_egress_tun_info = stt_get_egress_tun_info, }; diff --git a/datapath/vport.c b/datapath/vport.c index 899119f9f..01702d7cb 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -113,7 +113,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; @@ -129,7 +129,7 @@ errout: 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) { diff --git a/datapath/vport.h b/datapath/vport.h index d82071970..33c3935e9 100644 --- a/datapath/vport.h +++ b/datapath/vport.h @@ -212,7 +212,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,