aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_api.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2009-09-04 02:41:16 -0400
committerDavid S. Miller <davem@davemloft.net>2009-09-06 05:07:02 -0400
commitde6d5cdf881353f83006d5f3e28ac4fffd42145e (patch)
treeedc032e4d0a868578780facdd28fb0ee277aadc3 /net/sched/sch_api.c
parent71ebe5e91947392bc276af713827eab12b6db8e4 (diff)
net_sched: make cls_ops->change and cls_ops->delete optional
Some schedulers don't support creating, changing or deleting classes. Make the respective callbacks optionally and consistently return -EOPNOTSUPP for unsupported operations, instead of currently either -EOPNOTSUPP, -ENOSYS or no error. In case of sch_prio and sch_multiq, the removed operations additionally checked for an invalid class. This is not necessary since the class argument can only orginate from ->get() or in case of ->change is 0 for creation of new classes, in which case ->change() incorrectly returned -ENOENT. As a side-effect, this patch fixes a possible (root-only) NULL pointer function call in sch_ingress, which didn't implement a so far mandatory ->delete() operation. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r--net/sched/sch_api.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index bef2d645a36..166fcca86e7 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -1417,7 +1417,9 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
1417 goto out; 1417 goto out;
1418 break; 1418 break;
1419 case RTM_DELTCLASS: 1419 case RTM_DELTCLASS:
1420 err = cops->delete(q, cl); 1420 err = -EOPNOTSUPP;
1421 if (cops->delete)
1422 err = cops->delete(q, cl);
1421 if (err == 0) 1423 if (err == 0)
1422 tclass_notify(skb, n, q, cl, RTM_DELTCLASS); 1424 tclass_notify(skb, n, q, cl, RTM_DELTCLASS);
1423 goto out; 1425 goto out;
@@ -1431,7 +1433,9 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
1431 } 1433 }
1432 1434
1433 new_cl = cl; 1435 new_cl = cl;
1434 err = cops->change(q, clid, pid, tca, &new_cl); 1436 err = -EOPNOTSUPP;
1437 if (cops->change)
1438 err = cops->change(q, clid, pid, tca, &new_cl);
1435 if (err == 0) 1439 if (err == 0)
1436 tclass_notify(skb, n, q, new_cl, RTM_NEWTCLASS); 1440 tclass_notify(skb, n, q, new_cl, RTM_NEWTCLASS);
1437 1441