History

switchdev: respect SKIP_EOPNOTSUPP flag in case there is no recursion

Caller passing down the SKIP_EOPNOTSUPP switchdev flag expects that -EOPNOTSUPP cannot be returned. But in case of direct op call without recurtion, this may happen. So fix this by checking it always on the end of __switchdev_port_attr_set function.

Jiri Pirko committed 11 years ago

Commit 0c63d801 parent 2a4f4171 file · +4 −5Browse files

Showing the changes to net/switchdev/switchdev.c (1 of 1 file). Show all

Unified · Split

net/switchdev/switchdev.c+4−5
@@ -225,8 +225,10 @@ static int __switchdev_port_attr_set(struct net_device *dev, · 224 unmodified lines
225225 struct list_head *iter;
226226 int err = -EOPNOTSUPP;
227227
228− if (ops && ops->switchdev_port_attr_set)
229− return ops->switchdev_port_attr_set(dev, attr, trans);
228+ if (ops && ops->switchdev_port_attr_set) {
229+ err = ops->switchdev_port_attr_set(dev, attr, trans);
230+ goto done;
231+ }
230232
231233 if (attr->flags & SWITCHDEV_F_NO_RECURSE)
232234 goto done;
@@ -238,9 +240,6 @@ static int __switchdev_port_attr_set(struct net_device *dev, · 5 unmodified lines
238240
239241 netdev_for_each_lower_dev(dev, lower_dev, iter) {
240242 err = __switchdev_port_attr_set(lower_dev, attr, trans);
241− if (err == -EOPNOTSUPP &&
242− attr->flags & SWITCHDEV_F_SKIP_EOPNOTSUPP)
243− continue;
244243 if (err)
245244 break;
246245 }