if cdev_add() fails, do you need to "put" the cdev's kobject?

Greg KH greg at kroah.com
Tue May 3 18:08:24 EDT 2011


On Tue, May 03, 2011 at 05:46:05PM -0400, Robert P. J. Day wrote:
> 
>   still perusing various drivers to use as examples in class, and i
> ran across this snippet in the load routine of drivers/char/raw.c:
> 
> ===== start excerpt =====
> 
>         cdev_init(&raw_cdev, &raw_fops);
>         ret = cdev_add(&raw_cdev, dev, MAX_RAW_MINORS);
>         if (ret) {
>                 kobject_put(&raw_cdev.kobj);
>                 goto error_region;
>         }
> 
> ===== end =====
> 
>   of course it's wise to check the return code from cdev_add() to make
> sure it worked, but is it really necessary to call kobject_put()
> there?

No, that is wrong.  No one should ever mess with the kobject in a cdev.
I want to call it something other than a kobject, as it's not really
used as you would think of a kobject (it's used in the hash lookup of
the object when userspace opens a chardev, it has nothing to do with
sysfs.)

> i don't recall other character drivers calling that if they
> note that cdev_add() failed.  it's probably harmless, but it can't be
> necessary, can it?  unless that driver is doing something unusual
> somewhere else in its code.

Hopefully not.

Nice auditing, you are going to start sending patches for this, right?
:)

thanks,

greg k-h



More information about the Kernelnewbies mailing list