The kernel crashed in mutex_lock called from smp_execute_task. The reason
is that the mutex is initialized only for devices with type EDGE_DEV or
FANOUT_DEV, but in some cases smp_execute_task gets called in the expander
revalidation context for end devices too. Expander revalidation should not
be performed for non-expander devices since they are discovered via their
IDENTIFY frames and probing for expander capabilities is not required.

Signed-off-by: Praveen Murali <pmur...@logicube.com>
---
 drivers/scsi/libsas/sas_discover.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/libsas/sas_discover.c 
b/drivers/scsi/libsas/sas_discover.c
index 629a086..333a400 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,8 +461,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);
+       /* perform expander revalidation for sas expander devices */
+       if (ddev && (ddev->dev_type == EDGE_DEV || ddev->dev_type == 
FANOUT_DEV))
+               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);
-- 
2.1.4

N�����r��y����b�X��ǧv�^�)޺{.n�+����{���"�{ay�ʇڙ�,j��f���h���z��w���
���j:+v���w�j�m��������zZ+�����ݢj"��!�i

Reply via email to