Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ce2c9cb0259acd2aed184499ebe41ab00da13b25
Commit:     ce2c9cb0259acd2aed184499ebe41ab00da13b25
Parent:     34980ca8faebfcce31094eba6ffbb0113950361f
Author:     Greg Kroah-Hartman <[EMAIL PROTECTED]>
AuthorDate: Wed Sep 12 15:06:57 2007 -0700
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Oct 12 14:51:02 2007 -0700

    kobject: remove the static array for the name
    
    Due to historical reasons, struct kobject contained a static array for
    the name, and a dynamic pointer in case the name got bigger than the
    array.  That's just dumb, as people didn't always know which variable to
    reference, even with the accessor for the kobject name.
    
    This patch removes the static array, potentially saving a lot of memory
    as the majority of kobjects do not have a very long name.
    
    Thanks to Kay for the idea to do this.
    
    Cc: Kay Sievers <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 include/linux/kobject.h |    7 ++--
 lib/kobject.c           |   79 +++++++++++++++++++++++------------------------
 2 files changed, 42 insertions(+), 44 deletions(-)

diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index c0fb535..8b45946 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -63,7 +63,6 @@ extern const char *kobject_actions[];
 
 struct kobject {
        const char              * k_name;
-       char                    name[KOBJ_NAME_LEN];
        struct kref             kref;
        struct list_head        entry;
        struct kobject          * parent;
@@ -188,18 +187,18 @@ extern struct kobject * kset_find_obj(struct kset *, 
const char *);
  * Use this when initializing an embedded kset with no other 
  * fields to initialize.
  */
-#define set_kset_name(str)     .kset = { .kobj = { .name = str } }
+#define set_kset_name(str)     .kset = { .kobj = { .k_name = str } }
 
 
 #define decl_subsys(_name,_type,_uevent_ops) \
 struct kset _name##_subsys = { \
-       .kobj = { .name = __stringify(_name) }, \
+       .kobj = { .k_name = __stringify(_name) }, \
        .ktype = _type, \
        .uevent_ops =_uevent_ops, \
 }
 #define decl_subsys_name(_varname,_name,_type,_uevent_ops) \
 struct kset _varname##_subsys = { \
-       .kobj = { .name = __stringify(_name) }, \
+       .kobj = { .k_name = __stringify(_name) }, \
        .ktype = _type, \
        .uevent_ops =_uevent_ops, \
 }
diff --git a/lib/kobject.c b/lib/kobject.c
index 1326041..10ae2eb 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -170,7 +170,7 @@ int kobject_shadow_add(struct kobject *kobj, struct 
sysfs_dirent *shadow_parent)
        if (!(kobj = kobject_get(kobj)))
                return -ENOENT;
        if (!kobj->k_name)
-               kobj->k_name = kobj->name;
+               kobject_set_name(kobj, "NO_NAME");
        if (!*kobj->k_name) {
                pr_debug("kobject attempted to be registered with no name!\n");
                WARN_ON(1);
@@ -181,7 +181,7 @@ int kobject_shadow_add(struct kobject *kobj, struct 
sysfs_dirent *shadow_parent)
 
        pr_debug("kobject %s: registering. parent: %s, set: %s\n",
                 kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>", 
-                kobj->kset ? kobj->kset->kobj.name : "<NULL>" );
+                kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>" );
 
        if (kobj->kset) {
                spin_lock(&kobj->kset->list_lock);
@@ -255,54 +255,50 @@ int kobject_register(struct kobject * kobj)
 int kobject_set_name(struct kobject * kobj, const char * fmt, ...)
 {
        int error = 0;
-       int limit = KOBJ_NAME_LEN;
+       int limit;
        int need;
        va_list args;
-       char * name;
+       char *name;
 
-       /* 
-        * First, try the static array 
-        */
-       va_start(args,fmt);
-       need = vsnprintf(kobj->name,limit,fmt,args);
+       /* find out how big a buffer we need */
+       name = kmalloc(1024, GFP_KERNEL);
+       if (!name) {
+               error = -ENOMEM;
+               goto done;
+       }
+       va_start(args, fmt);
+       need = vsnprintf(name, 1024, fmt, args);
        va_end(args);
-       if (need < limit) 
-               name = kobj->name;
-       else {
-               /* 
-                * Need more space? Allocate it and try again 
-                */
-               limit = need + 1;
-               name = kmalloc(limit,GFP_KERNEL);
-               if (!name) {
-                       error = -ENOMEM;
-                       goto Done;
-               }
-               va_start(args,fmt);
-               need = vsnprintf(name,limit,fmt,args);
-               va_end(args);
-
-               /* Still? Give up. */
-               if (need >= limit) {
-                       kfree(name);
-                       error = -EFAULT;
-                       goto Done;
-               }
+       kfree(name);
+
+       /* Allocate the new space and copy the string in */
+       limit = need + 1;
+       name = kmalloc(limit, GFP_KERNEL);
+       if (!name) {
+               error = -ENOMEM;
+               goto done;
+       }
+       va_start(args, fmt);
+       need = vsnprintf(name, limit, fmt, args);
+       va_end(args);
+
+       /* something wrong with the string we copied? */
+       if (need >= limit) {
+               kfree(name);
+               error = -EFAULT;
+               goto done;
        }
 
        /* Free the old name, if necessary. */
-       if (kobj->k_name && kobj->k_name != kobj->name)
-               kfree(kobj->k_name);
+       kfree(kobj->k_name);
 
        /* Now, set the new name */
        kobj->k_name = name;
- Done:
+done:
        return error;
 }
-
 EXPORT_SYMBOL(kobject_set_name);
 
-
 /**
  *     kobject_rename - change the name of an object
  *     @kobj:  object in question.
@@ -477,13 +473,16 @@ void kobject_cleanup(struct kobject * kobj)
        struct kobj_type * t = get_ktype(kobj);
        struct kset * s = kobj->kset;
        struct kobject * parent = kobj->parent;
+       const char *name = kobj->k_name;
 
        pr_debug("kobject %s: cleaning up\n",kobject_name(kobj));
-       if (kobj->k_name != kobj->name)
-               kfree(kobj->k_name);
-       kobj->k_name = NULL;
-       if (t && t->release)
+       if (t && t->release) {
                t->release(kobj);
+               /* If we have a release function, we can guess that this was
+                * not a statically allocated kobject, so we should be safe to
+                * free the name */
+               kfree(name);
+       }
        if (s)
                kset_put(s);
        kobject_put(parent);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to