diff options
author | NeilBrown <neilb@suse.de> | 2006-10-02 05:17:46 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 10:57:18 -0400 |
commit | 02a375f0ac4bc2e9b767fabb6b2f9915547226a7 (patch) | |
tree | 997bf0cb90d644acd2f573b9e04cf92eaf216e08 /fs | |
parent | 6658d3a7bbfd1768a7b599def47939417f0ee8ef (diff) |
[PATCH] knfsd: separate out some parts of nfsd_svc, which start nfs servers
Separate out the code for creating a new service, and for creating initial
sockets.
Some of these new functions will have multiple callers soon.
[akpm@osdl.org: cleanups]
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfsd/nfssvc.c | 83 |
1 files changed, 57 insertions, 26 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 140e3a2d1b9f..5d473d8f0630 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -195,6 +195,52 @@ void nfsd_reset_versions(void) | |||
195 | } | 195 | } |
196 | } | 196 | } |
197 | 197 | ||
198 | static int nfsd_create_serv(void) | ||
199 | { | ||
200 | int err = 0; | ||
201 | lock_kernel(); | ||
202 | if (nfsd_serv) { | ||
203 | nfsd_serv->sv_nrthreads++; | ||
204 | unlock_kernel(); | ||
205 | return 0; | ||
206 | } | ||
207 | |||
208 | atomic_set(&nfsd_busy, 0); | ||
209 | nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE, | ||
210 | nfsd_last_thread); | ||
211 | if (nfsd_serv == NULL) | ||
212 | err = -ENOMEM; | ||
213 | else | ||
214 | nfsd_serv->sv_nrthreads++; | ||
215 | unlock_kernel(); | ||
216 | do_gettimeofday(&nfssvc_boot); /* record boot time */ | ||
217 | return err; | ||
218 | } | ||
219 | |||
220 | static int nfsd_init_socks(int port) | ||
221 | { | ||
222 | int error; | ||
223 | if (!list_empty(&nfsd_serv->sv_permsocks)) | ||
224 | return 0; | ||
225 | |||
226 | error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); | ||
227 | if (error < 0) | ||
228 | return error; | ||
229 | error = lockd_up(IPPROTO_UDP); | ||
230 | if (error < 0) | ||
231 | return error; | ||
232 | |||
233 | #ifdef CONFIG_NFSD_TCP | ||
234 | error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); | ||
235 | if (error < 0) | ||
236 | return error; | ||
237 | error = lockd_up(IPPROTO_TCP); | ||
238 | if (error < 0) | ||
239 | return error; | ||
240 | #endif | ||
241 | return 0; | ||
242 | } | ||
243 | |||
198 | int | 244 | int |
199 | nfsd_svc(unsigned short port, int nrservs) | 245 | nfsd_svc(unsigned short port, int nrservs) |
200 | { | 246 | { |
@@ -216,32 +262,17 @@ nfsd_svc(unsigned short port, int nrservs) | |||
216 | error = nfs4_state_start(); | 262 | error = nfs4_state_start(); |
217 | if (error<0) | 263 | if (error<0) |
218 | goto out; | 264 | goto out; |
219 | if (!nfsd_serv) { | 265 | |
220 | nfsd_reset_versions(); | 266 | nfsd_reset_versions(); |
221 | 267 | ||
222 | atomic_set(&nfsd_busy, 0); | 268 | error = nfsd_create_serv(); |
223 | error = -ENOMEM; | 269 | |
224 | nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE, | 270 | if (error) |
225 | nfsd_last_thread); | 271 | goto out; |
226 | if (nfsd_serv == NULL) | 272 | error = nfsd_init_socks(port); |
227 | goto out; | 273 | if (error) |
228 | error = svc_makesock(nfsd_serv, IPPROTO_UDP, port); | 274 | goto failure; |
229 | if (error < 0) | 275 | |
230 | goto failure; | ||
231 | error = lockd_up(IPPROTO_UDP); | ||
232 | if (error < 0) | ||
233 | goto failure; | ||
234 | #ifdef CONFIG_NFSD_TCP | ||
235 | error = svc_makesock(nfsd_serv, IPPROTO_TCP, port); | ||
236 | if (error < 0) | ||
237 | goto failure; | ||
238 | error = lockd_up(IPPROTO_TCP); | ||
239 | if (error < 0) | ||
240 | goto failure; | ||
241 | #endif | ||
242 | do_gettimeofday(&nfssvc_boot); /* record boot time */ | ||
243 | } else | ||
244 | nfsd_serv->sv_nrthreads++; | ||
245 | nrservs -= (nfsd_serv->sv_nrthreads-1); | 276 | nrservs -= (nfsd_serv->sv_nrthreads-1); |
246 | while (nrservs > 0) { | 277 | while (nrservs > 0) { |
247 | nrservs--; | 278 | nrservs--; |