kref: add kref_set()
[firefly-linux-kernel-4.4.55.git] / lib / kobject.c
index b7e0646f79779cd3729467b2bded83c83d424241..9500339ae0249d29163261bb489475e90a924a09 100644 (file)
@@ -2,6 +2,8 @@
  * kobject.c - library routines for handling generic kernel objects
  *
  * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org>
+ * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (c) 2006-2007 Novell Inc.
  *
  * This file is released under the GPLv2.
  *
@@ -232,13 +234,13 @@ int kobject_register(struct kobject * kobj)
 
 
 /**
- *     kobject_set_name - Set the name of an object
- *     @kobj:  object.
- *     @fmt:   format string used to build the name
+ * kobject_set_name - Set the name of a kobject
+ * @kobj: kobject to name
+ * @fmt: format string used to build the name
  *
- *     If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated
- *     string that @kobj->k_name points to. Otherwise, use the static 
- *     @kobj->name array.
+ * This sets the name of the kobject.  If you have already added the
+ * kobject to the system, you must call kobject_rename() in order to
+ * change the name of the kobject.
  */
 int kobject_set_name(struct kobject * kobj, const char * fmt, ...)
 {
@@ -306,6 +308,19 @@ int kobject_rename(struct kobject * kobj, const char *new_name)
        if (!kobj->parent)
                return -EINVAL;
 
+       /* see if this name is already in use */
+       if (kobj->kset) {
+               struct kobject *temp_kobj;
+               temp_kobj = kset_find_obj(kobj->kset, new_name);
+               if (temp_kobj) {
+                       printk(KERN_WARNING "kobject '%s' cannot be renamed "
+                              "to '%s' as '%s' is already in existence.\n",
+                              kobject_name(kobj), new_name, new_name);
+                       kobject_put(temp_kobj);
+                       return -EINVAL;
+               }
+       }
+
        devpath = kobject_get_path(kobj, GFP_KERNEL);
        if (!devpath) {
                error = -ENOMEM;
@@ -319,8 +334,6 @@ int kobject_rename(struct kobject * kobj, const char *new_name)
        sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
        envp[0] = devpath_string;
        envp[1] = NULL;
-       /* Note : if we want to send the new name alone, not the full path,
-        * we could probably use kobject_name(kobj); */
 
        error = sysfs_rename_dir(kobj, new_name);