orangefs: don't reinvent completion.h...
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 23 Jan 2016 18:45:46 +0000 (13:45 -0500)
committerMike Marshall <hubcap@omnibond.com>
Sat, 23 Jan 2016 20:20:11 +0000 (15:20 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
fs/orangefs/devorangefs-req.c
fs/orangefs/file.c
fs/orangefs/orangefs-cache.c
fs/orangefs/orangefs-kernel.h
fs/orangefs/orangefs-utils.c

index 3879f2b..812844f 100644 (file)
@@ -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);
index df3404b..7af0adb 100644 (file)
 
 #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)
 
 /*
index adc3ab0..90c11a0 100644 (file)
@@ -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);
index 2b72806..58e523c 100644 (file)
@@ -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;
 
index a611778..ca7edcf 100644 (file)
@@ -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;