|
|
@@ -2338,6 +2338,32 @@ out:
|
|
|
resource->size_valid = size_valid;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+devlink_resource_validate_size(struct devlink_resource *resource, u64 size,
|
|
|
+ struct netlink_ext_ack *extack)
|
|
|
+{
|
|
|
+ u64 reminder;
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+ if (size > resource->size_params->size_max) {
|
|
|
+ NL_SET_ERR_MSG_MOD(extack, "Size larger than maximum");
|
|
|
+ err = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (size < resource->size_params->size_min) {
|
|
|
+ NL_SET_ERR_MSG_MOD(extack, "Size smaller than minimum");
|
|
|
+ err = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ div64_u64_rem(size, resource->size_params->size_granularity, &reminder);
|
|
|
+ if (reminder) {
|
|
|
+ NL_SET_ERR_MSG_MOD(extack, "Wrong granularity");
|
|
|
+ err = -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
static int devlink_nl_cmd_resource_set(struct sk_buff *skb,
|
|
|
struct genl_info *info)
|
|
|
{
|
|
|
@@ -2356,12 +2382,8 @@ static int devlink_nl_cmd_resource_set(struct sk_buff *skb,
|
|
|
if (!resource)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!resource->resource_ops->size_validate)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
size = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_SIZE]);
|
|
|
- err = resource->resource_ops->size_validate(devlink, size,
|
|
|
- info->extack);
|
|
|
+ err = devlink_resource_validate_size(resource, size, info->extack);
|
|
|
if (err)
|
|
|
return err;
|
|
|
|