From: Kay Sievers <kay.sievers@vrfy.org>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>,
Greg KH <greg@kroah.com>,
Kernel development list <linux-kernel@vger.kernel.org>,
Jonathan Corbet <corbet@lwn.net>,
Randy Dunlap <randy.dunlap@oracle.com>
Subject: Re: [PATCH] kobject: make sure kobj->ktype is set before kobject_init
Date: Thu, 29 Nov 2007 19:33:46 +0100 [thread overview]
Message-ID: <1196361226.7903.6.camel@lov.site> (raw)
In-Reply-To: <Pine.LNX.4.44L0.0711291259300.4712-100000@iolanthe.rowland.org>
On Thu, 2007-11-29 at 13:04 -0500, Alan Stern wrote:
> On Thu, 29 Nov 2007, Kay Sievers wrote:
>
> > > > Sounds fine, maybe we should also pass the name along, so it will be
> > > > obvious what happens here:
> > > > int kobject_init(struct kobject *kobj, struct kobj_type *type, const char *fmt, ...)
> > >
> > > I don't know... Normally *_init() routines can't fail, but this could.
> > > Then things like device_register() would run into trouble: The caller
> > > wouldn't know whether a failure occurred before or after the
> > > kobject_init() call, so it wouldn't know what sort of cleanup action
> > > was needed: kfree() or device_put().
> >
> > But wouldn't device_register() do the kobject cleanup for you when it
> > fails? Why would a caller of device_register() care about the state of
> > the kobject?
>
> Let's say device_register() calls device_init(), which calls
> kobject_init(), which fails. Then there's no cleanup to do --
> device_register() returns -ENOMEM or some such code and the caller has
> to do the kfree().
>
> Now let's say device_register() calls device_init(), which succeeds,
> and then calls device_add(), which fails. To recover properly,
> somebody then has to call device_put(). That "somebody" can't be the
> original caller -- according to the previous paragraph the original
> caller won't do anything but kfree(). So the "somebody" has to be
> device_register() itself.
>
> But the device_put() will call kobject_put(), which will invoke the
> device's cleanup routine, which will deallocate the structure. Now the
> original caller gets an error code (perhaps -ENOMEM again) but must
> _not_ call kfree().
>
> So what should the original caller do when an error occurs?
Right, and that is not covered today, the current code just leaks the
allocated name.
Your error scenario confirmed my initial concern about suggesting
kobject_put() to clean up an initialized kobject.
We should probably make kobject_cleanup() free only the resources taken
by kobject_init(), and use kobject_cleanup() instead of kobject_put()?
Kay
next prev parent reply other threads:[~2007-11-29 18:35 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-27 23:02 [RFC] New kobject/kset/ktype documentation and example code Greg KH
2007-11-27 23:03 ` [RFC] sample kobject implementation Greg KH
2007-11-27 23:04 ` [RFC] Sample kset/ktype/kobject implementation Greg KH
2007-11-28 16:35 ` Cornelia Huck
2007-11-29 6:11 ` Greg KH
2007-11-29 9:39 ` Cornelia Huck
2007-11-29 20:39 ` Greg KH
2007-11-29 22:11 ` Alan Stern
2007-11-30 5:07 ` Dave Young
2007-11-30 5:57 ` Dave Young
2007-11-30 14:51 ` Alan Stern
2007-11-30 6:41 ` Greg KH
2007-11-27 23:10 ` [RFC] New kobject/kset/ktype documentation and example code Kyle McMartin
2007-11-27 23:29 ` Greg KH
2007-11-27 23:21 ` Frans Pop
2007-11-28 3:50 ` Jonathan Corbet
2007-11-29 5:46 ` Greg KH
2007-11-28 9:01 ` Cornelia Huck
2007-11-28 12:35 ` Kay Sievers
2007-11-28 15:52 ` Cornelia Huck
2007-11-28 16:03 ` Kay Sievers
2007-11-28 16:09 ` Cornelia Huck
2007-11-28 17:06 ` Greg KH
2007-11-28 19:18 ` Alan Stern
2007-11-29 10:12 ` Cornelia Huck
2007-11-29 15:47 ` Alan Stern
2007-11-29 16:28 ` Cornelia Huck
2007-11-29 16:55 ` Alan Stern
2007-11-29 17:52 ` Cornelia Huck
2007-11-29 5:59 ` Greg KH
2007-11-28 11:45 ` Cornelia Huck
2007-11-28 12:23 ` Kay Sievers
2007-11-28 15:48 ` Cornelia Huck
2007-11-28 15:57 ` Kay Sievers
2007-11-28 16:12 ` Cornelia Huck
2007-11-28 16:36 ` Kay Sievers
2007-11-28 16:51 ` Cornelia Huck
2007-11-28 17:00 ` Kay Sievers
2007-11-29 6:08 ` Greg KH
2007-11-29 7:50 ` Kay Sievers
2007-11-29 9:35 ` Cornelia Huck
2007-11-29 10:53 ` Kay Sievers
2007-11-29 6:02 ` Greg KH
2007-11-29 6:04 ` Greg KH
2007-11-29 9:41 ` Cornelia Huck
2007-11-28 19:03 ` Alan Stern
2007-11-28 19:28 ` Kay Sievers
2007-11-28 19:36 ` Alan Stern
2007-11-28 19:46 ` Kay Sievers
2007-11-28 20:42 ` [PATCH] kobject: make sure kobj->ktype is set before kobject_init Alan Stern
2007-11-28 20:52 ` Kay Sievers
2007-11-28 21:45 ` Greg KH
2007-11-28 22:00 ` Alan Stern
2007-11-28 22:38 ` Greg KH
2007-11-29 10:05 ` Cornelia Huck
2007-11-29 10:59 ` Kay Sievers
2007-11-29 11:48 ` Cornelia Huck
2007-11-29 15:54 ` Alan Stern
2007-11-29 16:04 ` Kay Sievers
2007-11-29 16:21 ` Cornelia Huck
2007-11-29 21:53 ` kobject_init rewrite Greg KH
2007-11-29 21:54 ` Greg KH
2007-11-30 9:31 ` Cornelia Huck
2007-11-29 22:16 ` Alan Stern
2007-11-29 22:24 ` Greg KH
2007-11-29 17:06 ` [PATCH] kobject: make sure kobj->ktype is set before kobject_init Alan Stern
2007-11-29 17:17 ` Kay Sievers
2007-11-29 18:04 ` Alan Stern
2007-11-29 18:33 ` Kay Sievers [this message]
2007-11-29 19:05 ` Alan Stern
2007-11-29 19:51 ` Kay Sievers
2007-11-29 20:09 ` Alan Stern
2007-11-29 20:19 ` Kay Sievers
2007-11-29 20:26 ` Kay Sievers
2007-11-30 9:30 ` Cornelia Huck
2007-11-29 6:18 ` [RFC] New kobject/kset/ktype documentation and example code Greg KH
2007-11-29 15:42 ` Alan Stern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1196361226.7903.6.camel@lov.site \
--to=kay.sievers@vrfy.org \
--cc=corbet@lwn.net \
--cc=cornelia.huck@de.ibm.com \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=randy.dunlap@oracle.com \
--cc=stern@rowland.harvard.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox