diff options
Diffstat (limited to 'net/core/dst.c')
| -rw-r--r-- | net/core/dst.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/net/core/dst.c b/net/core/dst.c index 9ccca038444f..14b33baf0733 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
| @@ -171,8 +171,7 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev, | |||
| 171 | dst_init_metrics(dst, dst_default_metrics, true); | 171 | dst_init_metrics(dst, dst_default_metrics, true); |
| 172 | dst->expires = 0UL; | 172 | dst->expires = 0UL; |
| 173 | dst->path = dst; | 173 | dst->path = dst; |
| 174 | dst->neighbour = NULL; | 174 | dst->_neighbour = NULL; |
| 175 | dst->hh = NULL; | ||
| 176 | #ifdef CONFIG_XFRM | 175 | #ifdef CONFIG_XFRM |
| 177 | dst->xfrm = NULL; | 176 | dst->xfrm = NULL; |
| 178 | #endif | 177 | #endif |
| @@ -190,7 +189,8 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev, | |||
| 190 | dst->lastuse = jiffies; | 189 | dst->lastuse = jiffies; |
| 191 | dst->flags = flags; | 190 | dst->flags = flags; |
| 192 | dst->next = NULL; | 191 | dst->next = NULL; |
| 193 | dst_entries_add(ops, 1); | 192 | if (!(flags & DST_NOCOUNT)) |
| 193 | dst_entries_add(ops, 1); | ||
| 194 | return dst; | 194 | return dst; |
| 195 | } | 195 | } |
| 196 | EXPORT_SYMBOL(dst_alloc); | 196 | EXPORT_SYMBOL(dst_alloc); |
| @@ -225,25 +225,20 @@ struct dst_entry *dst_destroy(struct dst_entry * dst) | |||
| 225 | { | 225 | { |
| 226 | struct dst_entry *child; | 226 | struct dst_entry *child; |
| 227 | struct neighbour *neigh; | 227 | struct neighbour *neigh; |
| 228 | struct hh_cache *hh; | ||
| 229 | 228 | ||
| 230 | smp_rmb(); | 229 | smp_rmb(); |
| 231 | 230 | ||
| 232 | again: | 231 | again: |
| 233 | neigh = dst->neighbour; | 232 | neigh = dst->_neighbour; |
| 234 | hh = dst->hh; | ||
| 235 | child = dst->child; | 233 | child = dst->child; |
| 236 | 234 | ||
| 237 | dst->hh = NULL; | ||
| 238 | if (hh) | ||
| 239 | hh_cache_put(hh); | ||
| 240 | |||
| 241 | if (neigh) { | 235 | if (neigh) { |
| 242 | dst->neighbour = NULL; | 236 | dst->_neighbour = NULL; |
| 243 | neigh_release(neigh); | 237 | neigh_release(neigh); |
| 244 | } | 238 | } |
| 245 | 239 | ||
| 246 | dst_entries_add(dst->ops, -1); | 240 | if (!(dst->flags & DST_NOCOUNT)) |
| 241 | dst_entries_add(dst->ops, -1); | ||
| 247 | 242 | ||
| 248 | if (dst->ops->destroy) | 243 | if (dst->ops->destroy) |
| 249 | dst->ops->destroy(dst); | 244 | dst->ops->destroy(dst); |
| @@ -368,8 +363,8 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
| 368 | dst->dev = dev_net(dst->dev)->loopback_dev; | 363 | dst->dev = dev_net(dst->dev)->loopback_dev; |
| 369 | dev_hold(dst->dev); | 364 | dev_hold(dst->dev); |
| 370 | dev_put(dev); | 365 | dev_put(dev); |
| 371 | if (dst->neighbour && dst->neighbour->dev == dev) { | 366 | if (dst->_neighbour && dst->_neighbour->dev == dev) { |
| 372 | dst->neighbour->dev = dst->dev; | 367 | dst->_neighbour->dev = dst->dev; |
| 373 | dev_hold(dst->dev); | 368 | dev_hold(dst->dev); |
| 374 | dev_put(dev); | 369 | dev_put(dev); |
| 375 | } | 370 | } |
