{
        struct tcf_block *block = chain->block;
        const struct tcf_proto_ops *tmplt_ops;
-       bool is_last, free_block = false;
+       bool free_block = false;
        unsigned int refcnt;
        void *tmplt_priv;
-       u32 chain_index;
 
        mutex_lock(&block->lock);
        if (explicitly_created) {
         * save these to temporary variables.
         */
        refcnt = --chain->refcnt;
-       is_last = refcnt - chain->action_refcnt == 0;
        tmplt_ops = chain->tmplt_ops;
        tmplt_priv = chain->tmplt_priv;
-       chain_index = chain->index;
-
-       if (refcnt == 0)
-               free_block = tcf_chain_detach(chain);
-       mutex_unlock(&block->lock);
 
        /* The last dropped non-action reference will trigger notification. */
-       if (is_last && !by_act) {
-               tc_chain_notify_delete(tmplt_ops, tmplt_priv, chain_index,
+       if (refcnt - chain->action_refcnt == 0 && !by_act) {
+               tc_chain_notify_delete(tmplt_ops, tmplt_priv, chain->index,
                                       block, NULL, 0, 0, false);
                /* Last reference to chain, no need to lock. */
                chain->flushing = false;
        }
 
+       if (refcnt == 0)
+               free_block = tcf_chain_detach(chain);
+       mutex_unlock(&block->lock);
+
        if (refcnt == 0) {
                tc_chain_tmplt_del(tmplt_ops, tmplt_priv);
                tcf_chain_destroy(chain, free_block);