Loading fs/namei.c +3 −16 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading
fs/namei.c +3 −16 Original line number Diff line number Diff line Loading @@ -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); } Loading