Re: [GIT PULL] vfs mount

James Bottomley
2025-04-03T15:34:35Z

On Thu, 2025-04-03 at 17:15 +0200, Christian Brauner wrote:
> On Thu, Apr 03, 2025 at 10:29:37AM +0200, Christian Brauner wrote:
> > On Tue, Apr 01, 2025 at 08:07:15PM +0300, Leon Romanovsky wrote:
> > > On Mon, Mar 24, 2025 at 09:00:59PM +0000,
> > > pr-tracker-bot@kernel.org wrote:
> > > > The pull request you sent on Sat, 22 Mar 2025 11:13:18 +0100:
> > > >
> > > > > git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs
> > > > > tags/vfs-6.15-rc1.mount
> > > >
> > > > has been merged into torvalds/linux.git:
> > > > https://git.kernel.org/torvalds/c/fd101da676362aaa051b4f5d8a941bd308603041
> > >
> > > I didn't bisect, but this PR looks like the most relevant
> > > candidate.
> > > The latest Linus's master generates the following slab-use-after-
> > > free:
> >
> > Sorry, did just see this today. I'll take a look now.
>
> So in light of "Liberation Day" and the bug that caused this splat
> it's
> time to quote Max Liebermann:
>
> "Ich kann nicht so viel fressen, wie ich kotzen möchte."

> --- a/fs/namespace.c
> +++ b/fs/namespace.c
> @@ -2478,7 +2478,8 @@ struct vfsmount *clone_private_mount(const
> struct path *path)
> struct mount *old_mnt = real_mount(path->mnt);
> struct mount *new_mnt;
>
> - scoped_guard(rwsem_read, &namespace_sem)
> + guard(rwsem_read, &namespace_sem);
> +
> if (IS_MNT_UNBINDABLE(old_mnt))
> return ERR_PTR(-EINVAL);
>

Well that's a barfworthy oopsie, yes. However, it does strike me as an
easy one to make for a lot of these cleanup.h things since we have a
lot of scoped and unscoped variants. We should, at least, get
checkpatch to issue a warning about indentation expectations as it does
for our other scoped statements like for, while, if etc.

It looks quite simple if got my perl right (it's a bit rusty).

Regards,

James

---

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 7b28ad331742..805b65098149 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -4347,7 +4347,7 @@ sub process {
}

# Check relative indent for conditionals and blocks.
- if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
+ if ($line =~ /\b(?:(?:if|while|scoped_[a-z_]+|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
($stat, $cond, $line_nr_next, $remain_next, $off_next) =
ctx_statement_block($linenr, $realcnt, 0)
if (!defined $stat);