CAPABILITIES: remove undefined caps from all processes
[cascardo/linux.git] / net / sched / act_ipt.c
index 0a6d621..8a64a07 100644 (file)
@@ -29,7 +29,6 @@
 
 
 #define IPT_TAB_MASK     15
-static struct tcf_hashinfo ipt_hash_info;
 
 static int ipt_init_target(struct xt_entry_target *t, char *table, unsigned int hook)
 {
@@ -69,22 +68,12 @@ static void ipt_destroy_target(struct xt_entry_target *t)
        module_put(par.target->me);
 }
 
-static int tcf_ipt_release(struct tcf_ipt *ipt, int bind)
+static void tcf_ipt_release(struct tc_action *a, int bind)
 {
-       int ret = 0;
-       if (ipt) {
-               if (bind)
-                       ipt->tcf_bindcnt--;
-               ipt->tcf_refcnt--;
-               if (ipt->tcf_bindcnt <= 0 && ipt->tcf_refcnt <= 0) {
-                       ipt_destroy_target(ipt->tcfi_t);
-                       kfree(ipt->tcfi_tname);
-                       kfree(ipt->tcfi_t);
-                       tcf_hash_destroy(&ipt->common, &ipt_hash_info);
-                       ret = ACT_P_DELETED;
-               }
-       }
-       return ret;
+       struct tcf_ipt *ipt = to_ipt(a);
+       ipt_destroy_target(ipt->tcfi_t);
+       kfree(ipt->tcfi_tname);
+       kfree(ipt->tcfi_t);
 }
 
 static const struct nla_policy ipt_policy[TCA_IPT_MAX + 1] = {
@@ -99,7 +88,6 @@ static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est,
 {
        struct nlattr *tb[TCA_IPT_MAX + 1];
        struct tcf_ipt *ipt;
-       struct tcf_common *pc;
        struct xt_entry_target *td, *t;
        char *tname;
        int ret = 0, err;
@@ -125,21 +113,20 @@ static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est,
        if (tb[TCA_IPT_INDEX] != NULL)
                index = nla_get_u32(tb[TCA_IPT_INDEX]);
 
-       pc = tcf_hash_check(index, a, bind);
-       if (!pc) {
-               pc = tcf_hash_create(index, est, a, sizeof(*ipt), bind);
-               if (IS_ERR(pc))
-                       return PTR_ERR(pc);
+       if (!tcf_hash_check(index, a, bind) ) {
+               ret = tcf_hash_create(index, est, a, sizeof(*ipt), bind);
+               if (ret)
+                       return ret;
                ret = ACT_P_CREATED;
        } else {
                if (bind)/* dont override defaults */
                        return 0;
-               tcf_ipt_release(to_ipt(pc), bind);
+               tcf_hash_release(a, bind);
 
                if (!ovr)
                        return -EEXIST;
        }
-       ipt = to_ipt(pc);
+       ipt = to_ipt(a);
 
        hook = nla_get_u32(tb[TCA_IPT_HOOK]);
 
@@ -170,7 +157,7 @@ static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est,
        ipt->tcfi_hook  = hook;
        spin_unlock_bh(&ipt->tcf_lock);
        if (ret == ACT_P_CREATED)
-               tcf_hash_insert(pc, a->ops->hinfo);
+               tcf_hash_insert(a);
        return ret;
 
 err3:
@@ -178,21 +165,11 @@ err3:
 err2:
        kfree(tname);
 err1:
-       if (ret == ACT_P_CREATED) {
-               if (est)
-                       gen_kill_estimator(&pc->tcfc_bstats,
-                                          &pc->tcfc_rate_est);
-               kfree_rcu(pc, tcfc_rcu);
-       }
+       if (ret == ACT_P_CREATED)
+               tcf_hash_cleanup(a, est);
        return err;
 }
 
-static int tcf_ipt_cleanup(struct tc_action *a, int bind)
-{
-       struct tcf_ipt *ipt = a->priv;
-       return tcf_ipt_release(ipt, bind);
-}
-
 static int tcf_ipt(struct sk_buff *skb, const struct tc_action *a,
                   struct tcf_result *res)
 {
@@ -284,23 +261,21 @@ nla_put_failure:
 
 static struct tc_action_ops act_ipt_ops = {
        .kind           =       "ipt",
-       .hinfo          =       &ipt_hash_info,
        .type           =       TCA_ACT_IPT,
        .owner          =       THIS_MODULE,
        .act            =       tcf_ipt,
        .dump           =       tcf_ipt_dump,
-       .cleanup        =       tcf_ipt_cleanup,
+       .cleanup        =       tcf_ipt_release,
        .init           =       tcf_ipt_init,
 };
 
 static struct tc_action_ops act_xt_ops = {
        .kind           =       "xt",
-       .hinfo          =       &ipt_hash_info,
        .type           =       TCA_ACT_XT,
        .owner          =       THIS_MODULE,
        .act            =       tcf_ipt,
        .dump           =       tcf_ipt_dump,
-       .cleanup        =       tcf_ipt_cleanup,
+       .cleanup        =       tcf_ipt_release,
        .init           =       tcf_ipt_init,
 };
 
@@ -311,20 +286,16 @@ MODULE_ALIAS("act_xt");
 
 static int __init ipt_init_module(void)
 {
-       int ret1, ret2, err;
-       err = tcf_hashinfo_init(&ipt_hash_info, IPT_TAB_MASK);
-       if (err)
-               return err;
+       int ret1, ret2;
 
-       ret1 = tcf_register_action(&act_xt_ops);
+       ret1 = tcf_register_action(&act_xt_ops, IPT_TAB_MASK);
        if (ret1 < 0)
                printk("Failed to load xt action\n");
-       ret2 = tcf_register_action(&act_ipt_ops);
+       ret2 = tcf_register_action(&act_ipt_ops, IPT_TAB_MASK);
        if (ret2 < 0)
                printk("Failed to load ipt action\n");
 
        if (ret1 < 0 && ret2 < 0) {
-               tcf_hashinfo_destroy(&ipt_hash_info);
                return ret1;
        } else
                return 0;
@@ -334,7 +305,6 @@ static void __exit ipt_cleanup_module(void)
 {
        tcf_unregister_action(&act_xt_ops);
        tcf_unregister_action(&act_ipt_ops);
-       tcf_hashinfo_destroy(&ipt_hash_info);
 }
 
 module_init(ipt_init_module);