greybus: cancel whole operation on interrupt
authorAlex Elder <elder@linaro.org>
Sat, 22 Nov 2014 01:29:18 +0000 (19:29 -0600)
committerGreg Kroah-Hartman <greg@kroah.com>
Sat, 22 Nov 2014 03:36:42 +0000 (19:36 -0800)
Cancel the operation--not just the request message--if waiting
for a synchronous operation to complete is interrupted.  Return
the operation result (which in that case will be -EINTR).  The
cancelation will result in the normal operation completion path
being taken before returning.

Make gb_operation_wait() private, since it's only ever used for
for synchronous operations.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/operation.c
drivers/staging/greybus/operation.h

index dc12e6d..f4d984f 100644 (file)
@@ -161,21 +161,18 @@ static void gb_operation_complete(struct gb_operation *operation)
 }
 
 /*
- * Wait for a submitted operation to complete.  Returns -RESTARTSYS
- * if the wait was interrupted.  Otherwise returns the result of the
- * operation.
+ * Wait for a submitted operation to complete.  Returns the result
+ * of the operation; this will be -EINTR if the wait was interrupted.
  */
-int gb_operation_wait(struct gb_operation *operation)
+static int gb_operation_wait(struct gb_operation *operation)
 {
        int ret;
 
        ret = wait_for_completion_interruptible(&operation->completion);
-       /* If interrupted, cancel the in-flight buffer */
        if (ret < 0)
-               gb_message_cancel(operation->request);
-       else
-               ret = operation->errno;
-       return ret;
+               gb_operation_cancel(operation, -EINTR);
+
+       return operation->errno;
 }
 
 #if 0
index d24e5e0..c391b28 100644 (file)
@@ -99,7 +99,6 @@ int gb_operation_request_send(struct gb_operation *operation,
 int gb_operation_response_send(struct gb_operation *operation);
 
 void gb_operation_cancel(struct gb_operation *operation, int errno);
-int gb_operation_wait(struct gb_operation *operation);
 
 int gb_operation_status_map(u8 status);