aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Reed <mdr@sgi.com>2008-03-20 18:32:05 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-04-07 13:19:00 -0400
commit7748369f49d428e558c519ed344d3005d38347b7 (patch)
tree37a8bcdbd147d11bf1d93c2cb2a0ac3404e4b0a2
parent9d56291366cd6ab156be722e42cf487bef20f5fd (diff)
[SCSI] mptsas: do not use ioc->handle to locate hba portinfo structure
While performing hardware raid reset testing via the raid's client, I noticed that sometimes, following the reset, that there would be more raid targets in the lsscsi output than there actually were raid targets. I tracked this down to the following issue. Fusion cannot always find the mptsas_portinfo structure for the hba because it uses the handle stored in ioc->handle to locate it. The problem is that the firmware can change the handle associated with the hba when h/w raid is reset (via the raid client). When this happens, the driver will allocate another mptsas_portinfo structure and link it into the chain of said structures. This ultimately causes confusion within the driver resulting in targets not being removed when they should be. Eric Moore pointed out that the hba's portinfo structure is always the first structure on the sas_topology list. This patch modifies mptsas.c to access the hba's portinfo structure by taking the first structure on said list. Signed-off-by: Michael Reed <mdr@sgi.com> Acked-by: "Moore, Eric" <Eric.Moore@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r--drivers/message/fusion/mptbase.h1
-rw-r--r--drivers/message/fusion/mptsas.c22
2 files changed, 17 insertions, 6 deletions
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h
index 0041ab3e5e80..a8f617447d22 100644
--- a/drivers/message/fusion/mptbase.h
+++ b/drivers/message/fusion/mptbase.h
@@ -695,7 +695,6 @@ typedef struct _MPT_ADAPTER
695 struct mutex sas_discovery_mutex; 695 struct mutex sas_discovery_mutex;
696 u8 sas_discovery_runtime; 696 u8 sas_discovery_runtime;
697 u8 sas_discovery_ignore_events; 697 u8 sas_discovery_ignore_events;
698 u16 handle;
699 int sas_index; /* index refrencing */ 698 int sas_index; /* index refrencing */
700 MPT_SAS_MGMT sas_mgmt; 699 MPT_SAS_MGMT sas_mgmt;
701 struct work_struct sas_persist_task; 700 struct work_struct sas_persist_task;
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c
index 78734e25edd5..468480771f13 100644
--- a/drivers/message/fusion/mptsas.c
+++ b/drivers/message/fusion/mptsas.c
@@ -230,6 +230,20 @@ static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
230 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; 230 return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
231} 231}
232 232
233static struct mptsas_portinfo *
234mptsas_get_hba_portinfo(MPT_ADAPTER *ioc)
235{
236 struct list_head *head = &ioc->sas_topology;
237 struct mptsas_portinfo *pi = NULL;
238
239 /* always the first entry on sas_topology list */
240
241 if (!list_empty(head))
242 pi = list_entry(head->next, struct mptsas_portinfo, list);
243
244 return pi;
245}
246
233/* 247/*
234 * mptsas_find_portinfo_by_handle 248 * mptsas_find_portinfo_by_handle
235 * 249 *
@@ -1290,7 +1304,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
1290 struct mptsas_portinfo *port_info; 1304 struct mptsas_portinfo *port_info;
1291 1305
1292 mutex_lock(&ioc->sas_topology_mutex); 1306 mutex_lock(&ioc->sas_topology_mutex);
1293 port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle); 1307 port_info = mptsas_get_hba_portinfo(ioc);
1294 if (port_info && port_info->phy_info) 1308 if (port_info && port_info->phy_info)
1295 sas_address = 1309 sas_address =
1296 port_info->phy_info[0].phy->identify.sas_address; 1310 port_info->phy_info[0].phy->identify.sas_address;
@@ -2028,8 +2042,7 @@ static int mptsas_probe_one_phy(struct device *dev,
2028 int i; 2042 int i;
2029 2043
2030 mutex_lock(&ioc->sas_topology_mutex); 2044 mutex_lock(&ioc->sas_topology_mutex);
2031 port_info = mptsas_find_portinfo_by_handle(ioc, 2045 port_info = mptsas_get_hba_portinfo(ioc);
2032 ioc->handle);
2033 mutex_unlock(&ioc->sas_topology_mutex); 2046 mutex_unlock(&ioc->sas_topology_mutex);
2034 2047
2035 for (i = 0; i < port_info->num_phys; i++) 2048 for (i = 0; i < port_info->num_phys; i++)
@@ -2099,8 +2112,7 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
2099 2112
2100 mptsas_sas_io_unit_pg1(ioc); 2113 mptsas_sas_io_unit_pg1(ioc);
2101 mutex_lock(&ioc->sas_topology_mutex); 2114 mutex_lock(&ioc->sas_topology_mutex);
2102 ioc->handle = hba->phy_info[0].handle; 2115 port_info = mptsas_get_hba_portinfo(ioc);
2103 port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
2104 if (!port_info) { 2116 if (!port_info) {
2105 port_info = hba; 2117 port_info = hba;
2106 list_add_tail(&port_info->list, &ioc->sas_topology); 2118 list_add_tail(&port_info->list, &ioc->sas_topology);