vfs: now it can be done - make mnt_parent point to struct mount
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
24
fs/namei.c
24
fs/namei.c
@@ -677,36 +677,38 @@ follow_link(struct path *link, struct nameidata *nd, void **p)
|
||||
|
||||
static int follow_up_rcu(struct path *path)
|
||||
{
|
||||
struct vfsmount *parent;
|
||||
struct mount *mnt = real_mount(path->mnt);
|
||||
struct mount *parent;
|
||||
struct dentry *mountpoint;
|
||||
|
||||
parent = real_mount(path->mnt)->mnt_parent;
|
||||
if (parent == path->mnt)
|
||||
parent = mnt->mnt_parent;
|
||||
if (&parent->mnt == path->mnt)
|
||||
return 0;
|
||||
mountpoint = path->mnt->mnt_mountpoint;
|
||||
mountpoint = mnt->mnt.mnt_mountpoint;
|
||||
path->dentry = mountpoint;
|
||||
path->mnt = parent;
|
||||
path->mnt = &parent->mnt;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int follow_up(struct path *path)
|
||||
{
|
||||
struct vfsmount *parent;
|
||||
struct mount *mnt = real_mount(path->mnt);
|
||||
struct mount *parent;
|
||||
struct dentry *mountpoint;
|
||||
|
||||
br_read_lock(vfsmount_lock);
|
||||
parent = real_mount(path->mnt)->mnt_parent;
|
||||
if (parent == path->mnt) {
|
||||
parent = mnt->mnt_parent;
|
||||
if (&parent->mnt == path->mnt) {
|
||||
br_read_unlock(vfsmount_lock);
|
||||
return 0;
|
||||
}
|
||||
mntget(parent);
|
||||
mountpoint = dget(path->mnt->mnt_mountpoint);
|
||||
mntget(&parent->mnt);
|
||||
mountpoint = dget(mnt->mnt.mnt_mountpoint);
|
||||
br_read_unlock(vfsmount_lock);
|
||||
dput(path->dentry);
|
||||
path->dentry = mountpoint;
|
||||
mntput(path->mnt);
|
||||
path->mnt = parent;
|
||||
path->mnt = &parent->mnt;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user