mirror of
https://github.com/torvalds/linux.git
synced 2025-11-03 10:10:33 +02:00
nfsd: new netlink ops to get/set server pool_mode
Signed-off-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
5f71f3c325
commit
00506072d7
5 changed files with 113 additions and 0 deletions
|
|
@ -115,6 +115,15 @@ attribute-sets:
|
||||||
type: nest
|
type: nest
|
||||||
nested-attributes: sock
|
nested-attributes: sock
|
||||||
multi-attr: true
|
multi-attr: true
|
||||||
|
-
|
||||||
|
name: pool-mode
|
||||||
|
attributes:
|
||||||
|
-
|
||||||
|
name: mode
|
||||||
|
type: string
|
||||||
|
-
|
||||||
|
name: npools
|
||||||
|
type: u32
|
||||||
|
|
||||||
operations:
|
operations:
|
||||||
list:
|
list:
|
||||||
|
|
@ -195,3 +204,21 @@ operations:
|
||||||
reply:
|
reply:
|
||||||
attributes:
|
attributes:
|
||||||
- addr
|
- addr
|
||||||
|
-
|
||||||
|
name: pool-mode-set
|
||||||
|
doc: set the current server pool-mode
|
||||||
|
attribute-set: pool-mode
|
||||||
|
flags: [ admin-perm ]
|
||||||
|
do:
|
||||||
|
request:
|
||||||
|
attributes:
|
||||||
|
- mode
|
||||||
|
-
|
||||||
|
name: pool-mode-get
|
||||||
|
doc: get info about server pool-mode
|
||||||
|
attribute-set: pool-mode
|
||||||
|
do:
|
||||||
|
reply:
|
||||||
|
attributes:
|
||||||
|
- mode
|
||||||
|
- npools
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,11 @@ static const struct nla_policy nfsd_listener_set_nl_policy[NFSD_A_SERVER_SOCK_AD
|
||||||
[NFSD_A_SERVER_SOCK_ADDR] = NLA_POLICY_NESTED(nfsd_sock_nl_policy),
|
[NFSD_A_SERVER_SOCK_ADDR] = NLA_POLICY_NESTED(nfsd_sock_nl_policy),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* NFSD_CMD_POOL_MODE_SET - do */
|
||||||
|
static const struct nla_policy nfsd_pool_mode_set_nl_policy[NFSD_A_POOL_MODE_MODE + 1] = {
|
||||||
|
[NFSD_A_POOL_MODE_MODE] = { .type = NLA_NUL_STRING, },
|
||||||
|
};
|
||||||
|
|
||||||
/* Ops table for nfsd */
|
/* Ops table for nfsd */
|
||||||
static const struct genl_split_ops nfsd_nl_ops[] = {
|
static const struct genl_split_ops nfsd_nl_ops[] = {
|
||||||
{
|
{
|
||||||
|
|
@ -83,6 +88,18 @@ static const struct genl_split_ops nfsd_nl_ops[] = {
|
||||||
.doit = nfsd_nl_listener_get_doit,
|
.doit = nfsd_nl_listener_get_doit,
|
||||||
.flags = GENL_CMD_CAP_DO,
|
.flags = GENL_CMD_CAP_DO,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.cmd = NFSD_CMD_POOL_MODE_SET,
|
||||||
|
.doit = nfsd_nl_pool_mode_set_doit,
|
||||||
|
.policy = nfsd_pool_mode_set_nl_policy,
|
||||||
|
.maxattr = NFSD_A_POOL_MODE_MODE,
|
||||||
|
.flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cmd = NFSD_CMD_POOL_MODE_GET,
|
||||||
|
.doit = nfsd_nl_pool_mode_get_doit,
|
||||||
|
.flags = GENL_CMD_CAP_DO,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
struct genl_family nfsd_nl_family __ro_after_init = {
|
struct genl_family nfsd_nl_family __ro_after_init = {
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@ int nfsd_nl_version_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
int nfsd_nl_version_get_doit(struct sk_buff *skb, struct genl_info *info);
|
int nfsd_nl_version_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
int nfsd_nl_listener_set_doit(struct sk_buff *skb, struct genl_info *info);
|
int nfsd_nl_listener_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
int nfsd_nl_listener_get_doit(struct sk_buff *skb, struct genl_info *info);
|
int nfsd_nl_listener_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
int nfsd_nl_pool_mode_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
int nfsd_nl_pool_mode_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
|
||||||
extern struct genl_family nfsd_nl_family;
|
extern struct genl_family nfsd_nl_family;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2156,6 +2156,63 @@ int nfsd_nl_listener_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd_nl_pool_mode_set_doit - set the number of running threads
|
||||||
|
* @skb: reply buffer
|
||||||
|
* @info: netlink metadata and command arguments
|
||||||
|
*
|
||||||
|
* Return 0 on success or a negative errno.
|
||||||
|
*/
|
||||||
|
int nfsd_nl_pool_mode_set_doit(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
const struct nlattr *attr;
|
||||||
|
|
||||||
|
if (GENL_REQ_ATTR_CHECK(info, NFSD_A_POOL_MODE_MODE))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
attr = info->attrs[NFSD_A_POOL_MODE_MODE];
|
||||||
|
return sunrpc_set_pool_mode(nla_data(attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd_nl_pool_mode_get_doit - get info about pool_mode
|
||||||
|
* @skb: reply buffer
|
||||||
|
* @info: netlink metadata and command arguments
|
||||||
|
*
|
||||||
|
* Return 0 on success or a negative errno.
|
||||||
|
*/
|
||||||
|
int nfsd_nl_pool_mode_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
struct net *net = genl_info_net(info);
|
||||||
|
char buf[16];
|
||||||
|
void *hdr;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (sunrpc_get_pool_mode(buf, ARRAY_SIZE(buf)) >= ARRAY_SIZE(buf))
|
||||||
|
return -ERANGE;
|
||||||
|
|
||||||
|
skb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||||
|
if (!skb)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
err = -EMSGSIZE;
|
||||||
|
hdr = genlmsg_iput(skb, info);
|
||||||
|
if (!hdr)
|
||||||
|
goto err_free_msg;
|
||||||
|
|
||||||
|
err = nla_put_string(skb, NFSD_A_POOL_MODE_MODE, buf) |
|
||||||
|
nla_put_u32(skb, NFSD_A_POOL_MODE_NPOOLS, nfsd_nrpools(net));
|
||||||
|
if (err)
|
||||||
|
goto err_free_msg;
|
||||||
|
|
||||||
|
genlmsg_end(skb, hdr);
|
||||||
|
return genlmsg_reply(skb, info);
|
||||||
|
|
||||||
|
err_free_msg:
|
||||||
|
nlmsg_free(skb);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nfsd_net_init - Prepare the nfsd_net portion of a new net namespace
|
* nfsd_net_init - Prepare the nfsd_net portion of a new net namespace
|
||||||
* @net: a freshly-created network namespace
|
* @net: a freshly-created network namespace
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,14 @@ enum {
|
||||||
NFSD_A_SERVER_SOCK_MAX = (__NFSD_A_SERVER_SOCK_MAX - 1)
|
NFSD_A_SERVER_SOCK_MAX = (__NFSD_A_SERVER_SOCK_MAX - 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NFSD_A_POOL_MODE_MODE = 1,
|
||||||
|
NFSD_A_POOL_MODE_NPOOLS,
|
||||||
|
|
||||||
|
__NFSD_A_POOL_MODE_MAX,
|
||||||
|
NFSD_A_POOL_MODE_MAX = (__NFSD_A_POOL_MODE_MAX - 1)
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NFSD_CMD_RPC_STATUS_GET = 1,
|
NFSD_CMD_RPC_STATUS_GET = 1,
|
||||||
NFSD_CMD_THREADS_SET,
|
NFSD_CMD_THREADS_SET,
|
||||||
|
|
@ -78,6 +86,8 @@ enum {
|
||||||
NFSD_CMD_VERSION_GET,
|
NFSD_CMD_VERSION_GET,
|
||||||
NFSD_CMD_LISTENER_SET,
|
NFSD_CMD_LISTENER_SET,
|
||||||
NFSD_CMD_LISTENER_GET,
|
NFSD_CMD_LISTENER_GET,
|
||||||
|
NFSD_CMD_POOL_MODE_SET,
|
||||||
|
NFSD_CMD_POOL_MODE_GET,
|
||||||
|
|
||||||
__NFSD_CMD_MAX,
|
__NFSD_CMD_MAX,
|
||||||
NFSD_CMD_MAX = (__NFSD_CMD_MAX - 1)
|
NFSD_CMD_MAX = (__NFSD_CMD_MAX - 1)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue