提交 3088dd70 编写于 作者: A Al Viro

Clean follow_dotdot() up a bit

No need to open-code follow_up() in it and locking can be lighter.
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 de27a5bf
...@@ -689,33 +689,20 @@ static __always_inline void follow_dotdot(struct nameidata *nd) ...@@ -689,33 +689,20 @@ static __always_inline void follow_dotdot(struct nameidata *nd)
set_root(nd); set_root(nd);
while(1) { while(1) {
struct vfsmount *parent;
struct dentry *old = nd->path.dentry; struct dentry *old = nd->path.dentry;
if (nd->path.dentry == nd->root.dentry && if (nd->path.dentry == nd->root.dentry &&
nd->path.mnt == nd->root.mnt) { nd->path.mnt == nd->root.mnt) {
break; break;
} }
spin_lock(&dcache_lock);
if (nd->path.dentry != nd->path.mnt->mnt_root) { if (nd->path.dentry != nd->path.mnt->mnt_root) {
nd->path.dentry = dget(nd->path.dentry->d_parent); /* rare case of legitimate dget_parent()... */
spin_unlock(&dcache_lock); nd->path.dentry = dget_parent(nd->path.dentry);
dput(old); dput(old);
break; break;
} }
spin_unlock(&dcache_lock); if (!follow_up(&nd->path))
spin_lock(&vfsmount_lock);
parent = nd->path.mnt->mnt_parent;
if (parent == nd->path.mnt) {
spin_unlock(&vfsmount_lock);
break; break;
}
mntget(parent);
nd->path.dentry = dget(nd->path.mnt->mnt_mountpoint);
spin_unlock(&vfsmount_lock);
dput(old);
mntput(nd->path.mnt);
nd->path.mnt = parent;
} }
follow_mount(&nd->path); follow_mount(&nd->path);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册