On Wed, Jun 11, 2025 at 07:12:23PM +0100, Al Viro wrote: > On Wed, Jun 11, 2025 at 01:05:52PM +0200, Christian Brauner wrote: > > > - if (beneath) > > > - mnt_change_mountpoint(source_mnt, smp, top_mnt); > > > - commit_tree(source_mnt); > > > + hlist_add_head(&source_mnt->mnt_hash, &tree_list); > > > > Please add a comment here. Right now it's easy to understand even with > > your mnt_change_mountpoint() changes. Afterwards the cases are folded > > and imho that leaves readers wondering why that's correct. > > Hmm... Does the incremental below look sane for you? Yep, thanks! > > diff --git a/fs/namespace.c b/fs/namespace.c > index d5a7d7da3932..15b7959b1771 100644 > --- a/fs/namespace.c > +++ b/fs/namespace.c > @@ -2675,6 +2675,13 @@ static int attach_recursive_mnt(struct mount *source_mnt, > } > > mnt_set_mountpoint(dest_mnt, dest_mp, source_mnt); > + /* > + * Now the original copy is in the same state as the secondaries - > + * its root attached to mountpoint, but not hashed and all mounts > + * in it are either in our namespace or in no namespace at all. > + * Add the original to the list of copies and deal with the > + * rest of work for all of them uniformly. > + */ > hlist_add_head(&source_mnt->mnt_hash, &tree_list); > > hlist_for_each_entry_safe(child, n, &tree_list, mnt_hash) {