summaryrefslogtreecommitdiffstats
path: root/net/sched/sch_tbf.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2006-03-20 19:01:21 -0800
committerDavid S. Miller <davem@davemloft.net>2006-03-20 19:01:21 -0800
commit053cfed75d9e01bda274c5b0126f5937181dcb62 (patch)
treeeddf99fddfdb6979c422c427a60a164135e0fc20 /net/sched/sch_tbf.c
parentcdc7f8e362bcadbc312c97fb69d8d59676eec422 (diff)
downloadlinux-053cfed75d9e01bda274c5b0126f5937181dcb62.tar.gz
linux-053cfed75d9e01bda274c5b0126f5937181dcb62.tar.bz2
linux-053cfed75d9e01bda274c5b0126f5937181dcb62.zip
[PKT_SCHED]: Restore TBF change semantic
When TBF was converted to a classful qdisc, the semantic of the limit parameter was broken. On initilization an inner bfifo qdisc is created for backwards compatibility, when changing parameters however the new limit is ignored and the current child qdisc remains in place. Always replace the child qdisc by the default bfifo when limit is above zero, otherwise don't touch the inner qdisc. Current tc version enforce a limit above zero, other users can avoid creating the inner qdisc by using zero. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_tbf.c')
-rw-r--r--net/sched/sch_tbf.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
index e9e473457361..d8e03c74ca76 100644
--- a/net/sched/sch_tbf.c
+++ b/net/sched/sch_tbf.c
@@ -341,13 +341,14 @@ static int tbf_change(struct Qdisc* sch, struct rtattr *opt)
if (max_size < 0)
goto done;
- if (q->qdisc == &noop_qdisc) {
+ if (qopt->limit > 0) {
if ((child = tbf_create_dflt_qdisc(sch->dev, qopt->limit)) == NULL)
goto done;
}
sch_tree_lock(sch);
- if (child) q->qdisc = child;
+ if (child)
+ qdisc_destroy(xchg(&q->qdisc, child));
q->limit = qopt->limit;
q->mtu = qopt->mtu;
q->max_size = max_size;