From c9557599d1ac4634f04895627bd825fd1992adef Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 27 May 2011 06:53:39 -0400 Subject: [PATCH] --- yaml --- r: 252699 b: refs/heads/master c: dea3937619cb67d2ad08e2d29ae923875b1eeee9 h: refs/heads/master i: 252697: ab29996e06e7c39f3a721a62fa3cafb5d6149a75 252695: 4369807abe88f16e85cffee5de2ebdb31681ab59 v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 26 ++++++++------------------ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/[refs] b/[refs] index beb967742729..9ef80a14a5a0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 287548e46aa752ce9bb87fcff46f8aa794cc5037 +refs/heads/master: dea3937619cb67d2ad08e2d29ae923875b1eeee9 diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index da9c26578663..988081424098 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -951,29 +951,21 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, return true; } -static void follow_mount_rcu(struct nameidata *nd, struct path *path, - struct inode **inode) +static void follow_mount_rcu(struct nameidata *nd) { - for (;;) { + while (d_mountpoint(nd->path.dentry)) { struct vfsmount *mounted; - *inode = path->dentry->d_inode; - - if (!d_mountpoint(path->dentry)) - break; - - mounted = __lookup_mnt(path->mnt, path->dentry, 1); + mounted = __lookup_mnt(nd->path.mnt, nd->path.dentry, 1); if (!mounted) break; - path->mnt = mounted; - path->dentry = mounted->mnt_root; - nd->seq = read_seqcount_begin(&path->dentry->d_seq); + nd->path.mnt = mounted; + nd->path.dentry = mounted->mnt_root; + nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); } } static int follow_dotdot_rcu(struct nameidata *nd) { - struct inode *inode = nd->inode; - set_root_rcu(nd); while (1) { @@ -989,7 +981,6 @@ static int follow_dotdot_rcu(struct nameidata *nd) seq = read_seqcount_begin(&parent->d_seq); if (read_seqcount_retry(&old->d_seq, nd->seq)) goto failed; - inode = parent->d_inode; nd->path.dentry = parent; nd->seq = seq; break; @@ -997,10 +988,9 @@ static int follow_dotdot_rcu(struct nameidata *nd) if (!follow_up_rcu(&nd->path)) break; nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); - inode = nd->path.dentry->d_inode; } - follow_mount_rcu(nd, &nd->path, &inode); - nd->inode = inode; + follow_mount_rcu(nd); + nd->inode = nd->path.dentry->d_inode; return 0; failed: