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 | return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len, | 1635 | return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len, |
| 1641 | extack); | 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 | state = nla_get_u8(attr); | 1646 | state = nla_get_u8(attr); |
| 1652 | ops = port->devlink->ops; | 1647 | ops = port->devlink->ops; |
| 1653 | if (!ops->port_fn_state_set) { | 1648 | return ops->port_fn_state_set(port, state, extack); |
| 1654 | NL_SET_ERR_MSG_MOD(extack, | 1649 | } |
| 1655 | "Function does not support state setting"); | 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 | return -EOPNOTSUPP; | 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 | static int devlink_port_function_set(struct devlink_port *port, | 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 | return err; | 1682 | return err; |
| 1673 | } | 1683 | } |
| 1674 | 1684 | ||
| 1685 | err = devlink_port_function_validate(port, tb, extack); | ||
| 1686 | if (err) | ||
| 1687 | return err; | ||
| 1688 | |||
| 1675 | attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR]; | 1689 | attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR]; |
| 1676 | if (attr) { | 1690 | if (attr) { |
| 1677 | err = devlink_port_function_hw_addr_set(port, attr, extack); | 1691 | err = devlink_port_function_hw_addr_set(port, attr, extack); |