Always use put_device() after device_add() failed.

Signed-off-by: Robert Richter <[email protected]>
---
 drivers/edac/edac_mc_sysfs.c | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 464174685589..dbef699162a8 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -404,6 +404,8 @@ static inline int nr_pages_per_csrow(struct csrow_info 
*csrow)
 static int edac_create_csrow_object(struct mem_ctl_info *mci,
                                    struct csrow_info *csrow, int index)
 {
+       int err;
+
        csrow->dev.type = &csrow_attr_type;
        csrow->dev.groups = csrow_dev_groups;
        device_initialize(&csrow->dev);
@@ -415,7 +417,11 @@ static int edac_create_csrow_object(struct mem_ctl_info 
*mci,
        edac_dbg(0, "creating (virtual) csrow node %s\n",
                 dev_name(&csrow->dev));
 
-       return device_add(&csrow->dev);
+       err = device_add(&csrow->dev);
+       if (err)
+               put_device(&csrow->dev);
+
+       return err;
 }
 
 /* Create a CSROW object under specifed edac_mc_device */
@@ -646,8 +652,11 @@ static int edac_create_dimm_object(struct mem_ctl_info 
*mci,
        pm_runtime_forbid(&mci->dev);
 
        err =  device_add(&dimm->dev);
-
-       edac_dbg(0, "creating rank/dimm device %s\n", dev_name(&dimm->dev));
+       if (err)
+               put_device(&dimm->dev);
+       else
+               edac_dbg(0, "creating rank/dimm device %s\n",
+                       dev_name(&dimm->dev));
 
        return err;
 }
@@ -927,8 +936,9 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
        edac_dbg(0, "creating device %s\n", dev_name(&mci->dev));
        err = device_add(&mci->dev);
        if (err < 0) {
+               put_device(&mci->dev);
                edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev));
-               goto out;
+               return err;
        }
 
        /*
@@ -977,7 +987,6 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci,
        }
        device_unregister(&mci->dev);
 
-out:
        return err;
 }
 
@@ -1034,10 +1043,8 @@ int __init edac_mc_sysfs_init(void)
        int err;
 
        mci_pdev = kzalloc(sizeof(*mci_pdev), GFP_KERNEL);
-       if (!mci_pdev) {
-               err = -ENOMEM;
-               goto out;
-       }
+       if (!mci_pdev)
+               return -ENOMEM;
 
        mci_pdev->bus = edac_get_sysfs_subsys();
        mci_pdev->type = &mc_attr_type;
@@ -1046,15 +1053,10 @@ int __init edac_mc_sysfs_init(void)
 
        err = device_add(mci_pdev);
        if (err < 0)
-               goto out_put_device;
-
-       edac_dbg(0, "device %s created\n", dev_name(mci_pdev));
-
-       return 0;
+               put_device(mci_pdev);
+       else
+               edac_dbg(0, "device %s created\n", dev_name(mci_pdev));
 
- out_put_device:
-       put_device(mci_pdev);
- out:
        return err;
 }
 
-- 
2.20.1

Reply via email to