diff options
author | James.Smart@Emulex.Com <James.Smart@Emulex.Com> | 2005-08-10 15:03:01 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-08-12 13:08:48 -0400 |
commit | f888ba3ce77c66bece3d804caf7d559838209a4a (patch) | |
tree | 7bdd2439b758199b84eee084f6e5b184dfc28b75 | |
parent | 69859dc47744430ecda16522b0791b6d17e3fa93 (diff) |
[SCSI] lpfc driver 8.0.30 : fix get_stats panic
Fix panic in lpfc_get_stats()
Symptoms: Panic on sysfs stats access
Cause: In lpfc_get_stats() we are writing to memory that we do not
own.
Fix: Fix our stats structure allocation. Embed phba->link_stats in
struct lpfc_hba and stop treating it like rogue structure.
Note: Embedding midlayer/transport structure in our structure caused
need for more files to include midlayer/transport headers.
Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_ct.c | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_mbox.c | 3 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_mem.c | 3 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 1 |
7 files changed, 14 insertions, 8 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 3bb82aae432e..adb95674823f 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -342,9 +342,6 @@ struct lpfc_hba { | |||
342 | #define VPD_MASK 0xf /* mask for any vpd data */ | 342 | #define VPD_MASK 0xf /* mask for any vpd data */ |
343 | 343 | ||
344 | struct timer_list els_tmofunc; | 344 | struct timer_list els_tmofunc; |
345 | |||
346 | void *link_stats; | ||
347 | |||
348 | /* | 345 | /* |
349 | * stat counters | 346 | * stat counters |
350 | */ | 347 | */ |
@@ -370,6 +367,8 @@ struct lpfc_hba { | |||
370 | struct list_head freebufList; | 367 | struct list_head freebufList; |
371 | struct list_head ctrspbuflist; | 368 | struct list_head ctrspbuflist; |
372 | struct list_head rnidrspbuflist; | 369 | struct list_head rnidrspbuflist; |
370 | |||
371 | struct fc_host_statistics link_stats; | ||
373 | }; | 372 | }; |
374 | 373 | ||
375 | 374 | ||
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 3cea92883019..f37b7642c59d 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -988,8 +988,7 @@ lpfc_get_stats(struct Scsi_Host *shost) | |||
988 | { | 988 | { |
989 | struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; | 989 | struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; |
990 | struct lpfc_sli *psli = &phba->sli; | 990 | struct lpfc_sli *psli = &phba->sli; |
991 | struct fc_host_statistics *hs = | 991 | struct fc_host_statistics *hs = &phba->link_stats; |
992 | (struct fc_host_statistics *)phba->link_stats; | ||
993 | LPFC_MBOXQ_t *pmboxq; | 992 | LPFC_MBOXQ_t *pmboxq; |
994 | MAILBOX_t *pmb; | 993 | MAILBOX_t *pmb; |
995 | int rc=0; | 994 | int rc=0; |
@@ -1020,6 +1019,8 @@ lpfc_get_stats(struct Scsi_Host *shost) | |||
1020 | return NULL; | 1019 | return NULL; |
1021 | } | 1020 | } |
1022 | 1021 | ||
1022 | memset(hs, 0, sizeof (struct fc_host_statistics)); | ||
1023 | |||
1023 | hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt; | 1024 | hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt; |
1024 | hs->tx_words = (pmb->un.varRdStatus.xmitByteCnt * 256); | 1025 | hs->tx_words = (pmb->un.varRdStatus.xmitByteCnt * 256); |
1025 | hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt; | 1026 | hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt; |
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index 78adee4699af..b3880eca2f3c 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <scsi/scsi_device.h> | 30 | #include <scsi/scsi_device.h> |
31 | #include <scsi/scsi_host.h> | 31 | #include <scsi/scsi_host.h> |
32 | #include <scsi/scsi_transport_fc.h> | ||
32 | 33 | ||
33 | #include "lpfc_hw.h" | 34 | #include "lpfc_hw.h" |
34 | #include "lpfc_sli.h" | 35 | #include "lpfc_sli.h" |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 34d416d2b007..1b6d1dcdabb3 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -1339,14 +1339,12 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
1339 | if (pci_request_regions(pdev, LPFC_DRIVER_NAME)) | 1339 | if (pci_request_regions(pdev, LPFC_DRIVER_NAME)) |
1340 | goto out_disable_device; | 1340 | goto out_disable_device; |
1341 | 1341 | ||
1342 | host = scsi_host_alloc(&lpfc_template, | 1342 | host = scsi_host_alloc(&lpfc_template, sizeof (struct lpfc_hba)); |
1343 | sizeof (struct lpfc_hba) + sizeof (unsigned long)); | ||
1344 | if (!host) | 1343 | if (!host) |
1345 | goto out_release_regions; | 1344 | goto out_release_regions; |
1346 | 1345 | ||
1347 | phba = (struct lpfc_hba*)host->hostdata; | 1346 | phba = (struct lpfc_hba*)host->hostdata; |
1348 | memset(phba, 0, sizeof (struct lpfc_hba)); | 1347 | memset(phba, 0, sizeof (struct lpfc_hba)); |
1349 | phba->link_stats = (void *)&phba[1]; | ||
1350 | phba->host = host; | 1348 | phba->host = host; |
1351 | 1349 | ||
1352 | phba->fc_flag |= FC_LOADING; | 1350 | phba->fc_flag |= FC_LOADING; |
diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index c27cf94795db..afcd54d51f16 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c | |||
@@ -23,6 +23,9 @@ | |||
23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | 25 | ||
26 | #include <scsi/scsi_device.h> | ||
27 | #include <scsi/scsi_transport_fc.h> | ||
28 | |||
26 | #include "lpfc_hw.h" | 29 | #include "lpfc_hw.h" |
27 | #include "lpfc_sli.h" | 30 | #include "lpfc_sli.h" |
28 | #include "lpfc_disc.h" | 31 | #include "lpfc_disc.h" |
diff --git a/drivers/scsi/lpfc/lpfc_mem.c b/drivers/scsi/lpfc/lpfc_mem.c index a5cfb6421fa9..034a8bfa9ac8 100644 --- a/drivers/scsi/lpfc/lpfc_mem.c +++ b/drivers/scsi/lpfc/lpfc_mem.c | |||
@@ -23,6 +23,9 @@ | |||
23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | 25 | ||
26 | #include <scsi/scsi_device.h> | ||
27 | #include <scsi/scsi_transport_fc.h> | ||
28 | |||
26 | #include "lpfc_hw.h" | 29 | #include "lpfc_hw.h" |
27 | #include "lpfc_sli.h" | 30 | #include "lpfc_sli.h" |
28 | #include "lpfc_disc.h" | 31 | #include "lpfc_disc.h" |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 1775508ed276..e027f4708103 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <scsi/scsi_cmnd.h> | 27 | #include <scsi/scsi_cmnd.h> |
28 | #include <scsi/scsi_device.h> | 28 | #include <scsi/scsi_device.h> |
29 | #include <scsi/scsi_host.h> | 29 | #include <scsi/scsi_host.h> |
30 | #include <scsi/scsi_transport_fc.h> | ||
30 | 31 | ||
31 | #include "lpfc_hw.h" | 32 | #include "lpfc_hw.h" |
32 | #include "lpfc_sli.h" | 33 | #include "lpfc_sli.h" |