Patch "net: vrf: Make add_fib_rules per network namespace flag" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
net: vrf: Make add_fib_rules per network namespace flag
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-vrf-make-add_fib_rules-per-network-namespace-flag.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jun 29 18:57:46 CEST 2017
From: David Ahern <[email protected]>
Date: Thu, 8 Jun 2017 11:31:11 -0600
Subject: net: vrf: Make add_fib_rules per network namespace flag
From: David Ahern <[email protected]>
[ Upstream commit 097d3c9508dc58286344e4a22b300098cf0c1566 ]
Commit 1aa6c4f6b8cd8 ("net: vrf: Add l3mdev rules on first device create") adds the l3mdev FIB rule the first time a VRF device is created. However, it only creates the rule once and only in the namespace the first device is created - which may not be init_net. Fix by using the net_generic capability to make the add_fib_rules flag per network namespace.
--- drivers/net/vrf.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-)
drivers/net/vrf.c +32 -4
@@ -36,12 +36,14 @@#include <net/addrconf.h> #include <net/l3mdev.h> #include <net/fib_rules.h> +#include <net/netns/generic.h> #define DRV_NAME "vrf"#define DRV_VERSION "1.0"#define FIB_RULE_PREF 1000/* default preference for FIB rules */ -static bool add_fib_rules = true; + +static unsigned int vrf_net_id;struct net_vrf {struct rtable __rcu *rth;
@@ -1237,6 +1239,8 @@ static int vrf_newlink(struct net *src_n struct nlattr *tb[], struct nlattr *data[]) { struct net_vrf *vrf = netdev_priv(dev); +bool *add_fib_rules; +struct net *net;int err;if (!data || !data[IFLA_VRF_TABLE ])
@@ -1252,13 +1256,15 @@ static int vrf_newlink(struct net *src_nif (err) goto out; -if (add_fib_rules) { + net =dev_net (dev); + add_fib_rules =net_generic (net, vrf_net_id); +if (*add_fib_rules) { err =vrf_add_fib_rules (dev);if (err) {unregister_netdevice (dev); goto out; } - add_fib_rules = false; + *add_fib_rules = false; } out:
@@ -1341,16 +1347,38 @@ static struct notifier_block vrf_notifie .notifier_call = vrf_device_event, }; +/* Initialize per network namespace state */ +static int __net_init vrf_netns_init (struct net *net) +{ +bool *add_fib_rules =net_generic (net, vrf_net_id); + + *add_fib_rules = true; + +return 0 ; +} + +static struct pernet_operations vrf_net_ops__net_initdata = { + .init = vrf_netns_init, + .id = &vrf_net_id, + .size =sizeof (bool ), +}; +static int __init vrf_init_module (void ) {int rc;register_netdevice_notifier (&vrf_notifier_block); - rc =rtnl_link_register (&vrf_link_ops); + rc =register_pernet_subsys (&vrf_net_ops);if (rc <0 ) goto error; + rc =rtnl_link_register (&vrf_link_ops); +if (rc <0 ) { +unregister_pernet_subsys (&vrf_net_ops); + goto error; + } +return 0 ; error:
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-vrf-make-add_fib_rules-per-network-namespace-flag.patch