scsi: smartpqi: correct hang when deleting 32 lds

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>
This commit is contained in:
Mahesh Rajashekhara 2019-08-22 15:39:31 -05:00 committed by Martin K. Petersen
parent 2d2ad4bc72
commit 530dd8a7a2
1 changed files with 8 additions and 6 deletions

View 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;
}