diff options
author | Andy Grover <agrover@redhat.com> | 2015-05-22 14:07:44 -0700 |
---|---|---|
committer | Sasha Levin <sasha.levin@oracle.com> | 2015-06-10 13:42:15 -0400 |
commit | e0bc573f09efd4c681e94d3260722646934b9051 (patch) | |
tree | ccfc597462d2d7ed35e6025b675d91eec6591b1f /drivers/target | |
parent | 4d0b92162bd496128f027934010e27012fe0d5d0 (diff) | |
download | linux-stable-e0bc573f09efd4c681e94d3260722646934b9051.tar.gz linux-stable-e0bc573f09efd4c681e94d3260722646934b9051.tar.bz2 linux-stable-e0bc573f09efd4c681e94d3260722646934b9051.zip |
target/pscsi: Don't leak scsi_host if hba is VIRTUAL_HOST
[ Upstream commit 5a7125c64def3b21f8147eca8b54949a60963942 ]
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@redhat.com>
Cc: stable@vger.kernel.org # 2.6.38+
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/target_core_pscsi.c | 3 | ||||
-rw-r--r-- | drivers/target/target_core_pscsi.h | 1 |
2 files changed, 4 insertions, 0 deletions
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 9a54381e23c6..3ee77db03cb7 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -520,6 +520,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) { @@ -602,6 +603,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 1bd757dff8ee..820d3052b775 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 { |