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>
This commit is contained in:
committed by
David S. Miller
parent
71ebe5e919
commit
de6d5cdf88
@@ -1417,7 +1417,9 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
|
||||
goto out;
|
||||
break;
|
||||
case RTM_DELTCLASS:
|
||||
err = cops->delete(q, cl);
|
||||
err = -EOPNOTSUPP;
|
||||
if (cops->delete)
|
||||
err = cops->delete(q, cl);
|
||||
if (err == 0)
|
||||
tclass_notify(skb, n, q, cl, RTM_DELTCLASS);
|
||||
goto out;
|
||||
@@ -1431,7 +1433,9 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
|
||||
}
|
||||
|
||||
new_cl = cl;
|
||||
err = cops->change(q, clid, pid, tca, &new_cl);
|
||||
err = -EOPNOTSUPP;
|
||||
if (cops->change)
|
||||
err = cops->change(q, clid, pid, tca, &new_cl);
|
||||
if (err == 0)
|
||||
tclass_notify(skb, n, q, new_cl, RTM_NEWTCLASS);
|
||||
|
||||
|
Reference in New Issue
Block a user