Orangefs: update signal blocking code before Oleg sees it.
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
This commit is contained in:
Родитель
50e01586f4
Коммит
8c3905adea
|
@ -649,9 +649,9 @@ void pvfs2_op_initialize(struct pvfs2_kernel_op_s *op);
|
|||
|
||||
void pvfs2_make_bad_inode(struct inode *inode);
|
||||
|
||||
void mask_blocked_signals(sigset_t *orig_sigset);
|
||||
void block_signals(sigset_t *);
|
||||
|
||||
void unmask_blocked_signals(sigset_t *orig_sigset);
|
||||
void set_signals(sigset_t *);
|
||||
|
||||
int pvfs2_unmount_sb(struct super_block *sb);
|
||||
|
||||
|
|
|
@ -632,36 +632,25 @@ void pvfs2_make_bad_inode(struct inode *inode)
|
|||
}
|
||||
}
|
||||
|
||||
/* this code is based on linux/net/sunrpc/clnt.c:rpc_clnt_sigmask */
|
||||
void mask_blocked_signals(sigset_t *orig_sigset)
|
||||
/* Block all blockable signals... */
|
||||
void block_signals(sigset_t *orig_sigset)
|
||||
{
|
||||
unsigned long sigallow = sigmask(SIGKILL);
|
||||
unsigned long irqflags = 0;
|
||||
struct k_sigaction *action = pvfs2_current_sigaction;
|
||||
sigset_t mask;
|
||||
|
||||
sigallow |= ((action[SIGINT - 1].sa.sa_handler == SIG_DFL) ?
|
||||
sigmask(SIGINT) :
|
||||
0);
|
||||
sigallow |= ((action[SIGQUIT - 1].sa.sa_handler == SIG_DFL) ?
|
||||
sigmask(SIGQUIT) :
|
||||
0);
|
||||
/*
|
||||
* Initialize all entries in the signal set to the
|
||||
* inverse of the given mask.
|
||||
*/
|
||||
siginitsetinv(&mask, sigmask(SIGKILL));
|
||||
|
||||
spin_lock_irqsave(&pvfs2_current_signal_lock, irqflags);
|
||||
*orig_sigset = current->blocked;
|
||||
siginitsetinv(¤t->blocked, sigallow & ~orig_sigset->sig[0]);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irqrestore(&pvfs2_current_signal_lock, irqflags);
|
||||
/* Block 'em Danno... */
|
||||
sigprocmask(SIG_BLOCK, &mask, orig_sigset);
|
||||
}
|
||||
|
||||
/* this code is based on linux/net/sunrpc/clnt.c:rpc_clnt_sigunmask */
|
||||
void unmask_blocked_signals(sigset_t *orig_sigset)
|
||||
/* set the signal mask to the given template... */
|
||||
void set_signals(sigset_t *sigset)
|
||||
{
|
||||
unsigned long irqflags = 0;
|
||||
|
||||
spin_lock_irqsave(&pvfs2_current_signal_lock, irqflags);
|
||||
current->blocked = *orig_sigset;
|
||||
recalc_sigpending();
|
||||
spin_unlock_irqrestore(&pvfs2_current_signal_lock, irqflags);
|
||||
sigprocmask(SIG_SETMASK, sigset, NULL);
|
||||
}
|
||||
|
||||
__u64 pvfs2_convert_time_field(void *time_ptr)
|
||||
|
|
|
@ -80,7 +80,7 @@ retry_servicing:
|
|||
|
||||
/* mask out signals if this operation is not to be interrupted */
|
||||
if (!(flags & PVFS2_OP_INTERRUPTIBLE))
|
||||
mask_blocked_signals(&orig_sigset);
|
||||
block_signals(&orig_sigset);
|
||||
|
||||
if (!(flags & PVFS2_OP_NO_SEMAPHORE)) {
|
||||
ret = mutex_lock_interruptible(&request_mutex);
|
||||
|
@ -90,7 +90,7 @@ retry_servicing:
|
|||
*/
|
||||
if (ret < 0) {
|
||||
if (!(flags & PVFS2_OP_INTERRUPTIBLE))
|
||||
unmask_blocked_signals(&orig_sigset);
|
||||
set_signals(&orig_sigset);
|
||||
op->downcall.status = ret;
|
||||
gossip_debug(GOSSIP_WAIT_DEBUG,
|
||||
"pvfs2: service_operation interrupted.\n");
|
||||
|
@ -160,7 +160,7 @@ retry_servicing:
|
|||
}
|
||||
|
||||
if (!(flags & PVFS2_OP_INTERRUPTIBLE))
|
||||
unmask_blocked_signals(&orig_sigset);
|
||||
set_signals(&orig_sigset);
|
||||
|
||||
BUG_ON(ret != op->downcall.status);
|
||||
/* retry if operation has not been serviced and if requested */
|
||||
|
|
Загрузка…
Ссылка в новой задаче