Commit 32696198 authored by Joe Lawrence's avatar Joe Lawrence Committed by Christoph Hellwig

mptfusion: combine fw_event_work and its event_data

Tack the firmware reply event_data payload to the end of its
corresponding struct fw_event_work allocation.  Rework fw_event_work
allocation calculations to include the event_data size where
appropriate.

This clarifies the code a bit and avoids the following smatch warnings:

  drivers/message/fusion/mptsas.c:1003 mptsas_queue_device_delete()
    error: memcpy() 'fw_event->event_data' too small (29 vs 36)

  drivers/message/fusion/mptsas.c:1017 mptsas_queue_rescan() error: not
    allocating enough data 168 vs 160
Signed-off-by: default avatarJoe Lawrence <joe.lawrence@stratus.com>
Acked-by: default avatarSreekanth Reddy <Sreekanth.Reddy@avagotech.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent c9834c70
...@@ -990,11 +990,10 @@ mptsas_queue_device_delete(MPT_ADAPTER *ioc, ...@@ -990,11 +990,10 @@ mptsas_queue_device_delete(MPT_ADAPTER *ioc,
MpiEventDataSasDeviceStatusChange_t *sas_event_data) MpiEventDataSasDeviceStatusChange_t *sas_event_data)
{ {
struct fw_event_work *fw_event; struct fw_event_work *fw_event;
int sz;
sz = offsetof(struct fw_event_work, event_data) + fw_event = kzalloc(sizeof(*fw_event) +
sizeof(MpiEventDataSasDeviceStatusChange_t); sizeof(MpiEventDataSasDeviceStatusChange_t),
fw_event = kzalloc(sz, GFP_ATOMIC); GFP_ATOMIC);
if (!fw_event) { if (!fw_event) {
printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n", printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n",
ioc->name, __func__, __LINE__); ioc->name, __func__, __LINE__);
...@@ -1011,10 +1010,8 @@ static void ...@@ -1011,10 +1010,8 @@ static void
mptsas_queue_rescan(MPT_ADAPTER *ioc) mptsas_queue_rescan(MPT_ADAPTER *ioc)
{ {
struct fw_event_work *fw_event; struct fw_event_work *fw_event;
int sz;
sz = offsetof(struct fw_event_work, event_data); fw_event = kzalloc(sizeof(*fw_event), GFP_ATOMIC);
fw_event = kzalloc(sz, GFP_ATOMIC);
if (!fw_event) { if (!fw_event) {
printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n", printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n",
ioc->name, __func__, __LINE__); ioc->name, __func__, __LINE__);
...@@ -4983,7 +4980,7 @@ static int ...@@ -4983,7 +4980,7 @@ static int
mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply) mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
{ {
u32 event = le32_to_cpu(reply->Event); u32 event = le32_to_cpu(reply->Event);
int sz, event_data_sz; int event_data_sz;
struct fw_event_work *fw_event; struct fw_event_work *fw_event;
unsigned long delay; unsigned long delay;
...@@ -5093,8 +5090,7 @@ mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply) ...@@ -5093,8 +5090,7 @@ mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
event_data_sz = ((reply->MsgLength * 4) - event_data_sz = ((reply->MsgLength * 4) -
offsetof(EventNotificationReply_t, Data)); offsetof(EventNotificationReply_t, Data));
sz = offsetof(struct fw_event_work, event_data) + event_data_sz; fw_event = kzalloc(sizeof(*fw_event) + event_data_sz, GFP_ATOMIC);
fw_event = kzalloc(sz, GFP_ATOMIC);
if (!fw_event) { if (!fw_event) {
printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n", ioc->name, printk(MYIOC_s_WARN_FMT "%s: failed at (line=%d)\n", ioc->name,
__func__, __LINE__); __func__, __LINE__);
......
...@@ -110,7 +110,7 @@ struct fw_event_work { ...@@ -110,7 +110,7 @@ struct fw_event_work {
MPT_ADAPTER *ioc; MPT_ADAPTER *ioc;
u32 event; u32 event;
u8 retries; u8 retries;
u8 __attribute__((aligned(4))) event_data[1]; char event_data[0] __aligned(4);
}; };
struct mptsas_discovery_event { struct mptsas_discovery_event {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment