From: Mahesh Rajashekhara <[email protected]>

 - 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 <[email protected]>
Reviewed-by: Kevin Barnett <[email protected]>
Signed-off-by: Mahesh Rajashekhara <[email protected]>
Signed-off-by: Don Brace <[email protected]>
---
 drivers/scsi/smartpqi/smartpqi_init.c |   14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/smartpqi/smartpqi_init.c 
b/drivers/scsi/smartpqi/smartpqi_init.c
index a6cb49b8e5d0..9801606dadfa 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -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;
 }

Reply via email to