|
@@ -880,21 +880,26 @@ static struct device_type mci_attr_type = {
|
|
|
int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
|
|
|
const struct attribute_group **groups)
|
|
|
{
|
|
|
+ char *name;
|
|
|
int i, err;
|
|
|
|
|
|
/*
|
|
|
* The memory controller needs its own bus, in order to avoid
|
|
|
* namespace conflicts at /sys/bus/edac.
|
|
|
*/
|
|
|
- mci->bus->name = kasprintf(GFP_KERNEL, "mc%d", mci->mc_idx);
|
|
|
- if (!mci->bus->name)
|
|
|
+ name = kasprintf(GFP_KERNEL, "mc%d", mci->mc_idx);
|
|
|
+ if (!name)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ mci->bus->name = name;
|
|
|
+
|
|
|
edac_dbg(0, "creating bus %s\n", mci->bus->name);
|
|
|
|
|
|
err = bus_register(mci->bus);
|
|
|
- if (err < 0)
|
|
|
- goto fail_free_name;
|
|
|
+ if (err < 0) {
|
|
|
+ kfree(name);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
|
|
|
/* get the /sys/devices/system/edac subsys reference */
|
|
|
mci->dev.type = &mci_attr_type;
|
|
@@ -961,8 +966,8 @@ fail_unregister_dimm:
|
|
|
device_unregister(&mci->dev);
|
|
|
fail_unregister_bus:
|
|
|
bus_unregister(mci->bus);
|
|
|
-fail_free_name:
|
|
|
- kfree(mci->bus->name);
|
|
|
+ kfree(name);
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -993,10 +998,12 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
|
|
|
|
|
|
void edac_unregister_sysfs(struct mem_ctl_info *mci)
|
|
|
{
|
|
|
+ const char *name = mci->bus->name;
|
|
|
+
|
|
|
edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev));
|
|
|
device_unregister(&mci->dev);
|
|
|
bus_unregister(mci->bus);
|
|
|
- kfree(mci->bus->name);
|
|
|
+ kfree(name);
|
|
|
}
|
|
|
|
|
|
static void mc_attr_release(struct device *dev)
|