diff options
Diffstat (limited to '')
| -rw-r--r-- | fs/nfsd/nfsctl.c | 51 | 
1 files changed, 45 insertions, 6 deletions
| diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 51844048937f..4e042105fb6e 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -39,6 +39,7 @@ enum {  	NFSD_Versions,  	NFSD_Ports,  	NFSD_MaxBlkSize, +	NFSD_MaxConnections,  	NFSD_SupportedEnctypes,  	/*  	 * The below MUST come last.  Otherwise we leave a hole in nfsd_files[] @@ -62,6 +63,7 @@ static ssize_t write_pool_threads(struct file *file, char *buf, size_t size);  static ssize_t write_versions(struct file *file, char *buf, size_t size);  static ssize_t write_ports(struct file *file, char *buf, size_t size);  static ssize_t write_maxblksize(struct file *file, char *buf, size_t size); +static ssize_t write_maxconn(struct file *file, char *buf, size_t size);  #ifdef CONFIG_NFSD_V4  static ssize_t write_leasetime(struct file *file, char *buf, size_t size);  static ssize_t write_gracetime(struct file *file, char *buf, size_t size); @@ -77,6 +79,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {  	[NFSD_Versions] = write_versions,  	[NFSD_Ports] = write_ports,  	[NFSD_MaxBlkSize] = write_maxblksize, +	[NFSD_MaxConnections] = write_maxconn,  #ifdef CONFIG_NFSD_V4  	[NFSD_Leasetime] = write_leasetime,  	[NFSD_Gracetime] = write_gracetime, @@ -369,8 +372,7 @@ static ssize_t write_filehandle(struct file *file, char *buf, size_t size)  	if (maxsize < NFS_FHSIZE)  		return -EINVAL; -	if (maxsize > NFS3_FHSIZE) -		maxsize = NFS3_FHSIZE; +	maxsize = min(maxsize, NFS3_FHSIZE);  	if (qword_get(&mesg, mesg, size)>0)  		return -EINVAL; @@ -871,10 +873,8 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)  		/* force bsize into allowed range and  		 * required alignment.  		 */ -		if (bsize < 1024) -			bsize = 1024; -		if (bsize > NFSSVC_MAXBLKSIZE) -			bsize = NFSSVC_MAXBLKSIZE; +		bsize = max_t(int, bsize, 1024); +		bsize = min_t(int, bsize, NFSSVC_MAXBLKSIZE);  		bsize &= ~(1024-1);  		mutex_lock(&nfsd_mutex);  		if (nn->nfsd_serv) { @@ -889,6 +889,44 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)  							nfsd_max_blksize);  } +/** + * write_maxconn - Set or report the current max number of connections + * + * Input: + *			buf:		ignored + *			size:		zero + * OR + * + * Input: + * 			buf:		C string containing an unsigned + * 					integer value representing the new + * 					number of max connections + *			size:		non-zero length of C string in @buf + * Output: + *	On success:	passed-in buffer filled with '\n'-terminated C string + *			containing numeric value of max_connections setting + *			for this net namespace; + *			return code is the size in bytes of the string + *	On error:	return code is zero or a negative errno value + */ +static ssize_t write_maxconn(struct file *file, char *buf, size_t size) +{ +	char *mesg = buf; +	struct net *net = file->f_dentry->d_sb->s_fs_info; +	struct nfsd_net *nn = net_generic(net, nfsd_net_id); +	unsigned int maxconn = nn->max_connections; + +	if (size > 0) { +		int rv = get_uint(&mesg, &maxconn); + +		if (rv) +			return rv; +		nn->max_connections = maxconn; +	} + +	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%u\n", maxconn); +} +  #ifdef CONFIG_NFSD_V4  static ssize_t __nfsd4_write_time(struct file *file, char *buf, size_t size,  				  time_t *time, struct nfsd_net *nn) @@ -1064,6 +1102,7 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent)  		[NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},  		[NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},  		[NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, +		[NFSD_MaxConnections] = {"max_connections", &transaction_ops, S_IWUSR|S_IRUGO},  #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)  		[NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO},  #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ | 
