]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
[IPV6]: Track device renames in snmp6.
authorStephen Hemminger <shemminger@linux-foundation.org>
Tue, 22 May 2007 22:39:52 +0000 (00:39 +0200)
committerAdrian Bunk <bunk@stusta.de>
Tue, 22 May 2007 22:39:52 +0000 (00:39 +0200)
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>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
net/ipv6/addrconf.c
net/ipv6/proc.c

index eef33b83a406b60a658bd4b8c78bf30047299a20..7d0e86d53953e8967ae6ef4f5ddfd1ef0d440175 100644 (file)
@@ -2262,8 +2262,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
                break;
 
        case NETDEV_CHANGENAME:
-#ifdef CONFIG_SYSCTL
                if (idev) {
+                       snmp6_unregister_dev(idev);
+#ifdef CONFIG_SYSCTL
                        addrconf_sysctl_unregister(&idev->cnf);
                        neigh_sysctl_unregister(idev->nd_parms);
                        neigh_sysctl_register(dev, idev->nd_parms,
@@ -2271,8 +2272,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
                                              &ndisc_ifinfo_sysctl_change,
                                              NULL);
                        addrconf_sysctl_register(idev, &idev->cnf);
-               }
 #endif
+                       snmp6_register_dev(idev);
+               }
                break;
        };
 
index 4238b1ed886012a331b1c5dd16ddffa1ea2eaaae..4111a211258b34d721771d241b2f3f2f9064e21e 100644 (file)
@@ -226,6 +226,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev)
                return -EINVAL;
        remove_proc_entry(idev->stats.proc_dir_entry->name,
                          proc_net_devsnmp6);
+       idev->stats.proc_dir_entry = NULL;
        return 0;
 }