Hi Andy, Apologies for the delayed response on this. Comments below. On Fri, 2015-05-22 at 14:07 -0700, Andy Grover wrote: > See https://bugzilla.redhat.com/show_bug.cgi?id=1025672 > > We need to put() the reference to the scsi host that we got in > pscsi_configure_device(). In VIRTUAL_HOST mode it is associated with > the dev_virt, not the hba_virt. > > Signed-off-by: Andy Grover <agrover@xxxxxxxxxx> > --- > drivers/target/target_core_pscsi.c | 3 +++ > drivers/target/target_core_pscsi.h | 1 + > 2 files changed, 4 insertions(+) > > diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c > index 5bc458e..7ce0445 100644 > --- a/drivers/target/target_core_pscsi.c > +++ b/drivers/target/target_core_pscsi.c > @@ -519,6 +519,7 @@ static int pscsi_configure_device(struct se_device *dev) > " pdv_host_id: %d\n", pdv->pdv_host_id); > return -EINVAL; > } > + pdv->pdv_lld_host = sh; > } > } else { > if (phv->phv_mode == PHV_VIRTUAL_HOST_ID) { > @@ -601,6 +602,8 @@ static void pscsi_free_device(struct se_device *dev) > if ((phv->phv_mode == PHV_LLD_SCSI_HOST_NO) && > (phv->phv_lld_host != NULL)) > scsi_host_put(phv->phv_lld_host); > + else if (pdv->pdv_lld_host) > + scsi_host_put(pdv->pdv_lld_host); > > if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM)) > scsi_device_put(sd); > diff --git a/drivers/target/target_core_pscsi.h b/drivers/target/target_core_pscsi.h > index 1bd757d..820d305 100644 > --- a/drivers/target/target_core_pscsi.h > +++ b/drivers/target/target_core_pscsi.h > @@ -45,6 +45,7 @@ struct pscsi_dev_virt { > int pdv_lun_id; > struct block_device *pdv_bd; > struct scsi_device *pdv_sd; > + struct Scsi_Host *pdv_lld_host; > } ____cacheline_aligned; > > typedef enum phv_modes { Nice catch on this long-standing bug. Applied to target-pending/master, with a CC' to stable. Thank you, --nab -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html