From: Al Viro Date: Sat, 23 Jan 2016 18:04:19 +0000 (-0500) Subject: orangefs: reduce nesting in wait_for_matching_downcall() X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=70c6ea26ff2d2df420d573f8f0f22853336c0b56;p=linux-beck.git orangefs: reduce nesting in wait_for_matching_downcall() reorder if branches... Signed-off-by: Al Viro Signed-off-by: Mike Marshall --- diff --git a/fs/orangefs/waitqueue.c b/fs/orangefs/waitqueue.c index b8a2fcbcce64..8c07a070e2b6 100644 --- a/fs/orangefs/waitqueue.c +++ b/fs/orangefs/waitqueue.c @@ -376,79 +376,77 @@ static int wait_for_matching_downcall(struct orangefs_kernel_op_s *op) } spin_unlock(&op->lock); - if (!signal_pending(current)) { - /* - * if this was our first attempt and client-core - * has not purged our operation, we are happy to - * simply wait - */ - spin_lock(&op->lock); - if (op->attempts == 0 && !op_state_purged(op)) { - spin_unlock(&op->lock); - schedule(); - } else { - spin_unlock(&op->lock); - /* - * subsequent attempts, we retry exactly once - * with timeouts - */ - if (!schedule_timeout(MSECS_TO_JIFFIES - (1000 * op_timeout_secs))) { - gossip_debug(GOSSIP_WAIT_DEBUG, - "*** %s:" - " operation timed out (tag" - " %llu, %p, att %d)\n", - __func__, - llu(op->tag), - op, - op->attempts); - ret = -ETIMEDOUT; - orangefs_clean_up_interrupted_operation - (op); - break; - } - } - spin_lock(&op->lock); - op->attempts++; + if (unlikely(signal_pending(current))) { + gossip_debug(GOSSIP_WAIT_DEBUG, + "*** %s:" + " operation interrupted by a signal (tag " + "%llu, op %p)\n", + __func__, + llu(op->tag), + op); + orangefs_clean_up_interrupted_operation(op); + ret = -EINTR; + break; + } + + /* + * if this was our first attempt and client-core + * has not purged our operation, we are happy to + * simply wait + */ + spin_lock(&op->lock); + if (op->attempts == 0 && !op_state_purged(op)) { + spin_unlock(&op->lock); + schedule(); + } else { + spin_unlock(&op->lock); /* - * if the operation was purged in the meantime, it - * is better to requeue it afresh but ensure that - * we have not been purged repeatedly. This could - * happen if client-core crashes when an op - * is being serviced, so we requeue the op, client - * core crashes again so we requeue the op, client - * core starts, and so on... + * subsequent attempts, we retry exactly once + * with timeouts */ - if (op_state_purged(op)) { - ret = (op->attempts < ORANGEFS_PURGE_RETRY_COUNT) ? - -EAGAIN : - -EIO; - spin_unlock(&op->lock); + if (!schedule_timeout(MSECS_TO_JIFFIES + (1000 * op_timeout_secs))) { gossip_debug(GOSSIP_WAIT_DEBUG, "*** %s:" - " operation purged (tag " - "%llu, %p, att %d)\n", + " operation timed out (tag" + " %llu, %p, att %d)\n", __func__, llu(op->tag), op, op->attempts); + ret = -ETIMEDOUT; orangefs_clean_up_interrupted_operation(op); break; } + } + spin_lock(&op->lock); + op->attempts++; + /* + * if the operation was purged in the meantime, it + * is better to requeue it afresh but ensure that + * we have not been purged repeatedly. This could + * happen if client-core crashes when an op + * is being serviced, so we requeue the op, client + * core crashes again so we requeue the op, client + * core starts, and so on... + */ + if (op_state_purged(op)) { + ret = (op->attempts < ORANGEFS_PURGE_RETRY_COUNT) ? + -EAGAIN : + -EIO; spin_unlock(&op->lock); - continue; + gossip_debug(GOSSIP_WAIT_DEBUG, + "*** %s:" + " operation purged (tag " + "%llu, %p, att %d)\n", + __func__, + llu(op->tag), + op, + op->attempts); + orangefs_clean_up_interrupted_operation(op); + break; } - - gossip_debug(GOSSIP_WAIT_DEBUG, - "*** %s:" - " operation interrupted by a signal (tag " - "%llu, op %p)\n", - __func__, - llu(op->tag), - op); - orangefs_clean_up_interrupted_operation(op); - ret = -EINTR; - break; + spin_unlock(&op->lock); } spin_lock(&op->lock);