do_move_mount(): don't leak MNTNS_PROPAGATING on failures
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 29 Apr 2025 01:43:23 +0000 (21:43 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 9 May 2025 22:06:10 +0000 (18:06 -0400)
as it is, a failed move_mount(2) from anon namespace breaks
all further propagation into that namespace, including normal
mounts in non-anon namespaces that would otherwise propagate
there.

Fixes: 064fe6e233e8 ("mount: handle mount propagation for detached mount trees")
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namespace.c

index d8a344d..04a9bb9 100644 (file)
@@ -3715,15 +3715,14 @@ static int do_move_mount(struct path *old_path,
        if (err)
                goto out;
 
-       if (is_anon_ns(ns))
-               ns->mntns_flags &= ~MNTNS_PROPAGATING;
-
        /* if the mount is moved, it should no longer be expire
         * automatically */
        list_del_init(&old->mnt_expire);
        if (attached)
                put_mountpoint(old_mp);
 out:
+       if (is_anon_ns(ns))
+               ns->mntns_flags &= ~MNTNS_PROPAGATING;
        unlock_mount(mp);
        if (!err) {
                if (attached) {