FAILED: patch "[PATCH] namespace: check the target before walking it in" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 08f4288a37ef4b3d19b4a9599ec3048219cac828
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026101210-barge-alkalize-e6de@gregkh' --subject-prefix 'PATCH 5.15.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 08f4288a37ef4b3d19b4a9599ec3048219cac828 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Sat, 26 Sep 2026 15:44:28 +0200
Subject: [PATCH] namespace: check the target before walking it in
do_mount_setattr()
When mount_setattr() changes the propagation type to MS_SHARED do_mount_setattr() takes namespace_sem and calls invent_group_ids() which walks the whole target tree with next_mnt() and allocates a peer group id for every mount that doesn't have one.
Whether the caller may touch the target at all is only checked afterwards under mount_lock. If it may not, cleanup_group_ids() walks the tree a second time on the way out to free the ids again.
A detached tree that a file descriptor keeps alive, a mount in another mount namespace or a mount below the root of an anonymous mount namespace does a bunch of allocation work that is completely useless because it will fail and revert right after.
Do the right thing and check the target right after taking namespace_sem instead. A mount leaves its namespace only under namespace_sem so the mount stays stable. The check under mount_lock stays for the case where no propagation change is requested and namespace_sem isn't taken. Callers get the same EINVAL as before.
fs/namespace.c +6 -0
@@ -4976,6 +4976,11 @@ static int do_mount_setattr(const struct path *path, struct mount_kattr *kattr)* propagation. */ namespace_lock (); +/* invent_group_ids() walks the tree, only walk a mounted one */ +if (!anon_ns_root (mnt) && !check_mnt (mnt)) { +namespace_unlock (); +return -EINVAL ; + }if (kattr->propagation ==MS_SHARED ) { err =invent_group_ids (mnt, kattr->kflags &MOUNT_KATTR_RECURSE );if (err) {
@@ -4988,6 +4993,7 @@ static int do_mount_setattr(const struct path *path, struct mount_kattr *kattr) err = -EINVAL ;lock_mount_hash (); +/* Checked under namespace_sem already if the propagation changes. */ if (!anon_ns_root (mnt) && !check_mnt (mnt)) goto out;
Sasha Levin
maintainerPATCH 1/1 namespace: check the target before walking it in do_mount_setattr()
From: Christian Brauner <[email protected]>
[ Upstream commit 08f4288a37ef4b3d19b4a9599ec3048219cac828 ]
When mount_setattr() changes the propagation type to MS_SHARED do_mount_setattr() takes namespace_sem and calls invent_group_ids() which walks the whole target tree with next_mnt() and allocates a peer group id for every mount that doesn't have one.
Whether the caller may touch the target at all is only checked afterwards under mount_lock. If it may not, cleanup_group_ids() walks the tree a second time on the way out to free the ids again.
A detached tree that a file descriptor keeps alive, a mount in another mount namespace or a mount below the root of an anonymous mount namespace does a bunch of allocation work that is completely useless because it will fail and revert right after.
Do the right thing and check the target right after taking namespace_sem instead. A mount leaves its namespace only under namespace_sem so the mount stays stable. The check under mount_lock stays for the case where no propagation change is requested and namespace_sem isn't taken. Callers get the same EINVAL as before.
--- fs/namespace.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/namespace.c +8 -0
@@ -4063,6 +4063,7 @@ static struct mount *mount_setattr_prepare(struct mount_kattr *kattr, {struct mount *m = mnt, *last =NULL ; +/* Checked under namespace_sem already if the propagation changes. */ if (!is_mounted (&m->mnt)) { *err = -EINVAL ; goto out;
@@ -4172,6 +4173,13 @@ static int do_mount_setattr(struct path *path, struct mount_kattr *kattr)* propagation. */ namespace_lock (); +/* invent_group_ids() walks the tree, only walk a mounted one */ +if (!is_mounted (&mnt->mnt) || + !(mnt_has_parent (mnt) ?check_mnt (mnt) : +is_anon_ns (mnt->mnt_ns))) { +namespace_unlock (); +return -EINVAL ; + }if (kattr->propagation ==MS_SHARED ) { err =invent_group_ids (mnt, kattr->recurse);if (err) {
Signature · 1 line
2.53.0