sysfs: Factor out sysfs_rename from sysfs_rename_dir and sysfs_move_dir
[safe/jmp/linux-2.6] / fs / sysfs / dir.c
index 97954c6..f05f230 100644 (file)
@@ -760,30 +760,42 @@ void sysfs_remove_dir(struct kobject * kobj)
        __sysfs_remove_dir(sd);
 }
 
-int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
+int sysfs_rename(struct sysfs_dirent *sd,
+       struct sysfs_dirent *new_parent_sd, const char *new_name)
 {
-       struct sysfs_dirent *sd = kobj->sd;
        const char *dup_name = NULL;
        int error;
 
        mutex_lock(&sysfs_mutex);
 
        error = 0;
-       if (strcmp(sd->s_name, new_name) == 0)
+       if ((sd->s_parent == new_parent_sd) &&
+           (strcmp(sd->s_name, new_name) == 0))
                goto out;       /* nothing to rename */
 
        error = -EEXIST;
-       if (sysfs_find_dirent(sd->s_parent, new_name))
+       if (sysfs_find_dirent(new_parent_sd, new_name))
                goto out;
 
        /* rename sysfs_dirent */
-       error = -ENOMEM;
-       new_name = dup_name = kstrdup(new_name, GFP_KERNEL);
-       if (!new_name)
-               goto out;
+       if (strcmp(sd->s_name, new_name) != 0) {
+               error = -ENOMEM;
+               new_name = dup_name = kstrdup(new_name, GFP_KERNEL);
+               if (!new_name)
+                       goto out;
+
+               dup_name = sd->s_name;
+               sd->s_name = new_name;
+       }
 
-       dup_name = sd->s_name;
-       sd->s_name = new_name;
+       /* Remove from old parent's list and insert into new parent's list. */
+       if (sd->s_parent != new_parent_sd) {
+               sysfs_unlink_sibling(sd);
+               sysfs_get(new_parent_sd);
+               sysfs_put(sd->s_parent);
+               sd->s_parent = new_parent_sd;
+               sysfs_link_sibling(sd);
+       }
 
        error = 0;
  out:
@@ -792,37 +804,21 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
        return error;
 }
 
+int sysfs_rename_dir(struct kobject *kobj, const char *new_name)
+{
+       return sysfs_rename(kobj->sd, kobj->sd->s_parent, new_name);
+}
+
 int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj)
 {
        struct sysfs_dirent *sd = kobj->sd;
        struct sysfs_dirent *new_parent_sd;
-       int error;
 
        BUG_ON(!sd->s_parent);
-
-       mutex_lock(&sysfs_mutex);
-       new_parent_sd = (new_parent_kobj && new_parent_kobj->sd) ?
+       new_parent_sd = new_parent_kobj && new_parent_kobj->sd ?
                new_parent_kobj->sd : &sysfs_root;
 
-       error = 0;
-       if (sd->s_parent == new_parent_sd)
-               goto out;       /* nothing to move */
-
-       error = -EEXIST;
-       if (sysfs_find_dirent(new_parent_sd, sd->s_name))
-               goto out;
-
-       /* Remove from old parent's list and insert into new parent's list. */
-       sysfs_unlink_sibling(sd);
-       sysfs_get(new_parent_sd);
-       sysfs_put(sd->s_parent);
-       sd->s_parent = new_parent_sd;
-       sysfs_link_sibling(sd);
-
-       error = 0;
-out:
-       mutex_unlock(&sysfs_mutex);
-       return error;
+       return sysfs_rename(sd, new_parent_sd, sd->s_name);
 }
 
 /* Relationship between s_mode and the DT_xxx types */