struct module           *owner;
        int     (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *);
        int     (*dump)(struct sk_buff *, struct tc_action *, int, int);
-       int     (*cleanup)(struct tc_action *, int bind);
+       void    (*cleanup)(struct tc_action *, int bind);
        int     (*lookup)(struct tc_action *, u32);
        int     (*init)(struct net *net, struct nlattr *nla,
                        struct nlattr *est, struct tc_action *act, int ovr,
 
 
                p->tcfc_refcnt--;
                if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) {
+                       if (a->ops->cleanup)
+                               a->ops->cleanup(a, bind);
                        tcf_hash_destroy(a);
                        ret = 1;
                }
 {
        struct tc_action_ops *a;
 
-       /* Must supply act, dump, cleanup and init */
-       if (!act->act || !act->dump || !act->cleanup || !act->init)
+       /* Must supply act, dump and init */
+       if (!act->act || !act->dump || !act->init)
                return -EINVAL;
 
        /* Supply defaults */
        struct tc_action *a, *tmp;
 
        list_for_each_entry_safe(a, tmp, actions, list) {
-               if (a->ops->cleanup(a, bind) == ACT_P_DELETED)
+               if (tcf_hash_release(a, bind) == ACT_P_DELETED)
                        module_put(a->ops->owner);
                list_del(&a->list);
                kfree(a);
 
        .owner          = THIS_MODULE,
        .act            = tcf_csum,
        .dump           = tcf_csum_dump,
-       .cleanup        = tcf_hash_release,
        .init           = tcf_csum_init,
 };
 
 
        .owner          =       THIS_MODULE,
        .act            =       tcf_gact,
        .dump           =       tcf_gact_dump,
-       .cleanup        =       tcf_hash_release,
        .init           =       tcf_gact_init,
 };
 
 
        module_put(par.target->me);
 }
 
-static int tcf_ipt_release(struct tc_action *a, int bind)
+static void tcf_ipt_release(struct tc_action *a, int bind)
 {
        struct tcf_ipt *ipt = to_ipt(a);
-       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(a);
-                       ret = ACT_P_DELETED;
-               }
-       }
-       return ret;
+       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] = {
        } else {
                if (bind)/* dont override defaults */
                        return 0;
-               tcf_ipt_release(a, bind);
+               tcf_hash_release(a, bind);
 
                if (!ovr)
                        return -EEXIST;
 
 static LIST_HEAD(mirred_list);
 static struct tcf_hashinfo mirred_hash_info;
 
-static int tcf_mirred_release(struct tc_action *a, int bind)
+static void tcf_mirred_release(struct tc_action *a, int bind)
 {
        struct tcf_mirred *m = to_mirred(a);
-       if (m) {
-               if (bind)
-                       m->tcf_bindcnt--;
-               m->tcf_refcnt--;
-               if (!m->tcf_bindcnt && m->tcf_refcnt <= 0) {
-                       list_del(&m->tcfm_list);
-                       if (m->tcfm_dev)
-                               dev_put(m->tcfm_dev);
-                       tcf_hash_destroy(a);
-                       return 1;
-               }
-       }
-       return 0;
+       list_del(&m->tcfm_list);
+       if (m->tcfm_dev)
+               dev_put(m->tcfm_dev);
 }
 
 static const struct nla_policy mirred_policy[TCA_MIRRED_MAX + 1] = {
                ret = ACT_P_CREATED;
        } else {
                if (!ovr) {
-                       tcf_mirred_release(a, bind);
+                       tcf_hash_release(a, bind);
                        return -EEXIST;
                }
        }
 
        .owner          =       THIS_MODULE,
        .act            =       tcf_nat,
        .dump           =       tcf_nat_dump,
-       .cleanup        =       tcf_hash_release,
        .init           =       tcf_nat_init,
 };
 
 
        return ret;
 }
 
-static int tcf_pedit_cleanup(struct tc_action *a, int bind)
+static void tcf_pedit_cleanup(struct tc_action *a, int bind)
 {
        struct tcf_pedit *p = a->priv;
-
-       if (p) {
-               struct tc_pedit_key *keys = p->tcfp_keys;
-               if (tcf_hash_release(a, bind)) {
-                       kfree(keys);
-                       return 1;
-               }
-       }
-       return 0;
+       struct tc_pedit_key *keys = p->tcfp_keys;
+       kfree(keys);
 }
 
 static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
 
        .owner          =       THIS_MODULE,
        .act            =       tcf_act_police,
        .dump           =       tcf_act_police_dump,
-       .cleanup        =       tcf_hash_release,
        .init           =       tcf_act_police_locate,
        .walk           =       tcf_act_police_walker
 };
 
        return d->tcf_action;
 }
 
-static int tcf_simp_release(struct tc_action *a, int bind)
+static void tcf_simp_release(struct tc_action *a, int bind)
 {
        struct tcf_defact *d = to_defact(a);
-       int ret = 0;
-       if (d) {
-               if (bind)
-                       d->tcf_bindcnt--;
-               d->tcf_refcnt--;
-               if (d->tcf_bindcnt <= 0 && d->tcf_refcnt <= 0) {
-                       kfree(d->tcfd_defdata);
-                       tcf_hash_destroy(a);
-                       ret = 1;
-               }
-       }
-       return ret;
+       kfree(d->tcfd_defdata);
 }
 
 static int alloc_defdata(struct tcf_defact *d, char *defdata)
 
                if (bind)
                        return 0;
-               tcf_simp_release(a, bind);
+               tcf_hash_release(a, bind);
                if (!ovr)
                        return -EEXIST;
 
 
        .owner          =       THIS_MODULE,
        .act            =       tcf_skbedit,
        .dump           =       tcf_skbedit_dump,
-       .cleanup        =       tcf_hash_release,
        .init           =       tcf_skbedit_init,
 };