[NET_SCHED]: sch_htb/sch_hfsc: fix oops in qlen_notify
During both HTB and HFSC class deletion the class is removed from the class hash before calling qdisc_tree_decrease_qlen. This makes the ->get operation in qdisc_tree_decrease_qlen fail, so it passes a NULL pointer to ->qlen_notify, causing an oops. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9b2f7bcf0e
commit
c38c83cb70
2 changed files with 6 additions and 4 deletions
|
@ -1184,10 +1184,12 @@ hfsc_delete_class(struct Qdisc *sch, unsigned long arg)
|
|||
|
||||
sch_tree_lock(sch);
|
||||
|
||||
list_del(&cl->hlist);
|
||||
list_del(&cl->siblings);
|
||||
hfsc_adjust_levels(cl->cl_parent);
|
||||
|
||||
hfsc_purge_queue(sch, cl);
|
||||
list_del(&cl->hlist);
|
||||
|
||||
if (--cl->refcnt == 0)
|
||||
hfsc_destroy_class(sch, cl);
|
||||
|
||||
|
|
|
@ -1380,15 +1380,15 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg)
|
|||
|
||||
sch_tree_lock(sch);
|
||||
|
||||
/* delete from hash and active; remainder in destroy_class */
|
||||
hlist_del_init(&cl->hlist);
|
||||
|
||||
if (!cl->level) {
|
||||
qlen = cl->un.leaf.q->q.qlen;
|
||||
qdisc_reset(cl->un.leaf.q);
|
||||
qdisc_tree_decrease_qlen(cl->un.leaf.q, qlen);
|
||||
}
|
||||
|
||||
/* delete from hash and active; remainder in destroy_class */
|
||||
hlist_del_init(&cl->hlist);
|
||||
|
||||
if (cl->prio_activity)
|
||||
htb_deactivate(q, cl);
|
||||
|
||||
|
|
Loading…
Reference in a new issue