ipv4: fix redirect handling
[linux-2.6.git] / net / phonet / pn_netlink.c
index 58b3b1f..d61f676 100644 (file)
@@ -264,10 +264,11 @@ static int route_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
        struct net *net = sock_net(skb->sk);
        u8 addr, addr_idx = 0, addr_start_idx = cb->args[0];
 
+       rcu_read_lock();
        for (addr = 0; addr < 64; addr++) {
                struct net_device *dev;
 
-               dev = phonet_route_get(net, addr << 2);
+               dev = phonet_route_get_rcu(net, addr << 2);
                if (!dev)
                        continue;
 
@@ -279,6 +280,7 @@ static int route_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
        }
 
 out:
+       rcu_read_unlock();
        cb->args[0] = addr_idx;
        cb->args[1] = 0;
 
@@ -287,15 +289,16 @@ out:
 
 int __init phonet_netlink_register(void)
 {
-       int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, NULL);
+       int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit,
+                                 NULL, NULL);
        if (err)
                return err;
 
        /* Further __rtnl_register() cannot fail */
-       __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL);
-       __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit);
-       __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL);
-       __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL);
-       __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit);
+       __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL, NULL);
+       __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, NULL);
+       __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL, NULL);
+       __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL, NULL);
+       __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit, NULL);
        return 0;
 }