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:
parent
f68c05c021
commit
7035833f08
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue