genetlink: refactor the cmd <> policy mapping dump
authorJakub Kicinski <kuba@kernel.org>
Fri, 4 Nov 2022 19:13:31 +0000 (12:13 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2022 12:30:16 +0000 (12:30 +0000)
The code at the top of ctrl_dumppolicy() dumps mappings between
ops and policies. It supports dumping both the entire family and
single op if dump is filtered. But both of those cases are handled
inside a loop, which makes the logic harder to follow and change.
Refactor to split the two cases more clearly.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/netlink/genetlink.c

index 3e16527..0a7a856 100644 (file)
@@ -1319,21 +1319,24 @@ static int ctrl_dumppolicy(struct sk_buff *skb, struct netlink_callback *cb)
        void *hdr;
 
        if (!ctx->policies) {
-               while (ctx->opidx < genl_get_cmd_cnt(ctx->rt)) {
-                       struct genl_ops op;
+               struct genl_ops op;
 
-                       if (ctx->single_op) {
-                               int err;
+               if (ctx->single_op) {
+                       int err;
 
-                               err = genl_get_cmd(ctx->op, ctx->rt, &op);
-                               if (WARN_ON(err))
-                                       return skb->len;
+                       err = genl_get_cmd(ctx->op, ctx->rt, &op);
+                       if (WARN_ON(err))
+                               return err;
 
-                               /* break out of the loop after this one */
-                               ctx->opidx = genl_get_cmd_cnt(ctx->rt);
-                       } else {
-                               genl_get_cmd_by_index(ctx->opidx, ctx->rt, &op);
-                       }
+                       if (ctrl_dumppolicy_put_op(skb, cb, &op))
+                               return skb->len;
+
+                       /* don't enter the loop below */
+                       ctx->opidx = genl_get_cmd_cnt(ctx->rt);
+               }
+
+               while (ctx->opidx < genl_get_cmd_cnt(ctx->rt)) {
+                       genl_get_cmd_by_index(ctx->opidx, ctx->rt, &op);
 
                        if (ctrl_dumppolicy_put_op(skb, cb, &op))
                                return skb->len;