Commit 756f173f authored by Dan Williams's avatar Dan Williams Committed by James Bottomley

[SCSI] libsas: fix leak of dev->sata_dev.identify_[packet_]device

These are never freed in the nominal path.  A domain_device has a
different lifetime than a sas_rphy we need a dev->rphy independent way
of identifying sata devices.
Reviewed-by: default avatarJack Wang <jack_wang@usish.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 735f7d2f
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <scsi/scsi_transport.h> #include <scsi/scsi_transport.h>
#include <scsi/scsi_transport_sas.h> #include <scsi/scsi_transport_sas.h>
#include <scsi/sas_ata.h>
#include "../scsi_sas_internal.h" #include "../scsi_sas_internal.h"
/* ---------- Basic task processing for discovery purposes ---------- */ /* ---------- Basic task processing for discovery purposes ---------- */
...@@ -231,6 +232,11 @@ void sas_free_device(struct kref *kref) ...@@ -231,6 +232,11 @@ void sas_free_device(struct kref *kref)
if (dev->dev_type == EDGE_DEV || dev->dev_type == FANOUT_DEV) if (dev->dev_type == EDGE_DEV || dev->dev_type == FANOUT_DEV)
kfree(dev->ex_dev.ex_phy); kfree(dev->ex_dev.ex_phy);
if (dev_is_sata(dev)) {
kfree(dev->sata_dev.identify_device);
kfree(dev->sata_dev.identify_packet_device);
}
kfree(dev); kfree(dev);
} }
......
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
static inline int dev_is_sata(struct domain_device *dev) static inline int dev_is_sata(struct domain_device *dev)
{ {
return (dev->rphy->identify.target_port_protocols & SAS_PROTOCOL_SATA); return dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM ||
dev->dev_type == SATA_PM_PORT;
} }
int sas_ata_init_host_and_port(struct domain_device *found_dev, int sas_ata_init_host_and_port(struct domain_device *found_dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment