Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

scsi: pm8001: Fix tag leaks on error

In pm8001_chip_set_dev_state_req(), pm8001_chip_fw_flash_update_req(),
pm80xx_chip_phy_ctl_req() and pm8001_chip_reg_dev_req() add missing calls
to pm8001_tag_free() to free the allocated tag when pm8001_mpi_build_cmd()
fails.

Similarly, in pm8001_exec_internal_task_abort(), if the chip ->task_abort
method fails, the tag allocated for the abort request task must be
freed. Add the missing call to pm8001_tag_free().

Link: https://lore.kernel.org/r/20220220031810.738362-22-damien.lemoal@opensource.wdc.com
Reviewed-by: John Garry <john.garry@huawei.com>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Damien Le Moal and committed by
Martin K. Petersen
4c8f04b1 f90a7489

+17 -3
+9
drivers/scsi/pm8001/pm8001_hwi.c
··· 4458 4458 SAS_ADDR_SIZE); 4459 4459 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 4460 4460 sizeof(payload), 0); 4461 + if (rc) 4462 + pm8001_tag_free(pm8001_ha, tag); 4463 + 4461 4464 return rc; 4462 4465 } 4463 4466 ··· 4873 4870 ccb->ccb_tag = tag; 4874 4871 rc = pm8001_chip_fw_flash_update_build(pm8001_ha, &flash_update_info, 4875 4872 tag); 4873 + if (rc) 4874 + pm8001_tag_free(pm8001_ha, tag); 4875 + 4876 4876 return rc; 4877 4877 } 4878 4878 ··· 4980 4974 payload.nds = cpu_to_le32(state); 4981 4975 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 4982 4976 sizeof(payload), 0); 4977 + if (rc) 4978 + pm8001_tag_free(pm8001_ha, tag); 4979 + 4983 4980 return rc; 4984 4981 4985 4982 }
+1 -1
drivers/scsi/pm8001/pm8001_sas.c
··· 738 738 739 739 res = PM8001_CHIP_DISP->task_abort(pm8001_ha, 740 740 pm8001_dev, flag, task_tag, ccb_tag); 741 - 742 741 if (res) { 743 742 del_timer(&task->slow_task->timer); 744 743 pm8001_dbg(pm8001_ha, FAIL, "Executing internal task failed\n"); 744 + pm8001_tag_free(pm8001_ha, ccb_tag); 745 745 goto ex_err; 746 746 } 747 747 wait_for_completion(&task->slow_task->completion);
+7 -2
drivers/scsi/pm8001/pm80xx_hwi.c
··· 4915 4915 payload.tag = cpu_to_le32(tag); 4916 4916 payload.phyop_phyid = 4917 4917 cpu_to_le32(((phy_op & 0xFF) << 8) | (phyId & 0xFF)); 4918 - return pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 4919 - sizeof(payload), 0); 4918 + 4919 + rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 4920 + sizeof(payload), 0); 4921 + if (rc) 4922 + pm8001_tag_free(pm8001_ha, tag); 4923 + 4924 + return rc; 4920 4925 } 4921 4926 4922 4927 static u32 pm80xx_chip_is_our_interrupt(struct pm8001_hba_info *pm8001_ha)