2020
2121struct ingress_sched_data {
2222 struct tcf_block * block ;
23+ struct tcf_block_ext_info block_info ;
2324};
2425
2526static struct Qdisc * ingress_leaf (struct Qdisc * sch , unsigned long arg )
@@ -59,7 +60,10 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt)
5960 struct net_device * dev = qdisc_dev (sch );
6061 int err ;
6162
62- err = tcf_block_get (& q -> block , & dev -> ingress_cl_list , sch );
63+ q -> block_info .binder_type = TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS ;
64+
65+ err = tcf_block_get_ext (& q -> block , & dev -> ingress_cl_list ,
66+ sch , & q -> block_info );
6367 if (err )
6468 return err ;
6569
@@ -72,8 +76,10 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt)
7276static void ingress_destroy (struct Qdisc * sch )
7377{
7478 struct ingress_sched_data * q = qdisc_priv (sch );
79+ struct net_device * dev = qdisc_dev (sch );
7580
76- tcf_block_put (q -> block );
81+ tcf_block_put_ext (q -> block , & dev -> ingress_cl_list ,
82+ sch , & q -> block_info );
7783 net_dec_ingress_queue ();
7884}
7985
@@ -114,6 +120,8 @@ static struct Qdisc_ops ingress_qdisc_ops __read_mostly = {
114120struct clsact_sched_data {
115121 struct tcf_block * ingress_block ;
116122 struct tcf_block * egress_block ;
123+ struct tcf_block_ext_info ingress_block_info ;
124+ struct tcf_block_ext_info egress_block_info ;
117125};
118126
119127static unsigned long clsact_find (struct Qdisc * sch , u32 classid )
@@ -153,28 +161,42 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt)
153161 struct net_device * dev = qdisc_dev (sch );
154162 int err ;
155163
156- err = tcf_block_get (& q -> ingress_block , & dev -> ingress_cl_list , sch );
164+ q -> ingress_block_info .binder_type = TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS ;
165+
166+ err = tcf_block_get_ext (& q -> ingress_block , & dev -> ingress_cl_list ,
167+ sch , & q -> ingress_block_info );
157168 if (err )
158169 return err ;
159170
160- err = tcf_block_get (& q -> egress_block , & dev -> egress_cl_list , sch );
171+ q -> egress_block_info .binder_type = TCF_BLOCK_BINDER_TYPE_CLSACT_EGRESS ;
172+
173+ err = tcf_block_get_ext (& q -> egress_block , & dev -> egress_cl_list ,
174+ sch , & q -> egress_block_info );
161175 if (err )
162- return err ;
176+ goto err_egress_block_get ;
163177
164178 net_inc_ingress_queue ();
165179 net_inc_egress_queue ();
166180
167181 sch -> flags |= TCQ_F_CPUSTATS ;
168182
169183 return 0 ;
184+
185+ err_egress_block_get :
186+ tcf_block_put_ext (q -> ingress_block , & dev -> ingress_cl_list ,
187+ sch , & q -> ingress_block_info );
188+ return err ;
170189}
171190
172191static void clsact_destroy (struct Qdisc * sch )
173192{
174193 struct clsact_sched_data * q = qdisc_priv (sch );
194+ struct net_device * dev = qdisc_dev (sch );
175195
176- tcf_block_put (q -> egress_block );
177- tcf_block_put (q -> ingress_block );
196+ tcf_block_put_ext (q -> egress_block , & dev -> egress_cl_list ,
197+ sch , & q -> egress_block_info );
198+ tcf_block_put_ext (q -> ingress_block , & dev -> ingress_cl_list ,
199+ sch , & q -> ingress_block_info );
178200
179201 net_dec_ingress_queue ();
180202 net_dec_egress_queue ();
0 commit comments