aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis V. Lunev <den@openvz.org>2008-04-16 02:02:18 -0700
committerDavid S. Miller <davem@davemloft.net>2008-04-16 02:02:18 -0700
commitf3005d7f4abe03ad41af33b1548602cd086d86a2 (patch)
tree937c5b6ba6089f93fa4f0a11a37ab07a8564e398
parent[NETNS]: Add netns refcnt debug to fib rules. (diff)
downloadlinux-dev-f3005d7f4abe03ad41af33b1548602cd086d86a2.tar.xz
linux-dev-f3005d7f4abe03ad41af33b1548602cd086d86a2.zip
[NETNS]: Add netns refcnt debug for network devices.
dev_set_net is called for - just allocated devices - devices moving from one namespace to another release_net has proper check inside to distinguish these cases. Signed-off-by: Denis V. Lunev <den@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/linux/netdevice.h3
-rw-r--r--net/core/dev.c2
2 files changed, 4 insertions, 1 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 8b17ed40dea2..7c1d4466583b 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -758,7 +758,8 @@ static inline
void dev_net_set(struct net_device *dev, struct net *net)
{
#ifdef CONFIG_NET_NS
- dev->nd_net = net;
+ release_net(dev->nd_net);
+ dev->nd_net = hold_net(net);
#endif
}
diff --git a/net/core/dev.c b/net/core/dev.c
index 7aa01125287e..77530e9a34fc 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4042,6 +4042,8 @@ EXPORT_SYMBOL(alloc_netdev_mq);
*/
void free_netdev(struct net_device *dev)
{
+ release_net(dev_net(dev));
+
/* Compatibility with error handling in drivers */
if (dev->reg_state == NETREG_UNINITIALIZED) {
kfree((char *)dev - dev->padded);