aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-12-27 01:37:05 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-27 01:37:05 -0500
commit17f7f4d9fcce8f1b75b5f735569309dee7665968 (patch)
tree14d7e49ca0053a0fcab3c33b5023bf3f90c5c08a /net/ipv4
parent041110a439e21cd40709ead4ffbfa8034619ad77 (diff)
parentd7c1255a3a21e98bdc64df8ccf005a174d7e6289 (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: net/ipv4/fib_frontend.c
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/fib_frontend.c10
-rw-r--r--net/ipv4/route.c7
-rw-r--r--net/ipv4/tcp_ipv4.c4
3 files changed, 14 insertions, 7 deletions
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 9f8bb68911e4..1d2cdd43a878 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -159,13 +159,19 @@ struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
159{ 159{
160 struct flowi fl = { 160 struct flowi fl = {
161 .fl4_dst = addr, 161 .fl4_dst = addr,
162 .flags = FLOWI_FLAG_MATCH_ANY_IIF
163 }; 162 };
164 struct fib_result res = { 0 }; 163 struct fib_result res = { 0 };
165 struct net_device *dev = NULL; 164 struct net_device *dev = NULL;
165 struct fib_table *local_table;
166
167#ifdef CONFIG_IP_MULTIPLE_TABLES
168 res.r = NULL;
169#endif
166 170
167 rcu_read_lock(); 171 rcu_read_lock();
168 if (fib_lookup(net, &fl, &res)) { 172 local_table = fib_get_table(net, RT_TABLE_LOCAL);
173 if (!local_table ||
174 fib_table_lookup(local_table, &fl, &res, FIB_LOOKUP_NOREF)) {
169 rcu_read_unlock(); 175 rcu_read_unlock();
170 return NULL; 176 return NULL;
171 } 177 }
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index d8b4f4d0d66e..f1defb7d88e8 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2562,9 +2562,10 @@ static int ip_route_output_slow(struct net *net, struct rtable **rp,
2562 goto out; 2562 goto out;
2563 2563
2564 /* RACE: Check return value of inet_select_addr instead. */ 2564 /* RACE: Check return value of inet_select_addr instead. */
2565 if (rcu_dereference(dev_out->ip_ptr) == NULL) 2565 if (!(dev_out->flags & IFF_UP) || !__in_dev_get_rcu(dev_out)) {
2566 goto out; /* Wrong error code */ 2566 err = -ENETUNREACH;
2567 2567 goto out;
2568 }
2568 if (ipv4_is_local_multicast(oldflp->fl4_dst) || 2569 if (ipv4_is_local_multicast(oldflp->fl4_dst) ||
2569 ipv4_is_lbcast(oldflp->fl4_dst)) { 2570 ipv4_is_lbcast(oldflp->fl4_dst)) {
2570 if (!fl.fl4_src) 2571 if (!fl.fl4_src)
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index f4011027543d..856f68466d49 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -2000,7 +2000,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
2000get_req: 2000get_req:
2001 req = icsk->icsk_accept_queue.listen_opt->syn_table[st->sbucket]; 2001 req = icsk->icsk_accept_queue.listen_opt->syn_table[st->sbucket];
2002 } 2002 }
2003 sk = sk_next(st->syn_wait_sk); 2003 sk = sk_nulls_next(st->syn_wait_sk);
2004 st->state = TCP_SEQ_STATE_LISTENING; 2004 st->state = TCP_SEQ_STATE_LISTENING;
2005 read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock); 2005 read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
2006 } else { 2006 } else {
@@ -2009,7 +2009,7 @@ get_req:
2009 if (reqsk_queue_len(&icsk->icsk_accept_queue)) 2009 if (reqsk_queue_len(&icsk->icsk_accept_queue))
2010 goto start_req; 2010 goto start_req;
2011 read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock); 2011 read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
2012 sk = sk_next(sk); 2012 sk = sk_nulls_next(sk);
2013 } 2013 }
2014get_sk: 2014get_sk:
2015 sk_nulls_for_each_from(sk, node) { 2015 sk_nulls_for_each_from(sk, node) {