summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/orangefs/devorangefs-req.c75
-rw-r--r--fs/orangefs/file.c5
-rw-r--r--fs/orangefs/orangefs-cache.c1
-rw-r--r--fs/orangefs/orangefs-kernel.h3
-rw-r--r--fs/orangefs/orangefs-utils.c2
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;
OpenPOWER on IntegriCloud