]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/bridge/br_netfilter.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-next-2.6
[net-next-2.6.git] / net / bridge / br_netfilter.c
index 44420992f72f17cc61f9e854ff511c8ec2bb270b..84060bc48f11b86f6d09220c7ca5ec5dd1026843 100644 (file)
@@ -117,26 +117,27 @@ void br_netfilter_rtable_init(struct net_bridge *br)
 {
        struct rtable *rt = &br->fake_rtable;
 
-       atomic_set(&rt->u.dst.__refcnt, 1);
-       rt->u.dst.dev = br->dev;
-       rt->u.dst.path = &rt->u.dst;
-       rt->u.dst.metrics[RTAX_MTU - 1] = 1500;
-       rt->u.dst.flags = DST_NOXFRM;
-       rt->u.dst.ops = &fake_dst_ops;
+       atomic_set(&rt->dst.__refcnt, 1);
+       rt->dst.dev = br->dev;
+       rt->dst.path = &rt->dst;
+       rt->dst.metrics[RTAX_MTU - 1] = 1500;
+       rt->dst.flags   = DST_NOXFRM;
+       rt->dst.ops = &fake_dst_ops;
 }
 
 static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
 {
-       struct net_bridge_port *port = rcu_dereference(dev->br_port);
-
-       return port ? &port->br->fake_rtable : NULL;
+       if (!br_port_exists(dev))
+               return NULL;
+       return &br_port_get_rcu(dev)->br->fake_rtable;
 }
 
 static inline struct net_device *bridge_parent(const struct net_device *dev)
 {
-       struct net_bridge_port *port = rcu_dereference(dev->br_port);
+       if (!br_port_exists(dev))
+               return NULL;
 
-       return port ? port->br->dev : NULL;
+       return br_port_get_rcu(dev)->br->dev;
 }
 
 static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
@@ -244,8 +245,7 @@ static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
                kfree_skb(skb);
                return 0;
        }
-       dst_hold(&rt->u.dst);
-       skb_dst_set(skb, &rt->u.dst);
+       skb_dst_set_noref(skb, &rt->dst);
 
        skb->dev = nf_bridge->physindev;
        nf_bridge_update_protocol(skb);
@@ -396,8 +396,7 @@ bridged_dnat:
                        kfree_skb(skb);
                        return 0;
                }
-               dst_hold(&rt->u.dst);
-               skb_dst_set(skb, &rt->u.dst);
+               skb_dst_set_noref(skb, &rt->dst);
        }
 
        skb->dev = nf_bridge->physindev;