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:
parent
2d2ad4bc72
commit
530dd8a7a2
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue