diff options
author | Pavel Emelianov <xemul@openvz.org> | 2007-05-03 18:13:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-05-03 18:13:45 -0400 |
commit | 7562f876cd93800f2f8c89445f2a563590b24e09 (patch) | |
tree | 78a34c011af275efa0d55ba59c3bd49b771dd533 /net/ipv6 | |
parent | 03fba0479600114f32d29eee74ca3eaa364606bf (diff) |
[NET]: Rework dev_base via list_head (v3)
Cleanup of dev_base list use, with the aim to simplify making device
list per-namespace. In almost every occasion, use of dev_base variable
and dev->next pointer could be easily replaced by for_each_netdev
loop. A few most complicated places were converted to using
first_netdev()/next_netdev().
Signed-off-by: Pavel Emelianov <xemul@openvz.org>
Acked-by: Kirill Korotaev <dev@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 28 | ||||
-rw-r--r-- | net/ipv6/anycast.c | 17 | ||||
-rw-r--r-- | net/ipv6/mcast.c | 15 |
3 files changed, 34 insertions, 26 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 3452433cbc96..d02685c6bc69 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -449,7 +449,7 @@ static void addrconf_forward_change(void) | |||
449 | struct inet6_dev *idev; | 449 | struct inet6_dev *idev; |
450 | 450 | ||
451 | read_lock(&dev_base_lock); | 451 | read_lock(&dev_base_lock); |
452 | for (dev=dev_base; dev; dev=dev->next) { | 452 | for_each_netdev(dev) { |
453 | rcu_read_lock(); | 453 | rcu_read_lock(); |
454 | idev = __in6_dev_get(dev); | 454 | idev = __in6_dev_get(dev); |
455 | if (idev) { | 455 | if (idev) { |
@@ -911,7 +911,7 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev, | |||
911 | read_lock(&dev_base_lock); | 911 | read_lock(&dev_base_lock); |
912 | rcu_read_lock(); | 912 | rcu_read_lock(); |
913 | 913 | ||
914 | for (dev = dev_base; dev; dev=dev->next) { | 914 | for_each_netdev(dev) { |
915 | struct inet6_dev *idev; | 915 | struct inet6_dev *idev; |
916 | struct inet6_ifaddr *ifa; | 916 | struct inet6_ifaddr *ifa; |
917 | 917 | ||
@@ -2064,7 +2064,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2064 | return; | 2064 | return; |
2065 | } | 2065 | } |
2066 | 2066 | ||
2067 | for (dev = dev_base; dev != NULL; dev = dev->next) { | 2067 | for_each_netdev(dev) { |
2068 | struct in_device * in_dev = __in_dev_get_rtnl(dev); | 2068 | struct in_device * in_dev = __in_dev_get_rtnl(dev); |
2069 | if (in_dev && (dev->flags & IFF_UP)) { | 2069 | if (in_dev && (dev->flags & IFF_UP)) { |
2070 | struct in_ifaddr * ifa; | 2070 | struct in_ifaddr * ifa; |
@@ -2225,7 +2225,7 @@ static void ip6_tnl_add_linklocal(struct inet6_dev *idev) | |||
2225 | return; | 2225 | return; |
2226 | } | 2226 | } |
2227 | /* then try to inherit it from any device */ | 2227 | /* then try to inherit it from any device */ |
2228 | for (link_dev = dev_base; link_dev; link_dev = link_dev->next) { | 2228 | for_each_netdev(link_dev) { |
2229 | if (!ipv6_inherit_linklocal(idev, link_dev)) | 2229 | if (!ipv6_inherit_linklocal(idev, link_dev)) |
2230 | return; | 2230 | return; |
2231 | } | 2231 | } |
@@ -3257,14 +3257,15 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
3257 | s_idx = cb->args[0]; | 3257 | s_idx = cb->args[0]; |
3258 | s_ip_idx = ip_idx = cb->args[1]; | 3258 | s_ip_idx = ip_idx = cb->args[1]; |
3259 | 3259 | ||
3260 | for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) { | 3260 | idx = 0; |
3261 | for_each_netdev(dev) { | ||
3261 | if (idx < s_idx) | 3262 | if (idx < s_idx) |
3262 | continue; | 3263 | goto cont; |
3263 | if (idx > s_idx) | 3264 | if (idx > s_idx) |
3264 | s_ip_idx = 0; | 3265 | s_ip_idx = 0; |
3265 | ip_idx = 0; | 3266 | ip_idx = 0; |
3266 | if ((idev = in6_dev_get(dev)) == NULL) | 3267 | if ((idev = in6_dev_get(dev)) == NULL) |
3267 | continue; | 3268 | goto cont; |
3268 | read_lock_bh(&idev->lock); | 3269 | read_lock_bh(&idev->lock); |
3269 | switch (type) { | 3270 | switch (type) { |
3270 | case UNICAST_ADDR: | 3271 | case UNICAST_ADDR: |
@@ -3311,6 +3312,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
3311 | } | 3312 | } |
3312 | read_unlock_bh(&idev->lock); | 3313 | read_unlock_bh(&idev->lock); |
3313 | in6_dev_put(idev); | 3314 | in6_dev_put(idev); |
3315 | cont: | ||
3316 | idx++; | ||
3314 | } | 3317 | } |
3315 | done: | 3318 | done: |
3316 | if (err <= 0) { | 3319 | if (err <= 0) { |
@@ -3575,16 +3578,19 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
3575 | struct inet6_dev *idev; | 3578 | struct inet6_dev *idev; |
3576 | 3579 | ||
3577 | read_lock(&dev_base_lock); | 3580 | read_lock(&dev_base_lock); |
3578 | for (dev=dev_base, idx=0; dev; dev = dev->next, idx++) { | 3581 | idx = 0; |
3582 | for_each_netdev(dev) { | ||
3579 | if (idx < s_idx) | 3583 | if (idx < s_idx) |
3580 | continue; | 3584 | goto cont; |
3581 | if ((idev = in6_dev_get(dev)) == NULL) | 3585 | if ((idev = in6_dev_get(dev)) == NULL) |
3582 | continue; | 3586 | goto cont; |
3583 | err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, | 3587 | err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, |
3584 | cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI); | 3588 | cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI); |
3585 | in6_dev_put(idev); | 3589 | in6_dev_put(idev); |
3586 | if (err <= 0) | 3590 | if (err <= 0) |
3587 | break; | 3591 | break; |
3592 | cont: | ||
3593 | idx++; | ||
3588 | } | 3594 | } |
3589 | read_unlock(&dev_base_lock); | 3595 | read_unlock(&dev_base_lock); |
3590 | cb->args[0] = idx; | 3596 | cb->args[0] = idx; |
@@ -4247,7 +4253,7 @@ void __exit addrconf_cleanup(void) | |||
4247 | * clean dev list. | 4253 | * clean dev list. |
4248 | */ | 4254 | */ |
4249 | 4255 | ||
4250 | for (dev=dev_base; dev; dev=dev->next) { | 4256 | for_each_netdev(dev) { |
4251 | if ((idev = __in6_dev_get(dev)) == NULL) | 4257 | if ((idev = __in6_dev_get(dev)) == NULL) |
4252 | continue; | 4258 | continue; |
4253 | addrconf_ifdown(dev, 1); | 4259 | addrconf_ifdown(dev, 1); |
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index 09117d63256f..9b81264eb78f 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c | |||
@@ -423,14 +423,18 @@ static int ipv6_chk_acast_dev(struct net_device *dev, struct in6_addr *addr) | |||
423 | */ | 423 | */ |
424 | int ipv6_chk_acast_addr(struct net_device *dev, struct in6_addr *addr) | 424 | int ipv6_chk_acast_addr(struct net_device *dev, struct in6_addr *addr) |
425 | { | 425 | { |
426 | int found = 0; | ||
427 | |||
426 | if (dev) | 428 | if (dev) |
427 | return ipv6_chk_acast_dev(dev, addr); | 429 | return ipv6_chk_acast_dev(dev, addr); |
428 | read_lock(&dev_base_lock); | 430 | read_lock(&dev_base_lock); |
429 | for (dev=dev_base; dev; dev=dev->next) | 431 | for_each_netdev(dev) |
430 | if (ipv6_chk_acast_dev(dev, addr)) | 432 | if (ipv6_chk_acast_dev(dev, addr)) { |
433 | found = 1; | ||
431 | break; | 434 | break; |
435 | } | ||
432 | read_unlock(&dev_base_lock); | 436 | read_unlock(&dev_base_lock); |
433 | return dev != 0; | 437 | return found; |
434 | } | 438 | } |
435 | 439 | ||
436 | 440 | ||
@@ -447,9 +451,8 @@ static inline struct ifacaddr6 *ac6_get_first(struct seq_file *seq) | |||
447 | struct ifacaddr6 *im = NULL; | 451 | struct ifacaddr6 *im = NULL; |
448 | struct ac6_iter_state *state = ac6_seq_private(seq); | 452 | struct ac6_iter_state *state = ac6_seq_private(seq); |
449 | 453 | ||
450 | for (state->dev = dev_base, state->idev = NULL; | 454 | state->idev = NULL; |
451 | state->dev; | 455 | for_each_netdev(state->dev) { |
452 | state->dev = state->dev->next) { | ||
453 | struct inet6_dev *idev; | 456 | struct inet6_dev *idev; |
454 | idev = in6_dev_get(state->dev); | 457 | idev = in6_dev_get(state->dev); |
455 | if (!idev) | 458 | if (!idev) |
@@ -476,7 +479,7 @@ static struct ifacaddr6 *ac6_get_next(struct seq_file *seq, struct ifacaddr6 *im | |||
476 | read_unlock_bh(&state->idev->lock); | 479 | read_unlock_bh(&state->idev->lock); |
477 | in6_dev_put(state->idev); | 480 | in6_dev_put(state->idev); |
478 | } | 481 | } |
479 | state->dev = state->dev->next; | 482 | state->dev = next_net_device(state->dev); |
480 | if (!state->dev) { | 483 | if (!state->dev) { |
481 | state->idev = NULL; | 484 | state->idev = NULL; |
482 | break; | 485 | break; |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 6c2758951d60..3e308fb41b49 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -2331,9 +2331,8 @@ static inline struct ifmcaddr6 *igmp6_mc_get_first(struct seq_file *seq) | |||
2331 | struct ifmcaddr6 *im = NULL; | 2331 | struct ifmcaddr6 *im = NULL; |
2332 | struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); | 2332 | struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq); |
2333 | 2333 | ||
2334 | for (state->dev = dev_base, state->idev = NULL; | 2334 | state->idev = NULL; |
2335 | state->dev; | 2335 | for_each_netdev(state->dev) { |
2336 | state->dev = state->dev->next) { | ||
2337 | struct inet6_dev *idev; | 2336 | struct inet6_dev *idev; |
2338 | idev = in6_dev_get(state->dev); | 2337 | idev = in6_dev_get(state->dev); |
2339 | if (!idev) | 2338 | if (!idev) |
@@ -2360,7 +2359,7 @@ static struct ifmcaddr6 *igmp6_mc_get_next(struct seq_file *seq, struct ifmcaddr | |||
2360 | read_unlock_bh(&state->idev->lock); | 2359 | read_unlock_bh(&state->idev->lock); |
2361 | in6_dev_put(state->idev); | 2360 | in6_dev_put(state->idev); |
2362 | } | 2361 | } |
2363 | state->dev = state->dev->next; | 2362 | state->dev = next_net_device(state->dev); |
2364 | if (!state->dev) { | 2363 | if (!state->dev) { |
2365 | state->idev = NULL; | 2364 | state->idev = NULL; |
2366 | break; | 2365 | break; |
@@ -2475,9 +2474,9 @@ static inline struct ip6_sf_list *igmp6_mcf_get_first(struct seq_file *seq) | |||
2475 | struct ifmcaddr6 *im = NULL; | 2474 | struct ifmcaddr6 *im = NULL; |
2476 | struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq); | 2475 | struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq); |
2477 | 2476 | ||
2478 | for (state->dev = dev_base, state->idev = NULL, state->im = NULL; | 2477 | state->idev = NULL; |
2479 | state->dev; | 2478 | state->im = NULL; |
2480 | state->dev = state->dev->next) { | 2479 | for_each_netdev(state->dev) { |
2481 | struct inet6_dev *idev; | 2480 | struct inet6_dev *idev; |
2482 | idev = in6_dev_get(state->dev); | 2481 | idev = in6_dev_get(state->dev); |
2483 | if (unlikely(idev == NULL)) | 2482 | if (unlikely(idev == NULL)) |
@@ -2513,7 +2512,7 @@ static struct ip6_sf_list *igmp6_mcf_get_next(struct seq_file *seq, struct ip6_s | |||
2513 | read_unlock_bh(&state->idev->lock); | 2512 | read_unlock_bh(&state->idev->lock); |
2514 | in6_dev_put(state->idev); | 2513 | in6_dev_put(state->idev); |
2515 | } | 2514 | } |
2516 | state->dev = state->dev->next; | 2515 | state->dev = next_net_device(state->dev); |
2517 | if (!state->dev) { | 2516 | if (!state->dev) { |
2518 | state->idev = NULL; | 2517 | state->idev = NULL; |
2519 | goto out; | 2518 | goto out; |