________________________________________ From: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> Sent: Wednesday, March 4, 2015 4:18 PM To: Praveen Murali Cc: linux-scsi@xxxxxxxxxxxxxxx; dan.j.williams@xxxxxxxxx Subject: Re: [libsas] Kernel Crash in smp_execute_task On Wed, 2015-03-04 at 23:29 +0000, Praveen Murali wrote: >> On second thoughts, should we even let smp commands/requests thru for >> sas end devices (dev->dev_type == SAS_END_DEV) ? if so, wont the >> following patch more sense? (also, in my last mail the kernel logs >> were all messed up; sorry dint realize that when I sent the mail. >> Trying to fix it here) >I think the bug is deeper than this: we shouldn't be trying expander >revalidation on non-expander devices. If the device changes from end to >expander via hotplug, we'll see the remove and add (via the identify >frame) so the device type should be correct by the time we do the >revalidation. >Does this fix the problem? Yes, that fixes the issue. So if my understanding is correct, what you are saying is we need to do something like diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index 629a086..e1060d7 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c @@ -445,6 +445,7 @@ static void sas_revalidate_domain(struct work_struct *work) int res = 0; struct sas_discovery_event *ev = to_sas_discovery_event(work); struct asd_sas_port *port = ev->port; + struct domain_device *ddev = port->port_dev; struct sas_ha_struct *ha = port->ha; /* prevent revalidation from finding sata links in recovery */ @@ -460,7 +461,7 @@ static void sas_revalidate_domain(struct work_struct *work) SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id, task_pid_nr(current)); - if (port->port_dev) + if (ddev && (ddev->dev_type == EDGE_DEV || ddev->dev_type == FANOUT_DEV)) res = sas_ex_revalidate_domain(port->port_dev); SAS_DPRINTK("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n", instead of putting the exclusion in smp_execute_task; is that right? Thanks, Praveen >James --- diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c index 62b58d3..60de662 100644 --- a/drivers/scsi/libsas/sas_discover.c +++ b/drivers/scsi/libsas/sas_discover.c @@ -500,6 +500,7 @@ static void sas_revalidate_domain(struct work_struct *work) struct sas_discovery_event *ev = to_sas_discovery_event(work); struct asd_sas_port *port = ev->port; struct sas_ha_struct *ha = port->ha; + struct domain_device *ddev = port->port_dev; /* prevent revalidation from finding sata links in recovery */ mutex_lock(&ha->disco_mutex); @@ -514,8 +515,9 @@ static void sas_revalidate_domain(struct work_struct *work) SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id, task_pid_nr(current)); - if (port->port_dev) - res = sas_ex_revalidate_domain(port->port_dev); + if (ddev && (ddev->dev_type == SAS_FANOUT_EXPANDER_DEVICE || + ddev->dev_type == SAS_EDGE_EXPANDER_DEVICE)) + res = sas_ex_revalidate_domain(ddev); SAS_DPRINTK("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n", port->id, task_pid_nr(current), res); -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html