aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2012-06-22 02:36:15 -0400
committerJames Bottomley <JBottomley@Parallels.com>2012-07-20 03:58:52 -0400
commit26f2f199ff150d8876b2641c41e60d1c92d2fb81 (patch)
tree00e731f023ef8df4dd7ed80acec4e5d1945a7954
parentb2311a287553af4dffaef224cdd6e3ddf6783312 (diff)
[SCSI] libsas: continue revalidation
Continue running revalidation until no more broadcast devices are discovered. Fixes cases where re-discovery completes too early in a domain with multiple expanders with pending re-discovery events. Servicing BCNs can get backed up behind error recovery. Cc: <stable@vger.kernel.org> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--drivers/scsi/libsas/sas_expander.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index af659cc8308c..63c574227ebf 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -2114,9 +2114,7 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev)
2114 struct domain_device *dev = NULL; 2114 struct domain_device *dev = NULL;
2115 2115
2116 res = sas_find_bcast_dev(port_dev, &dev); 2116 res = sas_find_bcast_dev(port_dev, &dev);
2117 if (res) 2117 while (res == 0 && dev) {
2118 goto out;
2119 if (dev) {
2120 struct expander_device *ex = &dev->ex_dev; 2118 struct expander_device *ex = &dev->ex_dev;
2121 int i = 0, phy_id; 2119 int i = 0, phy_id;
2122 2120
@@ -2128,8 +2126,10 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev)
2128 res = sas_rediscover(dev, phy_id); 2126 res = sas_rediscover(dev, phy_id);
2129 i = phy_id + 1; 2127 i = phy_id + 1;
2130 } while (i < ex->num_phys); 2128 } while (i < ex->num_phys);
2129
2130 dev = NULL;
2131 res = sas_find_bcast_dev(port_dev, &dev);
2131 } 2132 }
2132out:
2133 return res; 2133 return res;
2134} 2134}
2135 2135