diff options
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r-- | drivers/base/core.c | 18 |
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); |
1909 | parent_error: | ||
1905 | put_device(parent); | 1910 | put_device(parent); |
1906 | name_error: | 1911 | name_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 | ||
2429 | static struct device * | 2434 | static __printf(6, 0) struct device * |
2430 | device_create_groups_vargs(struct class *class, struct device *parent, | 2435 | device_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 | */ |
2710 | int device_move(struct device *dev, struct device *new_parent, | 2715 | int 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>"); |