diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-09-23 17:46:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-09-26 22:04:07 -0400 |
commit | 83180af0b0ea166adf8249f4513beb7355f9b4c9 (patch) | |
tree | 4e2606d19e0e5be3e1fc1851a0294f163bfa8780 /net/ipv4/route.c | |
parent | 1b4bf461f05d56ced6d6b8f3b4831adc7076f565 (diff) |
net: fix rcu use in ip_route_output_slow
__in_dev_get_rtnl(dev_out) is called while RTNL is not held, thus
triggers a lockdep fault.
At this point, we only perform a raw test of dev_out->ip_ptr being NULL,
we dont need to make sure ip_ptr cant changed right after.
We can use rcu_dereference_raw() for this.
Reported-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r-- | net/ipv4/route.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index ae1d4a41f1c..98beda47bc9 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2579,7 +2579,7 @@ static int ip_route_output_slow(struct net *net, struct rtable **rp, | |||
2579 | goto out; | 2579 | goto out; |
2580 | 2580 | ||
2581 | /* RACE: Check return value of inet_select_addr instead. */ | 2581 | /* RACE: Check return value of inet_select_addr instead. */ |
2582 | if (__in_dev_get_rtnl(dev_out) == NULL) { | 2582 | if (rcu_dereference_raw(dev_out->ip_ptr) == NULL) { |
2583 | dev_put(dev_out); | 2583 | dev_put(dev_out); |
2584 | goto out; /* Wrong error code */ | 2584 | goto out; /* Wrong error code */ |
2585 | } | 2585 | } |