From 110609cd04c390c497f39d8bafd5d57265a7b410 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Fri, 4 Feb 2011 14:37:30 -0800 Subject: [PATCH] --- yaml --- r: 236971 b: refs/heads/master c: 0131ba451e20239c5dc701027c1a2edef95e1a6e h: refs/heads/master i: 236969: a1ca713c9f146e7d50a68b84eb5a7568db9bfc8b 236967: 351008415068b39b1a2dcd879102a5ef189d814f v: v3 --- [refs] | 2 +- trunk/net/ipv4/route.c | 31 +++++++++++++++++-------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 65de2fe38fe5..0de8417fefc0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bd4a6974cc9090ef3851e5b0a2071e5383565c7c +refs/heads/master: 0131ba451e20239c5dc701027c1a2edef95e1a6e diff --git a/trunk/net/ipv4/route.c b/trunk/net/ipv4/route.c index e4c81652f17d..0ba6a382b2b4 100644 --- a/trunk/net/ipv4/route.c +++ b/trunk/net/ipv4/route.c @@ -1859,25 +1859,28 @@ static unsigned int ipv4_default_mtu(const struct dst_entry *dst) static void rt_init_metrics(struct rtable *rt, struct fib_info *fi) { - if (!(rt->fl.flags & FLOWI_FLAG_PRECOW_METRICS)) { - no_cow: - if (fi->fib_metrics != (u32 *) dst_default_metrics) { - rt->fi = fi; - atomic_inc(&fi->fib_clntref); - } - dst_init_metrics(&rt->dst, fi->fib_metrics, true); - } else { - struct inet_peer *peer; + struct inet_peer *peer; + int create = 0; - if (!rt->peer) - rt_bind_peer(rt, 1); - peer = rt->peer; - if (!peer) - goto no_cow; + /* If a peer entry exists for this destination, we must hook + * it up in order to get at cached metrics. + */ + if (rt->fl.flags & FLOWI_FLAG_PRECOW_METRICS) + create = 1; + + rt_bind_peer(rt, create); + peer = rt->peer; + if (peer) { if (inet_metrics_new(peer)) memcpy(peer->metrics, fi->fib_metrics, sizeof(u32) * RTAX_MAX); dst_init_metrics(&rt->dst, peer->metrics, false); + } else { + if (fi->fib_metrics != (u32 *) dst_default_metrics) { + rt->fi = fi; + atomic_inc(&fi->fib_clntref); + } + dst_init_metrics(&rt->dst, fi->fib_metrics, true); } }