Skip to content

Commit

Permalink
ipv4: Restart rt_intern_hash after emergency rebuild (v2)
Browse files Browse the repository at this point in the history
The the rebuild changes the genid which in turn is used at
the hash calculation. Thus if we don't restart and go on with
inserting the rt will happen in wrong chain.

(Fixed Neil's comment about the index passed into the rt_intern_hash)

Signed-off-by: Pavel Emelyanov <[email protected]>
Reviewed-by: Neil Horman <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
xemul authored and davem330 committed Mar 27, 2010
1 parent b35ecb5 commit 6a2bad7
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions net/ipv4/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -1097,7 +1097,7 @@ static int slow_chain_length(const struct rtable *head)
}

static int rt_intern_hash(unsigned hash, struct rtable *rt,
struct rtable **rp, struct sk_buff *skb)
struct rtable **rp, struct sk_buff *skb, int ifindex)
{
struct rtable *rth, **rthp;
unsigned long now;
Expand Down Expand Up @@ -1217,6 +1217,11 @@ static int rt_intern_hash(unsigned hash, struct rtable *rt,
rt->u.dst.dev->name, num);
}
rt_emergency_hash_rebuild(net);
spin_unlock_bh(rt_hash_lock_addr(hash));

hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src,
ifindex, rt_genid(net));
goto restart;
}
}

Expand Down Expand Up @@ -1477,7 +1482,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
&netevent);

rt_del(hash, rth);
if (!rt_intern_hash(hash, rt, &rt, NULL))
if (!rt_intern_hash(hash, rt, &rt, NULL, rt->fl.oif))
ip_rt_put(rt);
goto do_next;
}
Expand Down Expand Up @@ -1931,7 +1936,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,

in_dev_put(in_dev);
hash = rt_hash(daddr, saddr, dev->ifindex, rt_genid(dev_net(dev)));
return rt_intern_hash(hash, rth, NULL, skb);
return rt_intern_hash(hash, rth, NULL, skb, dev->ifindex);

e_nobufs:
in_dev_put(in_dev);
Expand Down Expand Up @@ -2098,7 +2103,7 @@ static int ip_mkroute_input(struct sk_buff *skb,
/* put it into the cache */
hash = rt_hash(daddr, saddr, fl->iif,
rt_genid(dev_net(rth->u.dst.dev)));
return rt_intern_hash(hash, rth, NULL, skb);
return rt_intern_hash(hash, rth, NULL, skb, fl->iif);
}

/*
Expand Down Expand Up @@ -2255,7 +2260,7 @@ out: return err;
}
rth->rt_type = res.type;
hash = rt_hash(daddr, saddr, fl.iif, rt_genid(net));
err = rt_intern_hash(hash, rth, NULL, skb);
err = rt_intern_hash(hash, rth, NULL, skb, fl.iif);
goto done;

no_route:
Expand Down Expand Up @@ -2502,7 +2507,7 @@ static int ip_mkroute_output(struct rtable **rp,
if (err == 0) {
hash = rt_hash(oldflp->fl4_dst, oldflp->fl4_src, oldflp->oif,
rt_genid(dev_net(dev_out)));
err = rt_intern_hash(hash, rth, rp, NULL);
err = rt_intern_hash(hash, rth, rp, NULL, oldflp->oif);
}

return err;
Expand Down

0 comments on commit 6a2bad7

Please sign in to comment.