Drivers: hv: fcopy: dynamically allocate smsg_out in fcopy_send_data()
authorVitaly Kuznetsov <vkuznets@redhat.com>
Sat, 1 Aug 2015 23:08:12 +0000 (16:08 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Aug 2015 05:28:38 +0000 (22:28 -0700)
struct hv_start_fcopy is too big to be on stack on i386, the following
warning is reported:

>> drivers/hv/hv_fcopy.c:159:1: warning: the frame size of 1088 bytes is larger than 1024 bytes [-Wframe-larger-than=]

Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/hv_fcopy.c

index b50dd330cf311ca5d7da7681aa0d818d61a6463b..db4b887b889d268c3e427764e732ce88dc6a008e 100644 (file)
@@ -116,7 +116,7 @@ static int fcopy_handle_handshake(u32 version)
 
 static void fcopy_send_data(struct work_struct *dummy)
 {
-       struct hv_start_fcopy smsg_out;
+       struct hv_start_fcopy *smsg_out = NULL;
        int operation = fcopy_transaction.fcopy_msg->operation;
        struct hv_start_fcopy *smsg_in;
        void *out_src;
@@ -136,21 +136,24 @@ static void fcopy_send_data(struct work_struct *dummy)
        switch (operation) {
        case START_FILE_COPY:
                out_len = sizeof(struct hv_start_fcopy);
-               memset(&smsg_out, 0, out_len);
-               smsg_out.hdr.operation = operation;
+               smsg_out = kzalloc(sizeof(*smsg_out), GFP_KERNEL);
+               if (!smsg_out)
+                       return;
+
+               smsg_out->hdr.operation = operation;
                smsg_in = (struct hv_start_fcopy *)fcopy_transaction.fcopy_msg;
 
                utf16s_to_utf8s((wchar_t *)smsg_in->file_name, W_MAX_PATH,
                                UTF16_LITTLE_ENDIAN,
-                               (__u8 *)&smsg_out.file_name, W_MAX_PATH - 1);
+                               (__u8 *)&smsg_out->file_name, W_MAX_PATH - 1);
 
                utf16s_to_utf8s((wchar_t *)smsg_in->path_name, W_MAX_PATH,
                                UTF16_LITTLE_ENDIAN,
-                               (__u8 *)&smsg_out.path_name, W_MAX_PATH - 1);
+                               (__u8 *)&smsg_out->path_name, W_MAX_PATH - 1);
 
-               smsg_out.copy_flags = smsg_in->copy_flags;
-               smsg_out.file_size = smsg_in->file_size;
-               out_src = &smsg_out;
+               smsg_out->copy_flags = smsg_in->copy_flags;
+               smsg_out->file_size = smsg_in->file_size;
+               out_src = smsg_out;
                break;
 
        default:
@@ -168,6 +171,8 @@ static void fcopy_send_data(struct work_struct *dummy)
                        fcopy_transaction.state = HVUTIL_READY;
                }
        }
+       kfree(smsg_out);
+
        return;
 }