[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: Jack Wang <jack_wang@usish.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Родитель
735f7d2fed
Коммит
756f173fb5
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include <scsi/scsi_transport.h>
|
||||
#include <scsi/scsi_transport_sas.h>
|
||||
#include <scsi/sas_ata.h>
|
||||
#include "../scsi_sas_internal.h"
|
||||
|
||||
/* ---------- Basic task processing for discovery purposes ---------- */
|
||||
|
@ -231,6 +232,11 @@ void sas_free_device(struct kref *kref)
|
|||
if (dev->dev_type == EDGE_DEV || dev->dev_type == FANOUT_DEV)
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,8 @@
|
|||
|
||||
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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче