| From 24926dadc41cc566e974022b0e66231b82c6375f Mon Sep 17 00:00:00 2001 |
| From: Mark Salyzyn <mark_salyzyn@us.xyratex.com> |
| Date: Thu, 1 Sep 2011 06:11:17 -0700 |
| Subject: [SCSI] libsas: fix failure to revalidate domain for anything but the first expander child. |
| |
| From: Mark Salyzyn <mark_salyzyn@us.xyratex.com> |
| |
| commit 24926dadc41cc566e974022b0e66231b82c6375f upstream. |
| |
| In an enclosure model where there are chaining expanders to a large body |
| of storage, it was discovered that libsas, responding to a broadcast |
| event change, would only revalidate the domain of first child expander |
| in the list. |
| |
| The issue is that the pointer value to the discovered source device was |
| used to break out of the loop, rather than the content of the pointer. |
| |
| This still remains non-compliant as the revalidate domain code is |
| supposed to loop through all child expanders, and not stop at the first |
| one it finds that reports a change count. However, the design of this |
| routine does not allow multiple device discoveries and that would be a |
| more complicated set of patches reserved for another day. We are fixing |
| the glaring bug rather than refactoring the code. |
| |
| Signed-off-by: Mark Salyzyn <msalyzyn@us.xyratex.com> |
| Signed-off-by: James Bottomley <JBottomley@Parallels.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/libsas/sas_expander.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/scsi/libsas/sas_expander.c |
| +++ b/drivers/scsi/libsas/sas_expander.c |
| @@ -1712,7 +1712,7 @@ static int sas_find_bcast_dev(struct dom |
| list_for_each_entry(ch, &ex->children, siblings) { |
| if (ch->dev_type == EDGE_DEV || ch->dev_type == FANOUT_DEV) { |
| res = sas_find_bcast_dev(ch, src_dev); |
| - if (src_dev) |
| + if (*src_dev) |
| return res; |
| } |
| } |