From: Al Viro <viro@zeniv.linux.org.uk>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-fsdevel@vger.kernel.org, jack@suse.cz,
Christian Brauner <brauner@kernel.org>,
linux-security-module@vger.kernel.org,
Paul Moore <paul@paul-moore.com>
Subject: [RFC][PATCH] switch do_new_mount_fc() to using fc_mount()
Date: Tue, 26 Aug 2025 19:21:24 +0100 [thread overview]
Message-ID: <20250826182124.GV39973@ZenIV> (raw)
In-Reply-To: <20250826175501.GU39973@ZenIV>
[
This is on top of -rc3; if nobody objects, I'll insert that early in series
in viro/vfs.git#work.mount. It has an impact for LSM folks - ->sb_kern_mount()
would be called without ->s_umount; nothing in-tree cares, but if you have
objections, yell now.
]
Prior to the call of do_new_mount_fc() the caller has just done successful
vfs_get_tree(). Then do_new_mount_fc() does several checks on resulting
superblock, and either does fc_drop_locked() and returns an error or
proceeds to unlock the superblock and call vfs_create_mount().
The thing is, there's no reason to delay that unlock + vfs_create_mount() -
the tests do not rely upon the state of ->s_umount and
fc_drop_locked()
put_fs_context()
is equivalent to
unlock ->s_umount
put_fs_context()
Doing vfs_create_mount() before the checks allows us to move vfs_get_tree()
from caller to do_new_mount_fc() and collapse it with vfs_create_mount()
into an fc_mount() call.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
diff --git a/fs/namespace.c b/fs/namespace.c
index ae6d1312b184..9e1b7319532c 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -3721,25 +3721,19 @@ static bool mount_too_revealing(const struct super_block *sb, int *new_mnt_flags
static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
unsigned int mnt_flags)
{
- struct vfsmount *mnt;
struct pinned_mountpoint mp = {};
struct super_block *sb = fc->root->d_sb;
+ struct vfsmount *mnt = fc_mount(fc);
int error;
+ if (IS_ERR(mnt))
+ return PTR_ERR(mnt);
+
error = security_sb_kern_mount(sb);
if (!error && mount_too_revealing(sb, &mnt_flags))
error = -EPERM;
-
- if (unlikely(error)) {
- fc_drop_locked(fc);
- return error;
- }
-
- up_write(&sb->s_umount);
-
- mnt = vfs_create_mount(fc);
- if (IS_ERR(mnt))
- return PTR_ERR(mnt);
+ if (unlikely(error))
+ goto out;
mnt_warn_timestamp_expiry(mountpoint, mnt);
@@ -3747,10 +3741,12 @@ static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
if (!error) {
error = do_add_mount(real_mount(mnt), mp.mp,
mountpoint, mnt_flags);
+ if (!error)
+ mnt = NULL; // consumed on success
unlock_mount(&mp);
}
- if (error < 0)
- mntput(mnt);
+out:
+ mntput(mnt);
return error;
}
@@ -3804,8 +3800,6 @@ static int do_new_mount(struct path *path, const char *fstype, int sb_flags,
err = parse_monolithic_mount_data(fc, data);
if (!err && !mount_capable(fc))
err = -EPERM;
- if (!err)
- err = vfs_get_tree(fc);
if (!err)
err = do_new_mount_fc(fc, path, mnt_flags);
next parent reply other threads:[~2025-08-26 18:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20250825044046.GI39973@ZenIV>
[not found] ` <20250825044355.1541941-1-viro@zeniv.linux.org.uk>
[not found] ` <20250825044355.1541941-25-viro@zeniv.linux.org.uk>
[not found] ` <20250825-zugute-verkohlen-945073b3851f@brauner>
[not found] ` <20250825160939.GL39973@ZenIV>
[not found] ` <20250826-kronleuchter-vortag-af3c087ae46a@brauner>
[not found] ` <20250826170044.GT39973@ZenIV>
[not found] ` <20250826175501.GU39973@ZenIV>
2025-08-26 18:21 ` Al Viro [this message]
2025-08-27 15:38 ` [RFC][PATCH] switch do_new_mount_fc() to using fc_mount() Paul Moore
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=20250826182124.GV39973@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=brauner@kernel.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=paul@paul-moore.com \
--cc=torvalds@linux-foundation.org \
/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).