]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/netfilter/nfnetlink.c
PCI: Add pcibios_bus_add_device() weak function
[karo-tx-linux.git] / net / netfilter / nfnetlink.c
index 77afe913d03db73c65631fba8c42732cb3f33f32..a7ba23353dab938b4048095e50da9eb463dfc477 100644 (file)
@@ -33,6 +33,10 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_NETFILTER);
 
+#define nfnl_dereference_protected(id) \
+       rcu_dereference_protected(table[(id)].subsys, \
+                                 lockdep_nfnl_is_held((id)))
+
 static char __initdata nfversion[] = "0.30";
 
 static struct {
@@ -49,6 +53,7 @@ static const int nfnl_group2type[NFNLGRP_MAX+1] = {
        [NFNLGRP_CONNTRACK_EXP_DESTROY] = NFNL_SUBSYS_CTNETLINK_EXP,
        [NFNLGRP_NFTABLES]              = NFNL_SUBSYS_NFTABLES,
        [NFNLGRP_ACCT_QUOTA]            = NFNL_SUBSYS_ACCT,
+       [NFNLGRP_NFTRACE]               = NFNL_SUBSYS_NFTABLES,
 };
 
 void nfnl_lock(__u8 subsys_id)
@@ -201,19 +206,18 @@ replay:
                }
 
                if (nc->call_rcu) {
-                       err = nc->call_rcu(net->nfnl, skb, nlh,
+                       err = nc->call_rcu(net, net->nfnl, skb, nlh,
                                           (const struct nlattr **)cda);
                        rcu_read_unlock();
                } else {
                        rcu_read_unlock();
                        nfnl_lock(subsys_id);
-                       if (rcu_dereference_protected(table[subsys_id].subsys,
-                               lockdep_is_held(&table[subsys_id].mutex)) != ss ||
+                       if (nfnl_dereference_protected(subsys_id) != ss ||
                            nfnetlink_find_client(type, ss) != nc)
                                err = -EAGAIN;
                        else if (nc->call)
-                               err = nc->call(net->nfnl, skb, nlh,
-                                                  (const struct nlattr **)cda);
+                               err = nc->call(net, net->nfnl, skb, nlh,
+                                              (const struct nlattr **)cda);
                        else
                                err = -EINVAL;
                        nfnl_unlock(subsys_id);
@@ -296,15 +300,13 @@ replay:
                return netlink_ack(oskb, nlh, -ENOMEM);
 
        nfnl_lock(subsys_id);
-       ss = rcu_dereference_protected(table[subsys_id].subsys,
-                                      lockdep_is_held(&table[subsys_id].mutex));
+       ss = nfnl_dereference_protected(subsys_id);
        if (!ss) {
 #ifdef CONFIG_MODULES
                nfnl_unlock(subsys_id);
                request_module("nfnetlink-subsys-%d", subsys_id);
                nfnl_lock(subsys_id);
-               ss = rcu_dereference_protected(table[subsys_id].subsys,
-                                              lockdep_is_held(&table[subsys_id].mutex));
+               ss = nfnl_dereference_protected(subsys_id);
                if (!ss)
 #endif
                {
@@ -423,15 +425,15 @@ next:
        }
 done:
        if (status & NFNL_BATCH_REPLAY) {
-               ss->abort(oskb);
+               ss->abort(net, oskb);
                nfnl_err_reset(&err_list);
                nfnl_unlock(subsys_id);
                kfree_skb(skb);
                goto replay;
        } else if (status == NFNL_BATCH_DONE) {
-               ss->commit(oskb);
+               ss->commit(net, oskb);
        } else {
-               ss->abort(oskb);
+               ss->abort(net, oskb);
        }
 
        nfnl_err_deliver(&err_list, oskb);