scsi: smartpqi: correct hang when deleting 32 lds
authorMahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
Thu, 22 Aug 2019 20:39:31 +0000 (15:39 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 29 Aug 2019 22:31:39 +0000 (18:31 -0400)
When each ld is deleted, a rescan event is triggered in the driver. These
can stack up waiting on mutex_lock.

Change to mutex_try_lock and schedule a rescan for later.

Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekhara@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi_init.c

index a6cb49b8e5d0696f838e023293ecddddcb63d9f2..9801606dadfa5a60c38f56a763e5d7ea2950c857 100644 (file)
@@ -2236,18 +2236,20 @@ static void pqi_remove_all_scsi_devices(struct pqi_ctrl_info *ctrl_info)
 
 static int pqi_scan_scsi_devices(struct pqi_ctrl_info *ctrl_info)
 {
-       int rc;
+       int rc = 0;
 
        if (pqi_ctrl_offline(ctrl_info))
                return -ENXIO;
 
-       mutex_lock(&ctrl_info->scan_mutex);
-
-       rc = pqi_update_scsi_devices(ctrl_info);
-       if (rc)
+       if (!mutex_trylock(&ctrl_info->scan_mutex)) {
                pqi_schedule_rescan_worker_delayed(ctrl_info);
 
-       mutex_unlock(&ctrl_info->scan_mutex);
+       } else {
+               rc = pqi_update_scsi_devices(ctrl_info);
+               if (rc)
+                       pqi_schedule_rescan_worker_delayed(ctrl_info);
+               mutex_unlock(&ctrl_info->scan_mutex);
+       }
 
        return rc;
 }