diff options
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, |