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
|
#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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
/* 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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user