diff options
Diffstat (limited to 'fs/nfsd/netlink.c')
| -rw-r--r-- | fs/nfsd/netlink.c | 66 | 
1 files changed, 66 insertions, 0 deletions
diff --git a/fs/nfsd/netlink.c b/fs/nfsd/netlink.c index 0e1d635ec5f9..62d2586d9902 100644 --- a/fs/nfsd/netlink.c +++ b/fs/nfsd/netlink.c @@ -10,6 +10,36 @@  #include <uapi/linux/nfsd_netlink.h> +/* Common nested types */ +const struct nla_policy nfsd_sock_nl_policy[NFSD_A_SOCK_TRANSPORT_NAME + 1] = { +	[NFSD_A_SOCK_ADDR] = { .type = NLA_BINARY, }, +	[NFSD_A_SOCK_TRANSPORT_NAME] = { .type = NLA_NUL_STRING, }, +}; + +const struct nla_policy nfsd_version_nl_policy[NFSD_A_VERSION_ENABLED + 1] = { +	[NFSD_A_VERSION_MAJOR] = { .type = NLA_U32, }, +	[NFSD_A_VERSION_MINOR] = { .type = NLA_U32, }, +	[NFSD_A_VERSION_ENABLED] = { .type = NLA_FLAG, }, +}; + +/* NFSD_CMD_THREADS_SET - do */ +static const struct nla_policy nfsd_threads_set_nl_policy[NFSD_A_SERVER_SCOPE + 1] = { +	[NFSD_A_SERVER_THREADS] = { .type = NLA_U32, }, +	[NFSD_A_SERVER_GRACETIME] = { .type = NLA_U32, }, +	[NFSD_A_SERVER_LEASETIME] = { .type = NLA_U32, }, +	[NFSD_A_SERVER_SCOPE] = { .type = NLA_NUL_STRING, }, +}; + +/* NFSD_CMD_VERSION_SET - do */ +static const struct nla_policy nfsd_version_set_nl_policy[NFSD_A_SERVER_PROTO_VERSION + 1] = { +	[NFSD_A_SERVER_PROTO_VERSION] = NLA_POLICY_NESTED(nfsd_version_nl_policy), +}; + +/* NFSD_CMD_LISTENER_SET - do */ +static const struct nla_policy nfsd_listener_set_nl_policy[NFSD_A_SERVER_SOCK_ADDR + 1] = { +	[NFSD_A_SERVER_SOCK_ADDR] = NLA_POLICY_NESTED(nfsd_sock_nl_policy), +}; +  /* Ops table for nfsd */  static const struct genl_split_ops nfsd_nl_ops[] = {  	{ @@ -19,6 +49,42 @@ static const struct genl_split_ops nfsd_nl_ops[] = {  		.done	= nfsd_nl_rpc_status_get_done,  		.flags	= GENL_CMD_CAP_DUMP,  	}, +	{ +		.cmd		= NFSD_CMD_THREADS_SET, +		.doit		= nfsd_nl_threads_set_doit, +		.policy		= nfsd_threads_set_nl_policy, +		.maxattr	= NFSD_A_SERVER_SCOPE, +		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO, +	}, +	{ +		.cmd	= NFSD_CMD_THREADS_GET, +		.doit	= nfsd_nl_threads_get_doit, +		.flags	= GENL_CMD_CAP_DO, +	}, +	{ +		.cmd		= NFSD_CMD_VERSION_SET, +		.doit		= nfsd_nl_version_set_doit, +		.policy		= nfsd_version_set_nl_policy, +		.maxattr	= NFSD_A_SERVER_PROTO_VERSION, +		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO, +	}, +	{ +		.cmd	= NFSD_CMD_VERSION_GET, +		.doit	= nfsd_nl_version_get_doit, +		.flags	= GENL_CMD_CAP_DO, +	}, +	{ +		.cmd		= NFSD_CMD_LISTENER_SET, +		.doit		= nfsd_nl_listener_set_doit, +		.policy		= nfsd_listener_set_nl_policy, +		.maxattr	= NFSD_A_SERVER_SOCK_ADDR, +		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO, +	}, +	{ +		.cmd	= NFSD_CMD_LISTENER_GET, +		.doit	= nfsd_nl_listener_get_doit, +		.flags	= GENL_CMD_CAP_DO, +	},  };  struct genl_family nfsd_nl_family __ro_after_init = {  |