OSDN Git Service

taskstats: move specifying netlink policy back to ops
authorJakub Kicinski <kuba@kernel.org>
Fri, 2 Oct 2020 21:49:58 +0000 (14:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Oct 2020 02:11:12 +0000 (19:11 -0700)
commit 3b0f31f2b8c9 ("genetlink: make policy common to family")
had to work around removal of policy from ops by parsing in
the pre_doit callback. Now that policy is back in full ops
we can switch again. Set maxattr to actual size of the policies
- both commands set GENL_DONT_VALIDATE_STRICT so out of range
attributes will be silently ignored, anyway.

v2:
 - remove stale comment

Suggested-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
kernel/taskstats.c

index ef4de29..a2802b6 100644 (file)
@@ -34,17 +34,13 @@ struct kmem_cache *taskstats_cache;
 
 static struct genl_family family;
 
-static const struct nla_policy taskstats_cmd_get_policy[TASKSTATS_CMD_ATTR_MAX+1] = {
+static const struct nla_policy taskstats_cmd_get_policy[] = {
        [TASKSTATS_CMD_ATTR_PID]  = { .type = NLA_U32 },
        [TASKSTATS_CMD_ATTR_TGID] = { .type = NLA_U32 },
        [TASKSTATS_CMD_ATTR_REGISTER_CPUMASK] = { .type = NLA_STRING },
        [TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK] = { .type = NLA_STRING },};
 
-/*
- * We have to use TASKSTATS_CMD_ATTR_MAX here, it is the maxattr in the family.
- * Make sure they are always aligned.
- */
-static const struct nla_policy cgroupstats_cmd_get_policy[TASKSTATS_CMD_ATTR_MAX+1] = {
+static const struct nla_policy cgroupstats_cmd_get_policy[] = {
        [CGROUPSTATS_CMD_ATTR_FD] = { .type = NLA_U32 },
 };
 
@@ -644,52 +640,30 @@ err:
        nlmsg_free(rep_skb);
 }
 
-static const struct genl_small_ops taskstats_ops[] = {
+static const struct genl_ops taskstats_ops[] = {
        {
                .cmd            = TASKSTATS_CMD_GET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit           = taskstats_user_cmd,
-               /* policy enforced later */
-               .flags          = GENL_ADMIN_PERM | GENL_CMD_CAP_HASPOL,
+               .policy         = taskstats_cmd_get_policy,
+               .maxattr        = ARRAY_SIZE(taskstats_cmd_get_policy) - 1,
+               .flags          = GENL_ADMIN_PERM,
        },
        {
                .cmd            = CGROUPSTATS_CMD_GET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit           = cgroupstats_user_cmd,
-               /* policy enforced later */
-               .flags          = GENL_CMD_CAP_HASPOL,
+               .policy         = cgroupstats_cmd_get_policy,
+               .maxattr        = ARRAY_SIZE(cgroupstats_cmd_get_policy) - 1,
        },
 };
 
-static int taskstats_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
-                             struct genl_info *info)
-{
-       const struct nla_policy *policy = NULL;
-
-       switch (ops->cmd) {
-       case TASKSTATS_CMD_GET:
-               policy = taskstats_cmd_get_policy;
-               break;
-       case CGROUPSTATS_CMD_GET:
-               policy = cgroupstats_cmd_get_policy;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return nlmsg_validate_deprecated(info->nlhdr, GENL_HDRLEN,
-                                        TASKSTATS_CMD_ATTR_MAX, policy,
-                                        info->extack);
-}
-
 static struct genl_family family __ro_after_init = {
        .name           = TASKSTATS_GENL_NAME,
        .version        = TASKSTATS_GENL_VERSION,
-       .maxattr        = TASKSTATS_CMD_ATTR_MAX,
        .module         = THIS_MODULE,
-       .small_ops      = taskstats_ops,
-       .n_small_ops    = ARRAY_SIZE(taskstats_ops),
-       .pre_doit       = taskstats_pre_doit,
+       .ops            = taskstats_ops,
+       .n_ops          = ARRAY_SIZE(taskstats_ops),
 };
 
 /* Needed early in initialization */