]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
nfsd: new netlink ops to get/set server pool_mode
authorJeff Layton <jlayton@kernel.org>
Fri, 14 Jun 2024 12:59:10 +0000 (08:59 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 8 Jul 2024 18:10:05 +0000 (14:10 -0400)
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Documentation/netlink/specs/nfsd.yaml
fs/nfsd/netlink.c
fs/nfsd/netlink.h
fs/nfsd/nfsctl.c
include/uapi/linux/nfsd_netlink.h

index 6bda7a467301844e4aa465e77b124748c2b2aa98..c87658114852ac9c8787611bf0eefde5e2b92561 100644 (file)
@@ -115,6 +115,15 @@ attribute-sets:
         type: nest
         nested-attributes: sock
         multi-attr: true
+  -
+    name: pool-mode
+    attributes:
+      -
+        name: mode
+        type: string
+      -
+        name: npools
+        type: u32
 
 operations:
   list:
@@ -195,3 +204,21 @@ operations:
         reply:
           attributes:
             - 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
index 529a75ecf22e8d485d2250e4f500f977f2499f93..ca54aa5835305ecb005f88ad723229a201a4cbe8 100644 (file)
@@ -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_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 */
 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,
                .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 = {
index 2e132ef328f8d4e9a6df91773df69e3e4c0793e5..8eb903f24c416a92368475a068f2d36b7579a086 100644 (file)
@@ -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_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_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;
 
index 3da7e4b3e2c3e794fbbad0f898f0762273ef3e26..9e0ea6fc2aa326c5413d792743a330ee5eec68f9 100644 (file)
@@ -2156,6 +2156,63 @@ err_free_msg:
        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
  * @net: a freshly-created network namespace
index 24c86dbc7ed54c03246f5027e443d47d97395252..887cbd12b695f2398c96976ba2d70e68ee0d93c0 100644 (file)
@@ -70,6 +70,14 @@ enum {
        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 {
        NFSD_CMD_RPC_STATUS_GET = 1,
        NFSD_CMD_THREADS_SET,
@@ -78,6 +86,8 @@ enum {
        NFSD_CMD_VERSION_GET,
        NFSD_CMD_LISTENER_SET,
        NFSD_CMD_LISTENER_GET,
+       NFSD_CMD_POOL_MODE_SET,
+       NFSD_CMD_POOL_MODE_GET,
 
        __NFSD_CMD_MAX,
        NFSD_CMD_MAX = (__NFSD_CMD_MAX - 1)