service_operation(): don't block signals, just use ..._killable

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
This commit is contained in:
Al Viro
2016-02-13 10:49:24 -05:00
committed by Mike Marshall
parent 98815ade9e
commit c72f15b7d9
3 changed files with 14 additions and 40 deletions

View File

@@ -16,7 +16,7 @@
#include "orangefs-kernel.h"
#include "orangefs-bufmap.h"
static int wait_for_matching_downcall(struct orangefs_kernel_op_s *);
static int wait_for_matching_downcall(struct orangefs_kernel_op_s *, bool);
static void orangefs_clean_up_interrupted_operation(struct orangefs_kernel_op_s *);
/*
@@ -56,7 +56,6 @@ int service_operation(struct orangefs_kernel_op_s *op,
int flags)
{
/* flags to modify behavior */
sigset_t orig_sigset;
int ret = 0;
DEFINE_WAIT(wait_entry);
@@ -75,19 +74,16 @@ retry_servicing:
current->comm,
current->pid);
/* mask out signals if this operation is not to be interrupted */
if (!(flags & ORANGEFS_OP_INTERRUPTIBLE))
orangefs_block_signals(&orig_sigset);
if (!(flags & ORANGEFS_OP_NO_SEMAPHORE)) {
ret = mutex_lock_interruptible(&request_mutex);
if (flags & ORANGEFS_OP_INTERRUPTIBLE)
ret = mutex_lock_interruptible(&request_mutex);
else
ret = mutex_lock_killable(&request_mutex);
/*
* check to see if we were interrupted while waiting for
* semaphore
*/
if (ret < 0) {
if (!(flags & ORANGEFS_OP_INTERRUPTIBLE))
orangefs_set_signals(&orig_sigset);
op->downcall.status = ret;
gossip_debug(GOSSIP_WAIT_DEBUG,
"orangefs: service_operation interrupted.\n");
@@ -128,7 +124,7 @@ retry_servicing:
if (flags & ORANGEFS_OP_ASYNC)
return 0;
ret = wait_for_matching_downcall(op);
ret = wait_for_matching_downcall(op, flags & ORANGEFS_OP_INTERRUPTIBLE);
if (ret < 0) {
/* failed to get matching downcall */
@@ -146,9 +142,6 @@ retry_servicing:
ret = op->downcall.status;
}
if (!(flags & ORANGEFS_OP_INTERRUPTIBLE))
orangefs_set_signals(&orig_sigset);
BUG_ON(ret != op->downcall.status);
/* retry if operation has not been serviced and if requested */
if (!op_state_serviced(op) && op->downcall.status == -EAGAIN) {
@@ -334,12 +327,18 @@ static void orangefs_clean_up_interrupted_operation(struct orangefs_kernel_op_s
*
* Returns with op->lock taken.
*/
static int wait_for_matching_downcall(struct orangefs_kernel_op_s *op)
static int wait_for_matching_downcall(struct orangefs_kernel_op_s *op,
bool interruptible)
{
long timeout, n;
timeout = op->attempts ? op_timeout_secs * HZ : MAX_SCHEDULE_TIMEOUT;
n = wait_for_completion_interruptible_timeout(&op->waitq, timeout);
if (interruptible)
n = wait_for_completion_interruptible_timeout(&op->waitq, timeout);
else
n = wait_for_completion_killable_timeout(&op->waitq, timeout);
spin_lock(&op->lock);
if (op_state_serviced(op))