*/
 
 struct pci_message {
-       u32 message_type;
+       u32 type;
 } __packed;
 
 struct pci_child_message {
-       u32 message_type;
+       struct pci_message message_type;
        union win_slot_encoding wslot;
 } __packed;
 
        void (*completion_func)(void *context, struct pci_response *resp,
                                int resp_packet_size);
        void *compl_ctxt;
-       struct pci_message message;
+
+       struct pci_message message[0];
 };
 
 /*
 } __packed;
 
 struct pci_eject_response {
-       u32 message_type;
+       struct pci_message message_type;
        union win_slot_encoding wslot;
        u32 status;
 } __packed;
        struct pci_delete_interrupt *int_pkt;
        struct {
                struct pci_packet pkt;
-               u8 buffer[sizeof(struct pci_delete_interrupt) -
-                         sizeof(struct pci_message)];
+               u8 buffer[sizeof(struct pci_delete_interrupt)];
        } ctxt;
 
        memset(&ctxt, 0, sizeof(ctxt));
        int_pkt = (struct pci_delete_interrupt *)&ctxt.pkt.message;
-       int_pkt->message_type.message_type =
+       int_pkt->message_type.type =
                PCI_DELETE_INTERRUPT_MESSAGE;
        int_pkt->wslot.slot = hpdev->desc.win_slot.slot;
        int_pkt->int_desc = *int_desc;
        struct cpumask *affinity;
        struct {
                struct pci_packet pkt;
-               u8 buffer[sizeof(struct pci_create_interrupt) -
-                         sizeof(struct pci_message)];
+               u8 buffer[sizeof(struct pci_create_interrupt)];
        } ctxt;
        int cpu;
        int ret;
        ctxt.pkt.completion_func = hv_pci_compose_compl;
        ctxt.pkt.compl_ctxt = ∁
        int_pkt = (struct pci_create_interrupt *)&ctxt.pkt.message;
-       int_pkt->message_type.message_type = PCI_CREATE_INTERRUPT_MESSAGE;
+       int_pkt->message_type.type = PCI_CREATE_INTERRUPT_MESSAGE;
        int_pkt->wslot.slot = hpdev->desc.win_slot.slot;
        int_pkt->int_desc.vector = cfg->vector;
        int_pkt->int_desc.vector_count = 1;
        pkt.init_packet.compl_ctxt = &comp_pkt;
        pkt.init_packet.completion_func = q_resource_requirements;
        res_req = (struct pci_child_message *)&pkt.init_packet.message;
-       res_req->message_type = PCI_QUERY_RESOURCE_REQUIREMENTS;
+       res_req->message_type.type = PCI_QUERY_RESOURCE_REQUIREMENTS;
        res_req->wslot.slot = desc->win_slot.slot;
 
        ret = vmbus_sendpacket(hbus->hdev->channel, res_req,
        int wslot;
        struct {
                struct pci_packet pkt;
-               u8 buffer[sizeof(struct pci_eject_response) -
-                         sizeof(struct pci_message)];
+               u8 buffer[sizeof(struct pci_eject_response)];
        } ctxt;
 
        hpdev = container_of(work, struct hv_pci_dev, wrk);
 
        memset(&ctxt, 0, sizeof(ctxt));
        ejct_pkt = (struct pci_eject_response *)&ctxt.pkt.message;
-       ejct_pkt->message_type = PCI_EJECTION_COMPLETE;
+       ejct_pkt->message_type.type = PCI_EJECTION_COMPLETE;
        ejct_pkt->wslot.slot = hpdev->desc.win_slot.slot;
        vmbus_sendpacket(hpdev->hbus->hdev->channel, ejct_pkt,
                         sizeof(*ejct_pkt), (unsigned long)&ctxt.pkt,
                case VM_PKT_DATA_INBAND:
 
                        new_message = (struct pci_incoming_message *)buffer;
-                       switch (new_message->message_type.message_type) {
+                       switch (new_message->message_type.type) {
                        case PCI_BUS_RELATIONS:
 
                                bus_rel = (struct pci_bus_relations *)buffer;
                        default:
                                dev_warn(&hbus->hdev->device,
                                        "Unimplemented protocol message %x\n",
-                                       new_message->message_type.message_type);
+                                       new_message->message_type.type);
                                break;
                        }
                        break;
        pkt->completion_func = hv_pci_generic_compl;
        pkt->compl_ctxt = &comp_pkt;
        version_req = (struct pci_version_request *)&pkt->message;
-       version_req->message_type.message_type = PCI_QUERY_PROTOCOL_VERSION;
+       version_req->message_type.type = PCI_QUERY_PROTOCOL_VERSION;
        version_req->protocol_version = PCI_PROTOCOL_VERSION_CURRENT;
 
        ret = vmbus_sendpacket(hdev->channel, version_req,
        pkt->completion_func = hv_pci_generic_compl;
        pkt->compl_ctxt = &comp_pkt;
        d0_entry = (struct pci_bus_d0_entry *)&pkt->message;
-       d0_entry->message_type.message_type = PCI_BUS_D0ENTRY;
+       d0_entry->message_type.type = PCI_BUS_D0ENTRY;
        d0_entry->mmio_base = hbus->mem_config->start;
 
        ret = vmbus_sendpacket(hdev->channel, d0_entry, sizeof(*d0_entry),
                return -ENOTEMPTY;
 
        memset(&message, 0, sizeof(message));
-       message.message_type = PCI_QUERY_BUS_RELATIONS;
+       message.type = PCI_QUERY_BUS_RELATIONS;
 
        ret = vmbus_sendpacket(hdev->channel, &message, sizeof(message),
                               0, VM_PKT_DATA_INBAND, 0);
                init_completion(&comp_pkt.host_event);
                pkt->completion_func = hv_pci_generic_compl;
                pkt->compl_ctxt = &comp_pkt;
-               pkt->message.message_type = PCI_RESOURCES_ASSIGNED;
                res_assigned = (struct pci_resources_assigned *)&pkt->message;
+               res_assigned->message_type.type = PCI_RESOURCES_ASSIGNED;
                res_assigned->wslot.slot = hpdev->desc.win_slot.slot;
 
                put_pcichild(hpdev, hv_pcidev_ref_by_slot);
                        continue;
 
                memset(&pkt, 0, sizeof(pkt));
-               pkt.message_type = PCI_RESOURCES_RELEASED;
+               pkt.message_type.type = PCI_RESOURCES_RELEASED;
                pkt.wslot.slot = hpdev->desc.win_slot.slot;
 
                put_pcichild(hpdev, hv_pcidev_ref_by_slot);
        init_completion(&comp_pkt.host_event);
        pkt.teardown_packet.completion_func = hv_pci_generic_compl;
        pkt.teardown_packet.compl_ctxt = &comp_pkt;
-       pkt.teardown_packet.message.message_type = PCI_BUS_D0EXIT;
+       pkt.teardown_packet.message[0].type = PCI_BUS_D0EXIT;
 
        ret = vmbus_sendpacket(hdev->channel, &pkt.teardown_packet.message,
                               sizeof(struct pci_message),