diff options
| author | Stephen Hemminger <shemminger@vyatta.com> | 2008-11-25 21:13:31 -0800 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-11-25 21:13:31 -0800 | 
| commit | 71bcb09a57894fa35591ce93dd972065eeecb63a (patch) | |
| tree | 50ca8a43125f0aa89f1444928a209420754a79f3 /net/sched/sch_drr.c | |
| parent | 0e991ec6a0340916d3f29bd5dcb35299069e7226 (diff) | |
tc: check for errors in gen_rate_estimator creation
The functions gen_new_estimator and gen_replace_estimator can return
errors, but they were being ignored.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_drr.c')
| -rw-r--r-- | net/sched/sch_drr.c | 26 | 
1 files changed, 18 insertions, 8 deletions
| diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c index e7a7e87b141a..f6b4fa97df70 100644 --- a/net/sched/sch_drr.c +++ b/net/sched/sch_drr.c @@ -82,15 +82,19 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid,  		quantum = psched_mtu(qdisc_dev(sch));  	if (cl != NULL) { +		if (tca[TCA_RATE]) { +			err = gen_replace_estimator(&cl->bstats, &cl->rate_est, +						    qdisc_root_sleeping_lock(sch), +						    tca[TCA_RATE]); +			if (err) +				return err; +		} +  		sch_tree_lock(sch);  		if (tb[TCA_DRR_QUANTUM])  			cl->quantum = quantum;  		sch_tree_unlock(sch); -		if (tca[TCA_RATE]) -			gen_replace_estimator(&cl->bstats, &cl->rate_est, -					      qdisc_root_sleeping_lock(sch), -					      tca[TCA_RATE]);  		return 0;  	} @@ -106,10 +110,16 @@ static int drr_change_class(struct Qdisc *sch, u32 classid, u32 parentid,  	if (cl->qdisc == NULL)  		cl->qdisc = &noop_qdisc; -	if (tca[TCA_RATE]) -		gen_replace_estimator(&cl->bstats, &cl->rate_est, -				      qdisc_root_sleeping_lock(sch), -				      tca[TCA_RATE]); +	if (tca[TCA_RATE]) { +		err = gen_replace_estimator(&cl->bstats, &cl->rate_est, +					    qdisc_root_sleeping_lock(sch), +					    tca[TCA_RATE]); +		if (err) { +			qdisc_destroy(cl->qdisc); +			kfree(cl); +			return err; +		} +	}  	sch_tree_lock(sch);  	qdisc_class_hash_insert(&q->clhash, &cl->common); | 
