diff options
-rw-r--r-- | fs/orangefs/devorangefs-req.c | 75 | ||||
-rw-r--r-- | fs/orangefs/file.c | 5 | ||||
-rw-r--r-- | fs/orangefs/orangefs-cache.c | 1 | ||||
-rw-r--r-- | fs/orangefs/orangefs-kernel.h | 3 | ||||
-rw-r--r-- | fs/orangefs/orangefs-utils.c | 2 |
5 files changed, 24 insertions, 62 deletions
diff --git a/fs/orangefs/devorangefs-req.c b/fs/orangefs/devorangefs-req.c index 3879f2b7cf29..812844faa7f5 100644 --- a/fs/orangefs/devorangefs-req.c +++ b/fs/orangefs/devorangefs-req.c @@ -398,6 +398,17 @@ static ssize_t orangefs_devreq_write_iter(struct kiocb *iocb, } wakeup: + /* + * tell the vfs op waiting on a waitqueue + * that this op is done + */ + spin_lock(&op->lock); + if (unlikely(op_state_given_up(op))) { + spin_unlock(&op->lock); + goto out; + } + set_op_state_serviced(op); + spin_unlock(&op->lock); /* * If this operation is an I/O operation we need to wait @@ -411,61 +422,17 @@ wakeup: * the buffers are done being used. */ if (op->downcall.type == ORANGEFS_VFS_OP_FILE_IO) { - DEFINE_WAIT(wait_entry); - - /* - * tell the vfs op waiting on a waitqueue - * that this op is done - */ - spin_lock(&op->lock); - if (unlikely(op_state_given_up(op))) { - spin_unlock(&op->lock); - goto out; - } - set_op_state_serviced(op); - spin_unlock(&op->lock); - - while (1) { - spin_lock(&op->lock); - prepare_to_wait_exclusive( - &op->io_completion_waitq, - &wait_entry, - TASK_INTERRUPTIBLE); - if (op->io_completed) { - spin_unlock(&op->lock); - break; - } - spin_unlock(&op->lock); - if (unlikely(signal_pending(current))) { - gossip_debug(GOSSIP_DEV_DEBUG, - "%s: signal on I/O wait, aborting\n", - __func__); - break; - } - - if (!schedule_timeout(op_timeout_secs * HZ)) { - gossip_debug(GOSSIP_DEV_DEBUG, - "%s: timed out.\n", - __func__); - break; - } + long n = wait_for_completion_interruptible_timeout(&op->done, + op_timeout_secs * HZ); + if (unlikely(n < 0)) { + gossip_debug(GOSSIP_DEV_DEBUG, + "%s: signal on I/O wait, aborting\n", + __func__); + } else if (unlikely(n == 0)) { + gossip_debug(GOSSIP_DEV_DEBUG, + "%s: timed out.\n", + __func__); } - - spin_lock(&op->lock); - finish_wait(&op->io_completion_waitq, &wait_entry); - spin_unlock(&op->lock); - } else { - /* - * tell the vfs op waiting on a waitqueue that - * this op is done - - * for every other operation (i.e. non-I/O), we need to - * wake up the callers for downcall completion - * notification - */ - spin_lock(&op->lock); - if (!op_state_given_up(op)) - set_op_state_serviced(op); - spin_unlock(&op->lock); } out: op_release(op); diff --git a/fs/orangefs/file.c b/fs/orangefs/file.c index df3404ba60af..7af0adba29aa 100644 --- a/fs/orangefs/file.c +++ b/fs/orangefs/file.c @@ -16,10 +16,7 @@ #define wake_up_daemon_for_return(op) \ do { \ - spin_lock(&op->lock); \ - op->io_completed = 1; \ - spin_unlock(&op->lock); \ - wake_up_interruptible(&op->io_completion_waitq);\ + complete(&op->done); \ } while (0) /* diff --git a/fs/orangefs/orangefs-cache.c b/fs/orangefs/orangefs-cache.c index adc3ab013fdf..90c11a0daf74 100644 --- a/fs/orangefs/orangefs-cache.c +++ b/fs/orangefs/orangefs-cache.c @@ -119,7 +119,6 @@ struct orangefs_kernel_op_s *op_alloc(__s32 type) spin_lock_init(&new_op->lock); init_waitqueue_head(&new_op->waitq); - init_waitqueue_head(&new_op->io_completion_waitq); atomic_set(&new_op->ref_count, 1); orangefs_op_initialize(new_op); diff --git a/fs/orangefs/orangefs-kernel.h b/fs/orangefs/orangefs-kernel.h index 2b72806d0f68..58e523c23637 100644 --- a/fs/orangefs/orangefs-kernel.h +++ b/fs/orangefs/orangefs-kernel.h @@ -201,8 +201,7 @@ struct orangefs_kernel_op_s { wait_queue_head_t waitq; spinlock_t lock; - int io_completed; - wait_queue_head_t io_completion_waitq; + struct completion done; atomic_t ref_count; diff --git a/fs/orangefs/orangefs-utils.c b/fs/orangefs/orangefs-utils.c index a6117787ee8d..ca7edcfae873 100644 --- a/fs/orangefs/orangefs-utils.c +++ b/fs/orangefs/orangefs-utils.c @@ -597,7 +597,7 @@ void orangefs_op_initialize(struct orangefs_kernel_op_s *op) { if (op) { spin_lock(&op->lock); - op->io_completed = 0; + init_completion(&op->done); op->upcall.type = ORANGEFS_VFS_OP_INVALID; op->downcall.type = ORANGEFS_VFS_OP_INVALID; |