diff options
Diffstat (limited to 'net/sched/sch_tbf.c')
-rw-r--r-- | net/sched/sch_tbf.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index cb9711ea8c6c..d8e03c74ca76 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
@@ -177,9 +177,9 @@ static int tbf_requeue(struct sk_buff *skb, struct Qdisc* sch) | |||
177 | static unsigned int tbf_drop(struct Qdisc* sch) | 177 | static unsigned int tbf_drop(struct Qdisc* sch) |
178 | { | 178 | { |
179 | struct tbf_sched_data *q = qdisc_priv(sch); | 179 | struct tbf_sched_data *q = qdisc_priv(sch); |
180 | unsigned int len; | 180 | unsigned int len = 0; |
181 | 181 | ||
182 | if ((len = q->qdisc->ops->drop(q->qdisc)) != 0) { | 182 | if (q->qdisc->ops->drop && (len = q->qdisc->ops->drop(q->qdisc)) != 0) { |
183 | sch->q.qlen--; | 183 | sch->q.qlen--; |
184 | sch->qstats.drops++; | 184 | sch->qstats.drops++; |
185 | } | 185 | } |
@@ -341,13 +341,14 @@ static int tbf_change(struct Qdisc* sch, struct rtattr *opt) | |||
341 | if (max_size < 0) | 341 | if (max_size < 0) |
342 | goto done; | 342 | goto done; |
343 | 343 | ||
344 | if (q->qdisc == &noop_qdisc) { | 344 | if (qopt->limit > 0) { |
345 | if ((child = tbf_create_dflt_qdisc(sch->dev, qopt->limit)) == NULL) | 345 | if ((child = tbf_create_dflt_qdisc(sch->dev, qopt->limit)) == NULL) |
346 | goto done; | 346 | goto done; |
347 | } | 347 | } |
348 | 348 | ||
349 | sch_tree_lock(sch); | 349 | sch_tree_lock(sch); |
350 | if (child) q->qdisc = child; | 350 | if (child) |
351 | qdisc_destroy(xchg(&q->qdisc, child)); | ||
351 | q->limit = qopt->limit; | 352 | q->limit = qopt->limit; |
352 | q->mtu = qopt->mtu; | 353 | q->mtu = qopt->mtu; |
353 | q->max_size = max_size; | 354 | q->max_size = max_size; |