Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3088dd70 authored by Al Viro's avatar Al Viro
Browse files

Clean follow_dotdot() up a bit



No need to open-code follow_up() in it and locking can be lighter.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent de27a5bf
Loading
Loading
Loading
Loading
+3 −16
Original line number Diff line number Diff line
@@ -689,34 +689,21 @@ static __always_inline void follow_dotdot(struct nameidata *nd)
	set_root(nd);

	while(1) {
		struct vfsmount *parent;
		struct dentry *old = nd->path.dentry;

		if (nd->path.dentry == nd->root.dentry &&
		    nd->path.mnt == nd->root.mnt) {
			break;
		}
		spin_lock(&dcache_lock);
		if (nd->path.dentry != nd->path.mnt->mnt_root) {
			nd->path.dentry = dget(nd->path.dentry->d_parent);
			spin_unlock(&dcache_lock);
			/* rare case of legitimate dget_parent()... */
			nd->path.dentry = dget_parent(nd->path.dentry);
			dput(old);
			break;
		}
		spin_unlock(&dcache_lock);
		spin_lock(&vfsmount_lock);
		parent = nd->path.mnt->mnt_parent;
		if (parent == nd->path.mnt) {
			spin_unlock(&vfsmount_lock);
		if (!follow_up(&nd->path))
			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);
}