________________________________________
From: James Bottomley <[email protected]>
Sent: Wednesday, March 4, 2015 4:18 PM
To: Praveen Murali
Cc: [email protected]; [email protected]
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html