Messages in this thread Patch in this message | | | From | (Eric W. Biederman) | Subject | [PATCH 10/25] sysfs: Rewrite sysfs_get_dentry in terms of __sysfs_get_dentry | Date | Tue, 07 Aug 2007 15:18:27 -0600 |
| |
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@xmission.com> --- 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 - 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/
| |