diff options
Diffstat (limited to 'net/core/dst.c')
| -rw-r--r-- | net/core/dst.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/net/core/dst.c b/net/core/dst.c index 95f533844f17..9552a90d4772 100644 --- a/net/core/dst.c +++ b/net/core/dst.c @@ -109,9 +109,6 @@ static void dst_destroy(struct dst_entry *dst)  		child = xdst->child;  	}  #endif -	if (!(dst->flags & DST_NOCOUNT)) -		dst_entries_add(dst->ops, -1); -  	if (dst->ops->destroy)  		dst->ops->destroy(dst);  	netdev_put(dst->dev, &dst->dev_tracker); @@ -159,17 +156,27 @@ void dst_dev_put(struct dst_entry *dst)  }  EXPORT_SYMBOL(dst_dev_put); +static void dst_count_dec(struct dst_entry *dst) +{ +	if (!(dst->flags & DST_NOCOUNT)) +		dst_entries_add(dst->ops, -1); +} +  void dst_release(struct dst_entry *dst)  { -	if (dst && rcuref_put(&dst->__rcuref)) +	if (dst && rcuref_put(&dst->__rcuref)) { +		dst_count_dec(dst);  		call_rcu_hurry(&dst->rcu_head, dst_destroy_rcu); +	}  }  EXPORT_SYMBOL(dst_release);  void dst_release_immediate(struct dst_entry *dst)  { -	if (dst && rcuref_put(&dst->__rcuref)) +	if (dst && rcuref_put(&dst->__rcuref)) { +		dst_count_dec(dst);  		dst_destroy(dst); +	}  }  EXPORT_SYMBOL(dst_release_immediate); | 
