rcu_assign_pointer(tp_c->hlist, root_ht);
        root_ht->tp_c = tp_c;
 
+       root_ht->refcnt++;
        rcu_assign_pointer(tp->root, root_ht);
        tp->data = tp_c;
        return 0;
        struct tc_u_hnode __rcu **hn;
        struct tc_u_hnode *phn;
 
-       WARN_ON(ht->refcnt);
+       WARN_ON(--ht->refcnt);
 
        u32_clear_hnode(tp, ht, extack);
 
 
        WARN_ON(root_ht == NULL);
 
-       if (root_ht && --root_ht->refcnt == 0)
+       if (root_ht && --root_ht->refcnt == 1)
                u32_destroy_hnode(tp, root_ht, extack);
 
        if (--tp_c->refcnt == 0) {
        }
 
        if (ht->refcnt == 1) {
-               ht->refcnt--;
                u32_destroy_hnode(tp, ht, extack);
        } else {
                NL_SET_ERR_MSG_MOD(extack, "Can not delete in-use filter");
 out:
        *last = true;
        if (root_ht) {
-               if (root_ht->refcnt > 1) {
+               if (root_ht->refcnt > 2) {
                        *last = false;
                        goto ret;
                }
-               if (root_ht->refcnt == 1) {
+               if (root_ht->refcnt == 2) {
                        if (!ht_empty(root_ht)) {
                                *last = false;
                                goto ret;