From: Arkadi Sharshevsky <arka...@mellanox.com>

Currently the size validation is done via a cb, which is unneeded. The
size validation can be moved to core. The next patch will perform cleanup.

Signed-off-by: Arkadi Sharshevsky <arka...@mellanox.com>
Signed-off-by: Jiri Pirko <j...@mellanox.com>
---
v1->v2:
- fixed u64 division error reported by kbuildbot
---
 net/core/devlink.c | 32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index 18d385ed8237..88e846779269 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -2338,6 +2338,32 @@ devlink_resource_validate_children(struct 
devlink_resource *resource)
        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;
 
-- 
2.14.3

Reply via email to