*/
void gb_operation_cancel(struct gb_operation *operation, int errno)
{
- if (gb_operation_result_set(operation, errno)) {
- gb_message_cancel(operation->request);
- gb_operation_put(operation);
- } else if (gb_operation_is_incoming(operation)) {
- if (!gb_operation_is_unidirectional(operation))
+ if (gb_operation_is_incoming(operation)) {
+ /* Cancel response if it has been allocated */
+ if (!gb_operation_result_set(operation, errno) &&
+ !gb_operation_is_unidirectional(operation)) {
gb_message_cancel(operation->response);
+ }
+ } else {
+ if (gb_operation_result_set(operation, errno)) {
+ gb_message_cancel(operation->request);
+ gb_operation_put(operation);
+ }
}
}
EXPORT_SYMBOL_GPL(gb_operation_cancel);