Commit 100766f8 authored by Jeff Layton's avatar Jeff Layton Committed by J. Bruce Fields

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: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 3cd2cfea
...@@ -37,15 +37,6 @@ ...@@ -37,15 +37,6 @@
#define NFSDDBG_FACILITY NFSDDBG_SVC #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; extern struct svc_program nfsd_program;
static int nfsd(void *vrqstp); static int nfsd(void *vrqstp);
struct timeval nfssvc_boot; struct timeval nfssvc_boot;
...@@ -414,9 +405,7 @@ nfsd(void *vrqstp) ...@@ -414,9 +405,7 @@ nfsd(void *vrqstp)
{ {
struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp; struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp;
struct fs_struct *fsp; struct fs_struct *fsp;
sigset_t shutdown_mask, allowed_mask;
int err, preverr = 0; int err, preverr = 0;
unsigned int signo;
/* Lock module and set up kernel thread */ /* Lock module and set up kernel thread */
mutex_lock(&nfsd_mutex); mutex_lock(&nfsd_mutex);
...@@ -433,17 +422,14 @@ nfsd(void *vrqstp) ...@@ -433,17 +422,14 @@ nfsd(void *vrqstp)
current->fs = fsp; current->fs = fsp;
current->fs->umask = 0; 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 * 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++) { allow_signal(SIGKILL);
if (!sigismember(&shutdown_mask, signo)) allow_signal(SIGHUP);
allow_signal(signo); allow_signal(SIGINT);
} allow_signal(SIGQUIT);
nfsdstats.th_cnt++; nfsdstats.th_cnt++;
mutex_unlock(&nfsd_mutex); mutex_unlock(&nfsd_mutex);
...@@ -460,9 +446,6 @@ nfsd(void *vrqstp) ...@@ -460,9 +446,6 @@ nfsd(void *vrqstp)
* The main request loop * The main request loop
*/ */
for (;;) { for (;;) {
/* Block all but the shutdown signals */
sigprocmask(SIG_SETMASK, &shutdown_mask, NULL);
/* /*
* Find a socket with data available and call its * Find a socket with data available and call its
* recvfrom routine. * recvfrom routine.
...@@ -487,9 +470,6 @@ nfsd(void *vrqstp) ...@@ -487,9 +470,6 @@ nfsd(void *vrqstp)
/* Lock the export hash tables for reading. */ /* Lock the export hash tables for reading. */
exp_readlock(); exp_readlock();
/* Process request with signals blocked. */
sigprocmask(SIG_SETMASK, &allowed_mask, NULL);
svc_process(rqstp); svc_process(rqstp);
/* Unlock export hash tables */ /* Unlock export hash tables */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment