{
struct vfsmount *parent;
struct dentry *mountpoint;
- spin_lock(&dcache_lock);
+ spin_lock(&vfsmount_lock);
parent=(*mnt)->mnt_parent;
if (parent == *mnt) {
- spin_unlock(&dcache_lock);
+ spin_unlock(&vfsmount_lock);
return 0;
}
mntget(parent);
mountpoint=dget((*mnt)->mnt_mountpoint);
- spin_unlock(&dcache_lock);
+ spin_unlock(&vfsmount_lock);
dput(*dentry);
*dentry = mountpoint;
mntput(*mnt);
struct vfsmount *mounted = lookup_mnt(*mnt, *dentry);
if (!mounted)
break;
+ mntput(*mnt);
*mnt = mounted;
dput(*dentry);
- mntput(mounted->mnt_parent);
*dentry = dget(mounted->mnt_root);
res = 1;
}
mounted = lookup_mnt(*mnt, *dentry);
if (mounted) {
+ mntput(*mnt);
*mnt = mounted;
dput(*dentry);
- mntput(mounted->mnt_parent);
*dentry = dget(mounted->mnt_root);
return 1;
}
dput(old);
break;
}
+ spin_unlock(&dcache_lock);
+ spin_lock(&vfsmount_lock);
parent = (*mnt)->mnt_parent;
if (parent == *mnt) {
- spin_unlock(&dcache_lock);
+ spin_unlock(&vfsmount_lock);
break;
}
mntget(parent);
*dentry = dget((*mnt)->mnt_mountpoint);
- spin_unlock(&dcache_lock);
+ spin_unlock(&vfsmount_lock);
dput(old);
mntput(*mnt);
*mnt = parent;