[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZUP81f/bQ7yjt4W/@tissot.1015granger.net>
Date: Thu, 2 Nov 2023 15:47:33 -0400
From: Chuck Lever <chuck.lever@...cle.com>
To: Jakub Kicinski <kuba@...nel.org>
Cc: davem@...emloft.net, netdev@...r.kernel.org, edumazet@...gle.com,
pabeni@...hat.com, lorenzo@...nel.org
Subject: Re: [PATCH net] nfsd: regenerate user space parsers after ynl-gen
changes
On Thu, Nov 02, 2023 at 11:52:27AM -0700, Jakub Kicinski wrote:
> Commit 8cea95b0bd79 ("tools: ynl-gen: handle do ops with no input attrs")
> added support for some of the previously-skipped ops in nfsd.
> Regenerate the user space parsers to fill them in.
>
> Signed-off-by: Jakub Kicinski <kuba@...nel.org>
> ---
> CC: chuck.lever@...cle.com
> CC: lorenzo@...nel.org
Acked-by: Chuck Lever <chuck.lever@...cle.com>
> ---
> include/uapi/linux/nfsd_netlink.h | 6 +-
> tools/net/ynl/generated/nfsd-user.c | 120 ++++++++++++++++++++++++++--
> tools/net/ynl/generated/nfsd-user.h | 44 ++++++++--
> 3 files changed, 156 insertions(+), 14 deletions(-)
>
> diff --git a/include/uapi/linux/nfsd_netlink.h b/include/uapi/linux/nfsd_netlink.h
> index c8ae72466ee6..3cd044edee5d 100644
> --- a/include/uapi/linux/nfsd_netlink.h
> +++ b/include/uapi/linux/nfsd_netlink.h
> @@ -3,8 +3,8 @@
> /* Documentation/netlink/specs/nfsd.yaml */
> /* YNL-GEN uapi header */
>
> -#ifndef _UAPI_LINUX_NFSD_H
> -#define _UAPI_LINUX_NFSD_H
> +#ifndef _UAPI_LINUX_NFSD_NETLINK_H
> +#define _UAPI_LINUX_NFSD_NETLINK_H
>
> #define NFSD_FAMILY_NAME "nfsd"
> #define NFSD_FAMILY_VERSION 1
> @@ -36,4 +36,4 @@ enum {
> NFSD_CMD_MAX = (__NFSD_CMD_MAX - 1)
> };
>
> -#endif /* _UAPI_LINUX_NFSD_H */
> +#endif /* _UAPI_LINUX_NFSD_NETLINK_H */
> diff --git a/tools/net/ynl/generated/nfsd-user.c b/tools/net/ynl/generated/nfsd-user.c
> index fec6828680ce..360b6448c6e9 100644
> --- a/tools/net/ynl/generated/nfsd-user.c
> +++ b/tools/net/ynl/generated/nfsd-user.c
> @@ -50,9 +50,116 @@ struct ynl_policy_nest nfsd_rpc_status_nest = {
> /* Common nested types */
> /* ============== NFSD_CMD_RPC_STATUS_GET ============== */
> /* NFSD_CMD_RPC_STATUS_GET - dump */
> -void nfsd_rpc_status_get_list_free(struct nfsd_rpc_status_get_list *rsp)
> +int nfsd_rpc_status_get_rsp_dump_parse(const struct nlmsghdr *nlh, void *data)
> {
> - struct nfsd_rpc_status_get_list *next = rsp;
> + struct nfsd_rpc_status_get_rsp_dump *dst;
> + struct ynl_parse_arg *yarg = data;
> + unsigned int n_compound_ops = 0;
> + const struct nlattr *attr;
> + int i;
> +
> + dst = yarg->data;
> +
> + if (dst->compound_ops)
> + return ynl_error_parse(yarg, "attribute already present (rpc-status.compound-ops)");
> +
> + mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
> + unsigned int type = mnl_attr_get_type(attr);
> +
> + if (type == NFSD_A_RPC_STATUS_XID) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.xid = 1;
> + dst->xid = mnl_attr_get_u32(attr);
> + } else if (type == NFSD_A_RPC_STATUS_FLAGS) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.flags = 1;
> + dst->flags = mnl_attr_get_u32(attr);
> + } else if (type == NFSD_A_RPC_STATUS_PROG) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.prog = 1;
> + dst->prog = mnl_attr_get_u32(attr);
> + } else if (type == NFSD_A_RPC_STATUS_VERSION) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.version = 1;
> + dst->version = mnl_attr_get_u8(attr);
> + } else if (type == NFSD_A_RPC_STATUS_PROC) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.proc = 1;
> + dst->proc = mnl_attr_get_u32(attr);
> + } else if (type == NFSD_A_RPC_STATUS_SERVICE_TIME) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.service_time = 1;
> + dst->service_time = mnl_attr_get_u64(attr);
> + } else if (type == NFSD_A_RPC_STATUS_SADDR4) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.saddr4 = 1;
> + dst->saddr4 = mnl_attr_get_u32(attr);
> + } else if (type == NFSD_A_RPC_STATUS_DADDR4) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.daddr4 = 1;
> + dst->daddr4 = mnl_attr_get_u32(attr);
> + } else if (type == NFSD_A_RPC_STATUS_SADDR6) {
> + unsigned int len;
> +
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> +
> + len = mnl_attr_get_payload_len(attr);
> + dst->_present.saddr6_len = len;
> + dst->saddr6 = malloc(len);
> + memcpy(dst->saddr6, mnl_attr_get_payload(attr), len);
> + } else if (type == NFSD_A_RPC_STATUS_DADDR6) {
> + unsigned int len;
> +
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> +
> + len = mnl_attr_get_payload_len(attr);
> + dst->_present.daddr6_len = len;
> + dst->daddr6 = malloc(len);
> + memcpy(dst->daddr6, mnl_attr_get_payload(attr), len);
> + } else if (type == NFSD_A_RPC_STATUS_SPORT) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.sport = 1;
> + dst->sport = mnl_attr_get_u16(attr);
> + } else if (type == NFSD_A_RPC_STATUS_DPORT) {
> + if (ynl_attr_validate(yarg, attr))
> + return MNL_CB_ERROR;
> + dst->_present.dport = 1;
> + dst->dport = mnl_attr_get_u16(attr);
> + } else if (type == NFSD_A_RPC_STATUS_COMPOUND_OPS) {
> + n_compound_ops++;
> + }
> + }
> +
> + if (n_compound_ops) {
> + dst->compound_ops = calloc(n_compound_ops, sizeof(*dst->compound_ops));
> + dst->n_compound_ops = n_compound_ops;
> + i = 0;
> + mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
> + if (mnl_attr_get_type(attr) == NFSD_A_RPC_STATUS_COMPOUND_OPS) {
> + dst->compound_ops[i] = mnl_attr_get_u32(attr);
> + i++;
> + }
> + }
> + }
> +
> + return MNL_CB_OK;
> +}
> +
> +void
> +nfsd_rpc_status_get_rsp_list_free(struct nfsd_rpc_status_get_rsp_list *rsp)
> +{
> + struct nfsd_rpc_status_get_rsp_list *next = rsp;
>
> while ((void *)next != YNL_LIST_END) {
> rsp = next;
> @@ -65,15 +172,16 @@ void nfsd_rpc_status_get_list_free(struct nfsd_rpc_status_get_list *rsp)
> }
> }
>
> -struct nfsd_rpc_status_get_list *nfsd_rpc_status_get_dump(struct ynl_sock *ys)
> +struct nfsd_rpc_status_get_rsp_list *
> +nfsd_rpc_status_get_dump(struct ynl_sock *ys)
> {
> struct ynl_dump_state yds = {};
> struct nlmsghdr *nlh;
> int err;
>
> yds.ys = ys;
> - yds.alloc_sz = sizeof(struct nfsd_rpc_status_get_list);
> - yds.cb = nfsd_rpc_status_get_rsp_parse;
> + yds.alloc_sz = sizeof(struct nfsd_rpc_status_get_rsp_list);
> + yds.cb = nfsd_rpc_status_get_rsp_dump_parse;
> yds.rsp_cmd = NFSD_CMD_RPC_STATUS_GET;
> yds.rsp_policy = &nfsd_rpc_status_nest;
>
> @@ -86,7 +194,7 @@ struct nfsd_rpc_status_get_list *nfsd_rpc_status_get_dump(struct ynl_sock *ys)
> return yds.first;
>
> free_list:
> - nfsd_rpc_status_get_list_free(yds.first);
> + nfsd_rpc_status_get_rsp_list_free(yds.first);
> return NULL;
> }
>
> diff --git a/tools/net/ynl/generated/nfsd-user.h b/tools/net/ynl/generated/nfsd-user.h
> index b6b69501031a..989c6e209ced 100644
> --- a/tools/net/ynl/generated/nfsd-user.h
> +++ b/tools/net/ynl/generated/nfsd-user.h
> @@ -21,13 +21,47 @@ const char *nfsd_op_str(int op);
> /* Common nested types */
> /* ============== NFSD_CMD_RPC_STATUS_GET ============== */
> /* NFSD_CMD_RPC_STATUS_GET - dump */
> -struct nfsd_rpc_status_get_list {
> - struct nfsd_rpc_status_get_list *next;
> - struct nfsd_rpc_status_get_rsp obj __attribute__ ((aligned (8)));
> +struct nfsd_rpc_status_get_rsp_dump {
> + struct {
> + __u32 xid:1;
> + __u32 flags:1;
> + __u32 prog:1;
> + __u32 version:1;
> + __u32 proc:1;
> + __u32 service_time:1;
> + __u32 saddr4:1;
> + __u32 daddr4:1;
> + __u32 saddr6_len;
> + __u32 daddr6_len;
> + __u32 sport:1;
> + __u32 dport:1;
> + } _present;
> +
> + __u32 xid /* big-endian */;
> + __u32 flags;
> + __u32 prog;
> + __u8 version;
> + __u32 proc;
> + __s64 service_time;
> + __u32 saddr4 /* big-endian */;
> + __u32 daddr4 /* big-endian */;
> + void *saddr6;
> + void *daddr6;
> + __u16 sport /* big-endian */;
> + __u16 dport /* big-endian */;
> + unsigned int n_compound_ops;
> + __u32 *compound_ops;
> };
>
> -void nfsd_rpc_status_get_list_free(struct nfsd_rpc_status_get_list *rsp);
> +struct nfsd_rpc_status_get_rsp_list {
> + struct nfsd_rpc_status_get_rsp_list *next;
> + struct nfsd_rpc_status_get_rsp_dump obj __attribute__((aligned(8)));
> +};
>
> -struct nfsd_rpc_status_get_list *nfsd_rpc_status_get_dump(struct ynl_sock *ys);
> +void
> +nfsd_rpc_status_get_rsp_list_free(struct nfsd_rpc_status_get_rsp_list *rsp);
> +
> +struct nfsd_rpc_status_get_rsp_list *
> +nfsd_rpc_status_get_dump(struct ynl_sock *ys);
>
> #endif /* _LINUX_NFSD_GEN_H */
> --
> 2.41.0
>
--
Chuck Lever
Powered by blists - more mailing lists