net: dont hold rtnl mutex during netlink dump callbacks
[linux-2.6.git] / net / phonet / pn_netlink.c
index fe2e708..438accb 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/kernel.h>
 #include <linux/netlink.h>
 #include <linux/phonet.h>
+#include <linux/slab.h>
 #include <net/sock.h>
 #include <net/phonet/pn_dev.h>
 
@@ -263,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;
 
@@ -278,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;