From 4f83b8d34964ef343afe5e8f731a0e37e311a42d Mon Sep 17 00:00:00 2001
From: Alex Elder <elder@linaro.org>
Date: Tue, 18 Nov 2014 13:26:38 -0600
Subject: [PATCH] greybus: fix an allocation flag bug

We allocate message buffers with GFP_KERNEL allocation flags if
possible.  However when an incoming request message is received we
can be in interrupt context, so we must use GFP_ATOMIC in that case.

The computation of gfp_flags in gb_operation_message_init() is
wrong.  It is needlessly using GFP_ATOMIC when allocating outbound
response buffers.  Fix the flawed logic.

Change the name of "data_out" to be "outbound" to be consistent with
usage elsewhere.  (Data/messages are "inbound" or "outbound";
requests are "incoming" or "outgoing".)

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
---
 drivers/staging/greybus/operation.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c
index 2239883277957..103fc9746796b 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -213,14 +213,14 @@ static void operation_timeout(struct work_struct *work)
  */
 static int gb_operation_message_init(struct gb_operation *operation,
 					u8 type, size_t size,
-					bool request, bool data_out)
+					bool request, bool outbound)
 {
 	struct gb_connection *connection = operation->connection;
 	struct greybus_host_device *hd = connection->hd;
 	struct gb_message *message;
 	struct gb_operation_msg_hdr *header;
 	struct gbuf *gbuf;
-	gfp_t gfp_flags = data_out ? GFP_KERNEL : GFP_ATOMIC;
+	gfp_t gfp_flags = request && !outbound ? GFP_ATOMIC : GFP_KERNEL;
 	u16 dest_cport_id;
 	int ret;
 
@@ -236,7 +236,7 @@ static int gb_operation_message_init(struct gb_operation *operation,
 	}
 	gbuf = &message->gbuf;
 
-	if (data_out)
+	if (outbound)
 		dest_cport_id = connection->interface_cport_id;
 	else
 		dest_cport_id = CPORT_ID_BAD;
-- 
2.30.2