Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763804AbXK2SFQ (ORCPT ); Thu, 29 Nov 2007 13:05:16 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1761952AbXK2SFE (ORCPT ); Thu, 29 Nov 2007 13:05:04 -0500 Received: from iolanthe.rowland.org ([192.131.102.54]:59585 "HELO iolanthe.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1761523AbXK2SFB (ORCPT ); Thu, 29 Nov 2007 13:05:01 -0500 Date: Thu, 29 Nov 2007 13:04:59 -0500 (EST) From: Alan Stern X-X-Sender: stern@iolanthe.rowland.org To: Kay Sievers cc: Cornelia Huck , Greg KH , Kernel development list , Jonathan Corbet , Randy Dunlap Subject: Re: [PATCH] kobject: make sure kobj->ktype is set before kobject_init In-Reply-To: <1196356667.3118.16.camel@lov.site> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1879 Lines: 42 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? Alan Stern - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/