| From 20f5895d55d9281830bfb7819c5c5b70b05297a6 Mon Sep 17 00:00:00 2001 |
| From: Kashyap, Desai <kashyap.desai@lsi.com> |
| Date: Fri, 7 Aug 2009 19:34:26 +0530 |
| Subject: SCSI: mpt2sas: Expander fix oops saying "Already part of another port" |
| |
| From: Kashyap, Desai <kashyap.desai@lsi.com> |
| |
| commit 20f5895d55d9281830bfb7819c5c5b70b05297a6 upstream. |
| |
| Kernel panic is seen because driver did not tear down the port which should |
| be dnoe using mpt2sas_transport_port_remove(). without this fix When expander |
| is added back we would oops inside sas_port_add_phy. |
| |
| Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> |
| Signed-off-by: James Bottomley <James.Bottomley@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/mpt2sas/mpt2sas_scsih.c | 21 +++++++++++++++------ |
| 1 file changed, 15 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c |
| +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c |
| @@ -3205,7 +3205,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPT |
| __le64 sas_address; |
| int i; |
| unsigned long flags; |
| - struct _sas_port *mpt2sas_port; |
| + struct _sas_port *mpt2sas_port = NULL; |
| int rc = 0; |
| |
| if (!handle) |
| @@ -3297,12 +3297,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPT |
| &expander_pg1, i, handle))) { |
| printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", |
| ioc->name, __FILE__, __LINE__, __func__); |
| - continue; |
| + rc = -1; |
| + goto out_fail; |
| } |
| sas_expander->phy[i].handle = handle; |
| sas_expander->phy[i].phy_id = i; |
| - mpt2sas_transport_add_expander_phy(ioc, &sas_expander->phy[i], |
| - expander_pg1, sas_expander->parent_dev); |
| + |
| + if ((mpt2sas_transport_add_expander_phy(ioc, |
| + &sas_expander->phy[i], expander_pg1, |
| + sas_expander->parent_dev))) { |
| + printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", |
| + ioc->name, __FILE__, __LINE__, __func__); |
| + rc = -1; |
| + goto out_fail; |
| + } |
| } |
| |
| if (sas_expander->enclosure_handle) { |
| @@ -3319,8 +3327,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPT |
| |
| out_fail: |
| |
| - if (sas_expander) |
| - kfree(sas_expander->phy); |
| + if (mpt2sas_port) |
| + mpt2sas_transport_port_remove(ioc, sas_expander->sas_address, |
| + sas_expander->parent_handle); |
| kfree(sas_expander); |
| return rc; |
| } |