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:
Al Viro
2011-11-24 22:19:58 -05:00
parent 3376f34fff
commit 0714a53380
5 changed files with 53 additions and 50 deletions

View File

@@ -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;
}