diff options
| author | David Herrmann <dh.herrmann@gmail.com> | 2013-11-21 14:15:48 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-12-08 21:25:10 -0500 |
| commit | bbc780f8bab52fef1784151d3c4982cb1143edd2 (patch) | |
| tree | 01585734243405412fbfb466e0eb6919437c4746 /drivers/base | |
| parent | d0f80f9aadf60adc4caafed0d2b01e79a315ff80 (diff) | |
driver core: fix device_create() error path
We call put_device() in the error path, which is fine for dev==NULL.
However, in case kobject_set_name_vargs() fails, we have dev!=NULL but
device_initialized() wasn't called, yet.
Fix this by splitting device_register() into explicit calls to
device_add() and an early call to device_initialize().
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/core.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index 67b180d855b2..aab43fbb8336 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -1603,6 +1603,7 @@ device_create_groups_vargs(struct class *class, struct device *parent, | |||
| 1603 | goto error; | 1603 | goto error; |
| 1604 | } | 1604 | } |
| 1605 | 1605 | ||
| 1606 | device_initialize(dev); | ||
| 1606 | dev->devt = devt; | 1607 | dev->devt = devt; |
| 1607 | dev->class = class; | 1608 | dev->class = class; |
| 1608 | dev->parent = parent; | 1609 | dev->parent = parent; |
| @@ -1614,7 +1615,7 @@ device_create_groups_vargs(struct class *class, struct device *parent, | |||
| 1614 | if (retval) | 1615 | if (retval) |
| 1615 | goto error; | 1616 | goto error; |
| 1616 | 1617 | ||
| 1617 | retval = device_register(dev); | 1618 | retval = device_add(dev); |
| 1618 | if (retval) | 1619 | if (retval) |
| 1619 | goto error; | 1620 | goto error; |
| 1620 | 1621 | ||
