mirror of
https://github.com/torvalds/linux.git
synced 2024-12-30 23:02:08 +00:00
nfsd: treat all shutdown signals as equivalent
knfsd currently uses 2 signal masks when processing requests. A "loose" mask (SHUTDOWN_SIGS) that it uses when receiving network requests, and then a more "strict" mask (ALLOWED_SIGS, which is just SIGKILL) that it allows when doing the actual operation on the local storage. This is apparently unnecessarily complicated. The underlying filesystem should be able to sanely handle a signal in the middle of an operation. This patch removes the signal mask handling from knfsd altogether. When knfsd is started as a kthread, all signals are ignored. It then allows all of the signals in SHUTDOWN_SIGS. There's no need to set the mask as well. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
3cd2cfeae1
commit
100766f834
@ -37,15 +37,6 @@
|
||||
|
||||
#define NFSDDBG_FACILITY NFSDDBG_SVC
|
||||
|
||||
/* these signals will be delivered to an nfsd thread
|
||||
* when handling a request
|
||||
*/
|
||||
#define ALLOWED_SIGS (sigmask(SIGKILL))
|
||||
/* these signals will be delivered to an nfsd thread
|
||||
* when not handling a request. i.e. when waiting
|
||||
*/
|
||||
#define SHUTDOWN_SIGS (sigmask(SIGKILL) | sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT))
|
||||
|
||||
extern struct svc_program nfsd_program;
|
||||
static int nfsd(void *vrqstp);
|
||||
struct timeval nfssvc_boot;
|
||||
@ -414,9 +405,7 @@ nfsd(void *vrqstp)
|
||||
{
|
||||
struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp;
|
||||
struct fs_struct *fsp;
|
||||
sigset_t shutdown_mask, allowed_mask;
|
||||
int err, preverr = 0;
|
||||
unsigned int signo;
|
||||
|
||||
/* Lock module and set up kernel thread */
|
||||
mutex_lock(&nfsd_mutex);
|
||||
@ -433,17 +422,14 @@ nfsd(void *vrqstp)
|
||||
current->fs = fsp;
|
||||
current->fs->umask = 0;
|
||||
|
||||
siginitsetinv(&shutdown_mask, SHUTDOWN_SIGS);
|
||||
siginitsetinv(&allowed_mask, ALLOWED_SIGS);
|
||||
|
||||
/*
|
||||
* thread is spawned with all signals set to SIG_IGN, re-enable
|
||||
* the ones that matter
|
||||
* the ones that will bring down the thread
|
||||
*/
|
||||
for (signo = 1; signo <= _NSIG; signo++) {
|
||||
if (!sigismember(&shutdown_mask, signo))
|
||||
allow_signal(signo);
|
||||
}
|
||||
allow_signal(SIGKILL);
|
||||
allow_signal(SIGHUP);
|
||||
allow_signal(SIGINT);
|
||||
allow_signal(SIGQUIT);
|
||||
|
||||
nfsdstats.th_cnt++;
|
||||
mutex_unlock(&nfsd_mutex);
|
||||
@ -460,9 +446,6 @@ nfsd(void *vrqstp)
|
||||
* The main request loop
|
||||
*/
|
||||
for (;;) {
|
||||
/* Block all but the shutdown signals */
|
||||
sigprocmask(SIG_SETMASK, &shutdown_mask, NULL);
|
||||
|
||||
/*
|
||||
* Find a socket with data available and call its
|
||||
* recvfrom routine.
|
||||
@ -487,9 +470,6 @@ nfsd(void *vrqstp)
|
||||
/* Lock the export hash tables for reading. */
|
||||
exp_readlock();
|
||||
|
||||
/* Process request with signals blocked. */
|
||||
sigprocmask(SIG_SETMASK, &allowed_mask, NULL);
|
||||
|
||||
svc_process(rqstp);
|
||||
|
||||
/* Unlock export hash tables */
|
||||
|
Loading…
Reference in New Issue
Block a user