Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 352831
b: refs/heads/master
c: ecd9883
h: refs/heads/master
i:
  352829: 0f6e5f4
  352827: 48b3ff7
  352823: bcded86
  352815: 6fb3943
  352799: e457a6e
  352767: 586b3a9
v: v3
  • Loading branch information
YOSHIFUJI Hideaki / 吉藤英明 authored and David S. Miller committed Feb 20, 2013
1 parent 779e82f commit 1e7a4cd
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 39 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 68534c682e8f5c333f835818ca5a89d3e6288870
refs/heads/master: ecd9883724b78cc72ed92c98bcb1a46c764fff21
8 changes: 2 additions & 6 deletions trunk/include/net/dst.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,9 @@ struct dst_entry {
struct net_device *dev;
struct dst_ops *ops;
unsigned long _metrics;
union {
unsigned long expires;
/* point to where the dst_entry copied from */
struct dst_entry *from;
};
unsigned long expires;
struct dst_entry *path;
void *__pad0;
struct dst_entry *from;
#ifdef CONFIG_XFRM
struct xfrm_state *xfrm;
#else
Expand Down
39 changes: 12 additions & 27 deletions trunk/include/net/ip6_fib.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,50 +164,35 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)

static inline void rt6_clean_expires(struct rt6_info *rt)
{
if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from)
dst_release(rt->dst.from);

rt->rt6i_flags &= ~RTF_EXPIRES;
rt->dst.from = NULL;
}

static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires)
{
if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from)
dst_release(rt->dst.from);

rt->rt6i_flags |= RTF_EXPIRES;
rt->dst.expires = expires;
rt->rt6i_flags |= RTF_EXPIRES;
}

static inline void rt6_update_expires(struct rt6_info *rt, int timeout)
static inline void rt6_update_expires(struct rt6_info *rt0, int timeout)
{
if (!(rt->rt6i_flags & RTF_EXPIRES)) {
if (rt->dst.from)
dst_release(rt->dst.from);
/* dst_set_expires relies on expires == 0
* if it has not been set previously.
*/
rt->dst.expires = 0;
}

dst_set_expires(&rt->dst, timeout);
rt->rt6i_flags |= RTF_EXPIRES;
struct rt6_info *rt;

for (rt = rt0; rt && !(rt->rt6i_flags & RTF_EXPIRES);
rt = (struct rt6_info *)rt->dst.from);
if (rt && rt != rt0)
rt0->dst.expires = rt->dst.expires;

dst_set_expires(&rt0->dst, timeout);
rt0->rt6i_flags |= RTF_EXPIRES;
}

static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from)
{
struct dst_entry *new = (struct dst_entry *) from;

if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) {
if (new == rt->dst.from)
return;
dst_release(rt->dst.from);
}

rt->rt6i_flags &= ~RTF_EXPIRES;
rt->dst.from = new;
dst_hold(new);
rt->dst.from = new;
}

static inline void ip6_rt_put(struct rt6_info *rt)
Expand Down
1 change: 1 addition & 0 deletions trunk/net/core/dst.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev,
dst_init_metrics(dst, dst_default_metrics, true);
dst->expires = 0UL;
dst->path = dst;
dst->from = NULL;
#ifdef CONFIG_XFRM
dst->xfrm = NULL;
#endif
Expand Down
8 changes: 3 additions & 5 deletions trunk/net/ipv6/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)
{
struct rt6_info *rt = (struct rt6_info *)dst;
struct inet6_dev *idev = rt->rt6i_idev;
struct dst_entry *from = dst->from;

if (!(rt->dst.flags & DST_HOST))
dst_destroy_metrics_generic(dst);
Expand All @@ -296,8 +297,8 @@ static void ip6_dst_destroy(struct dst_entry *dst)
in6_dev_put(idev);
}

if (!(rt->rt6i_flags & RTF_EXPIRES) && dst->from)
dst_release(dst->from);
dst->from = NULL;
dst_release(from);

if (rt6_has_peer(rt)) {
struct inet_peer *peer = rt6_peer_ptr(rt);
Expand Down Expand Up @@ -1010,7 +1011,6 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori

rt->rt6i_gateway = ort->rt6i_gateway;
rt->rt6i_flags = ort->rt6i_flags;
rt6_clean_expires(rt);
rt->rt6i_metric = 0;

memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
Expand Down Expand Up @@ -1784,8 +1784,6 @@ static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ==
(RTF_DEFAULT | RTF_ADDRCONF))
rt6_set_from(rt, ort);
else
rt6_clean_expires(rt);
rt->rt6i_metric = 0;

#ifdef CONFIG_IPV6_SUBTREES
Expand Down

0 comments on commit 1e7a4cd

Please sign in to comment.