In order to avoid partial request processing, validate the request before processing it.
Unified · Split
| @@ -1632,11 +1632,6 @@ static int devlink_port_function_hw_addr_set(struct devlink_port *port, · 1631 unmodified lines | ||
| 1632 | 1632 | } |
| 1633 | 1633 | } |
| 1634 | 1634 | |
| 1635 | − if (!ops->port_function_hw_addr_set) { | |
| 1636 | − NL_SET_ERR_MSG_MOD(extack, "Port doesn't support function attributes"); | |
| 1637 | − return -EOPNOTSUPP; | |
| 1638 | − } | |
| 1639 | − | |
| 1640 | 1635 | return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len, |
| 1641 | 1636 | extack); |
| 1642 | 1637 | } |
| @@ -1650,12 +1645,27 @@ static int devlink_port_fn_state_set(struct devlink_port *port, · 7 unmodified lines | ||
| 1650 | 1645 | |
| 1651 | 1646 | state = nla_get_u8(attr); |
| 1652 | 1647 | ops = port->devlink->ops; |
| 1653 | − if (!ops->port_fn_state_set) { | |
| 1654 | − NL_SET_ERR_MSG_MOD(extack, | |
| 1655 | − "Function does not support state setting"); | |
| 1648 | + return ops->port_fn_state_set(port, state, extack); | |
| 1649 | +} | |
| 1650 | + | |
| 1651 | +static int devlink_port_function_validate(struct devlink_port *devlink_port, | |
| 1652 | + struct nlattr **tb, | |
| 1653 | + struct netlink_ext_ack *extack) | |
| 1654 | +{ | |
| 1655 | + const struct devlink_ops *ops = devlink_port->devlink->ops; | |
| 1656 | + | |
| 1657 | + if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] && | |
| 1658 | + !ops->port_function_hw_addr_set) { | |
| 1659 | + NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR], | |
| 1660 | + "Port doesn't support function attributes"); | |
| 1656 | 1661 | return -EOPNOTSUPP; |
| 1657 | 1662 | } |
| 1658 | − return ops->port_fn_state_set(port, state, extack); | |
| 1663 | + if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) { | |
| 1664 | + NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR], | |
| 1665 | + "Function does not support state setting"); | |
| 1666 | + return -EOPNOTSUPP; | |
| 1667 | + } | |
| 1668 | + return 0; | |
| 1659 | 1669 | } |
| 1660 | 1670 | |
| 1661 | 1671 | static int devlink_port_function_set(struct devlink_port *port, |
| @@ -1672,6 +1682,10 @@ static int devlink_port_function_set(struct devlink_port *port, · 10 unmodified lines | ||
| 1672 | 1682 | return err; |
| 1673 | 1683 | } |
| 1674 | 1684 | |
| 1685 | + err = devlink_port_function_validate(port, tb, extack); | |
| 1686 | + if (err) | |
| 1687 | + return err; | |
| 1688 | + | |
| 1675 | 1689 | attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR]; |
| 1676 | 1690 | if (attr) { |
| 1677 | 1691 | err = devlink_port_function_hw_addr_set(port, attr, extack); |