forked from Minki/linux
libata: fix probe_ent alloc/free bugs
ata_probe_ent_alloc() had a temporary hack such that devm_kzalloc() was used for allocation if devres had been previously initialized on the device; otherwise, plain kzalloc() was used. This was to make the code useable from both the old and devres-aware libata drivers during transition. This hack made ata_sas_port_alloc() unable to determine how the probe_ent is allocated, causing double free in some cases. Remove the now-unneeded hack and make ata_sas_port_alloc() use devm_kfree(). Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: James Bottomley <James.Bottomley@SteelEye.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
8d9db2d2fb
commit
4d05447ec7
@ -5948,11 +5948,7 @@ ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port)
|
|||||||
{
|
{
|
||||||
struct ata_probe_ent *probe_ent;
|
struct ata_probe_ent *probe_ent;
|
||||||
|
|
||||||
/* XXX - the following if can go away once all LLDs are managed */
|
probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
|
||||||
if (!list_empty(&dev->devres_head))
|
|
||||||
probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
|
|
||||||
else
|
|
||||||
probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
|
|
||||||
if (!probe_ent) {
|
if (!probe_ent) {
|
||||||
printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
|
printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
|
||||||
kobject_name(&(dev->kobj)));
|
kobject_name(&(dev->kobj)));
|
||||||
|
@ -3235,7 +3235,7 @@ struct ata_port *ata_sas_port_alloc(struct ata_host *host,
|
|||||||
|
|
||||||
ata_port_init(ap, host, ent, 0);
|
ata_port_init(ap, host, ent, 0);
|
||||||
ap->lock = shost->host_lock;
|
ap->lock = shost->host_lock;
|
||||||
kfree(ent);
|
devm_kfree(host->dev, ent);
|
||||||
return ap;
|
return ap;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
|
EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
|
||||||
|
Loading…
Reference in New Issue
Block a user