Messages in this thread | | | Date | Wed, 8 Aug 2007 17:51:33 +0900 | From | Tejun Heo <> | Subject | Re: [PATCH 17/25] sysfs: Rewrite rename in terms of sysfs dirents |
| |
> int sysfs_rename_dir(struct kobject * kobj, const char *new_name) > { > - struct sysfs_dirent *sd; > + struct sysfs_dirent *sd = kobj->sd; > struct dentry *parent = NULL; > struct dentry *old_dentry = NULL, *new_dentry = NULL; > const char *dup_name = NULL; > @@ -863,42 +863,41 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name) > > mutex_lock(&sysfs_rename_mutex); > > + error = 0; > + if (strcmp(sd->s_name, new_name) == 0) > + goto out; /* nothing to rename */ > + > /* get the original dentry */ > old_dentry = sysfs_get_dentry(sd); > if (IS_ERR(old_dentry)) { > error = PTR_ERR(old_dentry); > + goto out; > } > > parent = old_dentry->d_parent; > > /* lock parent and get dentry for new name */ > mutex_lock(&parent->d_inode->i_mutex); > + mutex_lock(&sysfs_mutex); > > + error = -EEXIST; > + if (sysfs_find_dirent(sd->s_parent, new_name)) > goto out_unlock; > > + error = -ENOMEM; > + new_dentry = d_alloc_name(parent, new_name); > + if (!new_dentry) > goto out_unlock; > > /* rename kobject and sysfs_dirent */ > error = -ENOMEM; > new_name = dup_name = kstrdup(new_name, GFP_KERNEL); > if (!new_name) > + goto out_unlock; > > error = kobject_set_name(kobj, "%s", new_name); > if (error) > + goto out_unlock; > > mutex_lock(&sysfs_mutex);
sysfs_mutex is being grabbed twice and unlocked twice later.
-- tejun - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |