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;