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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to