From: Eric W. Biederman Date: Tue, 1 Nov 2011 14:06:17 +0000 (-0700) Subject: sysfs: Make sysfs_rename safe with sysfs_dirents in rbtrees. X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=f6d90b4f9ce018bff429d6e01ee672de712b8641;p=GitHub%2FLineageOS%2Fandroid_kernel_samsung_universal7580.git sysfs: Make sysfs_rename safe with sysfs_dirents in rbtrees. In sysfs_rename we need to remove the optimization of not calling sysfs_unlink_sibling and sysfs_link_sibling if the renamed parent directory is not changing. This optimization is no longer valid now that sysfs dirents are stored in an rbtree sorted by name. Move the assignment of s_ns before the call of sysfs_link_sibling. With no sysfs_dirent fields changing after the call of sysfs_link_sibling this allows sysfs_link_sibling to take any of the directory entries into account when it builds the rbtrees, and s_ns looks like a prime canidate to be used in the rbtree in the future. Signed-off-by: Eric W. Biederman Cc: Jiri Slaby Cc: Greg KH Cc: David Miller Cc: Mikulas Patocka Cc: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 48ffbdf0d01..7fdf6a7b743 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -865,15 +865,13 @@ int sysfs_rename(struct sysfs_dirent *sd, 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); - } + /* Move to the appropriate place in the appropriate directories rbtree. */ + sysfs_unlink_sibling(sd); + sysfs_get(new_parent_sd); + sysfs_put(sd->s_parent); sd->s_ns = new_ns; + sd->s_parent = new_parent_sd; + sysfs_link_sibling(sd); error = 0; out: