diff options
author | Dan Williams <dan.j.williams@intel.com> | 2012-03-12 14:38:26 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-04-23 07:07:25 -0400 |
commit | ec236e526777ea8825e6e0c3673a40389692eabf (patch) | |
tree | f066f500296e65563ad70e0913273aa9db8b4705 /drivers/scsi | |
parent | 1699490db339e2c6b3037ea8e7dcd6b2755b688e (diff) |
[SCSI] libsas: fix sas_get_port_device regression
Commit 899fcf4 "[SCSI] libsas: set attached device type and target
protocols for local phys" setup 'phy' to be dereferenced after
list_for_each_entry(phy, &port->phy_list, port_phy_el) (i.e. phy ==
&port->phy_list) resulting in reports like:
BUG: unable to handle kernel NULL pointer dereference at 00000000000002b0
IP: [<ffffffffa00ce948>] sas_discover_domain+0x29e/0x4fb [libsas]
...fix by deferring sas_phy_set_target() to the end of
sas_get_port_device().
Reported-by: Tom Jackson <thomas.p.jackson@intel.com>
Tested-by: Tom Jackson <thomas.p.jackson@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/libsas/sas_discover.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index c7ac88288bf1..658f16cc2f03 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c | |||
@@ -134,10 +134,6 @@ static int sas_get_port_device(struct asd_sas_port *port) | |||
134 | return -ENODEV; | 134 | return -ENODEV; |
135 | } | 135 | } |
136 | 136 | ||
137 | spin_lock_irq(&port->phy_list_lock); | ||
138 | list_for_each_entry(phy, &port->phy_list, port_phy_el) | ||
139 | sas_phy_set_target(phy, dev); | ||
140 | spin_unlock_irq(&port->phy_list_lock); | ||
141 | rphy->identify.phy_identifier = phy->phy->identify.phy_identifier; | 137 | rphy->identify.phy_identifier = phy->phy->identify.phy_identifier; |
142 | memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE); | 138 | memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE); |
143 | sas_fill_in_rphy(dev, rphy); | 139 | sas_fill_in_rphy(dev, rphy); |
@@ -164,6 +160,11 @@ static int sas_get_port_device(struct asd_sas_port *port) | |||
164 | spin_unlock_irq(&port->dev_list_lock); | 160 | spin_unlock_irq(&port->dev_list_lock); |
165 | } | 161 | } |
166 | 162 | ||
163 | spin_lock_irq(&port->phy_list_lock); | ||
164 | list_for_each_entry(phy, &port->phy_list, port_phy_el) | ||
165 | sas_phy_set_target(phy, dev); | ||
166 | spin_unlock_irq(&port->phy_list_lock); | ||
167 | |||
167 | return 0; | 168 | return 0; |
168 | } | 169 | } |
169 | 170 | ||