aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/devinet.c
diff options
context:
space:
mode:
authorNicolas Dichtel <nicolas.dichtel@6wind.com>2013-03-22 02:28:42 -0400
committerDavid S. Miller <davem@davemloft.net>2013-03-24 17:16:29 -0400
commit0465277f6b3fd0535428ae935644ac30ce903de0 (patch)
treed773aa622e9f208114a37487bf4dac0862def51d /net/ipv4/devinet.c
parent976c90b90187f2eb4778d766d52d6ab176714734 (diff)
ipv4: provide addr and netconf dump consistency info
This patch takes benefit of dev_addr_genid and dev_base_seq to check if a change occurs during a netlink dump. If a change is detected, the flag NLM_F_DUMP_INTR is set in the first message after the dump was interrupted. Note that seq and prev_seq must be reset between each family in rtnl_dump_all() because they are specific to each family. Reported-by: Junwei Zhang <junwei.zhang@6wind.com> Reported-by: Hongjun Li <hongjun.li@6wind.com> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r--net/ipv4/devinet.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 20a9f9274f3f..5d985e367535 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1499,6 +1499,8 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1499 idx = 0; 1499 idx = 0;
1500 head = &net->dev_index_head[h]; 1500 head = &net->dev_index_head[h];
1501 rcu_read_lock(); 1501 rcu_read_lock();
1502 cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^
1503 net->dev_base_seq;
1502 hlist_for_each_entry_rcu(dev, head, index_hlist) { 1504 hlist_for_each_entry_rcu(dev, head, index_hlist) {
1503 if (idx < s_idx) 1505 if (idx < s_idx)
1504 goto cont; 1506 goto cont;
@@ -1519,6 +1521,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1519 rcu_read_unlock(); 1521 rcu_read_unlock();
1520 goto done; 1522 goto done;
1521 } 1523 }
1524 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1522 } 1525 }
1523cont: 1526cont:
1524 idx++; 1527 idx++;
@@ -1807,6 +1810,8 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb,
1807 idx = 0; 1810 idx = 0;
1808 head = &net->dev_index_head[h]; 1811 head = &net->dev_index_head[h];
1809 rcu_read_lock(); 1812 rcu_read_lock();
1813 cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^
1814 net->dev_base_seq;
1810 hlist_for_each_entry_rcu(dev, head, index_hlist) { 1815 hlist_for_each_entry_rcu(dev, head, index_hlist) {
1811 if (idx < s_idx) 1816 if (idx < s_idx)
1812 goto cont; 1817 goto cont;
@@ -1824,6 +1829,7 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb,
1824 rcu_read_unlock(); 1829 rcu_read_unlock();
1825 goto done; 1830 goto done;
1826 } 1831 }
1832 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1827cont: 1833cont:
1828 idx++; 1834 idx++;
1829 } 1835 }