@@ -205,7 +205,7 @@ static int hisi_sas_slot_index_alloc(struct hisi_hba *hisi_hba,
205205}
206206
207207void hisi_sas_slot_task_free (struct hisi_hba * hisi_hba , struct sas_task * task ,
208- struct hisi_sas_slot * slot )
208+ struct hisi_sas_slot * slot , bool need_lock )
209209{
210210 int device_id = slot -> device_id ;
211211 struct hisi_sas_device * sas_dev = & hisi_hba -> devices [device_id ];
@@ -239,9 +239,13 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
239239 }
240240 }
241241
242- spin_lock (& sas_dev -> lock );
243- list_del_init (& slot -> entry );
244- spin_unlock (& sas_dev -> lock );
242+ if (need_lock ) {
243+ spin_lock (& sas_dev -> lock );
244+ list_del_init (& slot -> entry );
245+ spin_unlock (& sas_dev -> lock );
246+ } else {
247+ list_del_init (& slot -> entry );
248+ }
245249
246250 memset (slot , 0 , offsetof(struct hisi_sas_slot , buf ));
247251
@@ -1081,7 +1085,7 @@ static void hisi_sas_port_notify_formed(struct asd_sas_phy *sas_phy)
10811085}
10821086
10831087static void hisi_sas_do_release_task (struct hisi_hba * hisi_hba , struct sas_task * task ,
1084- struct hisi_sas_slot * slot )
1088+ struct hisi_sas_slot * slot , bool need_lock )
10851089{
10861090 if (task ) {
10871091 unsigned long flags ;
@@ -1098,7 +1102,7 @@ static void hisi_sas_do_release_task(struct hisi_hba *hisi_hba, struct sas_task
10981102 spin_unlock_irqrestore (& task -> task_state_lock , flags );
10991103 }
11001104
1101- hisi_sas_slot_task_free (hisi_hba , task , slot );
1105+ hisi_sas_slot_task_free (hisi_hba , task , slot , need_lock );
11021106}
11031107
11041108static void hisi_sas_release_task (struct hisi_hba * hisi_hba ,
@@ -1107,8 +1111,11 @@ static void hisi_sas_release_task(struct hisi_hba *hisi_hba,
11071111 struct hisi_sas_slot * slot , * slot2 ;
11081112 struct hisi_sas_device * sas_dev = device -> lldd_dev ;
11091113
1114+ spin_lock (& sas_dev -> lock );
11101115 list_for_each_entry_safe (slot , slot2 , & sas_dev -> list , entry )
1111- hisi_sas_do_release_task (hisi_hba , slot -> task , slot );
1116+ hisi_sas_do_release_task (hisi_hba , slot -> task , slot , false);
1117+
1118+ spin_unlock (& sas_dev -> lock );
11121119}
11131120
11141121void hisi_sas_release_tasks (struct hisi_hba * hisi_hba )
@@ -1634,7 +1641,7 @@ static int hisi_sas_abort_task(struct sas_task *task)
16341641 */
16351642 if (rc == TMF_RESP_FUNC_COMPLETE && rc2 != TMF_RESP_FUNC_SUCC ) {
16361643 if (task -> lldd_task )
1637- hisi_sas_do_release_task (hisi_hba , task , slot );
1644+ hisi_sas_do_release_task (hisi_hba , task , slot , true );
16381645 }
16391646 } else if (task -> task_proto & SAS_PROTOCOL_SATA ||
16401647 task -> task_proto & SAS_PROTOCOL_STP ) {
@@ -1654,7 +1661,7 @@ static int hisi_sas_abort_task(struct sas_task *task)
16541661 */
16551662 if ((sas_dev -> dev_status == HISI_SAS_DEV_NCQ_ERR ) &&
16561663 qc && qc -> scsicmd ) {
1657- hisi_sas_do_release_task (hisi_hba , task , slot );
1664+ hisi_sas_do_release_task (hisi_hba , task , slot , true );
16581665 rc = TMF_RESP_FUNC_COMPLETE ;
16591666 } else {
16601667 rc = hisi_sas_softreset_ata_disk (device );
0 commit comments