]> Pileus Git - ~andy/linux/blobdiff - net/sched/act_gact.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[~andy/linux] / net / sched / act_gact.c
index fd2b3cff5fa28cf4da25690da9e7bad410c60a78..af5641c290fa1297543421b0691a7b6e63ae6078 100644 (file)
 #include <net/tc_act/tc_gact.h>
 
 #define GACT_TAB_MASK  15
-static struct tcf_common *tcf_gact_ht[GACT_TAB_MASK + 1];
 static u32 gact_idx_gen;
-static DEFINE_RWLOCK(gact_lock);
-
-static struct tcf_hashinfo gact_hash_info = {
-       .htab   =       tcf_gact_ht,
-       .hmask  =       GACT_TAB_MASK,
-       .lock   =       &gact_lock,
-};
+static struct tcf_hashinfo gact_hash_info;
 
 #ifdef CONFIG_GACT_PROB
 static int gact_net_rand(struct tcf_gact *gact)
@@ -102,10 +95,11 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla,
                        return PTR_ERR(pc);
                ret = ACT_P_CREATED;
        } else {
-               if (!ovr) {
-                       tcf_hash_release(pc, bind, &gact_hash_info);
+               if (bind)/* dont override defaults */
+                       return 0;
+               tcf_hash_release(pc, bind, &gact_hash_info);
+               if (!ovr)
                        return -EEXIST;
-               }
        }
 
        gact = to_gact(pc);
@@ -206,9 +200,7 @@ static struct tc_action_ops act_gact_ops = {
        .act            =       tcf_gact,
        .dump           =       tcf_gact_dump,
        .cleanup        =       tcf_gact_cleanup,
-       .lookup         =       tcf_hash_search,
        .init           =       tcf_gact_init,
-       .walk           =       tcf_generic_walker
 };
 
 MODULE_AUTHOR("Jamal Hadi Salim(2002-4)");
@@ -217,6 +209,9 @@ MODULE_LICENSE("GPL");
 
 static int __init gact_init_module(void)
 {
+       int err = tcf_hashinfo_init(&gact_hash_info, GACT_TAB_MASK);
+       if (err)
+               return err;
 #ifdef CONFIG_GACT_PROB
        pr_info("GACT probability on\n");
 #else
@@ -228,6 +223,7 @@ static int __init gact_init_module(void)
 static void __exit gact_cleanup_module(void)
 {
        tcf_unregister_action(&act_gact_ops);
+       tcf_hashinfo_destroy(&gact_hash_info);
 }
 
 module_init(gact_init_module);