diff options
Diffstat (limited to 'fs/nfs/nfs4client.c')
| -rw-r--r-- | fs/nfs/nfs4client.c | 33 | 
1 files changed, 32 insertions, 1 deletions
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 0bd77cc1f639..daacc78a3d48 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -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;  |