Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+22 −19
Original line number Diff line number Diff line
@@ -661,15 +661,18 @@ static int do_loopback(struct nameidata *nd, char *old_name, int recurse)

	down_write(&current->namespace->sem);
	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;
	if (recurse)
		mnt = copy_tree(old_nd.mnt, old_nd.dentry);
	else
		mnt = clone_mnt(old_nd.mnt, old_nd.dentry);
	}

	if (mnt) {
	if (!mnt)
		goto out;

	/* stop bind mounts from expiring */
	spin_lock(&vfsmount_lock);
	list_del_init(&mnt->mnt_expire);
@@ -682,8 +685,8 @@ static int do_loopback(struct nameidata *nd, char *old_name, int recurse)
		spin_unlock(&vfsmount_lock);
	} else
		mntput(mnt);
	}

out:
	up_write(&current->namespace->sem);
	path_release(&old_nd);
	return err;