bool create);
 void tcf_chain_put(struct tcf_chain *chain);
 int tcf_block_get(struct tcf_block **p_block,
-                 struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q);
+                 struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
+                 struct netlink_ext_ack *extack);
 int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
-                     struct tcf_block_ext_info *ei);
+                     struct tcf_block_ext_info *ei,
+                     struct netlink_ext_ack *extack);
 void tcf_block_put(struct tcf_block *block);
 void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q,
                       struct tcf_block_ext_info *ei);
 
 }
 
 int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q,
-                     struct tcf_block_ext_info *ei)
+                     struct tcf_block_ext_info *ei,
+                     struct netlink_ext_ack *extack)
 {
        struct tcf_block *block = kzalloc(sizeof(*block), GFP_KERNEL);
        struct tcf_chain *chain;
        int err;
 
-       if (!block)
+       if (!block) {
+               NL_SET_ERR_MSG(extack, "Memory allocation for block failed");
                return -ENOMEM;
+       }
        INIT_LIST_HEAD(&block->chain_list);
        INIT_LIST_HEAD(&block->cb_list);
 
        /* Create chain 0 by default, it has to be always present. */
        chain = tcf_chain_create(block, 0);
        if (!chain) {
+               NL_SET_ERR_MSG(extack, "Failed to create new tcf chain");
                err = -ENOMEM;
                goto err_chain_create;
        }
 }
 
 int tcf_block_get(struct tcf_block **p_block,
-                 struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q)
+                 struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q,
+                 struct netlink_ext_ack *extack)
 {
        struct tcf_block_ext_info ei = {
                .chain_head_change = tcf_chain_head_change_dflt,
        };
 
        WARN_ON(!p_filter_chain);
-       return tcf_block_get_ext(p_block, q, &ei);
+       return tcf_block_get_ext(p_block, q, &ei, extack);
 }
 EXPORT_SYMBOL(tcf_block_get);
 
 
                goto err_out;
        }
 
-       error = tcf_block_get(&flow->block, &flow->filter_list, sch);
+       error = tcf_block_get(&flow->block, &flow->filter_list, sch,
+                             extack);
        if (error) {
                kfree(flow);
                goto err_out;
                p->link.q = &noop_qdisc;
        pr_debug("atm_tc_init: link (%p) qdisc %p\n", &p->link, p->link.q);
 
-       err = tcf_block_get(&p->link.block, &p->link.filter_list, sch);
+       err = tcf_block_get(&p->link.block, &p->link.filter_list, sch,
+                           extack);
        if (err)
                return err;
 
 
        if (!q->link.R_tab)
                return -EINVAL;
 
-       err = tcf_block_get(&q->link.block, &q->link.filter_list, sch);
+       err = tcf_block_get(&q->link.block, &q->link.filter_list, sch, extack);
        if (err)
                goto put_rtab;
 
        if (cl == NULL)
                goto failure;
 
-       err = tcf_block_get(&cl->block, &cl->filter_list, sch);
+       err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
        if (err) {
                kfree(cl);
                return err;
 
        struct drr_sched *q = qdisc_priv(sch);
        int err;
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
        err = qdisc_class_hash_init(&q->clhash);
 
        if (!opt)
                goto errout;
 
-       err = tcf_block_get(&p->block, &p->filter_list, sch);
+       err = tcf_block_get(&p->block, &p->filter_list, sch, extack);
        if (err)
                return err;
 
 
                        return err;
        }
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
 
 
        if (cl == NULL)
                return -ENOBUFS;
 
-       err = tcf_block_get(&cl->block, &cl->filter_list, sch);
+       err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
        if (err) {
                kfree(cl);
                return err;
                return err;
        q->eligible = RB_ROOT;
 
-       err = tcf_block_get(&q->root.block, &q->root.filter_list, sch);
+       err = tcf_block_get(&q->root.block, &q->root.filter_list, sch, extack);
        if (err)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
 
                if (!cl)
                        goto failure;
 
-               err = tcf_block_get(&cl->block, &cl->filter_list, sch);
+               err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
                if (err) {
                        kfree(cl);
                        goto failure;
 
        q->block_info.chain_head_change = clsact_chain_head_change;
        q->block_info.chain_head_change_priv = &q->miniqp;
 
-       err = tcf_block_get_ext(&q->block, sch, &q->block_info);
+       err = tcf_block_get_ext(&q->block, sch, &q->block_info, extack);
        if (err)
                return err;
 
        q->ingress_block_info.chain_head_change = clsact_chain_head_change;
        q->ingress_block_info.chain_head_change_priv = &q->miniqp_ingress;
 
-       err = tcf_block_get_ext(&q->ingress_block, sch, &q->ingress_block_info);
+       err = tcf_block_get_ext(&q->ingress_block, sch, &q->ingress_block_info,
+                               extack);
        if (err)
                return err;
 
        q->egress_block_info.chain_head_change = clsact_chain_head_change;
        q->egress_block_info.chain_head_change_priv = &q->miniqp_egress;
 
-       err = tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info);
+       err = tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info,
+                               extack);
        if (err)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
 
 
        if (!opt)
                return -EINVAL;
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
 
 
        int i, j, err;
        u32 max_cl_shift, maxbudg_shift, max_classes;
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
 
 
        struct sfb_sched_data *q = qdisc_priv(sch);
        int err;
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;
 
 
        q->sch = sch;
        timer_setup(&q->perturb_timer, sfq_perturbation, TIMER_DEFERRABLE);
 
-       err = tcf_block_get(&q->block, &q->filter_list, sch);
+       err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
        if (err)
                return err;