diff options
author | David S. Miller <davem@davemloft.net> | 2012-07-10 10:08:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-07-11 01:40:17 -0400 |
commit | 312487313d4f7177cb751830e3d9c218e42ed59e (patch) | |
tree | feac6ec40f28f12ea7bfee8cca2df719f1f22d50 /net/ipv4/route.c | |
parent | 2db2d67e4cf6100249bad575d9c13c16fd7b06dc (diff) |
ipv4: Calling ->cow_metrics() now is a bug.
Nothing every writes to ipv4 metrics any longer.
PMTU is stored in rt->rt_pmtu.
Dynamic TCP metrics are stored in a special TCP metrics cache,
completely outside of the routes.
Therefore ->cow_metrics() can simply nothing more than a WARN_ON
trigger so we can catch anyone who tries to add new writes to
ipv4 route metrics.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r-- | net/ipv4/route.c | 30 |
1 files changed, 2 insertions, 28 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a967df54a423..9cc00f8a6ee5 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -158,34 +158,8 @@ static void ipv4_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
158 | 158 | ||
159 | static u32 *ipv4_cow_metrics(struct dst_entry *dst, unsigned long old) | 159 | static u32 *ipv4_cow_metrics(struct dst_entry *dst, unsigned long old) |
160 | { | 160 | { |
161 | struct rtable *rt = (struct rtable *) dst; | 161 | WARN_ON(1); |
162 | struct inet_peer *peer; | 162 | return NULL; |
163 | u32 *p = NULL; | ||
164 | |||
165 | peer = rt_get_peer_create(rt, rt->rt_dst); | ||
166 | if (peer) { | ||
167 | u32 *old_p = __DST_METRICS_PTR(old); | ||
168 | unsigned long prev, new; | ||
169 | |||
170 | p = peer->metrics; | ||
171 | if (inet_metrics_new(peer)) | ||
172 | memcpy(p, old_p, sizeof(u32) * RTAX_MAX); | ||
173 | |||
174 | new = (unsigned long) p; | ||
175 | prev = cmpxchg(&dst->_metrics, old, new); | ||
176 | |||
177 | if (prev != old) { | ||
178 | p = __DST_METRICS_PTR(prev); | ||
179 | if (prev & DST_METRICS_READ_ONLY) | ||
180 | p = NULL; | ||
181 | } else { | ||
182 | if (rt->fi) { | ||
183 | fib_info_put(rt->fi); | ||
184 | rt->fi = NULL; | ||
185 | } | ||
186 | } | ||
187 | } | ||
188 | return p; | ||
189 | } | 163 | } |
190 | 164 | ||
191 | static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, | 165 | static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, |