public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [Patch 1/2] Driver core: Clarify device cleanup.
       [not found] <20080903162808.36bb2405@gondolin.boeblingen.de.ibm.com>
@ 2008-09-03 16:26 ` Cornelia Huck
  2008-09-03 16:26 ` [Patch 2/2] Driver core: Fix cleanup in device_create_vargs() Cornelia Huck
  1 sibling, 0 replies; 3+ messages in thread
From: Cornelia Huck @ 2008-09-03 16:26 UTC (permalink / raw)
  To: Greg K-H; +Cc: linux-kernel

Make the comments on how to use device_initialize(), device_add()
and device_register() a bit clearer - in particular, explicitly
note that put_device() must be used once we tried to add the device
to the hierarchy.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>

---
 drivers/base/core.c |   23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

Index: linux-2.6/drivers/base/core.c
===================================================================
--- linux-2.6.orig/drivers/base/core.c
+++ linux-2.6/drivers/base/core.c
@@ -524,11 +524,16 @@ static void klist_children_put(struct kl
  * device_initialize - init device structure.
  * @dev: device.
  *
- * This prepares the device for use by other layers,
- * including adding it to the device hierarchy.
+ * This prepares the device for use by other layers by initializing
+ * its fields.
  * It is the first half of device_register(), if called by
- * that, though it can also be called separately, so one
- * may use @dev's fields (e.g. the refcount).
+ * that function, though it can also be called separately, so one
+ * may use @dev's fields. In particular, get_device()/put_device()
+ * may be used for reference counting of @dev after calling this
+ * function.
+ *
+ * NOTE: Use put_device() to give up your reference instead of freeing
+ * @dev directly once you have called this function.
  */
 void device_initialize(struct device *dev)
 {
@@ -836,9 +841,13 @@ static void device_remove_sys_dev_entry(
  * This is part 2 of device_register(), though may be called
  * separately _iff_ device_initialize() has been called separately.
  *
- * This adds it to the kobject hierarchy via kobject_add(), adds it
+ * This adds @dev to the kobject hierarchy via kobject_add(), adds it
  * to the global and sibling lists for the device, then
  * adds it to the other relevant subsystems of the driver model.
+ *
+ * NOTE: _Never_ directly free @dev after calling this function, even
+ * if it returned an error! Always use put_device() to give up your
+ * reference instead.
  */
 int device_add(struct device *dev)
 {
@@ -958,6 +967,10 @@ int device_add(struct device *dev)
  * I.e. you should only call the two helpers separately if
  * have a clearly defined need to use and refcount the device
  * before it is added to the hierarchy.
+ *
+ * NOTE: _Never_ directly free @dev after calling this function, even
+ * if it returned an error! Always use put_device() to give up the
+ * reference initialized in this function instead.
  */
 int device_register(struct device *dev)
 {

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Patch 2/2] Driver core: Fix cleanup in device_create_vargs().
       [not found] <20080903162808.36bb2405@gondolin.boeblingen.de.ibm.com>
  2008-09-03 16:26 ` [Patch 1/2] Driver core: Clarify device cleanup Cornelia Huck
@ 2008-09-03 16:26 ` Cornelia Huck
  2008-09-11 10:11   ` patch driver-core-fix-cleanup-in-device_create_vargs.patch added to gregkh-2.6 tree gregkh
  1 sibling, 1 reply; 3+ messages in thread
From: Cornelia Huck @ 2008-09-03 16:26 UTC (permalink / raw)
  To: Greg K-H; +Cc: linux-kernel

If device_register() in device_create_vargs() fails, the device
must be cleaned up with put_device() (which is also fine on NULL)
instead of kfree().

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>

---
 drivers/base/core.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Index: linux-2.6/drivers/base/core.c
===================================================================
--- linux-2.6.orig/drivers/base/core.c
+++ linux-2.6/drivers/base/core.c
@@ -1248,7 +1248,7 @@ struct device *device_create_vargs(struc
 	return dev;
 
 error:
-	kfree(dev);
+	put_device(dev);
 	return ERR_PTR(retval);
 }
 EXPORT_SYMBOL_GPL(device_create_vargs);

^ permalink raw reply	[flat|nested] 3+ messages in thread

* patch driver-core-fix-cleanup-in-device_create_vargs.patch added to gregkh-2.6 tree
  2008-09-03 16:26 ` [Patch 2/2] Driver core: Fix cleanup in device_create_vargs() Cornelia Huck
@ 2008-09-11 10:11   ` gregkh
  0 siblings, 0 replies; 3+ messages in thread
From: gregkh @ 2008-09-11 10:11 UTC (permalink / raw)
  To: cornelia.huck, gregkh, greg, linux-kernel, stable


This is a note to let you know that I've just added the patch titled

     Subject: Driver core: Fix cleanup in device_create_vargs().

to my gregkh-2.6 tree.  Its filename is

     driver-core-fix-cleanup-in-device_create_vargs.patch

This tree can be found at 
    http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/


>From cornelia.huck@de.ibm.com  Thu Sep 11 02:38:46 2008
From: Cornelia Huck <cornelia.huck@de.ibm.com>
Date: Wed, 3 Sep 2008 18:26:41 +0200
Subject: Driver core: Fix cleanup in device_create_vargs().
To: Greg K-H <greg@kroah.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Message-ID: <20080903182641.75db23a6@gondolin.boeblingen.de.ibm.com>

From: Cornelia Huck <cornelia.huck@de.ibm.com>

If device_register() in device_create_vargs() fails, the device
must be cleaned up with put_device() (which is also fine on NULL)
instead of kfree().

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/base/core.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1256,7 +1256,7 @@ struct device *device_create_vargs(struc
 	return dev;
 
 error:
-	kfree(dev);
+	put_device(dev);
 	return ERR_PTR(retval);
 }
 EXPORT_SYMBOL_GPL(device_create_vargs);


Patches currently in gregkh-2.6 which might be from cornelia.huck@de.ibm.com are

driver-core/s390-bus_id-dev_name-conversions.patch
driver-core/driver-core-clarify-device-cleanup.patch
driver-core/driver-core-fix-cleanup-in-device_create_vargs.patch
driver-core/s390-bus_id-dev_set_name-changes.patch
driver-core/s390-more-bus_id-dev_name-conversions.patch
driver-core/s390-use-s390_root_dev_-in-kvm_virtio.patch
driver-core/s390-bus_id-dev_set_name-for-css-and-ccw-busses.patch
driver-core/driver-core-provide-a-dev_set_name-that-handles-names-longer-than-20-chars.patch

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-09-11 10:14 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20080903162808.36bb2405@gondolin.boeblingen.de.ibm.com>
2008-09-03 16:26 ` [Patch 1/2] Driver core: Clarify device cleanup Cornelia Huck
2008-09-03 16:26 ` [Patch 2/2] Driver core: Fix cleanup in device_create_vargs() Cornelia Huck
2008-09-11 10:11   ` patch driver-core-fix-cleanup-in-device_create_vargs.patch added to gregkh-2.6 tree gregkh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox