diff options
author | David S. Miller <davem@davemloft.net> | 2011-02-17 15:37:09 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-02-17 15:37:09 -0800 |
commit | 010c2708e536938a2f84d51d625f603b9a8f80ac (patch) | |
tree | bf886bc996e41d8996c24e60ec08a19e551c116e /net | |
parent | 5ada552746685d558d0a8e9e979921c75a41e469 (diff) |
ipv4: Move rcu_read_{lock,unlock}() into ip_route_output_slow().
Simplifies tail of __ip_route_output_key().
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/route.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 849be48971ec..b2b3c9e0a618 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2456,6 +2456,7 @@ static int ip_route_output_slow(struct net *net, struct rtable **rp, res.r = NULL; #endif + rcu_read_lock(); if (oldflp->fl4_src) { err = -EINVAL; if (ipv4_is_multicast(oldflp->fl4_src) || @@ -2617,15 +2618,16 @@ make_route: err = rt_intern_hash(hash, rth, rp, NULL, oldflp->oif); } -out: return err; +out: + rcu_read_unlock(); + return err; } int __ip_route_output_key(struct net *net, struct rtable **rp, const struct flowi *flp) { - unsigned int hash; - int res; struct rtable *rth; + unsigned int hash; if (!rt_caching(net)) goto slow_output; @@ -2655,10 +2657,7 @@ int __ip_route_output_key(struct net *net, struct rtable **rp, rcu_read_unlock_bh(); slow_output: - rcu_read_lock(); - res = ip_route_output_slow(net, rp, flp); - rcu_read_unlock(); - return res; + return ip_route_output_slow(net, rp, flp); } EXPORT_SYMBOL_GPL(__ip_route_output_key); |