@@ -106,7 +106,7 @@ static struct svc_program nfsd_acl_program = {
106
106
107
107
#endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */
108
108
109
- static const struct svc_version * nfsd_version [] = {
109
+ static const struct svc_version * nfsd_version [NFSD_MAXVERS + 1 ] = {
110
110
#if defined(CONFIG_NFSD_V2 )
111
111
[2 ] = & nfsd_version2 ,
112
112
#endif
@@ -116,15 +116,12 @@ static const struct svc_version *nfsd_version[] = {
116
116
#endif
117
117
};
118
118
119
- #define NFSD_MINVERS 2
120
- #define NFSD_NRVERS ARRAY_SIZE(nfsd_version)
121
-
122
119
struct svc_program nfsd_program = {
123
120
#if defined(CONFIG_NFSD_V2_ACL ) || defined(CONFIG_NFSD_V3_ACL )
124
121
.pg_next = & nfsd_acl_program ,
125
122
#endif
126
123
.pg_prog = NFS_PROGRAM , /* program number */
127
- .pg_nvers = NFSD_NRVERS , /* nr of entries in nfsd_version */
124
+ .pg_nvers = NFSD_MAXVERS + 1 , /* nr of entries in nfsd_version */
128
125
.pg_vers = nfsd_version , /* version table */
129
126
.pg_name = "nfsd" , /* program name */
130
127
.pg_class = "nfsd" , /* authentication class */
@@ -135,78 +132,24 @@ struct svc_program nfsd_program = {
135
132
136
133
bool nfsd_support_version (int vers )
137
134
{
138
- if (vers >= NFSD_MINVERS && vers < NFSD_NRVERS )
135
+ if (vers >= NFSD_MINVERS && vers <= NFSD_MAXVERS )
139
136
return nfsd_version [vers ] != NULL ;
140
137
return false;
141
138
}
142
139
143
- static bool *
144
- nfsd_alloc_versions (void )
145
- {
146
- bool * vers = kmalloc_array (NFSD_NRVERS , sizeof (bool ), GFP_KERNEL );
147
- unsigned i ;
148
-
149
- if (vers ) {
150
- /* All compiled versions are enabled by default */
151
- for (i = 0 ; i < NFSD_NRVERS ; i ++ )
152
- vers [i ] = nfsd_support_version (i );
153
- }
154
- return vers ;
155
- }
156
-
157
- static bool *
158
- nfsd_alloc_minorversions (void )
159
- {
160
- bool * vers = kmalloc_array (NFSD_SUPPORTED_MINOR_VERSION + 1 ,
161
- sizeof (bool ), GFP_KERNEL );
162
- unsigned i ;
163
-
164
- if (vers ) {
165
- /* All minor versions are enabled by default */
166
- for (i = 0 ; i <= NFSD_SUPPORTED_MINOR_VERSION ; i ++ )
167
- vers [i ] = nfsd_support_version (4 );
168
- }
169
- return vers ;
170
- }
171
-
172
- void
173
- nfsd_netns_free_versions (struct nfsd_net * nn )
174
- {
175
- kfree (nn -> nfsd_versions );
176
- kfree (nn -> nfsd4_minorversions );
177
- nn -> nfsd_versions = NULL ;
178
- nn -> nfsd4_minorversions = NULL ;
179
- }
180
-
181
- static void
182
- nfsd_netns_init_versions (struct nfsd_net * nn )
183
- {
184
- if (!nn -> nfsd_versions ) {
185
- nn -> nfsd_versions = nfsd_alloc_versions ();
186
- nn -> nfsd4_minorversions = nfsd_alloc_minorversions ();
187
- if (!nn -> nfsd_versions || !nn -> nfsd4_minorversions )
188
- nfsd_netns_free_versions (nn );
189
- }
190
- }
191
-
192
140
int nfsd_vers (struct nfsd_net * nn , int vers , enum vers_op change )
193
141
{
194
- if (vers < NFSD_MINVERS || vers >= NFSD_NRVERS )
142
+ if (vers < NFSD_MINVERS || vers > NFSD_MAXVERS )
195
143
return 0 ;
196
144
switch (change ) {
197
145
case NFSD_SET :
198
- if (nn -> nfsd_versions )
199
- nn -> nfsd_versions [vers ] = nfsd_support_version (vers );
146
+ nn -> nfsd_versions [vers ] = nfsd_support_version (vers );
200
147
break ;
201
148
case NFSD_CLEAR :
202
- nfsd_netns_init_versions (nn );
203
- if (nn -> nfsd_versions )
204
- nn -> nfsd_versions [vers ] = false;
149
+ nn -> nfsd_versions [vers ] = false;
205
150
break ;
206
151
case NFSD_TEST :
207
- if (nn -> nfsd_versions )
208
- return nn -> nfsd_versions [vers ];
209
- fallthrough ;
152
+ return nn -> nfsd_versions [vers ];
210
153
case NFSD_AVAIL :
211
154
return nfsd_support_version (vers );
212
155
}
@@ -233,23 +176,16 @@ int nfsd_minorversion(struct nfsd_net *nn, u32 minorversion, enum vers_op change
233
176
234
177
switch (change ) {
235
178
case NFSD_SET :
236
- if (nn -> nfsd4_minorversions ) {
237
- nfsd_vers (nn , 4 , NFSD_SET );
238
- nn -> nfsd4_minorversions [minorversion ] =
239
- nfsd_vers (nn , 4 , NFSD_TEST );
240
- }
179
+ nfsd_vers (nn , 4 , NFSD_SET );
180
+ nn -> nfsd4_minorversions [minorversion ] =
181
+ nfsd_vers (nn , 4 , NFSD_TEST );
241
182
break ;
242
183
case NFSD_CLEAR :
243
- nfsd_netns_init_versions (nn );
244
- if (nn -> nfsd4_minorversions ) {
245
- nn -> nfsd4_minorversions [minorversion ] = false;
246
- nfsd_adjust_nfsd_versions4 (nn );
247
- }
184
+ nn -> nfsd4_minorversions [minorversion ] = false;
185
+ nfsd_adjust_nfsd_versions4 (nn );
248
186
break ;
249
187
case NFSD_TEST :
250
- if (nn -> nfsd4_minorversions )
251
- return nn -> nfsd4_minorversions [minorversion ];
252
- return nfsd_vers (nn , 4 , NFSD_TEST );
188
+ return nn -> nfsd4_minorversions [minorversion ];
253
189
case NFSD_AVAIL :
254
190
return minorversion <= NFSD_SUPPORTED_MINOR_VERSION &&
255
191
nfsd_vers (nn , 4 , NFSD_AVAIL );
@@ -568,11 +504,11 @@ void nfsd_reset_versions(struct nfsd_net *nn)
568
504
{
569
505
int i ;
570
506
571
- for (i = 0 ; i < NFSD_NRVERS ; i ++ )
507
+ for (i = 0 ; i <= NFSD_MAXVERS ; i ++ )
572
508
if (nfsd_vers (nn , i , NFSD_TEST ))
573
509
return ;
574
510
575
- for (i = 0 ; i < NFSD_NRVERS ; i ++ )
511
+ for (i = 0 ; i <= NFSD_MAXVERS ; i ++ )
576
512
if (i != 4 )
577
513
nfsd_vers (nn , i , NFSD_SET );
578
514
else {
@@ -905,17 +841,17 @@ nfsd_init_request(struct svc_rqst *rqstp,
905
841
if (likely (nfsd_vers (nn , rqstp -> rq_vers , NFSD_TEST )))
906
842
return svc_generic_init_request (rqstp , progp , ret );
907
843
908
- ret -> mismatch .lovers = NFSD_NRVERS ;
909
- for (i = NFSD_MINVERS ; i < NFSD_NRVERS ; i ++ ) {
844
+ ret -> mismatch .lovers = NFSD_MAXVERS + 1 ;
845
+ for (i = NFSD_MINVERS ; i <= NFSD_MAXVERS ; i ++ ) {
910
846
if (nfsd_vers (nn , i , NFSD_TEST )) {
911
847
ret -> mismatch .lovers = i ;
912
848
break ;
913
849
}
914
850
}
915
- if (ret -> mismatch .lovers == NFSD_NRVERS )
851
+ if (ret -> mismatch .lovers > NFSD_MAXVERS )
916
852
return rpc_prog_unavail ;
917
853
ret -> mismatch .hivers = NFSD_MINVERS ;
918
- for (i = NFSD_NRVERS - 1 ; i >= NFSD_MINVERS ; i -- ) {
854
+ for (i = NFSD_MAXVERS ; i >= NFSD_MINVERS ; i -- ) {
919
855
if (nfsd_vers (nn , i , NFSD_TEST )) {
920
856
ret -> mismatch .hivers = i ;
921
857
break ;
0 commit comments