]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/scsi/hisi_sas/hisi_sas_main.c
scsi: hisi_sas: fix some sas_task.task_state_lock locking
[mirror_ubuntu-bionic-kernel.git] / drivers / scsi / hisi_sas / hisi_sas_main.c
index 49cac22a83bdb3f1e22d90609f1b4cdbba50c4a6..f9ea5ccd1e844ade32fe754c3f30cee1f34e8b18 100644 (file)
@@ -188,6 +188,7 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
        struct asd_sas_port *sas_port = device->port;
        struct device *dev = &hisi_hba->pdev->dev;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
+       unsigned long flags;
 
        if (!sas_port) {
                struct task_status_struct *ts = &task->task_status;
@@ -308,9 +309,9 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
        }
 
        list_add_tail(&slot->entry, &sas_dev->list);
-       spin_lock(&task->task_state_lock);
+       spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
-       spin_unlock(&task->task_state_lock);
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        hisi_hba->slot_prep = slot;
 
@@ -922,14 +923,11 @@ static int hisi_sas_abort_task(struct sas_task *task)
                return TMF_RESP_FUNC_FAILED;
        }
 
-       spin_lock_irqsave(&task->task_state_lock, flags);
        if (task->task_state_flags & SAS_TASK_STATE_DONE) {
-               spin_unlock_irqrestore(&task->task_state_lock, flags);
                rc = TMF_RESP_FUNC_COMPLETE;
                goto out;
        }
 
-       spin_unlock_irqrestore(&task->task_state_lock, flags);
        sas_dev->dev_status = HISI_SAS_DEV_EH;
        if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
                struct scsi_cmnd *cmnd = task->uldd_task;
@@ -1127,6 +1125,7 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, u64 device_id,
        struct asd_sas_port *sas_port = device->port;
        struct hisi_sas_cmd_hdr *cmd_hdr_base;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
+       unsigned long flags;
 
        if (unlikely(test_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags)))
                return -EINVAL;
@@ -1167,9 +1166,9 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, u64 device_id,
 
 
        list_add_tail(&slot->entry, &sas_dev->list);
-       spin_lock(&task->task_state_lock);
+       spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
-       spin_unlock(&task->task_state_lock);
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        hisi_hba->slot_prep = slot;