Re: [Bug? Report] kref problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Mar 16, 2006 at 02:41:19PM +0300, Artem B. Bityutskiy wrote:
> struct my_obj_a
> {
> 	struct kobject kobj;
> } a;
> 
> struct my_obj_b
> {
> 	struct kobject kobj;
> } b;

Don't statically create kobjects, it's not nice.  But the real problem
is below...

> static __init int test_init(void)
> {
> 	int err;
> 
> 	kobject_init(&a.kobj);
> 	a.kobj.ktype = &a_ktype;
> 	err = kobject_set_name(&a.kobj, "A");
> 	if (err)
> 		return err;
> 	printk("a inited, kref %d\n", atomic_read(&a.kobj.kref.refcount));
> 	
> 	kobject_init(&b.kobj);
> 	b.kobj.ktype = &b_ktype;
> 	b.kobj.parent = &a.kobj;
> 	err = kobject_set_name(&b.kobj, "B");
> 	if (err)
> 		goto out_a;
> 	printk("b inited, kref %d\n", atomic_read(&b.kobj.kref.refcount));
> 
> 	err = sysfs_create_dir(&a.kobj);
> 	if (err)
> 		goto out_b;
> 	printk("dir A created, A kref %d, B kref %d\n",
> 	       atomic_read(&a.kobj.kref.refcount), atomic_read(&b.kobj.kref.refcount));
> 	
> 	err = sysfs_create_dir(&b.kobj);
> 	if (err)
> 		goto out_a_dir;
> 	printk("dir B created, A kref %d, B kref %d\n",
> 	       atomic_read(&a.kobj.kref.refcount), atomic_read(&b.kobj.kref.refcount));
> 
> 	kobject_put(&b.kobj);
> 	printk("kobj B put, A kref %d, B kref %d\n",
> 	       atomic_read(&a.kobj.kref.refcount), atomic_read(&b.kobj.kref.refcount));
> 
> 	kobject_put(&a.kobj);
> 	printk("kobj A put, A kref %d, B kref %d\n",
> 	       atomic_read(&a.kobj.kref.refcount), atomic_read(&b.kobj.kref.refcount));
> 
> 	return 0;
> 
> out_a_dir:
> 	sysfs_remove_dir(&a.kobj);
> out_b:
> 	kobject_put(&b.kobj);
> out_a:
> 	kobject_put(&a.kobj);
> 	return err;
> }
> module_init(test_init);
> 
> static void a_release(struct kobject *kobj)
> {
> 	struct my_obj_a *a;
> 	
> 	printk("%s\n", __FUNCTION__);
> 	a = container_of(kobj, struct my_obj_a, kobj);
> 	sysfs_remove_dir(&a->kobj);

Woah, don't do that here, the kobject core already does this.  A release
function is for you to release the memory you have created with this
kobject, not to mess with sysfs.

So, don't do this and everything should work just fine.

thanks,

greg k-h
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux