From: Christian Brauner <brauner@kernel.org>
To: Al Viro <viro@zeniv.linux.org.uk>
Cc: linux-fsdevel@vger.kernel.org, jack@suse.cz,
torvalds@linux-foundation.org
Subject: Re: [PATCH v2 35/63] do_lock_mount(): don't modify path.
Date: Tue, 2 Sep 2025 12:55:51 +0200 [thread overview]
Message-ID: <20250902-keimzelle-hitze-38cec80fae8f@brauner> (raw)
In-Reply-To: <20250828230806.3582485-35-viro@zeniv.linux.org.uk>
On Fri, Aug 29, 2025 at 12:07:38AM +0100, Al Viro wrote:
> Currently do_lock_mount() has the target path switched to whatever
> might be overmounting it. We _do_ want to have the parent
> mount/mountpoint chosen on top of the overmounting pile; however,
> the way it's done has unpleasant races - if umount propagation
> removes the overmount while we'd been trying to set the environment
> up, we might end up failing if our target path strays into that overmount
> just before the overmount gets kicked out.
>
> Users of do_lock_mount() do not need the target path changed - they
> have all information in res->{parent,mp}; only one place (in
> do_move_mount()) currently uses the resulting path->mnt, and that value
> is trivial to reconstruct by the original value of path->mnt + chosen
> parent mount.
>
> Let's keep the target path unchanged; it avoids a bunch of subtle races
> and it's not hard to do:
> do
> as mount_locked_reader
> find the prospective parent mount/mountpoint dentry
> grab references if it's not the original target
> lock the prospective mountpoint dentry
> take namespace_sem exclusive
> if prospective parent/mountpoint would be different now
> err = -EAGAIN
> else if location has been unmounted
> err = -ENOENT
> else if mountpoint dentry is not allowed to be mounted on
> err = -ENOENT
> else if beneath and the top of the pile was the absolute root
> err = -EINVAL
> else
> try to get struct mountpoint (by dentry), set
> err to 0 on success and -ENO{MEM,ENT} on failure
> if err != 0
> res->parent = ERR_PTR(err)
> drop locks
> else
> res->parent = prospective parent
> drop temporary references
> while err == -EAGAIN
>
> A somewhat subtle part is that dropping temporary references is allowed.
> Neither mounts nor dentries should be evicted by a thread that holds
> namespace_sem. On success we are dropping those references under
> namespace_sem, so we need to be sure that these are not the last
> references remaining. However, on success we'd already verified (under
> namespace_sem) that original target is still mounted and that mount
> and dentry we are about to drop are still reachable from it via the
> mount tree. That guarantees that we are not about to drop the last
> remaining references.
>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---
> fs/namespace.c | 126 ++++++++++++++++++++++++++-----------------------
> 1 file changed, 68 insertions(+), 58 deletions(-)
>
> diff --git a/fs/namespace.c b/fs/namespace.c
> index ebecb03972c5..b77d2df606a1 100644
> --- a/fs/namespace.c
> +++ b/fs/namespace.c
> @@ -2727,6 +2727,27 @@ static int attach_recursive_mnt(struct mount *source_mnt,
> return err;
> }
>
> +static inline struct mount *where_to_mount(const struct path *path,
> + struct dentry **dentry,
> + bool beneath)
> +{
> + struct mount *m;
> +
> + if (unlikely(beneath)) {
> + m = topmost_overmount(real_mount(path->mnt));
> + *dentry = m->mnt_mountpoint;
> + return m->mnt_parent;
No need for that else. This can just be:
if (unlikely(beneath)) {
m = topmost_overmount(real_mount(path->mnt));
*dentry = m->mnt_mountpoint;
return m->mnt_parent;
}
m = __lookup_mnt(path->mnt, *dentry = path->dentry);
if (unlikely(m)) {
m = topmost_overmount(m);
*dentry = m->mnt.mnt_root;
return m;
}
return real_mount(path->mnt);
> + } else {
> + m = __lookup_mnt(path->mnt, *dentry = path->dentry);
The assignment to *dentry during argument passing looks really weird.
I would prefer if we didn't do that.
> + if (unlikely(m)) {
> + m = topmost_overmount(m);
> + *dentry = m->mnt.mnt_root;
> + return m;
> + }
> + return real_mount(path->mnt);
> + }
> +}
> +
> /**
> * do_lock_mount - acquire environment for mounting
> * @path: target path
> @@ -2758,84 +2779,69 @@ static int attach_recursive_mnt(struct mount *source_mnt,
> * case we also require the location to be at the root of a mount
> * that has a parent (i.e. is not a root of some namespace).
> */
> -static void do_lock_mount(struct path *path, struct pinned_mountpoint *res, bool beneath)
> +static void do_lock_mount(const struct path *path,
> + struct pinned_mountpoint *res,
> + bool beneath)
> {
> - struct vfsmount *mnt = path->mnt;
> - struct dentry *dentry;
> - struct path under = {};
> - int err = -ENOENT;
> + int err;
>
> if (unlikely(beneath) && !path_mounted(path)) {
> res->parent = ERR_PTR(-EINVAL);
> return;
> }
>
> - for (;;) {
> - struct mount *m = real_mount(mnt);
> -
> - if (beneath) {
> - path_put(&under);
> - read_seqlock_excl(&mount_lock);
> - if (unlikely(!mnt_has_parent(m))) {
> - read_sequnlock_excl(&mount_lock);
> - res->parent = ERR_PTR(-EINVAL);
> - return;
> + do {
> + struct dentry *dentry, *d;
> + struct mount *m, *n;
> +
> + scoped_guard(mount_locked_reader) {
> + m = where_to_mount(path, &dentry, beneath);
> + if (&m->mnt != path->mnt) {
> + mntget(&m->mnt);
> + dget(dentry);
> }
> - under.mnt = mntget(&m->mnt_parent->mnt);
> - under.dentry = dget(m->mnt_mountpoint);
> - read_sequnlock_excl(&mount_lock);
> - dentry = under.dentry;
> - } else {
> - dentry = path->dentry;
> }
>
> inode_lock(dentry->d_inode);
> namespace_lock();
>
> - if (unlikely(cant_mount(dentry) || !is_mounted(mnt)))
> - break; // not to be mounted on
> + // check if the chain of mounts (if any) has changed.
> + scoped_guard(mount_locked_reader)
> + n = where_to_mount(path, &d, beneath);
>
> - if (beneath && unlikely(m->mnt_mountpoint != dentry ||
> - &m->mnt_parent->mnt != under.mnt)) {
> - namespace_unlock();
> - inode_unlock(dentry->d_inode);
> - continue; // got moved
> - }
> + if (unlikely(n != m || dentry != d))
> + err = -EAGAIN; // something moved, retry
> + else if (unlikely(cant_mount(dentry) || !is_mounted(path->mnt)))
> + err = -ENOENT; // not to be mounted on
> + else if (beneath && &m->mnt == path->mnt && !m->overmount)
> + err = -EINVAL;
> + else
> + err = get_mountpoint(dentry, res);
>
> - mnt = lookup_mnt(path);
> - if (unlikely(mnt)) {
> + if (unlikely(err)) {
> + res->parent = ERR_PTR(err);
> namespace_unlock();
> inode_unlock(dentry->d_inode);
> - path_put(path);
> - path->mnt = mnt;
> - path->dentry = dget(mnt->mnt_root);
> - continue; // got overmounted
> + } else {
> + res->parent = m;
> }
> - err = get_mountpoint(dentry, res);
> - if (err)
> - break;
> - if (beneath) {
> - /*
> - * @under duplicates the references that will stay
> - * at least until namespace_unlock(), so the path_put()
> - * below is safe (and OK to do under namespace_lock -
> - * we are not dropping the final references here).
> - */
> - path_put(&under);
> - res->parent = real_mount(path->mnt)->mnt_parent;
> - return;
> + /*
> + * Drop the temporary references. This is subtle - on success
> + * we are doing that under namespace_sem, which would normally
> + * be forbidden. However, in that case we are guaranteed that
> + * refcounts won't reach zero, since we know that path->mnt
> + * is mounted and thus all mounts reachable from it are pinned
"is mounted and we hold the namespace semaphore and thus all mounts
reachable [...]"
With these things fixed:
Reviewed-by: Christian Brauner <brauner@kernel.org>
Unless I forgot something this means I should've gone through the whole
series.
next prev parent reply other threads:[~2025-09-02 10:55 UTC|newest]
Thread overview: 324+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-25 4:40 [PATCHED][RFC][CFT] mount-related stuff Al Viro
2025-08-25 4:43 ` [PATCH 01/52] fs/namespace.c: fix the namespace_sem guard mess Al Viro
2025-08-25 4:43 ` [PATCH 02/52] introduced guards for mount_lock Al Viro
2025-08-25 12:32 ` Christian Brauner
2025-08-25 13:46 ` Al Viro
2025-08-25 20:21 ` Al Viro
2025-08-25 23:44 ` Al Viro
2025-08-26 1:44 ` Al Viro
2025-08-26 15:17 ` Askar Safin
2025-08-26 15:45 ` Al Viro
2025-08-25 4:43 ` [PATCH 03/52] fs/namespace.c: allow to drop vfsmount references via __free(mntput) Al Viro
2025-08-25 12:33 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 04/52] __detach_mounts(): use guards Al Viro
2025-08-25 12:33 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 05/52] __is_local_mountpoint(): " Al Viro
2025-08-25 12:33 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 06/52] do_change_type(): " Al Viro
2025-08-25 12:34 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 07/52] do_set_group(): " Al Viro
2025-08-25 12:35 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 08/52] mark_mounts_for_expiry(): " Al Viro
2025-08-25 12:37 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 09/52] put_mnt_ns(): " Al Viro
2025-08-25 12:37 ` Christian Brauner
2025-08-25 12:40 ` Christian Brauner
2025-08-25 16:21 ` Al Viro
2025-08-25 4:43 ` [PATCH 10/52] mnt_already_visible(): " Al Viro
2025-08-25 12:39 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 11/52] check_for_nsfs_mounts(): no need to take locks Al Viro
2025-08-25 12:48 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 12/52] propagate_mnt(): use scoped_guard(mount_locked_reader) for mnt_set_mountpoint() Al Viro
2025-08-25 12:49 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 13/52] has_locked_children(): use guards Al Viro
2025-08-25 11:54 ` Linus Torvalds
2025-08-25 17:33 ` Al Viro
2025-08-25 12:49 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 14/52] mnt_set_expiry(): " Al Viro
2025-08-25 12:51 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 15/52] path_is_under(): " Al Viro
2025-08-25 12:56 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 16/52] current_chrooted(): don't bother with follow_down_one() Al Viro
2025-08-25 12:57 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 17/52] current_chrooted(): use guards Al Viro
2025-08-25 12:57 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 18/52] do_move_mount(): trim local variables Al Viro
2025-08-25 12:57 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 19/52] do_move_mount(): deal with the checks on old_path early Al Viro
2025-08-25 13:00 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 20/52] move_mount(2): take sanity checks in 'beneath' case into do_lock_mount() Al Viro
2025-08-25 12:10 ` Linus Torvalds
2025-08-25 12:17 ` Linus Torvalds
2025-08-25 13:02 ` Christian Brauner
2025-08-25 16:05 ` Al Viro
2025-08-25 4:43 ` [PATCH 21/52] finish_automount(): simplify the ELOOP check Al Viro
2025-08-25 13:02 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 22/52] do_loopback(): use __free(path_put) to deal with old_path Al Viro
2025-08-25 13:02 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 23/52] pivot_root(2): use __free() to deal with struct path in it Al Viro
2025-08-25 13:03 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 24/52] finish_automount(): take the lock_mount() analogue into a helper Al Viro
2025-08-25 13:08 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 25/52] do_new_mount_rc(): use __free() to deal with dropping mnt on failure Al Viro
2025-08-25 13:29 ` Christian Brauner
2025-08-25 16:09 ` Al Viro
2025-08-26 8:27 ` Christian Brauner
2025-08-26 17:00 ` Al Viro
2025-08-26 17:55 ` Al Viro
2025-08-26 18:21 ` [RFC][PATCH] switch do_new_mount_fc() to using fc_mount() Al Viro
2025-08-27 15:38 ` Paul Moore
2025-08-25 4:43 ` [PATCH 26/52] finish_automount(): use __free() to deal with dropping mnt on failure Al Viro
2025-08-25 13:09 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 27/52] change calling conventions for lock_mount() et.al Al Viro
2025-08-25 4:43 ` [PATCH 28/52] do_move_mount(): use the parent mount returned by do_lock_mount() Al Viro
2025-08-25 4:43 ` [PATCH 29/52] do_add_mount(): switch to passing pinned_mountpoint instead of mountpoint + path Al Viro
2025-08-25 4:43 ` [PATCH 30/52] graft_tree(), attach_recursive_mnt() - pass pinned_mountpoint Al Viro
2025-08-25 4:43 ` [PATCH 31/52] pivot_root(2): use old_mp.mp->m_dentry instead of old.dentry Al Viro
2025-08-25 13:43 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 32/52] don't bother passing new_path->dentry to can_move_mount_beneath() Al Viro
2025-08-25 4:43 ` [PATCH 33/52] new helper: topmost_overmount() Al Viro
2025-08-25 13:43 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 34/52] do_lock_mount(): don't modify path Al Viro
2025-08-26 14:14 ` Askar Safin
2025-08-25 4:43 ` [PATCH 35/52] constify check_mnt() Al Viro
2025-08-25 13:43 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 36/52] do_mount_setattr(): constify path argument Al Viro
2025-08-25 13:30 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 37/52] do_set_group(): constify path arguments Al Viro
2025-08-25 13:29 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 38/52] drop_collected_paths(): constify arguments Al Viro
2025-08-25 13:31 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 39/52] collect_paths(): constify the return value Al Viro
2025-08-25 13:30 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 40/52] do_move_mount(), vfs_move_mount(), do_move_mount_old(): constify struct path argument(s) Al Viro
2025-08-25 13:30 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 41/52] mnt_warn_timestamp_expiry(): constify struct path argument Al Viro
2025-08-25 13:32 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 42/52] do_new_mount{,_fc}(): " Al Viro
2025-08-25 13:30 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 43/52] do_{loopback,change_type,remount,reconfigure_mnt}(): " Al Viro
2025-08-25 13:31 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 44/52] path_mount(): " Al Viro
2025-08-25 13:32 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 45/52] may_copy_tree(), __do_loopback(): " Al Viro
2025-08-25 13:40 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 46/52] path_umount(): " Al Viro
2025-08-25 13:40 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 47/52] constify can_move_mount_beneath() arguments Al Viro
2025-08-25 13:39 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 48/52] do_move_mount_old(): use __free(path_put) Al Viro
2025-08-25 13:40 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 49/52] do_mount(): " Al Viro
2025-08-25 13:32 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 50/52] umount_tree(): take all victims out of propagation graph at once Al Viro
2025-08-25 4:43 ` [PATCH 51/52] ecryptfs: get rid of pointless mount references in ecryptfs dentries Al Viro
2025-08-25 13:41 ` Christian Brauner
2025-08-25 4:43 ` [PATCH 52/52] fs/namespace.c: sanitize descriptions for {__,}lookup_mnt() Al Viro
2025-08-25 13:42 ` Christian Brauner
2025-08-25 12:30 ` [PATCH 01/52] fs/namespace.c: fix the namespace_sem guard mess Christian Brauner
2025-08-25 12:26 ` [PATCHED][RFC][CFT] mount-related stuff Christian Brauner
2025-08-25 12:43 ` Christian Brauner
2025-08-25 16:11 ` Al Viro
2025-08-25 17:43 ` Al Viro
2025-08-25 20:18 ` Theodore Ts'o
2025-08-26 8:56 ` Christian Brauner
2025-08-27 17:19 ` Linus Torvalds
2025-08-27 17:49 ` Linus Torvalds
2025-08-27 22:49 ` Konstantin Ryabitsev
2025-08-27 23:40 ` Linus Torvalds
2025-08-28 0:41 ` Konstantin Ryabitsev
2025-08-28 1:00 ` Al Viro
2025-08-28 1:15 ` Konstantin Ryabitsev
2025-08-28 1:29 ` Linus Torvalds
2025-08-29 12:30 ` Theodore Ts'o
2025-08-29 18:25 ` Konstantin Ryabitsev
2025-08-28 23:07 ` [PATCHES v2][RFC][CFT] " Al Viro
2025-08-28 23:07 ` [PATCH v2 01/63] fs/namespace.c: fix the namespace_sem guard mess Al Viro
2025-08-28 23:07 ` [PATCH v2 02/63] introduced guards for mount_lock Al Viro
2025-08-29 9:49 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 03/63] fs/namespace.c: allow to drop vfsmount references via __free(mntput) Al Viro
2025-08-28 23:07 ` [PATCH v2 04/63] __detach_mounts(): use guards Al Viro
2025-08-29 9:48 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 05/63] __is_local_mountpoint(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 06/63] do_change_type(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 07/63] do_set_group(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 08/63] mark_mounts_for_expiry(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 09/63] put_mnt_ns(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 10/63] mnt_already_visible(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 11/63] check_for_nsfs_mounts(): no need to take locks Al Viro
2025-08-28 23:07 ` [PATCH v2 12/63] propagate_mnt(): use scoped_guard(mount_locked_reader) for mnt_set_mountpoint() Al Viro
2025-08-28 23:07 ` [PATCH v2 13/63] has_locked_children(): use guards Al Viro
2025-08-29 9:49 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 14/63] mnt_set_expiry(): " Al Viro
2025-08-29 9:49 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 15/63] path_is_under(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 16/63] current_chrooted(): don't bother with follow_down_one() Al Viro
2025-08-28 23:07 ` [PATCH v2 17/63] current_chrooted(): use guards Al Viro
2025-08-28 23:07 ` [PATCH v2 18/63] switch do_new_mount_fc() to fc_mount() Al Viro
2025-08-29 9:53 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 19/63] do_move_mount(): trim local variables Al Viro
2025-08-28 23:07 ` [PATCH v2 20/63] do_move_mount(): deal with the checks on old_path early Al Viro
2025-08-28 23:07 ` [PATCH v2 21/63] move_mount(2): take sanity checks in 'beneath' case into do_lock_mount() Al Viro
2025-08-28 23:07 ` [PATCH v2 22/63] finish_automount(): simplify the ELOOP check Al Viro
2025-08-28 23:07 ` [PATCH v2 23/63] do_loopback(): use __free(path_put) to deal with old_path Al Viro
2025-08-28 23:07 ` [PATCH v2 24/63] pivot_root(2): use __free() to deal with struct path in it Al Viro
2025-08-28 23:07 ` [PATCH v2 25/63] finish_automount(): take the lock_mount() analogue into a helper Al Viro
2025-08-28 23:07 ` [PATCH v2 26/63] do_new_mount_rc(): use __free() to deal with dropping mnt on failure Al Viro
2025-09-01 11:34 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 27/63] finish_automount(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 28/63] change calling conventions for lock_mount() et.al Al Viro
2025-09-01 11:37 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 29/63] do_move_mount(): use the parent mount returned by do_lock_mount() Al Viro
2025-09-01 11:38 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 30/63] do_add_mount(): switch to passing pinned_mountpoint instead of mountpoint + path Al Viro
2025-09-01 11:40 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 31/63] graft_tree(), attach_recursive_mnt() - pass pinned_mountpoint Al Viro
2025-09-01 11:41 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 32/63] pivot_root(2): use old_mp.mp->m_dentry instead of old.dentry Al Viro
2025-08-28 23:07 ` [PATCH v2 33/63] don't bother passing new_path->dentry to can_move_mount_beneath() Al Viro
2025-08-28 23:20 ` Linus Torvalds
2025-08-28 23:39 ` Al Viro
2025-08-28 23:07 ` [PATCH v2 34/63] new helper: topmost_overmount() Al Viro
2025-08-28 23:07 ` [PATCH v2 35/63] do_lock_mount(): don't modify path Al Viro
2025-09-02 10:55 ` Christian Brauner [this message]
2025-08-28 23:07 ` [PATCH v2 36/63] constify check_mnt() Al Viro
2025-08-28 23:07 ` [PATCH v2 37/63] do_mount_setattr(): constify path argument Al Viro
2025-08-28 23:07 ` [PATCH v2 38/63] do_set_group(): constify path arguments Al Viro
2025-08-28 23:07 ` [PATCH v2 39/63] drop_collected_paths(): constify arguments Al Viro
2025-08-28 23:07 ` [PATCH v2 40/63] collect_paths(): constify the return value Al Viro
2025-08-28 23:07 ` [PATCH v2 41/63] do_move_mount(), vfs_move_mount(), do_move_mount_old(): constify struct path argument(s) Al Viro
2025-08-28 23:07 ` [PATCH v2 42/63] mnt_warn_timestamp_expiry(): constify struct path argument Al Viro
2025-08-28 23:07 ` [PATCH v2 43/63] do_new_mount{,_fc}(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 44/63] do_{loopback,change_type,remount,reconfigure_mnt}(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 45/63] path_mount(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 46/63] may_copy_tree(), __do_loopback(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 47/63] path_umount(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 48/63] constify can_move_mount_beneath() arguments Al Viro
2025-08-28 23:07 ` [PATCH v2 49/63] do_move_mount_old(): use __free(path_put) Al Viro
2025-08-28 23:07 ` [PATCH v2 50/63] do_mount(): " Al Viro
2025-08-28 23:07 ` [PATCH v2 51/63] umount_tree(): take all victims out of propagation graph at once Al Viro
2025-09-01 11:50 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 52/63] ecryptfs: get rid of pointless mount references in ecryptfs dentries Al Viro
2025-08-28 23:07 ` [PATCH v2 53/63] fs/namespace.c: sanitize descriptions for {__,}lookup_mnt() Al Viro
2025-08-28 23:07 ` [PATCH v2 54/63] open_detached_copy(): don't bother with mount_lock_hash() Al Viro
2025-09-01 11:29 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 55/63] open_detached_copy(): separate creation of namespace into helper Al Viro
2025-08-29 9:54 ` Christian Brauner
2025-08-28 23:07 ` [PATCH v2 56/63] mnt_ns_tree_remove(): DTRT if mnt_ns had never been added to mnt_ns_list Al Viro
2025-08-29 9:57 ` Christian Brauner
2025-08-28 23:08 ` [PATCH v2 57/63] copy_mnt_ns(): use the regular mechanism for freeing empty mnt_ns on failure Al Viro
2025-08-29 9:56 ` Christian Brauner
2025-08-28 23:08 ` [PATCH v2 58/63] copy_mnt_ns(): use guards Al Viro
2025-09-01 11:43 ` Christian Brauner
2025-08-28 23:08 ` [PATCH v2 59/63] setup_mnt(): primitive for connecting a mount to filesystem Al Viro
2025-08-28 23:08 ` [PATCH v2 60/63] preparations to taking MNT_WRITE_HOLD out of ->mnt_flags Al Viro
2025-08-28 23:08 ` [PATCH v2 61/63] struct mount: relocate MNT_WRITE_HOLD bit Al Viro
2025-08-28 23:31 ` Linus Torvalds
2025-08-29 0:11 ` Al Viro
2025-08-29 0:35 ` Linus Torvalds
2025-08-29 6:03 ` Al Viro
2025-08-29 6:04 ` [59/63] simplify the callers of mnt_unhold_writers() Al Viro
2025-09-01 11:20 ` Christian Brauner
2025-08-29 6:05 ` [60/63] setup_mnt(): primitive for connecting a mount to filesystem Al Viro
2025-08-29 9:59 ` Christian Brauner
2025-08-29 16:37 ` Al Viro
2025-08-30 4:36 ` Al Viro
2025-08-30 7:33 ` [RFC] does # really need to be escaped in devnames? Al Viro
2025-08-30 19:40 ` Linus Torvalds
2025-08-30 20:42 ` Al Viro
2025-09-02 15:03 ` Siddhesh Poyarekar
2025-09-02 16:30 ` Linus Torvalds
2025-09-02 16:39 ` Siddhesh Poyarekar
2025-09-02 17:48 ` David Howells
2025-09-02 20:04 ` Linus Torvalds
2025-09-01 11:17 ` [60/63] setup_mnt(): primitive for connecting a mount to filesystem Christian Brauner
2025-08-29 6:06 ` [61/63] preparations to taking MNT_WRITE_HOLD out of ->mnt_flags Al Viro
2025-09-01 11:27 ` Christian Brauner
2025-08-29 6:07 ` [62/63] struct mount: relocate MNT_WRITE_HOLD bit Al Viro
2025-09-01 11:26 ` Christian Brauner
2025-08-28 23:08 ` [PATCH v2 62/63] simplify the callers of mnt_unhold_writers() Al Viro
2025-08-28 23:08 ` [PATCH v2 63/63] WRITE_HOLD machinery: no need for to bump mount_lock seqcount Al Viro
2025-09-01 11:28 ` Christian Brauner
2025-09-03 4:54 ` [PATCHES v3][RFC][CFT] mount-related stuff Al Viro
2025-09-03 4:54 ` [PATCH v3 01/65] fs/namespace.c: fix the namespace_sem guard mess Al Viro
2025-09-03 4:54 ` [PATCH v3 02/65] introduced guards for mount_lock Al Viro
2025-09-03 4:54 ` [PATCH v3 03/65] fs/namespace.c: allow to drop vfsmount references via __free(mntput) Al Viro
2025-09-03 4:54 ` [PATCH v3 04/65] __detach_mounts(): use guards Al Viro
2025-09-03 4:54 ` [PATCH v3 05/65] __is_local_mountpoint(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 06/65] do_change_type(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 07/65] do_set_group(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 08/65] mark_mounts_for_expiry(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 09/65] put_mnt_ns(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 10/65] mnt_already_visible(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 11/65] check_for_nsfs_mounts(): no need to take locks Al Viro
2025-09-03 4:54 ` [PATCH v3 12/65] propagate_mnt(): use scoped_guard(mount_locked_reader) for mnt_set_mountpoint() Al Viro
2025-09-03 4:54 ` [PATCH v3 13/65] has_locked_children(): use guards Al Viro
2025-09-03 4:54 ` [PATCH v3 14/65] mnt_set_expiry(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 15/65] path_is_under(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 16/65] current_chrooted(): don't bother with follow_down_one() Al Viro
2025-09-03 4:54 ` [PATCH v3 17/65] current_chrooted(): use guards Al Viro
2025-09-03 4:54 ` [PATCH v3 18/65] switch do_new_mount_fc() to fc_mount() Al Viro
2025-09-03 4:54 ` [PATCH v3 19/65] do_move_mount(): trim local variables Al Viro
2025-09-03 4:54 ` [PATCH v3 20/65] do_move_mount(): deal with the checks on old_path early Al Viro
2025-09-03 4:54 ` [PATCH v3 21/65] move_mount(2): take sanity checks in 'beneath' case into do_lock_mount() Al Viro
2025-09-03 4:54 ` [PATCH v3 22/65] finish_automount(): simplify the ELOOP check Al Viro
2025-09-03 4:54 ` [PATCH v3 23/65] do_loopback(): use __free(path_put) to deal with old_path Al Viro
2025-09-03 4:54 ` [PATCH v3 24/65] pivot_root(2): use __free() to deal with struct path in it Al Viro
2025-09-03 4:54 ` [PATCH v3 25/65] finish_automount(): take the lock_mount() analogue into a helper Al Viro
2025-09-03 4:54 ` [PATCH v3 26/65] do_new_mount_fc(): use __free() to deal with dropping mnt on failure Al Viro
2025-09-03 4:54 ` [PATCH v3 26/63] do_new_mount_rc(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 27/65] finish_automount(): " Al Viro
2025-09-03 4:54 ` [PATCH v3 28/65] change calling conventions for lock_mount() et.al Al Viro
2025-09-03 4:54 ` [PATCH v3 29/65] do_move_mount(): use the parent mount returned by do_lock_mount() Al Viro
2025-09-03 4:54 ` [PATCH v3 30/65] do_add_mount(): switch to passing pinned_mountpoint instead of mountpoint + path Al Viro
2025-09-03 4:54 ` [PATCH v3 31/65] graft_tree(), attach_recursive_mnt() - pass pinned_mountpoint Al Viro
2025-09-03 4:54 ` [PATCH v3 32/65] pivot_root(2): use old_mp.mp->m_dentry instead of old.dentry Al Viro
2025-09-03 4:54 ` [PATCH v3 33/65] don't bother passing new_path->dentry to can_move_mount_beneath() Al Viro
2025-09-03 4:54 ` [PATCH v3 34/65] new helper: topmost_overmount() Al Viro
2025-09-03 4:54 ` [PATCH v3 35/65] do_lock_mount(): don't modify path Al Viro
2025-09-03 4:54 ` [PATCH v3 36/65] constify check_mnt() Al Viro
2025-09-03 4:54 ` [PATCH v3 37/65] do_mount_setattr(): constify path argument Al Viro
2025-09-03 4:55 ` [PATCH v3 38/65] do_set_group(): constify path arguments Al Viro
2025-09-03 4:55 ` [PATCH v3 39/65] drop_collected_paths(): constify arguments Al Viro
2025-09-03 4:55 ` [PATCH v3 40/65] collect_paths(): constify the return value Al Viro
2025-09-03 4:55 ` [PATCH v3 41/65] do_move_mount(), vfs_move_mount(), do_move_mount_old(): constify struct path argument(s) Al Viro
2025-09-03 4:55 ` [PATCH v3 42/65] mnt_warn_timestamp_expiry(): constify struct path argument Al Viro
2025-09-03 4:55 ` [PATCH v3 43/65] do_new_mount{,_fc}(): " Al Viro
2025-09-03 4:55 ` [PATCH v3 44/65] do_{loopback,change_type,remount,reconfigure_mnt}(): " Al Viro
2025-09-03 4:55 ` [PATCH v3 45/65] path_mount(): " Al Viro
2025-09-03 4:55 ` [PATCH v3 46/65] may_copy_tree(), __do_loopback(): " Al Viro
2025-09-03 4:55 ` [PATCH v3 47/65] path_umount(): " Al Viro
2025-09-03 4:55 ` [PATCH v3 48/65] constify can_move_mount_beneath() arguments Al Viro
2025-09-03 4:55 ` [PATCH v3 49/65] do_move_mount_old(): use __free(path_put) Al Viro
2025-09-03 4:55 ` [PATCH v3 50/65] do_mount(): " Al Viro
2025-09-03 4:55 ` [PATCH v3 51/65] umount_tree(): take all victims out of propagation graph at once Al Viro
2025-09-03 4:55 ` [PATCH v3 52/65] ecryptfs: get rid of pointless mount references in ecryptfs dentries Al Viro
2025-09-03 4:55 ` [PATCH v3 53/65] fs/namespace.c: sanitize descriptions for {__,}lookup_mnt() Al Viro
2025-09-03 4:55 ` [PATCH v3 54/63] open_detached_copy(): don't bother with mount_lock_hash() Al Viro
2025-09-03 4:55 ` [PATCH v3 54/65] path_has_submounts(): use guard(mount_locked_reader) Al Viro
2025-09-03 4:55 ` [PATCH v3 55/65] open_detached_copy(): don't bother with mount_lock_hash() Al Viro
2025-09-03 4:55 ` [PATCH v3 55/63] open_detached_copy(): separate creation of namespace into helper Al Viro
2025-09-03 4:55 ` [PATCH v3 56/63] mnt_ns_tree_remove(): DTRT if mnt_ns had never been added to mnt_ns_list Al Viro
2025-09-03 4:55 ` [PATCH v3 56/65] open_detached_copy(): separate creation of namespace into helper Al Viro
2025-09-03 4:55 ` [PATCH v3 57/63] copy_mnt_ns(): use the regular mechanism for freeing empty mnt_ns on failure Al Viro
2025-09-03 4:55 ` [PATCH v3 57/65] mnt_ns_tree_remove(): DTRT if mnt_ns had never been added to mnt_ns_list Al Viro
2025-09-03 4:55 ` [PATCH v3 58/63] copy_mnt_ns(): use guards Al Viro
2025-09-03 4:55 ` [PATCH v3 58/65] copy_mnt_ns(): use the regular mechanism for freeing empty mnt_ns on failure Al Viro
2025-09-03 4:55 ` [PATCH v3 59/65] copy_mnt_ns(): use guards Al Viro
2025-09-03 4:55 ` [PATCH v3 59/63] simplify the callers of mnt_unhold_writers() Al Viro
2025-09-03 4:55 ` [PATCH v3 60/63] setup_mnt(): primitive for connecting a mount to filesystem Al Viro
2025-09-03 4:55 ` [PATCH v3 60/65] simplify the callers of mnt_unhold_writers() Al Viro
2025-09-03 4:55 ` [PATCH v3 61/63] preparations to taking MNT_WRITE_HOLD out of ->mnt_flags Al Viro
2025-09-03 4:55 ` [PATCH v3 61/65] setup_mnt(): primitive for connecting a mount to filesystem Al Viro
2025-09-03 4:55 ` [PATCH v3 62/65] preparations to taking MNT_WRITE_HOLD out of ->mnt_flags Al Viro
2025-09-03 4:55 ` [PATCH v3 62/63] struct mount: relocate MNT_WRITE_HOLD bit Al Viro
2025-09-03 4:55 ` [PATCH v3 63/65] " Al Viro
2025-09-03 4:55 ` [PATCH v3 63/63] WRITE_HOLD machinery: no need for to bump mount_lock seqcount Al Viro
2025-09-03 4:55 ` [PATCH v3 64/65] " Al Viro
2025-09-03 4:55 ` [PATCH v3 65/65] constify {__,}mnt_is_readonly() Al Viro
2025-09-03 5:08 ` [PATCHES v3][RFC][CFT] mount-related stuff Al Viro
2025-09-03 14:47 ` Linus Torvalds
2025-09-03 18:14 ` Al Viro
2025-09-04 0:17 ` Dave Chinner
2025-09-04 3:20 ` Al Viro
2025-09-04 5:55 ` Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250902-keimzelle-hitze-38cec80fae8f@brauner \
--to=brauner@kernel.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).