This removes the last major user of s_dentry and makes the locking in sysfs_get_dentry much simpler. Hopefully leading to more readable and maintainable code. Signed-off-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxx> --- fs/sysfs/dir.c | 23 ++++++----------------- 1 files changed, 6 insertions(+), 17 deletions(-) diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 59a9ce8..adb1b01 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -809,19 +809,15 @@ struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd) struct dentry *parent_dentry, *dentry; int i, depth; - /* Find the first parent which has valid s_dentry and get the - * dentry. + /* Find the first parent which has valid dentry. */ mutex_lock(&sysfs_mutex); - restart0: - spin_lock(&sysfs_assoc_lock); - restart1: - spin_lock(&dcache_lock); + restart: dentry = NULL; depth = 0; cur = sd; - while (!cur->s_dentry || !cur->s_dentry->d_inode) { + while (!(dentry = __sysfs_get_dentry(sysfs_sb, cur))) { if (cur->s_flags & SYSFS_FLAG_REMOVED) { dentry = ERR_PTR(-ENOENT); depth = 0; @@ -830,11 +826,6 @@ struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd) cur = cur->s_parent; depth++; } - if (!IS_ERR(dentry)) - dentry = dget_locked(cur->s_dentry); - - spin_unlock(&dcache_lock); - spin_unlock(&sysfs_assoc_lock); /* from the found dentry, look up depth times */ while (depth--) { @@ -847,7 +838,7 @@ struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd) */ if (i != depth) { dput(dentry); - goto restart0; + goto restart; } sysfs_get(cur); @@ -866,18 +857,16 @@ struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd) } mutex_lock(&sysfs_mutex); - spin_lock(&sysfs_assoc_lock); /* This, again, can happen if tree structure has * changed and we looked up the wrong thing. Restart. */ - if (cur->s_dentry != dentry) { + if (dentry->d_fsdata != cur) { dput(dentry); sysfs_put(cur); - goto restart1; + goto restart; } - spin_unlock(&sysfs_assoc_lock); sysfs_put(cur); } -- 1.5.1.1.181.g2de0 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers