Hello Deepak, I think you're missing one declaration in kobject.h I had to add it...
extern struct kobject * __must_check kobject_create_and_add(const char *name, struct kobject *parent); Otherwise, when compiling i get an error that there has been an implicit use of function 'kobject_create_and_add'. Seems to be working okay now! Ben P.S. I don't suppose you have any idea of how to configure android proxies when using real hardware? On Sep 24, 6:09 am, deepak singal <[EMAIL PROTECTED]> wrote: > Hi Ben, > > I'm using below patch for lib/kobject.c (linux-2.6.22.6 kernel) > > diff -Naur linux-2.6.22/include/linux/kobject.h test-linux/include/ > linux/kobject.h > --- linux-2.6.22/include/linux/kobject.h 2007-07-09 > 05:02:17.000000000 +0530 > +++ test-linux/include/linux/kobject.h 2008-09-23 20:40:07.000000000 > +0530 > @@ -57,6 +57,11 @@ > struct kobj_type * ktype; > struct dentry * dentry; > wait_queue_head_t poll; > + struct sysfs_dirent *sd; > + unsigned int state_initialized:1; > + unsigned int state_in_sysfs:1; > + unsigned int state_add_uevent_sent:1; > + unsigned int state_remove_uevent_sent:1; > }; > > extern int kobject_set_name(struct kobject *, const char *, ...) > @@ -123,6 +128,14 @@ > int num_envp, char *buffer, int buffer_size); > }; > > +struct kobj_attribute { > + struct attribute attr; > + ssize_t (*show)(struct kobject *kobj, struct kobj_attribute > *attr, > + char *buf); > + ssize_t (*store)(struct kobject *kobj, struct kobj_attribute > *attr, > + const char *buf, size_t count); > +}; > + > struct kset { > struct kobj_type * ktype; > struct list_head list; > diff -Naur linux-2.6.22/lib/kobject.c test-linux/lib/kobject.c > --- linux-2.6.22/lib/kobject.c 2007-07-09 05:02:17.000000000 +0530 > +++ test-linux/lib/kobject.c 2008-09-23 19:32:19.000000000 +0530 > @@ -166,7 +166,7 @@ > { > int error = 0; > struct kobject * parent; > - > + > if (!(kobj = kobject_get(kobj))) > return -ENOENT; > if (!kobj->k_name) > @@ -518,6 +518,52 @@ > .default_attrs = NULL, > }; > > + > +/* default kobject attribute operations */ > + > +static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute > *attr, > + char *buf) > +{ > + struct kobj_attribute *kattr; > + ssize_t ret = -EIO; > + > + kattr = container_of(attr, struct kobj_attribute, attr); > + if (kattr->show) > + ret = kattr->show(kobj, kattr, buf); > + return ret; > +} > + > +static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute > *attr, > + const char *buf, size_t count) > +{ > + struct kobj_attribute *kattr; > + ssize_t ret = -EIO; > + > + kattr = container_of(attr, struct kobj_attribute, attr); > + if (kattr->store) > + ret = kattr->store(kobj, kattr, buf, count); > + return ret; > +} > + > + > +struct sysfs_ops kobj_sysfs_ops = { > + .show = kobj_attr_show, > + .store = kobj_attr_store, > +}; > + > +static void dynamic_kobj_release(struct kobject *kobj) > +{ > + pr_debug("kobject: (%p): %s\n", kobj, __FUNCTION__); > + kfree(kobj); > +} > + > + > +static struct kobj_type dynamic_kobj_ktype = { > + .release = dynamic_kobj_release, > + .sysfs_ops = &kobj_sysfs_ops, > +}; > + > /** > * kobject_kset_add_dir - add sub directory of object. > * @kset: kset the directory is belongs to. > @@ -616,6 +662,71 @@ > kobject_unregister(&k->kobj); > } > > +static int kobject_set_name_vargs(struct kobject *kobj, const char > *fmt, > + va_list vargs) > +{ > + va_list aq; > + char *name; > + > + va_copy(aq, vargs); > + name = kvasprintf(GFP_KERNEL, fmt, vargs); > + va_end(aq); > + > + if (!name) > + return -ENOMEM; > + > + /* Free the old name, if necessary. */ > + kfree(kobj->k_name); > + > + /* Now, set the new name */ > + kobj->k_name = name; > + > + return 0; > +} > + > + > +static int kobject_add_varg(struct kobject *kobj, struct kobject > *parent, > + const char *fmt, va_list vargs) > +{ > + va_list aq; > + int retval; > + > + va_copy(aq, vargs); > + retval = kobject_set_name_vargs(kobj, fmt, aq); > + va_end(aq); > + if (retval) { > + printk(KERN_ERR "kobject: can not set name properly! > \n"); > + return retval; > + } > + kobj->parent = parent; > + //return kobject_add_internal(kobj); > + return kobject_add(kobj); > +} > + > +int kobject_add_android(struct kobject *kobj, struct kobject *parent, > + const char *fmt, ...) > +{ > + va_list args; > + int retval; > + > + if (!kobj) > + return -EINVAL; > + > +#if 0 > + if (!kobj->state_initialized) { > + printk(KERN_ERR "kobject '%s' (%p): tried to add an " > + "uninitialized object, something is seriously > wrong.\n", > + kobject_name(kobj), kobj); > + dump_stack(); > + return -EINVAL; > + } > +#endif > + va_start(args, fmt); > + retval = kobject_add_varg(kobj, parent, fmt, args); > + va_end(args); > + > + return retval; > +} > > /** > * kset_find_obj - search for object in kset. > @@ -679,6 +790,71 @@ > return error; > } > +void kobject_init_android(struct kobject *kobj, struct kobj_type > *ktype) > +{ > + char *err_str; > + > + if (!kobj) { > + err_str = "invalid kobject pointer!"; > + goto error; > + } > + if (!ktype) { > + err_str = "must have a ktype to be initialized > properly!\n"; > + goto error; > + } > +#if 0 > + if (kobj->state_initialized) { > + /* do not error out as sometimes we can recover */ > + printk(KERN_ERR "kobject (%p): tried to init an > initialized " > + "object, something is seriously wrong.\n", > kobj); > + dump_stack(); > + } > +#endif > + // kobject_init_internal(kobj); > + kobject_init(kobj); > + kobj->ktype = ktype; > + return; > + > +error: > + printk("kobject (%p): %s\n", kobj, err_str); > + dump_stack(); > +} > +EXPORT_SYMBOL(kobject_init_android); > + > + > +struct kobject *kobject_create(void) > +{ > + struct kobject *kobj; > + > + kobj = kzalloc(sizeof(*kobj), GFP_KERNEL); > + if (!kobj) > + return NULL; > + > + kobject_init_android(kobj, &dynamic_kobj_ktype); > + return kobj; > +} > + > +struct kobject *kobject_create_and_add(const char *name, struct > kobject *parent) > +{ > + struct kobject *kobj; > + int retval; > + > + kobj = kobject_create(); > + if (!kobj) > + return NULL; > + > + retval = kobject_add_android(kobj, parent, "%s", name); > + // retval = kobject_add(kobj); > + if (retval) { > + printk(KERN_WARNING "%s: kobject_add error: %d\n", > + __FUNCTION__, retval); > + kobject_put(kobj); > + kobj = NULL; > + } > + return kobj; > +} > +EXPORT_SYMBOL_GPL(kobject_create_and_add); > + > EXPORT_SYMBOL(kobject_init); > EXPORT_SYMBOL(kobject_register); > EXPORT_SYMBOL(kobject_unregister); > > Warm Regards, > Deepak --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Internals" group. To post to this group, send email to android-internals@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/android-internals?hl=en -~----------~----~----~----~------~----~------~--~---