diff options
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 33 |
1 files changed, 8 insertions, 25 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 929af233510e..6339cb70a08d 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -44,11 +44,6 @@ | |||
44 | * when not handling a request. i.e. when waiting | 44 | * when not handling a request. i.e. when waiting |
45 | */ | 45 | */ |
46 | #define SHUTDOWN_SIGS (sigmask(SIGKILL) | sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT)) | 46 | #define SHUTDOWN_SIGS (sigmask(SIGKILL) | sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT)) |
47 | /* if the last thread dies with SIGHUP, then the exports table is | ||
48 | * left unchanged ( like 2.4-{0-9} ). Any other signal will clear | ||
49 | * the exports table (like 2.2). | ||
50 | */ | ||
51 | #define SIG_NOCLEAN SIGHUP | ||
52 | 47 | ||
53 | extern struct svc_program nfsd_program; | 48 | extern struct svc_program nfsd_program; |
54 | static void nfsd(struct svc_rqst *rqstp); | 49 | static void nfsd(struct svc_rqst *rqstp); |
@@ -175,7 +170,6 @@ int nfsd_nrthreads(void) | |||
175 | return nfsd_serv->sv_nrthreads; | 170 | return nfsd_serv->sv_nrthreads; |
176 | } | 171 | } |
177 | 172 | ||
178 | static int killsig; /* signal that was used to kill last nfsd */ | ||
179 | static void nfsd_last_thread(struct svc_serv *serv) | 173 | static void nfsd_last_thread(struct svc_serv *serv) |
180 | { | 174 | { |
181 | /* When last nfsd thread exits we need to do some clean-up */ | 175 | /* When last nfsd thread exits we need to do some clean-up */ |
@@ -186,11 +180,9 @@ static void nfsd_last_thread(struct svc_serv *serv) | |||
186 | nfsd_racache_shutdown(); | 180 | nfsd_racache_shutdown(); |
187 | nfs4_state_shutdown(); | 181 | nfs4_state_shutdown(); |
188 | 182 | ||
189 | printk(KERN_WARNING "nfsd: last server has exited\n"); | 183 | printk(KERN_WARNING "nfsd: last server has exited, flushing export " |
190 | if (killsig != SIG_NOCLEAN) { | 184 | "cache\n"); |
191 | printk(KERN_WARNING "nfsd: unexporting all filesystems\n"); | 185 | nfsd_export_flush(); |
192 | nfsd_export_flush(); | ||
193 | } | ||
194 | } | 186 | } |
195 | 187 | ||
196 | void nfsd_reset_versions(void) | 188 | void nfsd_reset_versions(void) |
@@ -242,10 +234,9 @@ int nfsd_create_serv(void) | |||
242 | } | 234 | } |
243 | 235 | ||
244 | atomic_set(&nfsd_busy, 0); | 236 | atomic_set(&nfsd_busy, 0); |
245 | nfsd_serv = svc_create_pooled(&nfsd_program, | 237 | nfsd_serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, |
246 | nfsd_max_blksize, | 238 | nfsd_last_thread, nfsd, SIGINT, |
247 | nfsd_last_thread, | 239 | THIS_MODULE); |
248 | nfsd, SIG_NOCLEAN, THIS_MODULE); | ||
249 | if (nfsd_serv == NULL) | 240 | if (nfsd_serv == NULL) |
250 | err = -ENOMEM; | 241 | err = -ENOMEM; |
251 | 242 | ||
@@ -490,17 +481,9 @@ nfsd(struct svc_rqst *rqstp) | |||
490 | atomic_dec(&nfsd_busy); | 481 | atomic_dec(&nfsd_busy); |
491 | } | 482 | } |
492 | 483 | ||
493 | if (err != -EINTR) { | 484 | if (err != -EINTR) |
494 | printk(KERN_WARNING "nfsd: terminating on error %d\n", -err); | 485 | printk(KERN_WARNING "nfsd: terminating on error %d\n", -err); |
495 | } else { | 486 | |
496 | unsigned int signo; | ||
497 | |||
498 | for (signo = 1; signo <= _NSIG; signo++) | ||
499 | if (sigismember(¤t->pending.signal, signo) && | ||
500 | !sigismember(¤t->blocked, signo)) | ||
501 | break; | ||
502 | killsig = signo; | ||
503 | } | ||
504 | /* Clear signals before calling svc_exit_thread() */ | 487 | /* Clear signals before calling svc_exit_thread() */ |
505 | flush_signals(current); | 488 | flush_signals(current); |
506 | 489 | ||