diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c index 2255355e51d3..5d5cee3cbc2b 100644 --- a/net/sched/sch_qfq.c +++ b/net/sched/sch_qfq.c @@ -403,6 +403,9 @@ static int qfq_change_agg(struct Qdisc *sch, struct qfq_class *cl, u32 weight, return 0; } +static int qfq_delete_class(struct Qdisc *sch, unsigned long arg, + struct netlink_ext_ack *extack); + static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **tca, unsigned long *arg, struct netlink_ext_ack *extack) @@ -511,6 +514,10 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, new_agg = kzalloc(sizeof(*new_agg), GFP_KERNEL); if (new_agg == NULL) { err = -ENOBUFS; + if (existing) { + qfq_delete_class(cl->qdisc, (unsigned long)cl, extack); + return err; + } gen_kill_estimator(&cl->rate_est); goto destroy_class; }