diff options
author | Steffen Klassert <steffen.klassert@secunet.com> | 2010-06-04 01:57:38 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-04 15:56:00 -0700 |
commit | 8764ab2ca7ab5055e1ca80f9cfa4970c34acb804 (patch) | |
tree | ca0a6ea6c6fabbb98220f5b700981f7f23855f42 /include/net | |
parent | 4f4aeb7fd0f7e6ca008bb2147ba36cee13876595 (diff) | |
download | linux-8764ab2ca7ab5055e1ca80f9cfa4970c34acb804.tar.gz linux-8764ab2ca7ab5055e1ca80f9cfa4970c34acb804.tar.bz2 linux-8764ab2ca7ab5055e1ca80f9cfa4970c34acb804.zip |
net: check for refcount if pop a stacked dst_entry
xfrm triggers a warning if dst_pop() drops a refcount
on a noref dst. This patch changes dst_pop() to
skb_dst_pop(). skb_dst_pop() drops the refcnt only
on a refcounted dst. Also we don't clone the child
dst_entry, so it is not refcounted and we can use
skb_dst_set_noref() in xfrm_output_one().
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/dst.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/include/net/dst.h b/include/net/dst.h index 612069beda73..81d1413a8701 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -250,11 +250,11 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) * Linux networking. Thus, destinations are stackable. */ -static inline struct dst_entry *dst_pop(struct dst_entry *dst) +static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb) { - struct dst_entry *child = dst_clone(dst->child); + struct dst_entry *child = skb_dst(skb)->child; - dst_release(dst); + skb_dst_drop(skb); return child; } |