diff options
-rw-r--r-- | include/net/dst.h | 2 | ||||
-rw-r--r-- | net/core/dst.c | 4 | ||||
-rw-r--r-- | net/decnet/dn_route.c | 4 | ||||
-rw-r--r-- | net/ipv4/route.c | 7 | ||||
-rw-r--r-- | net/ipv6/route.c | 5 | ||||
-rw-r--r-- | net/xfrm/xfrm_policy.c | 2 |
6 files changed, 10 insertions, 14 deletions
diff --git a/include/net/dst.h b/include/net/dst.h index e01855de21e8..23b564d3e110 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -352,7 +352,7 @@ static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb) | |||
352 | } | 352 | } |
353 | 353 | ||
354 | extern int dst_discard(struct sk_buff *skb); | 354 | extern int dst_discard(struct sk_buff *skb); |
355 | extern void * dst_alloc(struct dst_ops * ops); | 355 | extern void *dst_alloc(struct dst_ops * ops, int initial_ref); |
356 | extern void __dst_free(struct dst_entry * dst); | 356 | extern void __dst_free(struct dst_entry * dst); |
357 | extern struct dst_entry *dst_destroy(struct dst_entry * dst); | 357 | extern struct dst_entry *dst_destroy(struct dst_entry * dst); |
358 | 358 | ||
diff --git a/net/core/dst.c b/net/core/dst.c index c1674fde827d..91104d35de7d 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
@@ -166,7 +166,7 @@ EXPORT_SYMBOL(dst_discard); | |||
166 | 166 | ||
167 | const u32 dst_default_metrics[RTAX_MAX]; | 167 | const u32 dst_default_metrics[RTAX_MAX]; |
168 | 168 | ||
169 | void *dst_alloc(struct dst_ops *ops) | 169 | void *dst_alloc(struct dst_ops *ops, int initial_ref) |
170 | { | 170 | { |
171 | struct dst_entry *dst; | 171 | struct dst_entry *dst; |
172 | 172 | ||
@@ -177,7 +177,7 @@ void *dst_alloc(struct dst_ops *ops) | |||
177 | dst = kmem_cache_zalloc(ops->kmem_cachep, GFP_ATOMIC); | 177 | dst = kmem_cache_zalloc(ops->kmem_cachep, GFP_ATOMIC); |
178 | if (!dst) | 178 | if (!dst) |
179 | return NULL; | 179 | return NULL; |
180 | atomic_set(&dst->__refcnt, 0); | 180 | atomic_set(&dst->__refcnt, initial_ref); |
181 | dst->ops = ops; | 181 | dst->ops = ops; |
182 | dst->lastuse = jiffies; | 182 | dst->lastuse = jiffies; |
183 | dst->path = dst; | 183 | dst->path = dst; |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 42c9c62d3417..06c054d5ccba 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -1122,7 +1122,7 @@ make_route: | |||
1122 | if (dev_out->flags & IFF_LOOPBACK) | 1122 | if (dev_out->flags & IFF_LOOPBACK) |
1123 | flags |= RTCF_LOCAL; | 1123 | flags |= RTCF_LOCAL; |
1124 | 1124 | ||
1125 | rt = dst_alloc(&dn_dst_ops); | 1125 | rt = dst_alloc(&dn_dst_ops, 0); |
1126 | if (rt == NULL) | 1126 | if (rt == NULL) |
1127 | goto e_nobufs; | 1127 | goto e_nobufs; |
1128 | 1128 | ||
@@ -1383,7 +1383,7 @@ static int dn_route_input_slow(struct sk_buff *skb) | |||
1383 | } | 1383 | } |
1384 | 1384 | ||
1385 | make_route: | 1385 | make_route: |
1386 | rt = dst_alloc(&dn_dst_ops); | 1386 | rt = dst_alloc(&dn_dst_ops, 0); |
1387 | if (rt == NULL) | 1387 | if (rt == NULL) |
1388 | goto e_nobufs; | 1388 | goto e_nobufs; |
1389 | 1389 | ||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 79a287181025..9841543c468d 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1818,12 +1818,10 @@ static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag) | |||
1818 | 1818 | ||
1819 | static struct rtable *rt_dst_alloc(bool nopolicy, bool noxfrm) | 1819 | static struct rtable *rt_dst_alloc(bool nopolicy, bool noxfrm) |
1820 | { | 1820 | { |
1821 | struct rtable *rt = dst_alloc(&ipv4_dst_ops); | 1821 | struct rtable *rt = dst_alloc(&ipv4_dst_ops, 1); |
1822 | if (rt) { | 1822 | if (rt) { |
1823 | rt->dst.obsolete = -1; | 1823 | rt->dst.obsolete = -1; |
1824 | 1824 | ||
1825 | atomic_set(&rt->dst.__refcnt, 1); | ||
1826 | |||
1827 | rt->dst.flags = DST_HOST | | 1825 | rt->dst.flags = DST_HOST | |
1828 | (nopolicy ? DST_NOPOLICY : 0) | | 1826 | (nopolicy ? DST_NOPOLICY : 0) | |
1829 | (noxfrm ? DST_NOXFRM : 0); | 1827 | (noxfrm ? DST_NOXFRM : 0); |
@@ -2679,12 +2677,11 @@ static int ipv4_dst_blackhole(struct net *net, struct rtable **rp, struct flowi | |||
2679 | { | 2677 | { |
2680 | struct rtable *ort = *rp; | 2678 | struct rtable *ort = *rp; |
2681 | struct rtable *rt = (struct rtable *) | 2679 | struct rtable *rt = (struct rtable *) |
2682 | dst_alloc(&ipv4_dst_blackhole_ops); | 2680 | dst_alloc(&ipv4_dst_blackhole_ops, 1); |
2683 | 2681 | ||
2684 | if (rt) { | 2682 | if (rt) { |
2685 | struct dst_entry *new = &rt->dst; | 2683 | struct dst_entry *new = &rt->dst; |
2686 | 2684 | ||
2687 | atomic_set(&new->__refcnt, 1); | ||
2688 | new->__use = 1; | 2685 | new->__use = 1; |
2689 | new->input = dst_discard; | 2686 | new->input = dst_discard; |
2690 | new->output = dst_discard; | 2687 | new->output = dst_discard; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index ad8556e6fd41..7946b53692da 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -221,7 +221,7 @@ static struct rt6_info ip6_blk_hole_entry_template = { | |||
221 | /* allocate dst with ip6_dst_ops */ | 221 | /* allocate dst with ip6_dst_ops */ |
222 | static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops) | 222 | static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops) |
223 | { | 223 | { |
224 | return (struct rt6_info *)dst_alloc(ops); | 224 | return (struct rt6_info *)dst_alloc(ops, 0); |
225 | } | 225 | } |
226 | 226 | ||
227 | static void ip6_dst_destroy(struct dst_entry *dst) | 227 | static void ip6_dst_destroy(struct dst_entry *dst) |
@@ -873,13 +873,12 @@ int ip6_dst_blackhole(struct sock *sk, struct dst_entry **dstp, struct flowi *fl | |||
873 | { | 873 | { |
874 | struct rt6_info *ort = (struct rt6_info *) *dstp; | 874 | struct rt6_info *ort = (struct rt6_info *) *dstp; |
875 | struct rt6_info *rt = (struct rt6_info *) | 875 | struct rt6_info *rt = (struct rt6_info *) |
876 | dst_alloc(&ip6_dst_blackhole_ops); | 876 | dst_alloc(&ip6_dst_blackhole_ops, 1); |
877 | struct dst_entry *new = NULL; | 877 | struct dst_entry *new = NULL; |
878 | 878 | ||
879 | if (rt) { | 879 | if (rt) { |
880 | new = &rt->dst; | 880 | new = &rt->dst; |
881 | 881 | ||
882 | atomic_set(&new->__refcnt, 1); | ||
883 | new->__use = 1; | 882 | new->__use = 1; |
884 | new->input = dst_discard; | 883 | new->input = dst_discard; |
885 | new->output = dst_discard; | 884 | new->output = dst_discard; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 8b3ef404c794..3f1257add4f3 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -1340,7 +1340,7 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family) | |||
1340 | default: | 1340 | default: |
1341 | BUG(); | 1341 | BUG(); |
1342 | } | 1342 | } |
1343 | xdst = dst_alloc(dst_ops) ?: ERR_PTR(-ENOBUFS); | 1343 | xdst = dst_alloc(dst_ops, 0) ?: ERR_PTR(-ENOBUFS); |
1344 | xfrm_policy_put_afinfo(afinfo); | 1344 | xfrm_policy_put_afinfo(afinfo); |
1345 | 1345 | ||
1346 | xdst->flo.ops = &xfrm_bundle_fc_ops; | 1346 | xdst->flo.ops = &xfrm_bundle_fc_ops; |