aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@linux-foundation.org>2007-04-29 00:16:39 -0400
committerDavid S. Miller <davem@davemloft.net>2007-04-29 00:16:39 -0400
commit5632c5152aa621885d87ea0b8fdd5a6bb9f69c6f (patch)
tree1c01a7ddf8996e4a43f2231d1a3bd15015ff5a8c
parentaad97f38b71dd2ecd730b3a3dce8264d13fbcd56 (diff)
[IPV6]: Track device renames in snmp6.
When network device's are renamed, the IPV6 snmp6 code gets confused. It doesn't track name changes so it will OOPS when network device's are removed. The fix is trivial, just unregister/re-register in notify handler. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv6/addrconf.c6
-rw-r--r--net/ipv6/proc.c1
2 files changed, 5 insertions, 2 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index e04e49373505..3452433cbc96 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -2359,8 +2359,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
2359 break; 2359 break;
2360 2360
2361 case NETDEV_CHANGENAME: 2361 case NETDEV_CHANGENAME:
2362#ifdef CONFIG_SYSCTL
2363 if (idev) { 2362 if (idev) {
2363 snmp6_unregister_dev(idev);
2364#ifdef CONFIG_SYSCTL
2364 addrconf_sysctl_unregister(&idev->cnf); 2365 addrconf_sysctl_unregister(&idev->cnf);
2365 neigh_sysctl_unregister(idev->nd_parms); 2366 neigh_sysctl_unregister(idev->nd_parms);
2366 neigh_sysctl_register(dev, idev->nd_parms, 2367 neigh_sysctl_register(dev, idev->nd_parms,
@@ -2368,8 +2369,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
2368 &ndisc_ifinfo_sysctl_change, 2369 &ndisc_ifinfo_sysctl_change,
2369 NULL); 2370 NULL);
2370 addrconf_sysctl_register(idev, &idev->cnf); 2371 addrconf_sysctl_register(idev, &idev->cnf);
2371 }
2372#endif 2372#endif
2373 snmp6_register_dev(idev);
2374 }
2373 break; 2375 break;
2374 } 2376 }
2375 2377
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
index acb306a5dd56..920dc9cf6a84 100644
--- a/net/ipv6/proc.c
+++ b/net/ipv6/proc.c
@@ -223,6 +223,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev)
223 return -EINVAL; 223 return -EINVAL;
224 remove_proc_entry(idev->stats.proc_dir_entry->name, 224 remove_proc_entry(idev->stats.proc_dir_entry->name,
225 proc_net_devsnmp6); 225 proc_net_devsnmp6);
226 idev->stats.proc_dir_entry = NULL;
226 return 0; 227 return 0;
227} 228}
228 229