Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / net / core / neighbour.c
index 19b8e00..d8d0ca9 100644 (file)
@@ -388,7 +388,7 @@ struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
        hash_val = tbl->hash(pkey, NULL);
        for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
                if (!memcmp(n->primary_key, pkey, key_len) &&
-                   (net == n->dev->nd_net)) {
+                   net_eq(dev_net(n->dev), net)) {
                        neigh_hold(n);
                        NEIGH_CACHE_STAT_INC(tbl, hits);
                        break;
@@ -480,7 +480,7 @@ struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
 
        for (n = tbl->phash_buckets[hash_val]; n; n = n->next) {
                if (!memcmp(n->key, pkey, key_len) &&
-                   (n->net == net) &&
+                   (pneigh_net(n) == net) &&
                    (n->dev == dev || !n->dev))
                        break;
        }
@@ -505,7 +505,7 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
 
        for (n = tbl->phash_buckets[hash_val]; n; n = n->next) {
                if (!memcmp(n->key, pkey, key_len) &&
-                   (n->net == net) &&
+                   net_eq(pneigh_net(n), net) &&
                    (n->dev == dev || !n->dev)) {
                        read_unlock_bh(&tbl->lock);
                        goto out;
@@ -522,7 +522,9 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
        if (!n)
                goto out;
 
+#ifdef CONFIG_NET_NS
        n->net = hold_net(net);
+#endif
        memcpy(n->key, pkey, key_len);
        n->dev = dev;
        if (dev)
@@ -562,14 +564,14 @@ int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey,
        for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL;
             np = &n->next) {
                if (!memcmp(n->key, pkey, key_len) && n->dev == dev &&
-                   (n->net == net)) {
+                   net_eq(pneigh_net(n), net)) {
                        *np = n->next;
                        write_unlock_bh(&tbl->lock);
                        if (tbl->pdestructor)
                                tbl->pdestructor(n);
                        if (n->dev)
                                dev_put(n->dev);
-                       release_net(n->net);
+                       release_net(pneigh_net(n));
                        kfree(n);
                        return 0;
                }
@@ -592,7 +594,7 @@ static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
                                        tbl->pdestructor(n);
                                if (n->dev)
                                        dev_put(n->dev);
-                               release_net(n->net);
+                               release_net(pneigh_net(n));
                                kfree(n);
                                continue;
                        }
@@ -1306,9 +1308,7 @@ static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
        struct neigh_parms *p;
 
        for (p = &tbl->parms; p; p = p->next) {
-               if (p->net != net)
-                       continue;
-               if ((p->dev && p->dev->ifindex == ifindex) ||
+               if ((p->dev && p->dev->ifindex == ifindex && net_eq(neigh_parms_net(p), net)) ||
                    (!p->dev && !ifindex))
                        return p;
        }
@@ -1322,7 +1322,7 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
        struct neigh_parms *p, *ref;
        struct net *net;
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        ref = lookup_neigh_params(tbl, net, 0);
        if (!ref)
                return NULL;
@@ -1342,7 +1342,9 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
 
                dev_hold(dev);
                p->dev = dev;
+#ifdef CONFIG_NET_NS
                p->net = hold_net(net);
+#endif
                p->sysctl_table = NULL;
                write_lock_bh(&tbl->lock);
                p->next         = tbl->parms.next;
@@ -1384,7 +1386,7 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
 
 static void neigh_parms_destroy(struct neigh_parms *parms)
 {
-       release_net(parms->net);
+       release_net(neigh_parms_net(parms));
        kfree(parms);
 }
 
@@ -1395,7 +1397,9 @@ void neigh_table_init_no_netlink(struct neigh_table *tbl)
        unsigned long now = jiffies;
        unsigned long phsize;
 
+#ifdef CONFIG_NET_NS
        tbl->parms.net = &init_net;
+#endif
        atomic_set(&tbl->parms.refcnt, 1);
        INIT_RCU_HEAD(&tbl->parms.rcu_head);
        tbl->parms.reachable_time =
@@ -1502,7 +1506,7 @@ int neigh_table_clear(struct neigh_table *tbl)
 
 static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ndmsg *ndm;
        struct nlattr *dst_attr;
        struct neigh_table *tbl;
@@ -1568,7 +1572,7 @@ out:
 
 static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ndmsg *ndm;
        struct nlattr *tb[NDA_MAX+1];
        struct neigh_table *tbl;
@@ -1836,7 +1840,7 @@ static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
 
 static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct neigh_table *tbl;
        struct ndtmsg *ndtmsg;
        struct nlattr *tb[NDTA_MAX+1];
@@ -1961,7 +1965,7 @@ errout:
 
 static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int family, tidx, nidx = 0;
        int tbl_skip = cb->args[0];
        int neigh_skip = cb->args[1];
@@ -1982,7 +1986,7 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
                        break;
 
                for (nidx = 0, p = tbl->parms.next; p; p = p->next) {
-                       if (net != p->net)
+                       if (!net_eq(neigh_parms_net(p), net))
                                continue;
 
                        if (nidx++ < neigh_skip)
@@ -2061,7 +2065,7 @@ static void neigh_update_notify(struct neighbour *neigh)
 static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                            struct netlink_callback *cb)
 {
-       struct net * net = skb->sk->sk_net;
+       struct net * net = sock_net(skb->sk);
        struct neighbour *n;
        int rc, h, s_h = cb->args[1];
        int idx, s_idx = idx = cb->args[2];
@@ -2074,7 +2078,7 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                        s_idx = 0;
                for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
                        int lidx;
-                       if (n->dev->nd_net != net)
+                       if (dev_net(n->dev) != net)
                                continue;
                        lidx = idx++;
                        if (lidx < s_idx)
@@ -2169,7 +2173,7 @@ EXPORT_SYMBOL(__neigh_for_each_release);
 static struct neighbour *neigh_get_first(struct seq_file *seq)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
        struct neighbour *n = NULL;
        int bucket = state->bucket;
@@ -2179,7 +2183,7 @@ static struct neighbour *neigh_get_first(struct seq_file *seq)
                n = tbl->hash_buckets[bucket];
 
                while (n) {
-                       if (n->dev->nd_net != net)
+                       if (!net_eq(dev_net(n->dev), net))
                                goto next;
                        if (state->neigh_sub_iter) {
                                loff_t fakep = 0;
@@ -2210,7 +2214,7 @@ static struct neighbour *neigh_get_next(struct seq_file *seq,
                                        loff_t *pos)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
 
        if (state->neigh_sub_iter) {
@@ -2222,7 +2226,7 @@ static struct neighbour *neigh_get_next(struct seq_file *seq,
 
        while (1) {
                while (n) {
-                       if (n->dev->nd_net != net)
+                       if (!net_eq(dev_net(n->dev), net))
                                goto next;
                        if (state->neigh_sub_iter) {
                                void *v = state->neigh_sub_iter(state, n, pos);
@@ -2270,7 +2274,7 @@ static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos)
 static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net * net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
        struct pneigh_entry *pn = NULL;
        int bucket = state->bucket;
@@ -2278,7 +2282,7 @@ static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
        state->flags |= NEIGH_SEQ_IS_PNEIGH;
        for (bucket = 0; bucket <= PNEIGH_HASHMASK; bucket++) {
                pn = tbl->phash_buckets[bucket];
-               while (pn && (pn->net != net))
+               while (pn && !net_eq(pneigh_net(pn), net))
                        pn = pn->next;
                if (pn)
                        break;
@@ -2293,7 +2297,7 @@ static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
                                            loff_t *pos)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net * net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
 
        pn = pn->next;
@@ -2301,7 +2305,7 @@ static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
                if (++state->bucket > PNEIGH_HASHMASK)
                        break;
                pn = tbl->phash_buckets[state->bucket];
-               while (pn && (pn->net != net))
+               while (pn && !net_eq(pneigh_net(pn), net))
                        pn = pn->next;
                if (pn)
                        break;
@@ -2506,7 +2510,7 @@ static inline size_t neigh_nlmsg_size(void)
 
 static void __neigh_notify(struct neighbour *n, int type, int flags)
 {
-       struct net *net = n->dev->nd_net;
+       struct net *net = dev_net(n->dev);
        struct sk_buff *skb;
        int err = -ENOBUFS;
 
@@ -2763,7 +2767,8 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
        neigh_path[NEIGH_CTL_PATH_PROTO].procname = p_name;
        neigh_path[NEIGH_CTL_PATH_PROTO].ctl_name = p_id;
 
-       t->sysctl_header = register_sysctl_paths(neigh_path, t->neigh_vars);
+       t->sysctl_header =
+               register_net_sysctl_table(neigh_parms_net(p), neigh_path, t->neigh_vars);
        if (!t->sysctl_header)
                goto free_procname;