Functions tcf_block_get{_ext}() and tcf_block_put{_ext}() actually attach/detach block to specific Qdisc besides just taking/putting reference. Rename them according to their purpose.
Signed-off-by: Vlad Buslov <vla...@mellanox.com> Acked-by: Jiri Pirko <j...@mellanox.com> --- include/net/pkt_cls.h | 36 ++++++++++++++++++------------------ net/sched/cls_api.c | 31 +++++++++++++++---------------- net/sched/sch_atm.c | 12 ++++++------ net/sched/sch_cake.c | 4 ++-- net/sched/sch_cbq.c | 13 +++++++------ net/sched/sch_drr.c | 4 ++-- net/sched/sch_dsmark.c | 4 ++-- net/sched/sch_fq_codel.c | 4 ++-- net/sched/sch_hfsc.c | 11 ++++++----- net/sched/sch_htb.c | 13 +++++++------ net/sched/sch_ingress.c | 15 ++++++++------- net/sched/sch_multiq.c | 4 ++-- net/sched/sch_prio.c | 4 ++-- net/sched/sch_qfq.c | 4 ++-- net/sched/sch_sfb.c | 4 ++-- net/sched/sch_sfq.c | 4 ++-- 16 files changed, 85 insertions(+), 82 deletions(-) diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 75a3f3fdb359..9c11f8d83c1c 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -44,15 +44,15 @@ struct tcf_chain *tcf_chain_get_by_act(struct tcf_block *block, u32 chain_index); void tcf_chain_put_by_act(struct tcf_chain *chain); void tcf_block_netif_keep_dst(struct tcf_block *block); -int tcf_block_get(struct tcf_block **p_block, - 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 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_attach(struct tcf_block **p_block, + struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q, + struct netlink_ext_ack *extack); +int tcf_block_attach_ext(struct tcf_block **p_block, struct Qdisc *q, + struct tcf_block_ext_info *ei, + struct netlink_ext_ack *extack); +void tcf_block_detach(struct tcf_block *block); +void tcf_block_detach_ext(struct tcf_block *block, struct Qdisc *q, + struct tcf_block_ext_info *ei); static inline bool tcf_block_shared(struct tcf_block *block) { @@ -92,28 +92,28 @@ int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp, #else static inline -int tcf_block_get(struct tcf_block **p_block, - struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q, - struct netlink_ext_ack *extack) +int tcf_block_attach(struct tcf_block **p_block, + struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q, + struct netlink_ext_ack *extack) { return 0; } static inline -int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q, - struct tcf_block_ext_info *ei, - struct netlink_ext_ack *extack) +int tcf_block_attach_ext(struct tcf_block **p_block, struct Qdisc *q, + struct tcf_block_ext_info *ei, + struct netlink_ext_ack *extack) { return 0; } -static inline void tcf_block_put(struct tcf_block *block) +static inline void tcf_block_detach(struct tcf_block *block) { } static inline -void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q, - struct tcf_block_ext_info *ei) +void tcf_block_detach_ext(struct tcf_block *block, struct Qdisc *q, + struct tcf_block_ext_info *ei) { } diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 58b2d8443f6a..f11da74dd339 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c @@ -731,9 +731,9 @@ static void tcf_block_owner_del(struct tcf_block *block, WARN_ON(1); } -int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q, - struct tcf_block_ext_info *ei, - struct netlink_ext_ack *extack) +int tcf_block_attach_ext(struct tcf_block **p_block, struct Qdisc *q, + struct tcf_block_ext_info *ei, + struct netlink_ext_ack *extack) { struct net *net = qdisc_net(q); struct tcf_block *block = NULL; @@ -791,7 +791,7 @@ int tcf_block_get_ext(struct tcf_block **p_block, struct Qdisc *q, } return err; } -EXPORT_SYMBOL(tcf_block_get_ext); +EXPORT_SYMBOL(tcf_block_attach_ext); static void tcf_chain_head_change_dflt(struct tcf_proto *tp_head, void *priv) { @@ -800,9 +800,9 @@ static void tcf_chain_head_change_dflt(struct tcf_proto *tp_head, void *priv) rcu_assign_pointer(*p_filter_chain, tp_head); } -int tcf_block_get(struct tcf_block **p_block, - struct tcf_proto __rcu **p_filter_chain, struct Qdisc *q, - struct netlink_ext_ack *extack) +int tcf_block_attach(struct tcf_block **p_block, + 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, @@ -810,15 +810,15 @@ int tcf_block_get(struct tcf_block **p_block, }; WARN_ON(!p_filter_chain); - return tcf_block_get_ext(p_block, q, &ei, extack); + return tcf_block_attach_ext(p_block, q, &ei, extack); } -EXPORT_SYMBOL(tcf_block_get); +EXPORT_SYMBOL(tcf_block_attach); /* XXX: Standalone actions are not allowed to jump to any chain, and bound * actions should be all removed after flushing. */ -void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q, - struct tcf_block_ext_info *ei) +void tcf_block_detach_ext(struct tcf_block *block, struct Qdisc *q, + struct tcf_block_ext_info *ei) { if (!block) return; @@ -848,18 +848,17 @@ void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q, tcf_block_offload_unbind(block, q, ei); } } -EXPORT_SYMBOL(tcf_block_put_ext); +EXPORT_SYMBOL(tcf_block_detach_ext); -void tcf_block_put(struct tcf_block *block) +void tcf_block_detach(struct tcf_block *block) { struct tcf_block_ext_info ei = {0, }; if (!block) return; - tcf_block_put_ext(block, block->q, &ei); + tcf_block_detach_ext(block, block->q, &ei); } - -EXPORT_SYMBOL(tcf_block_put); +EXPORT_SYMBOL(tcf_block_detach); struct tcf_block_cb { struct list_head list; diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index d714d3747bcb..f7a3728d17fe 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c @@ -151,7 +151,7 @@ static void atm_tc_put(struct Qdisc *sch, unsigned long cl) list_del_init(&flow->list); pr_debug("atm_tc_put: qdisc %p\n", flow->q); qdisc_put(flow->q); - tcf_block_put(flow->block); + tcf_block_detach(flow->block); if (flow->sock) { pr_debug("atm_tc_put: f_count %ld\n", file_count(flow->sock->file)); @@ -283,8 +283,8 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent, goto err_out; } - error = tcf_block_get(&flow->block, &flow->filter_list, sch, - extack); + error = tcf_block_attach(&flow->block, &flow->filter_list, sch, + extack); if (error) { kfree(flow); goto err_out; @@ -552,8 +552,8 @@ static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt, 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, - extack); + err = tcf_block_attach(&p->link.block, &p->link.filter_list, sch, + extack); if (err) return err; @@ -583,7 +583,7 @@ static void atm_tc_destroy(struct Qdisc *sch) pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); list_for_each_entry(flow, &p->flows, list) { - tcf_block_put(flow->block); + tcf_block_detach(flow->block); flow->block = NULL; } diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c index c07c30b916d5..87b840ecb8b8 100644 --- a/net/sched/sch_cake.c +++ b/net/sched/sch_cake.c @@ -2603,7 +2603,7 @@ static void cake_destroy(struct Qdisc *sch) struct cake_sched_data *q = qdisc_priv(sch); qdisc_watchdog_cancel(&q->watchdog); - tcf_block_put(q->block); + tcf_block_detach(q->block); kvfree(q->tins); } @@ -2636,7 +2636,7 @@ static int cake_init(struct Qdisc *sch, struct nlattr *opt, return err; } - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 4dc05409e3fb..f78643748653 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -1164,7 +1164,8 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt, if (!q->link.R_tab) return -EINVAL; - err = tcf_block_get(&q->link.block, &q->link.filter_list, sch, extack); + err = tcf_block_attach(&q->link.block, &q->link.filter_list, sch, + extack); if (err) goto put_rtab; @@ -1205,7 +1206,7 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt, return 0; put_block: - tcf_block_put(q->link.block); + tcf_block_detach(q->link.block); put_rtab: qdisc_put_rtab(q->link.R_tab); @@ -1417,7 +1418,7 @@ static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl) WARN_ON(cl->filters); - tcf_block_put(cl->block); + tcf_block_detach(cl->block); qdisc_put(cl->q); qdisc_put_rtab(cl->R_tab); gen_kill_estimator(&cl->rate_est); @@ -1442,7 +1443,7 @@ static void cbq_destroy(struct Qdisc *sch) */ for (h = 0; h < q->clhash.hashsize; h++) { hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) { - tcf_block_put(cl->block); + tcf_block_detach(cl->block); cl->block = NULL; } } @@ -1597,7 +1598,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t if (cl == NULL) goto failure; - err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack); + err = tcf_block_attach(&cl->block, &cl->filter_list, sch, extack); if (err) { kfree(cl); return err; @@ -1610,7 +1611,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t tca[TCA_RATE]); if (err) { NL_SET_ERR_MSG(extack, "Couldn't create new estimator"); - tcf_block_put(cl->block); + tcf_block_detach(cl->block); kfree(cl); goto failure; } diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c index cdebaed0f8cf..d9b98806e3ec 100644 --- a/net/sched/sch_drr.c +++ b/net/sched/sch_drr.c @@ -427,7 +427,7 @@ static int drr_init_qdisc(struct Qdisc *sch, struct nlattr *opt, struct drr_sched *q = qdisc_priv(sch); int err; - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; err = qdisc_class_hash_init(&q->clhash); @@ -461,7 +461,7 @@ static void drr_destroy_qdisc(struct Qdisc *sch) struct hlist_node *next; unsigned int i; - tcf_block_put(q->block); + tcf_block_detach(q->block); for (i = 0; i < q->clhash.hashsize; i++) { hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index f6f480784bc6..88cbba60a0ac 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c @@ -348,7 +348,7 @@ static int dsmark_init(struct Qdisc *sch, struct nlattr *opt, if (!opt) goto errout; - err = tcf_block_get(&p->block, &p->filter_list, sch, extack); + err = tcf_block_attach(&p->block, &p->filter_list, sch, extack); if (err) return err; @@ -411,7 +411,7 @@ static void dsmark_destroy(struct Qdisc *sch) pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); - tcf_block_put(p->block); + tcf_block_detach(p->block); qdisc_put(p->q); if (p->mv != p->embedded) kfree(p->mv); diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c index 6c0a9d5dbf94..e9a14ae424ee 100644 --- a/net/sched/sch_fq_codel.c +++ b/net/sched/sch_fq_codel.c @@ -454,7 +454,7 @@ static void fq_codel_destroy(struct Qdisc *sch) { struct fq_codel_sched_data *q = qdisc_priv(sch); - tcf_block_put(q->block); + tcf_block_detach(q->block); kvfree(q->backlogs); kvfree(q->flows); } @@ -484,7 +484,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt, goto init_failure; } - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) goto init_failure; diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index b18ec1f6de60..ed1bcae948ca 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -1034,7 +1034,7 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid, if (cl == NULL) return -ENOBUFS; - err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack); + err = tcf_block_attach(&cl->block, &cl->filter_list, sch, extack); if (err) { kfree(cl); return err; @@ -1046,7 +1046,7 @@ hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid, qdisc_root_sleeping_running(sch), tca[TCA_RATE]); if (err) { - tcf_block_put(cl->block); + tcf_block_detach(cl->block); kfree(cl); return err; } @@ -1091,7 +1091,7 @@ hfsc_destroy_class(struct Qdisc *sch, struct hfsc_class *cl) { struct hfsc_sched *q = qdisc_priv(sch); - tcf_block_put(cl->block); + tcf_block_detach(cl->block); qdisc_put(cl->qdisc); gen_kill_estimator(&cl->rate_est); if (cl != &q->root) @@ -1409,7 +1409,8 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt, return err; q->eligible = RB_ROOT; - err = tcf_block_get(&q->root.block, &q->root.filter_list, sch, extack); + err = tcf_block_attach(&q->root.block, &q->root.filter_list, sch, + extack); if (err) return err; @@ -1506,7 +1507,7 @@ hfsc_destroy_qdisc(struct Qdisc *sch) for (i = 0; i < q->clhash.hashsize; i++) { hlist_for_each_entry(cl, &q->clhash.hash[i], cl_common.hnode) { - tcf_block_put(cl->block); + tcf_block_detach(cl->block); cl->block = NULL; } } diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 862a33b9e2e0..39341efbb7c8 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -1023,7 +1023,7 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt, if (!opt) return -EINVAL; - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; @@ -1227,7 +1227,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl) qdisc_put(cl->un.leaf.q); } gen_kill_estimator(&cl->rate_est); - tcf_block_put(cl->block); + tcf_block_detach(cl->block); kfree(cl); } @@ -1245,11 +1245,11 @@ static void htb_destroy(struct Qdisc *sch) * because filter need its target class alive to be able to call * unbind_filter on it (without Oops). */ - tcf_block_put(q->block); + tcf_block_detach(q->block); for (i = 0; i < q->clhash.hashsize; i++) { hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) { - tcf_block_put(cl->block); + tcf_block_detach(cl->block); cl->block = NULL; } } @@ -1387,7 +1387,8 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, if (!cl) goto failure; - err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack); + err = tcf_block_attach(&cl->block, &cl->filter_list, sch, + extack); if (err) { kfree(cl); goto failure; @@ -1399,7 +1400,7 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, qdisc_root_sleeping_running(sch), tca[TCA_RATE] ? : &est.nla); if (err) { - tcf_block_put(cl->block); + tcf_block_detach(cl->block); kfree(cl); goto failure; } diff --git a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c index ce3f55259d0d..e3a91c9e938e 100644 --- a/net/sched/sch_ingress.c +++ b/net/sched/sch_ingress.c @@ -91,14 +91,14 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt, q->block_info.chain_head_change = clsact_chain_head_change; q->block_info.chain_head_change_priv = &q->miniqp; - return tcf_block_get_ext(&q->block, sch, &q->block_info, extack); + return tcf_block_attach_ext(&q->block, sch, &q->block_info, extack); } static void ingress_destroy(struct Qdisc *sch) { struct ingress_sched_data *q = qdisc_priv(sch); - tcf_block_put_ext(q->block, sch, &q->block_info); + tcf_block_detach_ext(q->block, sch, &q->block_info); net_dec_ingress_queue(); } @@ -224,8 +224,8 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt, 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, - extack); + err = tcf_block_attach_ext(&q->ingress_block, sch, + &q->ingress_block_info, extack); if (err) return err; @@ -235,15 +235,16 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt, q->egress_block_info.chain_head_change = clsact_chain_head_change; q->egress_block_info.chain_head_change_priv = &q->miniqp_egress; - return tcf_block_get_ext(&q->egress_block, sch, &q->egress_block_info, extack); + return tcf_block_attach_ext(&q->egress_block, sch, + &q->egress_block_info, extack); } static void clsact_destroy(struct Qdisc *sch) { struct clsact_sched_data *q = qdisc_priv(sch); - tcf_block_put_ext(q->egress_block, sch, &q->egress_block_info); - tcf_block_put_ext(q->ingress_block, sch, &q->ingress_block_info); + tcf_block_detach_ext(q->egress_block, sch, &q->egress_block_info); + tcf_block_detach_ext(q->ingress_block, sch, &q->ingress_block_info); net_dec_ingress_queue(); net_dec_egress_queue(); diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c index 7410ce4d0321..296d5a2b053a 100644 --- a/net/sched/sch_multiq.c +++ b/net/sched/sch_multiq.c @@ -173,7 +173,7 @@ multiq_destroy(struct Qdisc *sch) int band; struct multiq_sched_data *q = qdisc_priv(sch); - tcf_block_put(q->block); + tcf_block_detach(q->block); for (band = 0; band < q->bands; band++) qdisc_put(q->queues[band]); @@ -248,7 +248,7 @@ static int multiq_init(struct Qdisc *sch, struct nlattr *opt, if (!opt) return -EINVAL; - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index f8af98621179..16c5815a86c1 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -172,7 +172,7 @@ prio_destroy(struct Qdisc *sch) int prio; struct prio_sched_data *q = qdisc_priv(sch); - tcf_block_put(q->block); + tcf_block_detach(q->block); prio_offload(sch, NULL); for (prio = 0; prio < q->bands; prio++) qdisc_put(q->queues[prio]); @@ -242,7 +242,7 @@ static int prio_init(struct Qdisc *sch, struct nlattr *opt, if (!opt) return -EINVAL; - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c index dc37c4ead439..ec136a0c06a4 100644 --- a/net/sched/sch_qfq.c +++ b/net/sched/sch_qfq.c @@ -1424,7 +1424,7 @@ static int qfq_init_qdisc(struct Qdisc *sch, struct nlattr *opt, int i, j, err; u32 max_cl_shift, maxbudg_shift, max_classes; - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; @@ -1482,7 +1482,7 @@ static void qfq_destroy_qdisc(struct Qdisc *sch) struct hlist_node *next; unsigned int i; - tcf_block_put(q->block); + tcf_block_detach(q->block); for (i = 0; i < q->clhash.hashsize; i++) { hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c index bab506b01a32..ac3edf6b0bbd 100644 --- a/net/sched/sch_sfb.c +++ b/net/sched/sch_sfb.c @@ -468,7 +468,7 @@ static void sfb_destroy(struct Qdisc *sch) { struct sfb_sched_data *q = qdisc_priv(sch); - tcf_block_put(q->block); + tcf_block_detach(q->block); qdisc_put(q->qdisc); } @@ -556,7 +556,7 @@ static int sfb_init(struct Qdisc *sch, struct nlattr *opt, struct sfb_sched_data *q = qdisc_priv(sch); int err; - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 2f2678197760..72c7b8d5c3f7 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c @@ -713,7 +713,7 @@ static void sfq_destroy(struct Qdisc *sch) { struct sfq_sched_data *q = qdisc_priv(sch); - tcf_block_put(q->block); + tcf_block_detach(q->block); q->perturb_period = 0; del_timer_sync(&q->perturb_timer); sfq_free(q->ht); @@ -731,7 +731,7 @@ static int sfq_init(struct Qdisc *sch, struct nlattr *opt, q->sch = sch; timer_setup(&q->perturb_timer, sfq_perturbation, TIMER_DEFERRABLE); - err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + err = tcf_block_attach(&q->block, &q->filter_list, sch, extack); if (err) return err; -- 2.7.5