]> Pileus Git - ~andy/linux/blobdiff - net/sched/act_police.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[~andy/linux] / net / sched / act_police.c
index 0cc305e7e4690043e3228c8425f73d384c51bf69..9295b86d5319f6537157efe75adbd1e3f15eaa84 100644 (file)
@@ -162,10 +162,12 @@ static int tcf_act_police_locate(struct net *net, struct nlattr *nla,
                        if (bind) {
                                police->tcf_bindcnt += 1;
                                police->tcf_refcnt += 1;
+                               return 0;
                        }
                        if (ovr)
                                goto override;
-                       return ret;
+                       /* not replacing */
+                       return -EEXIST;
                }
        }
 
@@ -261,10 +263,8 @@ override:
 failure_unlock:
        spin_unlock_bh(&police->tcf_lock);
 failure:
-       if (P_tab)
-               qdisc_put_rtab(P_tab);
-       if (R_tab)
-               qdisc_put_rtab(R_tab);
+       qdisc_put_rtab(P_tab);
+       qdisc_put_rtab(R_tab);
        if (ret == ACT_P_CREATED)
                kfree(police);
        return err;
@@ -398,7 +398,7 @@ static struct tc_action_ops act_police_ops = {
 static int __init
 police_init_module(void)
 {
-       int err = tcf_hashinfo_init(&police_hash_info, POL_TAB_MASK+1);
+       int err = tcf_hashinfo_init(&police_hash_info, POL_TAB_MASK);
        if (err)
                return err;
        err = tcf_register_action(&act_police_ops);