edac: fix device removal on a few drivers The removal logic was broken by the patch that added support for struct device. Fix it. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 99f4c32..9851a1a 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c
@@ -2452,6 +2452,14 @@ return 0; } +static void del_mc_sysfs_attrs(struct mem_ctl_info *mci) +{ + amd64_remove_sysfs_dbg_files(mci); + + if (boot_cpu_data.x86 >= 0x10) + amd64_remove_sysfs_inject_files(mci); +} + static void setup_mci_misc_attrs(struct mem_ctl_info *mci, struct amd64_family_type *fam) { @@ -2669,6 +2677,8 @@ struct pci_dev *F3 = node_to_amd_nb(nid)->misc; struct ecc_settings *s = ecc_stngs[nid]; + mci = find_mci_by_dev(&pdev->dev); + del_mc_sysfs_attrs(mci); /* Remove from EDAC CORE tracking list */ mci = edac_mc_del_mc(&pdev->dev); if (!mci)
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index df902ff..628c2d9 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h
@@ -414,20 +414,30 @@ #ifdef CONFIG_EDAC_DEBUG int amd64_create_sysfs_dbg_files(struct mem_ctl_info *mci); +void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci); + #else static int amd64_create_sysfs_dbg_files(struct mem_ctl_info *mci) { return 0; } +void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci) +{ +} #endif #ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION int amd64_create_sysfs_inject_files(struct mem_ctl_info *mci); +void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci); + #else static int amd64_create_sysfs_inject_files(struct mem_ctl_info *mci) { return 0; } +static void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci) +{ +} #endif /*
diff --git a/drivers/edac/amd64_edac_dbg.c b/drivers/edac/amd64_edac_dbg.c index a7cd553..2c1bbf7 100644 --- a/drivers/edac/amd64_edac_dbg.c +++ b/drivers/edac/amd64_edac_dbg.c
@@ -62,3 +62,12 @@ return 0; } + +void amd64_remove_sysfs_dbg_files(struct mem_ctl_info *mci) +{ + device_remove_file(&mci->dev, &dev_attr_dhar); + device_remove_file(&mci->dev, &dev_attr_dbam); + device_remove_file(&mci->dev, &dev_attr_topmem); + device_remove_file(&mci->dev, &dev_attr_topmem2); + device_remove_file(&mci->dev, &dev_attr_dram_hole); +}
diff --git a/drivers/edac/amd64_edac_inj.c b/drivers/edac/amd64_edac_inj.c index 1129e7a..ef1ff4e 100644 --- a/drivers/edac/amd64_edac_inj.c +++ b/drivers/edac/amd64_edac_inj.c
@@ -222,3 +222,12 @@ return 0; } + +void amd64_remove_sysfs_inject_files(struct mem_ctl_info *mci) +{ + device_remove_file(&mci->dev, &dev_attr_inject_section); + device_remove_file(&mci->dev, &dev_attr_inject_word); + device_remove_file(&mci->dev, &dev_attr_inject_ecc_vector); + device_remove_file(&mci->dev, &dev_attr_inject_write); + device_remove_file(&mci->dev, &dev_attr_inject_read); +}
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index 8e10e8e..4ab2e19 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c
@@ -1029,15 +1029,14 @@ void edac_unregister_sysfs(struct mem_ctl_info *mci) { - debugf1("Unregistering device %s\n", __func__, - dev_name(&mci->dev)); + debugf1("Unregistering device %s\n", dev_name(&mci->dev)); put_device(&mci->dev); device_del(&mci->dev); } static void mc_attr_release(struct device *device) { - debugf1("Releasing device %s\n", __func__, dev_name(device)); + debugf1("Releasing device %s\n", dev_name(device)); } static struct device_type mc_attr_type = {
diff --git a/drivers/edac/edac_stub.c b/drivers/edac/edac_stub.c index 4dea0af..670c448 100644 --- a/drivers/edac/edac_stub.c +++ b/drivers/edac/edac_stub.c
@@ -65,7 +65,6 @@ { int err = 0; - if (atomic_read(&edac_subsys_valid)) goto out; @@ -78,20 +77,14 @@ out: atomic_inc(&edac_subsys_valid); - -printk("%s() edac instance %d\n", - __func__, atomic_read(&edac_subsys_valid)); - return &edac_subsys; } EXPORT_SYMBOL_GPL(edac_get_sysfs_subsys); void edac_put_sysfs_subsys(void) { - /* last user unregisters it */ + /* last user unregisters it */ if (atomic_dec_and_test(&edac_subsys_valid)) bus_unregister(&edac_subsys); -printk("%s() edac instance %d\n", - __func__, atomic_read(&edac_subsys_valid)); } EXPORT_SYMBOL_GPL(edac_put_sysfs_subsys);
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 11253ef..9fd8ff5 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c
@@ -1101,7 +1101,7 @@ static void addrmatch_release(struct device *device) { - debugf1("Releasing device %s\n", __func__, dev_name(device)); + debugf1("Releasing device %s\n", dev_name(device)); } static struct device_type addrmatch_type = { @@ -1131,7 +1131,7 @@ static void all_channel_counts_release(struct device *device) { - debugf1("Releasing device %s\n", __func__, dev_name(device)); + debugf1("Releasing device %s\n", dev_name(device)); } static struct device_type all_channel_counts_type = {
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 69ddefe..bf0d73a 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c
@@ -149,6 +149,12 @@ return 0; } +static void mpc85xx_remove_sysfs_attributes(struct mem_ctl_info *mci) +{ + device_remove_file(&mci->dev, &dev_attr_inject_data_hi); + device_remove_file(&mci->dev, &dev_attr_inject_data_lo); + device_remove_file(&mci->dev, &dev_attr_inject_ctrl); +} /**************************** PCI Err device ***************************/ #ifdef CONFIG_PCI @@ -1127,6 +1133,7 @@ orig_ddr_err_disable); out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, orig_ddr_err_sbe); + mpc85xx_remove_sysfs_attributes(mci); edac_mc_del_mc(&op->dev); edac_mc_free(mci); return 0;