DF-3678 / fix.diff
--- a/sys/dev/disk/mpt/mpt_cam.c +++ b/sys/dev/disk/mpt/mpt_cam.c @@ -1198,6 +1198,16 @@ mpt_cam_detach(struct mpt_softc *mpt) if (mpt->sas_portinfo != NULL) { + if (mpt->sas_portinfo->phy_info != NULL) { + kfree(mpt->sas_portinfo->phy_info, M_DEVBUF); + mpt->sas_portinfo->phy_info = NULL; + } kfree(mpt->sas_portinfo, M_DEVBUF); mpt->sas_portinfo = NULL; } + if (mpt->tgt_cmd_ptrs != NULL) { + kfree(mpt->tgt_cmd_ptrs, M_DEVBUF); + mpt->tgt_cmd_ptrs = NULL; + mpt->tgt_cmds_allocated = 0; + } + if (mpt->els_cmd_ptrs != NULL) { + kfree(mpt->els_cmd_ptrs, M_DEVBUF); + mpt->els_cmd_ptrs = NULL; + mpt->els_cmds_allocated = 0; + } if (mpt->sim != NULL) { @@ -762,7 +772,11 @@ mpt_read_config_info_sas(struct mpt_softc *mpt) error = mptsas_sas_io_unit_pg0(mpt, portinfo); if (error) { + if (portinfo->phy_info != NULL) { + kfree(portinfo->phy_info, M_DEVBUF); + portinfo->phy_info = NULL; + } kfree(portinfo, M_DEVBUF); return (0); } |