diff options
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-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 { | |||
39 | NFSD_Versions, | 39 | NFSD_Versions, |
40 | NFSD_Ports, | 40 | NFSD_Ports, |
41 | NFSD_MaxBlkSize, | 41 | NFSD_MaxBlkSize, |
42 | NFSD_MaxConnections, | ||
42 | NFSD_SupportedEnctypes, | 43 | NFSD_SupportedEnctypes, |
43 | /* | 44 | /* |
44 | * The below MUST come last. Otherwise we leave a hole in nfsd_files[] | 45 | * 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); | |||
62 | static ssize_t write_versions(struct file *file, char *buf, size_t size); | 63 | static ssize_t write_versions(struct file *file, char *buf, size_t size); |
63 | static ssize_t write_ports(struct file *file, char *buf, size_t size); | 64 | static ssize_t write_ports(struct file *file, char *buf, size_t size); |
64 | static ssize_t write_maxblksize(struct file *file, char *buf, size_t size); | 65 | static ssize_t write_maxblksize(struct file *file, char *buf, size_t size); |
66 | static ssize_t write_maxconn(struct file *file, char *buf, size_t size); | ||
65 | #ifdef CONFIG_NFSD_V4 | 67 | #ifdef CONFIG_NFSD_V4 |
66 | static ssize_t write_leasetime(struct file *file, char *buf, size_t size); | 68 | static ssize_t write_leasetime(struct file *file, char *buf, size_t size); |
67 | static ssize_t write_gracetime(struct file *file, char *buf, size_t size); | 69 | 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) = { | |||
77 | [NFSD_Versions] = write_versions, | 79 | [NFSD_Versions] = write_versions, |
78 | [NFSD_Ports] = write_ports, | 80 | [NFSD_Ports] = write_ports, |
79 | [NFSD_MaxBlkSize] = write_maxblksize, | 81 | [NFSD_MaxBlkSize] = write_maxblksize, |
82 | [NFSD_MaxConnections] = write_maxconn, | ||
80 | #ifdef CONFIG_NFSD_V4 | 83 | #ifdef CONFIG_NFSD_V4 |
81 | [NFSD_Leasetime] = write_leasetime, | 84 | [NFSD_Leasetime] = write_leasetime, |
82 | [NFSD_Gracetime] = write_gracetime, | 85 | [NFSD_Gracetime] = write_gracetime, |
@@ -369,8 +372,7 @@ static ssize_t write_filehandle(struct file *file, char *buf, size_t size) | |||
369 | 372 | ||
370 | if (maxsize < NFS_FHSIZE) | 373 | if (maxsize < NFS_FHSIZE) |
371 | return -EINVAL; | 374 | return -EINVAL; |
372 | if (maxsize > NFS3_FHSIZE) | 375 | maxsize = min(maxsize, NFS3_FHSIZE); |
373 | maxsize = NFS3_FHSIZE; | ||
374 | 376 | ||
375 | if (qword_get(&mesg, mesg, size)>0) | 377 | if (qword_get(&mesg, mesg, size)>0) |
376 | return -EINVAL; | 378 | return -EINVAL; |
@@ -871,10 +873,8 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size) | |||
871 | /* force bsize into allowed range and | 873 | /* force bsize into allowed range and |
872 | * required alignment. | 874 | * required alignment. |
873 | */ | 875 | */ |
874 | if (bsize < 1024) | 876 | bsize = max_t(int, bsize, 1024); |
875 | bsize = 1024; | 877 | bsize = min_t(int, bsize, NFSSVC_MAXBLKSIZE); |
876 | if (bsize > NFSSVC_MAXBLKSIZE) | ||
877 | bsize = NFSSVC_MAXBLKSIZE; | ||
878 | bsize &= ~(1024-1); | 878 | bsize &= ~(1024-1); |
879 | mutex_lock(&nfsd_mutex); | 879 | mutex_lock(&nfsd_mutex); |
880 | if (nn->nfsd_serv) { | 880 | if (nn->nfsd_serv) { |
@@ -889,6 +889,44 @@ static ssize_t write_maxblksize(struct file *file, char *buf, size_t size) | |||
889 | nfsd_max_blksize); | 889 | nfsd_max_blksize); |
890 | } | 890 | } |
891 | 891 | ||
892 | /** | ||
893 | * write_maxconn - Set or report the current max number of connections | ||
894 | * | ||
895 | * Input: | ||
896 | * buf: ignored | ||
897 | * size: zero | ||
898 | * OR | ||
899 | * | ||
900 | * Input: | ||
901 | * buf: C string containing an unsigned | ||
902 | * integer value representing the new | ||
903 | * number of max connections | ||
904 | * size: non-zero length of C string in @buf | ||
905 | * Output: | ||
906 | * On success: passed-in buffer filled with '\n'-terminated C string | ||
907 | * containing numeric value of max_connections setting | ||
908 | * for this net namespace; | ||
909 | * return code is the size in bytes of the string | ||
910 | * On error: return code is zero or a negative errno value | ||
911 | */ | ||
912 | static ssize_t write_maxconn(struct file *file, char *buf, size_t size) | ||
913 | { | ||
914 | char *mesg = buf; | ||
915 | struct net *net = file->f_dentry->d_sb->s_fs_info; | ||
916 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); | ||
917 | unsigned int maxconn = nn->max_connections; | ||
918 | |||
919 | if (size > 0) { | ||
920 | int rv = get_uint(&mesg, &maxconn); | ||
921 | |||
922 | if (rv) | ||
923 | return rv; | ||
924 | nn->max_connections = maxconn; | ||
925 | } | ||
926 | |||
927 | return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%u\n", maxconn); | ||
928 | } | ||
929 | |||
892 | #ifdef CONFIG_NFSD_V4 | 930 | #ifdef CONFIG_NFSD_V4 |
893 | static ssize_t __nfsd4_write_time(struct file *file, char *buf, size_t size, | 931 | static ssize_t __nfsd4_write_time(struct file *file, char *buf, size_t size, |
894 | time_t *time, struct nfsd_net *nn) | 932 | time_t *time, struct nfsd_net *nn) |
@@ -1064,6 +1102,7 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent) | |||
1064 | [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR}, | 1102 | [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR}, |
1065 | [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO}, | 1103 | [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO}, |
1066 | [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, | 1104 | [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, |
1105 | [NFSD_MaxConnections] = {"max_connections", &transaction_ops, S_IWUSR|S_IRUGO}, | ||
1067 | #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) | 1106 | #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) |
1068 | [NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO}, | 1107 | [NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO}, |
1069 | #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ | 1108 | #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ |