@@ -60,7 +60,7 @@ static inline char pin_name(int pin)
static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(struct pci_dev *dev,
int pin)
{
- struct acpi_prt_entry *entry;
+ struct acpi_prt_entry *entry, *entry_copy;
int segment = pci_domain_nr(dev->bus);
int bus = dev->bus->number;
int device = PCI_SLOT(dev->devfn);
@@ -72,7 +72,11 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(struct pci_dev *dev,
&& (device == entry->id.device)
&& (pin == entry->pin)) {
spin_unlock(&acpi_prt_lock);
- return entry;
+ entry_copy = kzalloc(sizeof(struct acpi_prt_entry), GFP_KERNEL);
+ if (!entry_copy)
+ return NULL;
+ memcpy(entry_copy, entry, sizeof(struct acpi_prt_entry));
+ return entry_copy;
}
}
spin_unlock(&acpi_prt_lock);
@@ -384,6 +388,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
&link);
else
gsi = entry->index;
+ kfree(entry);
} else
gsi = -1;
@@ -453,6 +458,8 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
else
gsi = entry->index;
+ if (entry)
+ kfree(entry);
/*
* TBD: It might be worth clearing dev->irq by magic constant
* (e.g. PCI_UNDEFINED_IRQ).