--- initial
+++ final
@@ -1,88 +1,88 @@
 static int tbf_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack) {
   int err;
   struct tbf_sched_data *q = qdisc_priv(sch);
   struct nlattr *tb[TCA_TBF_MAX + 1];
   struct tc_tbf_qopt *qopt;
   struct Qdisc *child = NULL;
   struct psched_ratecfg rate;
   struct psched_ratecfg peak;
   u64 max_size;
   s64 buffer, mtu;
   u64 rate64 = 0, prate64 = 0;
   err = nla_parse_nested(tb, TCA_TBF_MAX, opt, tbf_policy, NULL);
   if (err < 0) return err;
   err = -EINVAL;
   if (tb[TCA_TBF_PARMS] == NULL) goto done;
   qopt = nla_data(tb[TCA_TBF_PARMS]);
   if (qopt->rate.linklayer == TC_LINKLAYER_UNAWARE) qdisc_put_rtab(qdisc_get_rtab(&qopt->rate, tb[TCA_TBF_RTAB], NULL));
   if (qopt->peakrate.linklayer == TC_LINKLAYER_UNAWARE) qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate, tb[TCA_TBF_PTAB], NULL));
   buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U);
   mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U);
   if (tb[TCA_TBF_RATE64]) rate64 = nla_get_u64(tb[TCA_TBF_RATE64]);
   psched_ratecfg_precompute(&rate, &qopt->rate, rate64);
   if (tb[TCA_TBF_BURST]) {
     max_size = nla_get_u32(tb[TCA_TBF_BURST]);
     buffer = psched_l2t_ns(&rate, max_size);
   } else {
     max_size = min_t(u64, psched_ns_t2l(&rate, buffer), ~0U);
   }
   if (qopt->peakrate.rate) {
     if (tb[TCA_TBF_PRATE64]) prate64 = nla_get_u64(tb[TCA_TBF_PRATE64]);
     psched_ratecfg_precompute(&peak, &qopt->peakrate, prate64);
     if (peak.rate_bytes_ps <= rate.rate_bytes_ps) {
       pr_warn_ratelimited("sch_tbf: peakrate %llu is lower than or equals to rate %llu !\n", peak.rate_bytes_ps, rate.rate_bytes_ps);
       err = -EINVAL;
       goto done;
     }
     if (tb[TCA_TBF_PBURST]) {
       u32 pburst = nla_get_u32(tb[TCA_TBF_PBURST]);
       max_size = min_t(u32, max_size, pburst);
       mtu = psched_l2t_ns(&peak, pburst);
     } else {
       max_size = min_t(u64, max_size, psched_ns_t2l(&peak, mtu));
     }
   } else {
     memset(&peak, 0, sizeof(peak));
   }
   if (max_size < psched_mtu(qdisc_dev(sch))) pr_warn_ratelimited("sch_tbf: burst %llu is lower than device %s mtu (%u) !\n", max_size, qdisc_dev(sch)->name, psched_mtu(qdisc_dev(sch)));
   if (!max_size) {
     err = -EINVAL;
     goto done;
   }
   if (q->qdisc != &noop_qdisc) {
     err = fifo_set_limit(q->qdisc, qopt->limit);
     if (err) goto done;
   } else if (qopt->limit > 0) {
     child = fifo_create_dflt(sch, &bfifo_qdisc_ops, qopt->limit, extack);
     if (IS_ERR(child)) {
       err = PTR_ERR(child);
       goto done;
     }
     /* child is fifo, no need to check for noop_qdisc */
     qdisc_hash_add(child, true);
   }
   sch_tree_lock(sch);
   if (child) {
     qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, q->qdisc->qstats.backlog);
-    qdisc_destroy(q->qdisc);
+    qdisc_put(q->qdisc);
     q->qdisc = child;
   }
   q->limit = qopt->limit;
   if (tb[TCA_TBF_PBURST])
     q->mtu = mtu;
   else
     q->mtu = PSCHED_TICKS2NS(qopt->mtu);
   q->max_size = max_size;
   if (tb[TCA_TBF_BURST])
     q->buffer = buffer;
   else
     q->buffer = PSCHED_TICKS2NS(qopt->buffer);
   q->tokens = q->buffer;
   q->ptokens = q->mtu;
   memcpy(&q->rate, &rate, sizeof(struct psched_ratecfg));
   memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg));
   sch_tree_unlock(sch);
   err = 0;
 done:
   return err;
 }<sep>@@
expression old;
@@
-                               qdisc_destroy(old);
+                               qdisc_put(old);