The structure of ctrl_dumppolicy() is clearly split into
init and dumping. Move the init to a .start callback
for clarity, it's a more idiomatic netlink dump code structure.

Signed-off-by: Jakub Kicinski <k...@kernel.org>
---
 net/netlink/genetlink.c | 48 ++++++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index a8001044d8cd..dfa8a00640c0 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -1107,33 +1107,29 @@ struct ctrl_dump_policy_ctx {
        unsigned int fam_id;
 };
 
-static int ctrl_dumppolicy(struct sk_buff *skb, struct netlink_callback *cb)
+static int ctrl_dumppolicy_start(struct netlink_callback *cb)
 {
        struct ctrl_dump_policy_ctx *ctx = (void *)cb->args;
+       struct nlattr *tb[CTRL_ATTR_MAX + 1];
        const struct genl_family *rt;
        int err;
 
-       if (!ctx->fam_id) {
-               struct nlattr *tb[CTRL_ATTR_MAX + 1];
-
-               err = genlmsg_parse(cb->nlh, &genl_ctrl, tb,
-                                   genl_ctrl.maxattr,
-                                   genl_ctrl.policy, cb->extack);
-               if (err)
-                       return err;
+       err = genlmsg_parse(cb->nlh, &genl_ctrl, tb, genl_ctrl.maxattr,
+                           genl_ctrl.policy, cb->extack);
+       if (err)
+               return err;
 
-               if (!tb[CTRL_ATTR_FAMILY_ID] && !tb[CTRL_ATTR_FAMILY_NAME])
-                       return -EINVAL;
+       if (!tb[CTRL_ATTR_FAMILY_ID] && !tb[CTRL_ATTR_FAMILY_NAME])
+               return -EINVAL;
 
-               if (tb[CTRL_ATTR_FAMILY_ID]) {
-                       ctx->fam_id = nla_get_u16(tb[CTRL_ATTR_FAMILY_ID]);
-               } else {
-                       rt = genl_family_find_byname(
-                               nla_data(tb[CTRL_ATTR_FAMILY_NAME]));
-                       if (!rt)
-                               return -ENOENT;
-                       ctx->fam_id = rt->id;
-               }
+       if (tb[CTRL_ATTR_FAMILY_ID]) {
+               ctx->fam_id = nla_get_u16(tb[CTRL_ATTR_FAMILY_ID]);
+       } else {
+               rt = genl_family_find_byname(
+                       nla_data(tb[CTRL_ATTR_FAMILY_NAME]));
+               if (!rt)
+                       return -ENOENT;
+               ctx->fam_id = rt->id;
        }
 
        rt = genl_family_find_byid(ctx->fam_id);
@@ -1143,9 +1139,12 @@ static int ctrl_dumppolicy(struct sk_buff *skb, struct 
netlink_callback *cb)
        if (!rt->policy)
                return -ENODATA;
 
-       err = netlink_policy_dump_start(rt->policy, rt->maxattr, &ctx->state);
-       if (err)
-               return err;
+       return netlink_policy_dump_start(rt->policy, rt->maxattr, &ctx->state);
+}
+
+static int ctrl_dumppolicy(struct sk_buff *skb, struct netlink_callback *cb)
+{
+       struct ctrl_dump_policy_ctx *ctx = (void *)cb->args;
 
        while (netlink_policy_dump_loop(&ctx->state)) {
                void *hdr;
@@ -1157,7 +1156,7 @@ static int ctrl_dumppolicy(struct sk_buff *skb, struct 
netlink_callback *cb)
                if (!hdr)
                        goto nla_put_failure;
 
-               if (nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, rt->id))
+               if (nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, ctx->fam_id))
                        goto nla_put_failure;
 
                nest = nla_nest_start(skb, CTRL_ATTR_POLICY);
@@ -1189,6 +1188,7 @@ static const struct genl_ops genl_ctrl_ops[] = {
        },
        {
                .cmd            = CTRL_CMD_GETPOLICY,
+               .start          = ctrl_dumppolicy_start,
                .dumpit         = ctrl_dumppolicy,
        },
 };
-- 
2.26.2

Reply via email to