Merge tag 'for-linus-5.10-1' of git://github.com/cminyard/linux-ipmi
[linux-2.6-microblaze.git] / fs / nfs / nfs4client.c
index 0bd77cc..daacc78 100644 (file)
@@ -880,7 +880,7 @@ static int nfs4_set_client(struct nfs_server *server,
 
        if (minorversion == 0)
                __set_bit(NFS_CS_REUSEPORT, &cl_init.init_flags);
-       else if (proto == XPRT_TRANSPORT_TCP)
+       if (proto == XPRT_TRANSPORT_TCP)
                cl_init.nconnect = nconnect;
 
        if (server->flags & NFS_MOUNT_NORESVPORT)
@@ -992,6 +992,36 @@ static void nfs4_session_limit_rwsize(struct nfs_server *server)
 #endif /* CONFIG_NFS_V4_1 */
 }
 
+/*
+ * Limit xattr sizes using the channel attributes.
+ */
+static void nfs4_session_limit_xasize(struct nfs_server *server)
+{
+#ifdef CONFIG_NFS_V4_2
+       struct nfs4_session *sess;
+       u32 server_gxa_sz;
+       u32 server_sxa_sz;
+       u32 server_lxa_sz;
+
+       if (!nfs4_has_session(server->nfs_client))
+               return;
+
+       sess = server->nfs_client->cl_session;
+
+       server_gxa_sz = sess->fc_attrs.max_resp_sz - nfs42_maxgetxattr_overhead;
+       server_sxa_sz = sess->fc_attrs.max_rqst_sz - nfs42_maxsetxattr_overhead;
+       server_lxa_sz = sess->fc_attrs.max_resp_sz -
+           nfs42_maxlistxattrs_overhead;
+
+       if (server->gxasize > server_gxa_sz)
+               server->gxasize = server_gxa_sz;
+       if (server->sxasize > server_sxa_sz)
+               server->sxasize = server_sxa_sz;
+       if (server->lxasize > server_lxa_sz)
+               server->lxasize = server_lxa_sz;
+#endif
+}
+
 static int nfs4_server_common_setup(struct nfs_server *server,
                struct nfs_fh *mntfh, bool auth_probe)
 {
@@ -1039,6 +1069,7 @@ static int nfs4_server_common_setup(struct nfs_server *server,
                goto out;
 
        nfs4_session_limit_rwsize(server);
+       nfs4_session_limit_xasize(server);
 
        if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN)
                server->namelen = NFS4_MAXNAMLEN;