greybus: cancel whole operation on interrupt

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>
This commit is contained in:
Alex Elder 2014-11-21 19:29:18 -06:00 committed by Greg Kroah-Hartman
parent f68c05c021
commit 7035833f08
2 changed files with 6 additions and 10 deletions

View 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

View 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);