Commit ccd48bc7 authored by Al Viro's avatar Al Viro Committed by Linus Torvalds

[PATCH] cleanups and bug fix in do_loopback()

 - check_mnt() on the source of binding should've been unconditional
   from the very beginning.  My fault - as far I could've trace it,
   that's an old thinko made back in 2001.  Kudos to Miklos for spotting
   it...

   Fixed.

 - code cleaned up.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7b7b1ace
...@@ -661,15 +661,18 @@ static int do_loopback(struct nameidata *nd, char *old_name, int recurse) ...@@ -661,15 +661,18 @@ static int do_loopback(struct nameidata *nd, char *old_name, int recurse)
down_write(&current->namespace->sem); down_write(&current->namespace->sem);
err = -EINVAL; err = -EINVAL;
if (check_mnt(nd->mnt) && (!recurse || check_mnt(old_nd.mnt))) { if (!check_mnt(nd->mnt) || !check_mnt(old_nd.mnt))
goto out;
err = -ENOMEM; err = -ENOMEM;
if (recurse) if (recurse)
mnt = copy_tree(old_nd.mnt, old_nd.dentry); mnt = copy_tree(old_nd.mnt, old_nd.dentry);
else else
mnt = clone_mnt(old_nd.mnt, old_nd.dentry); mnt = clone_mnt(old_nd.mnt, old_nd.dentry);
}
if (mnt) { if (!mnt)
goto out;
/* stop bind mounts from expiring */ /* stop bind mounts from expiring */
spin_lock(&vfsmount_lock); spin_lock(&vfsmount_lock);
list_del_init(&mnt->mnt_expire); list_del_init(&mnt->mnt_expire);
...@@ -682,8 +685,8 @@ static int do_loopback(struct nameidata *nd, char *old_name, int recurse) ...@@ -682,8 +685,8 @@ static int do_loopback(struct nameidata *nd, char *old_name, int recurse)
spin_unlock(&vfsmount_lock); spin_unlock(&vfsmount_lock);
} else } else
mntput(mnt); mntput(mnt);
}
out:
up_write(&current->namespace->sem); up_write(&current->namespace->sem);
path_release(&old_nd); path_release(&old_nd);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment