summaryrefslogtreecommitdiffstats
path: root/net/netlink
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2022-11-04 20:13:31 +0100
committerDavid S. Miller <davem@davemloft.net>2022-11-07 13:30:16 +0100
commitff14adbd8779f098576ffdb98381809ed8e40dfe (patch)
treee5ce47940111da476dd6e4dcc2ebb78f1ec0b9b7 /net/netlink
parentMerge branch 'am65-cpsw-suspend-resume' (diff)
downloadlinux-ff14adbd8779f098576ffdb98381809ed8e40dfe.tar.xz
linux-ff14adbd8779f098576ffdb98381809ed8e40dfe.zip
genetlink: refactor the cmd <> policy mapping dump
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>
Diffstat (limited to 'net/netlink')
-rw-r--r--net/netlink/genetlink.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 3e16527beb91..0a7a856e9ce0 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -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;