diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index ab27cd94880a..32cd2358ab1c 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -563,6 +563,7 @@ static void gb_connection_recv_response(struct gb_connection *connection, struct gb_operation *operation; struct gb_message *message; struct gb_operation_msg_hdr *header; + int result; operation = gb_pending_operation_find(connection, operation_id); if (!operation) { @@ -577,17 +578,18 @@ static void gb_connection_recv_response(struct gb_connection *connection, if (size <= message->size) { /* Transfer the operation result from the response header */ header = message->header; - operation->errno = gb_operation_status_map(header->result); + result = gb_operation_status_map(header->result); } else { gb_connection_err(connection, "recv buffer too small"); - operation->errno = -E2BIG; + result = -E2BIG; } /* We must ignore the payload if a bad status is returned */ - if (!operation->errno) + if (!result) memcpy(message->header, data, size); /* The rest will be handled in work queue context */ + operation->errno = result; queue_work(gb_operation_workqueue, &operation->work); }