greybus: operation: fix atomic response allocation
authorJohan Hovold <johan@hovoldconsulting.com>
Fri, 17 Jul 2015 16:50:25 +0000 (18:50 +0200)
committerGreg Kroah-Hartman <gregkh@google.com>
Mon, 20 Jul 2015 23:14:29 +0000 (16:14 -0700)
Response allocation also needs a GFP-flags argument as a response is
allocated as part of an outgoing operation.

Fixes: 9aa174d202e5 ("operation: allow atomic operation allocations")
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/control.c
drivers/staging/greybus/loopback.c
drivers/staging/greybus/operation.c
drivers/staging/greybus/operation.h

index d7870fc..a69a703 100644 (file)
@@ -75,7 +75,8 @@ static int gb_control_request_recv(u8 type, struct gb_operation *op)
                // an AP.
                break;
        case GB_CONTROL_TYPE_PROTOCOL_VERSION:
-               if (!gb_operation_response_alloc(op, sizeof(*version))) {
+               if (!gb_operation_response_alloc(op, sizeof(*version),
+                                                GFP_KERNEL)) {
                        dev_err(&connection->dev,
                                "%s: error allocating response\n", __func__);
                        return -ENOMEM;
index f07fc0a..fe3a57b 100644 (file)
@@ -283,7 +283,8 @@ static int gb_loopback_request_recv(u8 type, struct gb_operation *operation)
                }
 
                if (len) {
-                       if (!gb_operation_response_alloc(operation, len)) {
+                       if (!gb_operation_response_alloc(operation, len,
+                                                        GFP_KERNEL)) {
                                dev_err(&connection->dev,
                                        "error allocating response\n");
                                return -ENOMEM;
index a99505c..0fe50d8 100644 (file)
@@ -426,7 +426,7 @@ static u8 gb_operation_errno_map(int errno)
 }
 
 bool gb_operation_response_alloc(struct gb_operation *operation,
-                                       size_t response_size)
+                                       size_t response_size, gfp_t gfp)
 {
        struct greybus_host_device *hd = operation->connection->hd;
        struct gb_operation_msg_hdr *request_header;
@@ -434,8 +434,7 @@ bool gb_operation_response_alloc(struct gb_operation *operation,
        u8 type;
 
        type = operation->type | GB_MESSAGE_TYPE_RESPONSE;
-       response = gb_operation_message_alloc(hd, type, response_size,
-                                               GFP_KERNEL);
+       response = gb_operation_message_alloc(hd, type, response_size, gfp);
        if (!response)
                return false;
        response->operation = operation;
@@ -497,8 +496,10 @@ gb_operation_create_common(struct gb_connection *connection, u8 type,
 
        /* Allocate the response buffer for outgoing operations */
        if (!(op_flags & GB_OPERATION_FLAG_INCOMING)) {
-               if (!gb_operation_response_alloc(operation, response_size))
+               if (!gb_operation_response_alloc(operation, response_size,
+                                                gfp_flags)) {
                        goto err_request;
+               }
        }
 
        operation->flags = op_flags;
@@ -734,7 +735,7 @@ static int gb_operation_response_send(struct gb_operation *operation,
 
        if (!operation->response &&
                        !gb_operation_is_unidirectional(operation)) {
-               if (!gb_operation_response_alloc(operation, 0))
+               if (!gb_operation_response_alloc(operation, 0, GFP_KERNEL))
                        return -ENOMEM;
        }
 
index 6854703..00189e9 100644 (file)
@@ -166,7 +166,7 @@ static inline void gb_operation_destroy(struct gb_operation *operation)
 }
 
 bool gb_operation_response_alloc(struct gb_operation *operation,
-                                       size_t response_size);
+                                       size_t response_size, gfp_t gfp);
 
 int gb_operation_request_send(struct gb_operation *operation,
                                gb_operation_callback callback,