diff options
Diffstat (limited to 'net/decnet/dn_dev.c')
-rw-r--r-- | net/decnet/dn_dev.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 0dcaa903e00e..cf26ac74a188 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
@@ -332,14 +332,9 @@ static struct dn_ifaddr *dn_dev_alloc_ifa(void) | |||
332 | return ifa; | 332 | return ifa; |
333 | } | 333 | } |
334 | 334 | ||
335 | static void dn_dev_free_ifa_rcu(struct rcu_head *head) | ||
336 | { | ||
337 | kfree(container_of(head, struct dn_ifaddr, rcu)); | ||
338 | } | ||
339 | |||
340 | static void dn_dev_free_ifa(struct dn_ifaddr *ifa) | 335 | static void dn_dev_free_ifa(struct dn_ifaddr *ifa) |
341 | { | 336 | { |
342 | call_rcu(&ifa->rcu, dn_dev_free_ifa_rcu); | 337 | kfree_rcu(ifa, rcu); |
343 | } | 338 | } |
344 | 339 | ||
345 | static void dn_dev_del_ifa(struct dn_dev *dn_db, struct dn_ifaddr __rcu **ifap, int destroy) | 340 | static void dn_dev_del_ifa(struct dn_dev *dn_db, struct dn_ifaddr __rcu **ifap, int destroy) |
@@ -752,7 +747,8 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | |||
752 | skip_naddr = cb->args[1]; | 747 | skip_naddr = cb->args[1]; |
753 | 748 | ||
754 | idx = 0; | 749 | idx = 0; |
755 | for_each_netdev(&init_net, dev) { | 750 | rcu_read_lock(); |
751 | for_each_netdev_rcu(&init_net, dev) { | ||
756 | if (idx < skip_ndevs) | 752 | if (idx < skip_ndevs) |
757 | goto cont; | 753 | goto cont; |
758 | else if (idx > skip_ndevs) { | 754 | else if (idx > skip_ndevs) { |
@@ -761,11 +757,11 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | |||
761 | skip_naddr = 0; | 757 | skip_naddr = 0; |
762 | } | 758 | } |
763 | 759 | ||
764 | if ((dn_db = rtnl_dereference(dev->dn_ptr)) == NULL) | 760 | if ((dn_db = rcu_dereference(dev->dn_ptr)) == NULL) |
765 | goto cont; | 761 | goto cont; |
766 | 762 | ||
767 | for (ifa = rtnl_dereference(dn_db->ifa_list), dn_idx = 0; ifa; | 763 | for (ifa = rcu_dereference(dn_db->ifa_list), dn_idx = 0; ifa; |
768 | ifa = rtnl_dereference(ifa->ifa_next), dn_idx++) { | 764 | ifa = rcu_dereference(ifa->ifa_next), dn_idx++) { |
769 | if (dn_idx < skip_naddr) | 765 | if (dn_idx < skip_naddr) |
770 | continue; | 766 | continue; |
771 | 767 | ||
@@ -778,6 +774,7 @@ cont: | |||
778 | idx++; | 774 | idx++; |
779 | } | 775 | } |
780 | done: | 776 | done: |
777 | rcu_read_unlock(); | ||
781 | cb->args[0] = idx; | 778 | cb->args[0] = idx; |
782 | cb->args[1] = dn_idx; | 779 | cb->args[1] = dn_idx; |
783 | 780 | ||