X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=include%2Fnet%2Fdst.h;h=b7e47a7ad1058ec99d0e6d461af9b7d797841523;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=33fd86690d18605ebd5379fe00155f7cebe29262;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/include/net/dst.h b/include/net/dst.h index 33fd86690..b7e47a7ad 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -67,7 +67,7 @@ struct dst_entry struct xfrm_state *xfrm; int (*input)(struct sk_buff*); - int (*output)(struct sk_buff**); + int (*output)(struct sk_buff*); #ifdef CONFIG_NET_CLS_ROUTE __u32 tclassid; @@ -89,7 +89,8 @@ struct dst_ops int (*gc)(void); struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); void (*destroy)(struct dst_entry *); - void (*ifdown)(struct dst_entry *, int how); + void (*ifdown)(struct dst_entry *, + struct net_device *dev, int how); struct dst_entry * (*negative_advice)(struct dst_entry *); void (*link_failure)(struct sk_buff *); void (*update_pmtu)(struct dst_entry *dst, u32 mtu); @@ -103,19 +104,19 @@ struct dst_ops #ifdef __KERNEL__ static inline u32 -dst_metric(struct dst_entry *dst, int metric) +dst_metric(const struct dst_entry *dst, int metric) { return dst->metrics[metric-1]; } static inline u32 -dst_path_metric(struct dst_entry *dst, int metric) +dst_path_metric(const struct dst_entry *dst, int metric) { return dst->path->metrics[metric-1]; } static inline u32 -dst_pmtu(struct dst_entry *dst) +dst_pmtu(const struct dst_entry *dst) { u32 mtu = dst_path_metric(dst, RTAX_MTU); /* Yes, _exactly_. This is paranoia. */ @@ -142,16 +143,12 @@ struct dst_entry * dst_clone(struct dst_entry * dst) return dst; } -extern const char dst_underflow_bug_msg[]; - static inline void dst_release(struct dst_entry * dst) { if (dst) { - if (atomic_read(&dst->__refcnt) < 1) - printk(dst_underflow_bug_msg, - atomic_read(&dst->__refcnt), - dst, current_text_addr()); + WARN_ON(atomic_read(&dst->__refcnt) < 1); + smp_mb__before_atomic_dec(); atomic_dec(&dst->__refcnt); } } @@ -227,7 +224,7 @@ static inline int dst_output(struct sk_buff *skb) int err; for (;;) { - err = skb->dst->output(&skb); + err = skb->dst->output(skb); if (likely(err == 0)) return err;