diff options
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfssvc.c | 76 |
1 files changed, 49 insertions, 27 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 89ed04696865..1d163b616915 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -64,6 +64,32 @@ struct nfsd_list { | |||
64 | }; | 64 | }; |
65 | static struct list_head nfsd_list = LIST_HEAD_INIT(nfsd_list); | 65 | static struct list_head nfsd_list = LIST_HEAD_INIT(nfsd_list); |
66 | 66 | ||
67 | #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) | ||
68 | static struct svc_stat nfsd_acl_svcstats; | ||
69 | static struct svc_version * nfsd_acl_version[] = { | ||
70 | [2] = &nfsd_acl_version2, | ||
71 | [3] = &nfsd_acl_version3, | ||
72 | }; | ||
73 | |||
74 | #define NFSD_ACL_MINVERS 2 | ||
75 | #define NFSD_ACL_NRVERS (sizeof(nfsd_acl_version)/sizeof(nfsd_acl_version[0])) | ||
76 | static struct svc_version *nfsd_acl_versions[NFSD_ACL_NRVERS]; | ||
77 | |||
78 | static struct svc_program nfsd_acl_program = { | ||
79 | .pg_prog = NFS_ACL_PROGRAM, | ||
80 | .pg_nvers = NFSD_ACL_NRVERS, | ||
81 | .pg_vers = nfsd_acl_versions, | ||
82 | .pg_name = "nfsd", | ||
83 | .pg_class = "nfsd", | ||
84 | .pg_stats = &nfsd_acl_svcstats, | ||
85 | .pg_authenticate = &svc_set_client, | ||
86 | }; | ||
87 | |||
88 | static struct svc_stat nfsd_acl_svcstats = { | ||
89 | .program = &nfsd_acl_program, | ||
90 | }; | ||
91 | #endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */ | ||
92 | |||
67 | static struct svc_version * nfsd_version[] = { | 93 | static struct svc_version * nfsd_version[] = { |
68 | [2] = &nfsd_version2, | 94 | [2] = &nfsd_version2, |
69 | #if defined(CONFIG_NFSD_V3) | 95 | #if defined(CONFIG_NFSD_V3) |
@@ -79,6 +105,9 @@ static struct svc_version * nfsd_version[] = { | |||
79 | static struct svc_version *nfsd_versions[NFSD_NRVERS]; | 105 | static struct svc_version *nfsd_versions[NFSD_NRVERS]; |
80 | 106 | ||
81 | struct svc_program nfsd_program = { | 107 | struct svc_program nfsd_program = { |
108 | #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) | ||
109 | .pg_next = &nfsd_acl_program, | ||
110 | #endif | ||
82 | .pg_prog = NFS_PROGRAM, /* program number */ | 111 | .pg_prog = NFS_PROGRAM, /* program number */ |
83 | .pg_nvers = NFSD_NRVERS, /* nr of entries in nfsd_version */ | 112 | .pg_nvers = NFSD_NRVERS, /* nr of entries in nfsd_version */ |
84 | .pg_vers = nfsd_versions, /* version table */ | 113 | .pg_vers = nfsd_versions, /* version table */ |
@@ -147,6 +176,26 @@ nfsd_svc(unsigned short port, int nrservs) | |||
147 | nfsd_program.pg_vers[i] = nfsd_version[i]; | 176 | nfsd_program.pg_vers[i] = nfsd_version[i]; |
148 | } | 177 | } |
149 | 178 | ||
179 | |||
180 | #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) | ||
181 | found_one = 0; | ||
182 | |||
183 | for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++) { | ||
184 | if (NFSCTL_VERISSET(nfsd_versbits, i)) { | ||
185 | nfsd_acl_program.pg_vers[i] = | ||
186 | nfsd_acl_version[i]; | ||
187 | found_one = 1; | ||
188 | } else | ||
189 | nfsd_acl_program.pg_vers[i] = NULL; | ||
190 | } | ||
191 | |||
192 | if (!found_one) { | ||
193 | for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++) | ||
194 | nfsd_acl_program.pg_vers[i] = | ||
195 | nfsd_acl_version[i]; | ||
196 | } | ||
197 | #endif | ||
198 | |||
150 | atomic_set(&nfsd_busy, 0); | 199 | atomic_set(&nfsd_busy, 0); |
151 | error = -ENOMEM; | 200 | error = -ENOMEM; |
152 | nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE); | 201 | nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE); |
@@ -411,30 +460,3 @@ nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp) | |||
411 | nfsd_cache_update(rqstp, proc->pc_cachetype, statp + 1); | 460 | nfsd_cache_update(rqstp, proc->pc_cachetype, statp + 1); |
412 | return 1; | 461 | return 1; |
413 | } | 462 | } |
414 | |||
415 | #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) | ||
416 | static struct svc_stat nfsd_acl_svcstats; | ||
417 | static struct svc_version * nfsd_acl_version[] = { | ||
418 | [2] = &nfsd_acl_version2, | ||
419 | [3] = &nfsd_acl_version3, | ||
420 | }; | ||
421 | |||
422 | #define NFSD_ACL_NRVERS (sizeof(nfsd_acl_version)/sizeof(nfsd_acl_version[0])) | ||
423 | static struct svc_program nfsd_acl_program = { | ||
424 | .pg_prog = NFS_ACL_PROGRAM, | ||
425 | .pg_nvers = NFSD_ACL_NRVERS, | ||
426 | .pg_vers = nfsd_acl_version, | ||
427 | .pg_name = "nfsd", | ||
428 | .pg_class = "nfsd", | ||
429 | .pg_stats = &nfsd_acl_svcstats, | ||
430 | .pg_authenticate = &svc_set_client, | ||
431 | }; | ||
432 | |||
433 | static struct svc_stat nfsd_acl_svcstats = { | ||
434 | .program = &nfsd_acl_program, | ||
435 | }; | ||
436 | |||
437 | #define nfsd_acl_program_p &nfsd_acl_program | ||
438 | #else | ||
439 | #define nfsd_acl_program_p NULL | ||
440 | #endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */ | ||