aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r--drivers/base/core.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c
index ad7b50897bcc..36622b52e419 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1487,7 +1487,7 @@ class_dir_create_and_add(struct class *class, struct kobject *parent_kobj)
1487 1487
1488 dir = kzalloc(sizeof(*dir), GFP_KERNEL); 1488 dir = kzalloc(sizeof(*dir), GFP_KERNEL);
1489 if (!dir) 1489 if (!dir)
1490 return NULL; 1490 return ERR_PTR(-ENOMEM);
1491 1491
1492 dir->class = class; 1492 dir->class = class;
1493 kobject_init(&dir->kobj, &class_dir_ktype); 1493 kobject_init(&dir->kobj, &class_dir_ktype);
@@ -1497,7 +1497,7 @@ class_dir_create_and_add(struct class *class, struct kobject *parent_kobj)
1497 retval = kobject_add(&dir->kobj, parent_kobj, "%s", class->name); 1497 retval = kobject_add(&dir->kobj, parent_kobj, "%s", class->name);
1498 if (retval < 0) { 1498 if (retval < 0) {
1499 kobject_put(&dir->kobj); 1499 kobject_put(&dir->kobj);
1500 return NULL; 1500 return ERR_PTR(retval);
1501 } 1501 }
1502 return &dir->kobj; 1502 return &dir->kobj;
1503} 1503}
@@ -1804,6 +1804,10 @@ int device_add(struct device *dev)
1804 1804
1805 parent = get_device(dev->parent); 1805 parent = get_device(dev->parent);
1806 kobj = get_device_parent(dev, parent); 1806 kobj = get_device_parent(dev, parent);
1807 if (IS_ERR(kobj)) {
1808 error = PTR_ERR(kobj);
1809 goto parent_error;
1810 }
1807 if (kobj) 1811 if (kobj)
1808 dev->kobj.parent = kobj; 1812 dev->kobj.parent = kobj;
1809 1813
@@ -1902,6 +1906,7 @@ done:
1902 kobject_del(&dev->kobj); 1906 kobject_del(&dev->kobj);
1903 Error: 1907 Error:
1904 cleanup_glue_dir(dev, glue_dir); 1908 cleanup_glue_dir(dev, glue_dir);
1909parent_error:
1905 put_device(parent); 1910 put_device(parent);
1906name_error: 1911name_error:
1907 kfree(dev->p); 1912 kfree(dev->p);
@@ -2426,7 +2431,7 @@ static void device_create_release(struct device *dev)
2426 kfree(dev); 2431 kfree(dev);
2427} 2432}
2428 2433
2429static struct device * 2434static __printf(6, 0) struct device *
2430device_create_groups_vargs(struct class *class, struct device *parent, 2435device_create_groups_vargs(struct class *class, struct device *parent,
2431 dev_t devt, void *drvdata, 2436 dev_t devt, void *drvdata,
2432 const struct attribute_group **groups, 2437 const struct attribute_group **groups,
@@ -2704,7 +2709,7 @@ static int device_move_class_links(struct device *dev,
2704/** 2709/**
2705 * device_move - moves a device to a new parent 2710 * device_move - moves a device to a new parent
2706 * @dev: the pointer to the struct device to be moved 2711 * @dev: the pointer to the struct device to be moved
2707 * @new_parent: the new parent of the device (can by NULL) 2712 * @new_parent: the new parent of the device (can be NULL)
2708 * @dpm_order: how to reorder the dpm_list 2713 * @dpm_order: how to reorder the dpm_list
2709 */ 2714 */
2710int device_move(struct device *dev, struct device *new_parent, 2715int device_move(struct device *dev, struct device *new_parent,
@@ -2721,6 +2726,11 @@ int device_move(struct device *dev, struct device *new_parent,
2721 device_pm_lock(); 2726 device_pm_lock();
2722 new_parent = get_device(new_parent); 2727 new_parent = get_device(new_parent);
2723 new_parent_kobj = get_device_parent(dev, new_parent); 2728 new_parent_kobj = get_device_parent(dev, new_parent);
2729 if (IS_ERR(new_parent_kobj)) {
2730 error = PTR_ERR(new_parent_kobj);
2731 put_device(new_parent);
2732 goto out;
2733 }
2724 2734
2725 pr_debug("device: '%s': %s: moving to '%s'\n", dev_name(dev), 2735 pr_debug("device: '%s': %s: moving to '%s'\n", dev_name(dev),
2726 __func__, new_parent ? dev_name(new_parent) : "<NULL>"); 2736 __func__, new_parent ? dev_name(new_parent) : "<NULL>");