Subject: Re: Problem with talking to the kernel and iproute2/ifconfig

From: Patrick McHardy <[email-masked]>
Date: Thu, 25 Mar 2010 18:31:46 +0100

Paweł Staszewski wrote:
> Hello
> 
> I have strange problem with kernel 2.6.33.1
> 
> I have script with 6267 ip's
> 
> cat gateways.conf | grep 'addr add' | wc -l
> 6267
> 
> and when i want to commit this interfaces by command:
> ip -batch gateways.conf
> 
> I have only 680 ip interfaces
> ip a | grep inet | grep ' 10.' | wc -l
> 680
> 
> 
> I test this on kernels 2.6.29.1 and 2.6.30.1 and all was OK.
> on kernel 2.6.29.1
> 
> ip -batch gateways.conf
> ip a | grep inet | grep ' 10.' | wc -l
> 6267
> 
> on kernel 2.6.30.1
> ip -batch gateways.conf
> ip a | grep inet | grep ' 10.' | wc -l
> 6267

Does this patch help? When "idx" points to the last device
of a chain, it will never get incremented past s_idx and we
fail to reset s_ip_idx.

diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 51ca946..3feb2b3 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1194,7 +1194,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
 		hlist_for_each_entry_rcu(dev, node, head, index_hlist) {
 			if (idx < s_idx)
 				goto cont;
-			if (idx > s_idx)
+			if (h > s_h || idx > s_idx)
 				s_ip_idx = 0;
 			in_dev = __in_dev_get_rcu(dev);
 			if (!in_dev)