]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
scsi: mpt3sas: simplify task management functions
authorHannes Reinecke <hare@suse.de>
Thu, 4 Jan 2018 12:57:08 +0000 (04:57 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 11 Jan 2018 04:25:02 +0000 (23:25 -0500)
No functional change. Code optimization.

One can simply check 'target_busy' or 'device_busy' when figuring out if
there are outstanding commands; no need to painstakingly count them by
hand.

[mkp: tweaked patch description]

Signed-off-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_scsih.c

index 8870ceffb0bb1ce8ace405618c9f6440f6a56780..c6cbadc9f24248d3291569eed2831db35d6dce17 100644 (file)
@@ -1516,74 +1516,6 @@ _scsih_scsi_lookup_find_by_scmd(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd
        return smid;
 }
 
-/**
- * _scsih_scsi_lookup_find_by_target - search for matching channel:id
- * @ioc: per adapter object
- * @id: target id
- * @channel: channel
- * Context: This function will acquire ioc->scsi_lookup_lock.
- *
- * This will search for a matching channel:id in the scsi_lookup array,
- * returning 1 if found.
- */
-static u8
-_scsih_scsi_lookup_find_by_target(struct MPT3SAS_ADAPTER *ioc, int id,
-       int channel)
-{
-       u8 found;
-       unsigned long   flags;
-       int i;
-
-       spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
-       found = 0;
-       for (i = 0 ; i < ioc->scsiio_depth; i++) {
-               if (ioc->scsi_lookup[i].scmd &&
-                   (ioc->scsi_lookup[i].scmd->device->id == id &&
-                   ioc->scsi_lookup[i].scmd->device->channel == channel)) {
-                       found = 1;
-                       goto out;
-               }
-       }
- out:
-       spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
-       return found;
-}
-
-/**
- * _scsih_scsi_lookup_find_by_lun - search for matching channel:id:lun
- * @ioc: per adapter object
- * @id: target id
- * @lun: lun number
- * @channel: channel
- * Context: This function will acquire ioc->scsi_lookup_lock.
- *
- * This will search for a matching channel:id:lun in the scsi_lookup array,
- * returning 1 if found.
- */
-static u8
-_scsih_scsi_lookup_find_by_lun(struct MPT3SAS_ADAPTER *ioc, int id,
-       unsigned int lun, int channel)
-{
-       u8 found;
-       unsigned long   flags;
-       int i;
-
-       spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
-       found = 0;
-       for (i = 0 ; i < ioc->scsiio_depth; i++) {
-               if (ioc->scsi_lookup[i].scmd &&
-                   (ioc->scsi_lookup[i].scmd->device->id == id &&
-                   ioc->scsi_lookup[i].scmd->device->channel == channel &&
-                   ioc->scsi_lookup[i].scmd->device->lun == lun)) {
-                       found = 1;
-                       goto out;
-               }
-       }
- out:
-       spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
-       return found;
-}
-
 /**
  * scsih_change_queue_depth - setting device queue depth
  * @sdev: scsi device struct
@@ -2849,19 +2781,9 @@ mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle, uint channel,
                rc = FAILED;
                break;
 
-       case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
-               if (_scsih_scsi_lookup_find_by_target(ioc, id, channel))
-                       rc = FAILED;
-               else
-                       rc = SUCCESS;
-               break;
        case MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET:
        case MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET:
-               if (_scsih_scsi_lookup_find_by_lun(ioc, id, lun, channel))
-                       rc = FAILED;
-               else
-                       rc = SUCCESS;
-               break;
+       case MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
        case MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK:
                rc = SUCCESS;
                break;
@@ -3082,7 +3004,9 @@ scsih_dev_reset(struct scsi_cmnd *scmd)
        r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->channel,
            scmd->device->id, scmd->device->lun,
            MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET, 0, 30);
-
+       /* Check for busy commands after reset */
+       if (r == SUCCESS && atomic_read(&scmd->device->device_busy))
+               r = FAILED;
  out:
        sdev_printk(KERN_INFO, scmd->device, "device reset: %s scmd(%p)\n",
            ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);
@@ -3144,7 +3068,9 @@ scsih_target_reset(struct scsi_cmnd *scmd)
        r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->channel,
            scmd->device->id, 0, MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0,
            30);
-
+       /* Check for busy commands after reset */
+       if (r == SUCCESS && atomic_read(&starget->target_busy))
+               r = FAILED;
  out:
        starget_printk(KERN_INFO, starget, "target reset: %s scmd(%p)\n",
            ((r == SUCCESS) ? "SUCCESS" : "FAILED"), scmd);