Przeglądaj źródła

orangefs: don't reinvent completion.h...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
Al Viro 9 lat temu
rodzic
commit
2a9e5c2260

+ 21 - 54
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);

+ 1 - 4
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)
 
 /*

+ 0 - 1
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);

+ 1 - 2
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;
 

+ 1 - 1
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;