On Thu, Sep 28, 2017 at 03:44:38PM +0200, Guillaume Nault wrote: > The l2tp_eth module crashes if its netlink callbacks are run when the > pernet data aren't initialised. > > We should normally register_pernet_device() before the genl callbacks. > However, the pernet data only maintain a list of l2tpeth interfaces, > and this list is never used. So let's just drop pernet handling > instead. > > Fixes: d9e31d17ceba ("l2tp: Add L2TP ethernet pseudowire support") > Signed-off-by: Guillaume Nault <g.na...@alphalink.fr>
Whoops. I think this was intended to clear up the devices in the net namespace, but since l2tp_core.c already deletes tunnels on namespace exit I don't think it's necessary for l2tp_eth.c to do anything more. > --- > net/l2tp/l2tp_eth.c | 51 ++------------------------------------------------- > 1 file changed, 2 insertions(+), 49 deletions(-) > > diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c > index 87da9ef61860..014a7bc2a872 100644 > --- a/net/l2tp/l2tp_eth.c > +++ b/net/l2tp/l2tp_eth.c > @@ -44,7 +44,6 @@ struct l2tp_eth { > struct net_device *dev; > struct sock *tunnel_sock; > struct l2tp_session *session; > - struct list_head list; > atomic_long_t tx_bytes; > atomic_long_t tx_packets; > atomic_long_t tx_dropped; > @@ -58,17 +57,6 @@ struct l2tp_eth_sess { > struct net_device *dev; > }; > > -/* per-net private data for this module */ > -static unsigned int l2tp_eth_net_id; > -struct l2tp_eth_net { > - struct list_head l2tp_eth_dev_list; > - spinlock_t l2tp_eth_lock; > -}; > - > -static inline struct l2tp_eth_net *l2tp_eth_pernet(struct net *net) > -{ > - return net_generic(net, l2tp_eth_net_id); > -} > > static int l2tp_eth_dev_init(struct net_device *dev) > { > @@ -84,12 +72,6 @@ static int l2tp_eth_dev_init(struct net_device *dev) > > static void l2tp_eth_dev_uninit(struct net_device *dev) > { > - struct l2tp_eth *priv = netdev_priv(dev); > - struct l2tp_eth_net *pn = l2tp_eth_pernet(dev_net(dev)); > - > - spin_lock(&pn->l2tp_eth_lock); > - list_del_init(&priv->list); > - spin_unlock(&pn->l2tp_eth_lock); > dev_put(dev); > } > > @@ -273,7 +255,6 @@ static int l2tp_eth_create(struct net *net, struct > l2tp_tunnel *tunnel, > struct l2tp_eth *priv; > struct l2tp_eth_sess *spriv; > int rc; > - struct l2tp_eth_net *pn; > > if (cfg->ifname) { > strlcpy(name, cfg->ifname, IFNAMSIZ); > @@ -305,7 +286,6 @@ static int l2tp_eth_create(struct net *net, struct > l2tp_tunnel *tunnel, > priv = netdev_priv(dev); > priv->dev = dev; > priv->session = session; > - INIT_LIST_HEAD(&priv->list); > > priv->tunnel_sock = tunnel->sock; > session->recv_skb = l2tp_eth_dev_recv; > @@ -326,10 +306,6 @@ static int l2tp_eth_create(struct net *net, struct > l2tp_tunnel *tunnel, > strlcpy(session->ifname, dev->name, IFNAMSIZ); > > dev_hold(dev); > - pn = l2tp_eth_pernet(dev_net(dev)); > - spin_lock(&pn->l2tp_eth_lock); > - list_add(&priv->list, &pn->l2tp_eth_dev_list); > - spin_unlock(&pn->l2tp_eth_lock); > > return 0; > > @@ -342,22 +318,6 @@ static int l2tp_eth_create(struct net *net, struct > l2tp_tunnel *tunnel, > return rc; > } > > -static __net_init int l2tp_eth_init_net(struct net *net) > -{ > - struct l2tp_eth_net *pn = net_generic(net, l2tp_eth_net_id); > - > - INIT_LIST_HEAD(&pn->l2tp_eth_dev_list); > - spin_lock_init(&pn->l2tp_eth_lock); > - > - return 0; > -} > - > -static struct pernet_operations l2tp_eth_net_ops = { > - .init = l2tp_eth_init_net, > - .id = &l2tp_eth_net_id, > - .size = sizeof(struct l2tp_eth_net), > -}; > - > > static const struct l2tp_nl_cmd_ops l2tp_eth_nl_cmd_ops = { > .session_create = l2tp_eth_create, > @@ -371,25 +331,18 @@ static int __init l2tp_eth_init(void) > > err = l2tp_nl_register_ops(L2TP_PWTYPE_ETH, &l2tp_eth_nl_cmd_ops); > if (err) > - goto out; > - > - err = register_pernet_device(&l2tp_eth_net_ops); > - if (err) > - goto out_unreg; > + goto err; > > pr_info("L2TP ethernet pseudowire support (L2TPv3)\n"); > > return 0; > > -out_unreg: > - l2tp_nl_unregister_ops(L2TP_PWTYPE_ETH); > -out: > +err: > return err; > } > > static void __exit l2tp_eth_exit(void) > { > - unregister_pernet_device(&l2tp_eth_net_ops); > l2tp_nl_unregister_ops(L2TP_PWTYPE_ETH); > } > > -- > 2.14.2 > -- Tom Parkin Katalix Systems Ltd http://www.katalix.com Catalysts for your Embedded Linux software development
signature.asc
Description: Digital signature