The following changes since commit d0b3b7b22dfa1f4b515fd3a295b3fd958f9e81af: Linux 6.16-rc4 (2025-06-29 13:09:04 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git tags/pull-mount for you to fetch changes up to a7cce099450f8fc597a6ac215440666610895fb7: statmount_mnt_basic(): simplify the logics for group id (2025-06-29 19:03:46 -0400) ---------------------------------------------------------------- mount changes. I've got more stuff in the local tree, but this is getting too much for one merge window as it is. * mount hash conflicts rudiments are gone now - we do not allow multiple mounts with the same parent/mountpoint to be hashed at the same time. * struct mount changes mnt_umounting is gone; mnt_slave_list/mnt_slave is an hlist now; overmounts are kept track of by explicit pointer in mount; a bunch of flags moved out of mnt_flags to a new field, with only namespace_sem for protection; mnt_expiry is protected by mount_lock now (instead of namespace_sem); MNT_LOCKED is used only for mounts that need to remain attached to their parents to prevent mountpoint exposure - no more overloading it for absolute roots; all mnt_list uses are transient now - it's used only to represent temporary sets during umount_tree(). * mount refcounting change children no longer pin parents for any mounts, whether they'd passed through umount_tree() or not. * struct mountpoint changes refcount is no more; what matters is ->m_list emptiness; instead of temporary bumping the refcount, we insert a new object (pinned_mountpoint) into ->m_list; new calling conventions for lock_mount() and friends. * do_move_mount()/attach_recursive_mnt() seriously cleaned up. * globals in fs/pnode.c are gone. * propagate_mnt(), change_mnt_propagation() and propagate_umount() cleaned up (in the last case - pretty much completely rewritten). * freeing of emptied mnt_namespace is done in namespace_unlock() for one thing, there are subtle ordering requirements there; for another it simplifies cleanups. * assorted cleanups. * restore the machinery for long-term mounts from accumulated bitrot. This is going to get a followup come next cycle, when #work.fs_context with its change of vfs_fs_parse_string() calling conventions goes into -next. ---------------------------------------------------------------- Al Viro (48): attach_mnt(): expand in attach_recursive_mnt(), then lose the flag argument get rid of mnt_set_mountpoint_beneath() prevent mount hash conflicts copy_tree(): don't set ->mnt_mountpoint on the root of copy constify mnt_has_parent() pnode: lift peers() into pnode.h new predicate: mount_is_ancestor() constify is_local_mountpoint() new predicate: anon_ns_root(mount) dissolve_on_fput(): use anon_ns_root() __attach_mnt(): lose the second argument don't set MNT_LOCKED on parentless mounts clone_mnt(): simplify the propagation-related logics do_umount(): simplify the "is it still mounted" checks sanitize handling of long-term internal mounts Rewrite of propagate_umount() make commit_tree() usable in same-namespace move case attach_recursive_mnt(): unify the mnt_change_mountpoint() logics attach_recursive_mnt(): pass destination mount in all cases attach_recursive_mnt(): get rid of flags entirely do_move_mount(): take dropping the old mountpoint into attach_recursive_mnt() do_move_mount(): get rid of 'attached' flag attach_recursive_mnt(): remove from expiry list on move take ->mnt_expire handling under mount_lock [read_seqlock_excl] pivot_root(): reorder tree surgeries, collapse unhash_mnt() and put_mountpoint() combine __put_mountpoint() with unhash_mnt() get rid of mountpoint->m_count don't have mounts pin their parents mount: separate the flags accessed only under namespace_sem propagate_one(): get rid of dest_master propagate_mnt(): handle all peer groups in the same loop propagate_one(): separate the "do we need secondary here?" logics propagate_one(): separate the "what should be the master for this copy" part propagate_one(): fold into the sole caller fs/pnode.c: get rid of globals propagate_mnt(): get rid of last_dest propagate_mnt(): fix comment and convert to kernel-doc, while we are at it change_mnt_propagation() cleanups, step 1 change_mnt_propagation(): do_make_slave() is a no-op unless IS_MNT_SHARED() do_make_slave(): choose new master sanely turn do_make_slave() into transfer_propagation() mnt_slave_list/mnt_slave: turn into hlist_head/hlist_node change_mnt_propagation(): move ->mnt_master assignment into MS_SLAVE case copy_tree(): don't link the mounts via mnt_list take freeing of emptied mnt_namespace to namespace_unlock() get rid of CL_SHARE_TO_SLAVE invent_group_ids(): zero ->mnt_group_id always implies !IS_MNT_SHARED() statmount_mnt_basic(): simplify the logics for group id Documentation/filesystems/propagate_umount.txt | 484 +++++++++++++++++ drivers/gpu/drm/i915/gem/i915_gemfs.c | 21 +- drivers/gpu/drm/v3d/v3d_gemfs.c | 21 +- fs/hugetlbfs/inode.c | 2 +- fs/mount.h | 40 +- fs/namespace.c | 711 ++++++++++--------------- fs/pnode.c | 697 ++++++++++++------------ fs/pnode.h | 27 +- include/linux/mount.h | 18 +- ipc/mqueue.c | 2 +- 10 files changed, 1216 insertions(+), 807 deletions(-) create mode 100644 Documentation/filesystems/propagate_umount.txt