]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFS: Create an nfs4_server_set_init_caps() function
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 15 Aug 2025 20:03:29 +0000 (16:03 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:24:31 +0000 (16:24 +0200)
[ Upstream commit 01dde76e471229e3437a2686c572f4980b2c483e ]

And call it before doing an FSINFO probe to reset to the baseline
capabilities before probing.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Stable-dep-of: b01f21cacde9 ("NFS: Fix the setting of capabilities when automounting a new filesystem")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfs/internal.h
fs/nfs/nfs4client.c
fs/nfs/nfs4proc.c

index 76605eb93609e5a15b958455a7379f14ab72e82e..4bced7c8aa7d9df4823d241ad52ac68358d89430 100644 (file)
@@ -219,6 +219,7 @@ extern struct nfs_client *
 nfs4_find_client_sessionid(struct net *, const struct sockaddr *,
                                struct nfs4_sessionid *, u32);
 extern struct nfs_server *nfs_create_server(struct fs_context *);
+extern void nfs4_server_set_init_caps(struct nfs_server *);
 extern struct nfs_server *nfs4_create_server(struct fs_context *);
 extern struct nfs_server *nfs4_create_referral_server(struct fs_context *);
 extern int nfs4_update_server(struct nfs_server *server, const char *hostname,
index 8557b2218aa196c2f5dbdb50c26e2e4220a46d20..aa78428b40ccf47004ac3d77b0cbf6c99b47ea46 100644 (file)
@@ -1065,6 +1065,24 @@ static void nfs4_session_limit_xasize(struct nfs_server *server)
 #endif
 }
 
+void nfs4_server_set_init_caps(struct nfs_server *server)
+{
+       /* Set the basic capabilities */
+       server->caps |= server->nfs_client->cl_mvops->init_caps;
+       if (server->flags & NFS_MOUNT_NORDIRPLUS)
+                       server->caps &= ~NFS_CAP_READDIRPLUS;
+       if (server->nfs_client->cl_proto == XPRT_TRANSPORT_RDMA)
+               server->caps &= ~NFS_CAP_READ_PLUS;
+
+       /*
+        * Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower
+        * authentication.
+        */
+       if (nfs4_disable_idmapping &&
+                       server->client->cl_auth->au_flavor == RPC_AUTH_UNIX)
+               server->caps |= NFS_CAP_UIDGID_NOMAP;
+}
+
 static int nfs4_server_common_setup(struct nfs_server *server,
                struct nfs_fh *mntfh, bool auth_probe)
 {
@@ -1084,20 +1102,7 @@ static int nfs4_server_common_setup(struct nfs_server *server,
        if (error < 0)
                goto out;
 
-       /* Set the basic capabilities */
-       server->caps |= server->nfs_client->cl_mvops->init_caps;
-       if (server->flags & NFS_MOUNT_NORDIRPLUS)
-                       server->caps &= ~NFS_CAP_READDIRPLUS;
-       if (server->nfs_client->cl_proto == XPRT_TRANSPORT_RDMA)
-               server->caps &= ~NFS_CAP_READ_PLUS;
-       /*
-        * Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower
-        * authentication.
-        */
-       if (nfs4_disable_idmapping &&
-                       server->client->cl_auth->au_flavor == RPC_AUTH_UNIX)
-               server->caps |= NFS_CAP_UIDGID_NOMAP;
-
+       nfs4_server_set_init_caps(server);
 
        /* Probe the root fh to retrieve its FSID and filehandle */
        error = nfs4_get_rootfh(server, mntfh, auth_probe);
index 528e904f54753cab7d3e229439f6cead03ebb6b5..ac28b78ae3037e3a156d790bf0300ab6b2c4094b 100644 (file)
@@ -3968,6 +3968,8 @@ int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
                .interruptible = true,
        };
        int err;
+
+       nfs4_server_set_init_caps(server);
        do {
                err = nfs4_handle_exception(server,
                                _nfs4_server_capabilities(server, fhandle),