From: Eric Dumazet <eduma...@google.com> Now prio_init() can return -ENOMEM, it also has to make sure any allocated qdisc are freed, since the caller (qdisc_create()) wont call ->destroy() handler for us.
Fixes: cbdf45116478 ("net_sched: prio: properly report out of memory errors") Signed-off-by: Eric Dumazet <eduma...@google.com> Reported-by: Cong Wang <xiyou.wangc...@gmail.com> --- net/sched/sch_prio.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index 071718bccdab..9b703f2c921b 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c @@ -221,20 +221,18 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) static int prio_init(struct Qdisc *sch, struct nlattr *opt) { struct prio_sched_data *q = qdisc_priv(sch); - int i; + int err, i; for (i = 0; i < TCQ_PRIO_BANDS; i++) q->queues[i] = &noop_qdisc; - if (opt == NULL) { + if (!opt) return -EINVAL; - } else { - int err; - if ((err = prio_tune(sch, opt)) != 0) - return err; - } - return 0; + err = prio_tune(sch, opt); + if (err) + prio_destroy(sch); + return err; } static int prio_dump(struct Qdisc *sch, struct sk_buff *skb)