mirror of https://gitee.com/openkylin/linux.git
PCI: endpoint: Fix NULL pointer dereference error when CONFIGFS is disabled
commitef1433f717
("PCI: endpoint: Create configfs entry for each pci_epf_device_id table entry") while adding configfs entry for each pci_epf_device_id table entry introduced a NULL pointer dereference error when CONFIG_PCI_ENDPOINT_CONFIGFS is not enabled. Fix it here. Fixes:ef1433f717
("PCI: endpoint: Create configfs entry for each pci_epf_device_id table entry") Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> [lorenzo.pieralisi: updated commit log] Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
35a88a18d7
commit
a83a217344
|
@ -137,6 +137,20 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(pci_epf_alloc_space);
|
||||
|
||||
static void pci_epf_remove_cfs(struct pci_epf_driver *driver)
|
||||
{
|
||||
struct config_group *group, *tmp;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PCI_ENDPOINT_CONFIGFS))
|
||||
return;
|
||||
|
||||
mutex_lock(&pci_epf_mutex);
|
||||
list_for_each_entry_safe(group, tmp, &driver->epf_group, group_entry)
|
||||
pci_ep_cfs_remove_epf_group(group);
|
||||
list_del(&driver->epf_group);
|
||||
mutex_unlock(&pci_epf_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_epf_unregister_driver() - unregister the PCI EPF driver
|
||||
* @driver: the PCI EPF driver that has to be unregistered
|
||||
|
@ -145,17 +159,38 @@ EXPORT_SYMBOL_GPL(pci_epf_alloc_space);
|
|||
*/
|
||||
void pci_epf_unregister_driver(struct pci_epf_driver *driver)
|
||||
{
|
||||
struct config_group *group, *tmp;
|
||||
|
||||
mutex_lock(&pci_epf_mutex);
|
||||
list_for_each_entry_safe(group, tmp, &driver->epf_group, group_entry)
|
||||
pci_ep_cfs_remove_epf_group(group);
|
||||
list_del(&driver->epf_group);
|
||||
mutex_unlock(&pci_epf_mutex);
|
||||
pci_epf_remove_cfs(driver);
|
||||
driver_unregister(&driver->driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_epf_unregister_driver);
|
||||
|
||||
static int pci_epf_add_cfs(struct pci_epf_driver *driver)
|
||||
{
|
||||
struct config_group *group;
|
||||
const struct pci_epf_device_id *id;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PCI_ENDPOINT_CONFIGFS))
|
||||
return 0;
|
||||
|
||||
INIT_LIST_HEAD(&driver->epf_group);
|
||||
|
||||
id = driver->id_table;
|
||||
while (id->name[0]) {
|
||||
group = pci_ep_cfs_add_epf_group(id->name);
|
||||
if (IS_ERR(group)) {
|
||||
pci_epf_remove_cfs(driver);
|
||||
return PTR_ERR(group);
|
||||
}
|
||||
|
||||
mutex_lock(&pci_epf_mutex);
|
||||
list_add_tail(&group->group_entry, &driver->epf_group);
|
||||
mutex_unlock(&pci_epf_mutex);
|
||||
id++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* __pci_epf_register_driver() - register a new PCI EPF driver
|
||||
* @driver: structure representing PCI EPF driver
|
||||
|
@ -167,8 +202,6 @@ int __pci_epf_register_driver(struct pci_epf_driver *driver,
|
|||
struct module *owner)
|
||||
{
|
||||
int ret;
|
||||
struct config_group *group;
|
||||
const struct pci_epf_device_id *id;
|
||||
|
||||
if (!driver->ops)
|
||||
return -EINVAL;
|
||||
|
@ -183,16 +216,7 @@ int __pci_epf_register_driver(struct pci_epf_driver *driver,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
INIT_LIST_HEAD(&driver->epf_group);
|
||||
|
||||
id = driver->id_table;
|
||||
while (id->name[0]) {
|
||||
group = pci_ep_cfs_add_epf_group(id->name);
|
||||
mutex_lock(&pci_epf_mutex);
|
||||
list_add_tail(&group->group_entry, &driver->epf_group);
|
||||
mutex_unlock(&pci_epf_mutex);
|
||||
id++;
|
||||
}
|
||||
pci_epf_add_cfs(driver);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue