Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c3905ad authored by Mike Marshall's avatar Mike Marshall
Browse files

Orangefs: update signal blocking code before Oleg sees it.

parent 50e01586
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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);

+15 −26
Original line number Diff line number Diff line
@@ -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;

	sigallow |= ((action[SIGINT - 1].sa.sa_handler == SIG_DFL) ?
		     sigmask(SIGINT) :
		     0);
	sigallow |= ((action[SIGQUIT - 1].sa.sa_handler == SIG_DFL) ?
		     sigmask(SIGQUIT) :
		     0);

	spin_lock_irqsave(&pvfs2_current_signal_lock, irqflags);
	*orig_sigset = current->blocked;
	siginitsetinv(&current->blocked, sigallow & ~orig_sigset->sig[0]);
	recalc_sigpending();
	spin_unlock_irqrestore(&pvfs2_current_signal_lock, irqflags);
}

/* this code is based on linux/net/sunrpc/clnt.c:rpc_clnt_sigunmask */
void unmask_blocked_signals(sigset_t *orig_sigset)
{
	unsigned long irqflags = 0;
	sigset_t mask;

	/*
	 * 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);
	current->blocked = *orig_sigset;
	recalc_sigpending();
	spin_unlock_irqrestore(&pvfs2_current_signal_lock, irqflags);
	/* Block 'em Danno... */
	sigprocmask(SIG_BLOCK, &mask, orig_sigset);
}

/* set the signal mask to the given template... */
void set_signals(sigset_t *sigset)
{
	sigprocmask(SIG_SETMASK, sigset, NULL);
}

__u64 pvfs2_convert_time_field(void *time_ptr)
+3 −3
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ int service_operation(struct pvfs2_kernel_op_s *op,

	/* 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 @@ int service_operation(struct pvfs2_kernel_op_s *op,
		 */
		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 @@ int service_operation(struct pvfs2_kernel_op_s *op,
	}

	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 */