From nobody Sun May 24 16:15:15 2026 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gNkd00clfz6ddtx for ; Sun, 24 May 2026 16:15:16 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gNkcz4nZ9z3MRn for ; Sun, 24 May 2026 16:15:15 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779639315; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=c3MfG8AOUFvz7ykm+sfKbFFRPWcJh3UKlNzu4AcStew=; b=N3MkyEYaTKr+IRn4201bCDiFSsMsLqq6h9PLuVGzsAgQiUj6HqhbCf9LYTYbLmdmyvkGxp CLjH6m7Fyf9EArfdbRND0sEuCGeU6HSymlB/GbYzb3YW/GmRDmq//wy2y3mhwQBwqrptiY Wc0+/PEdKfScCIYrimBOSwGx7lYn0U1tAyXxRYus6PWaPOOHuxus0OVr7Lp1WnZrz7JsJQ tJ1hReuL4X7anhV5kcNe3eCLJsvQ32ZCYUzqCuCh44bb1wNqvRZuWYOLVObiyZVbCJEX4a Q7YtNvroHTV0ba7vvDIqxk2OyrWc9TSdJ6D4xN+mSWTGRklXMA91jo7vp90F8A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779639315; a=rsa-sha256; cv=none; b=dwBqvr8v9wzMc2jAb/n7a9dy92HOVoR7bNqAZ76n1Qj46bk7mLWsUYObNVdqBa1/mB6PrS jfu0ILt1NctG8zAh0LWFCMk4gs1p+xu6dt6wDbIhfbmjzaNS7snvM7dVtXsGQrN1BQtHzh OuXd8yvEzEwIHgCQfxOPQLX8oOQSkFZf/nyj8a6Kyx0i8ZM7fEIifVlg+RDiSdJkQxDqb4 5RhChnlj73cFLaFKfC6brZLlyrxzZlra6P8FU6/CMTGT+SrLvCP48pMe6LSzd5U8SXY/eP k4Cq4y5BnKMi4+Bw0HmopB55bpDo/Udk/FfEq/IGdo395tQ+Sm4TvYkiXO/P5w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779639315; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=c3MfG8AOUFvz7ykm+sfKbFFRPWcJh3UKlNzu4AcStew=; b=SMJsYeUXhihJ1sl3DQfKCYsWcye6BDA55w43j3/UX4HU8AKRnQSSIug7haSmEoIliXykcV U8vl10ZFPL/yx9FVmns534FSDftqjNkhuZHLFeBAW+b7E9r2rgkKNVBIPrYOkfjwd8zUYU rWJ/MSODnPtzlXvVF/mp+I6rFPr6bhP36xP7GUNYybyn/xULFD4wgmlrxm9E4fE1Q1oDWG 46/44wme0MrlomNxEDYiEM8eKxh3Rx0FEQ1gGJ0nq7nmNS6V6WB0mX0Gr50yLOBAmAecmT NdUVGQeFbf2qbE6IdOmuSOR2UIAyjyIxkx6Mfa3sybKUVgsac2XefM1WOhgfGQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gNkcz4MNXz11ns for ; Sun, 24 May 2026 16:15:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 31884 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 24 May 2026 16:15:15 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav Subject: git: 09935bf8af36 - stable/14 - tmpfs: Overhaul option handling on remount List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: des X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 09935bf8af363af75fc94b65bb3c33e323e9893a Auto-Submitted: auto-generated Date: Sun, 24 May 2026 16:15:15 +0000 Message-Id: <6a132413.31884.6c7820b0@gitrepo.freebsd.org> The branch stable/14 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=09935bf8af363af75fc94b65bb3c33e323e9893a commit 09935bf8af363af75fc94b65bb3c33e323e9893a Author: Dag-Erling Smørgrav AuthorDate: 2026-05-19 06:54:28 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2026-05-24 16:14:50 +0000 tmpfs: Overhaul option handling on remount On remount, we must accept all the same options as on initial mount. For parameters which we're unable to modify on the fly, fail only if the new value is different from the existing one. PR: 295096 MFC after: 1 week Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D57044 (cherry picked from commit 1cfc208a07b64a64377a4f8fe51c28f588a929cf) --- sys/fs/tmpfs/tmpfs_vfsops.c | 100 +++++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/sys/fs/tmpfs/tmpfs_vfsops.c b/sys/fs/tmpfs/tmpfs_vfsops.c index c404eb81a8d2..73feb6d0b4e0 100644 --- a/sys/fs/tmpfs/tmpfs_vfsops.c +++ b/sys/fs/tmpfs/tmpfs_vfsops.c @@ -94,10 +94,6 @@ static const char *tmpfs_opts[] = { "export", "union", "nonc", "nomtime", "nosymfollow", "pgread", NULL }; -static const char *tmpfs_updateopts[] = { - "from", "easize", "export", "nomtime", "size", "nosymfollow", NULL -}; - static int tmpfs_update_mtime_lazy_filter(struct vnode *vp, void *arg) { @@ -326,6 +322,7 @@ tmpfs_mount(struct mount *mp) sizeof(struct tmpfs_dirent) + sizeof(struct tmpfs_node)); struct tmpfs_mount *tmp; struct tmpfs_node *root; + struct vfsoptlist *opts; int error; bool nomtime, nonc, pgread; /* Size counters. */ @@ -339,44 +336,71 @@ tmpfs_mount(struct mount *mp) struct vattr va; - if (vfs_filteropt(mp->mnt_optnew, tmpfs_opts)) + opts = mp->mnt_optnew; + if (vfs_filteropt(opts, tmpfs_opts)) return (EINVAL); if (mp->mnt_flag & MNT_UPDATE) { - /* Only support update mounts for certain options. */ - if (vfs_filteropt(mp->mnt_optnew, tmpfs_updateopts) != 0) - return (EOPNOTSUPP); tmp = VFS_TO_TMPFS(mp); - if (vfs_getopt_size(mp->mnt_optnew, "size", &size_max) == 0) { - /* - * On-the-fly resizing is not supported (yet). We still - * need to have "size" listed as "supported", otherwise - * trying to update fs that is listed in fstab with size - * parameter, say trying to change rw to ro or vice - * versa, would cause vfs_filteropt() to bail. - */ - if (size_max != tmp->tm_size_max) - return (EOPNOTSUPP); - } - if (vfs_getopt_size(mp->mnt_optnew, "easize", &ea_max_size) == 0) { + + /* + * These options cannot (yet) be modified on the fly, but + * mount(8) will still pass them when remounting, so we + * will silently ignore them as long as the value is + * unchanged. + */ + if (vfs_scanopt(opts, "gid", "%d", &root_gid) == 1 && + root_gid != tmp->tm_root->tn_gid) + return (EOPNOTSUPP); + if (vfs_scanopt(opts, "uid", "%d", &root_uid) == 1 && + root_uid != tmp->tm_root->tn_uid) + return (EOPNOTSUPP); + if (vfs_scanopt(opts, "mode", "%ho", &root_mode) == 1 && + (root_mode & S_IFMT) != (tmp->tm_root->tn_mode & S_IFMT)) + return (EOPNOTSUPP); + if (vfs_getopt_size(opts, "inodes", &nodes_max) == 0 && + nodes_max != 0 && nodes_max != tmp->tm_nodes_max) + return (EOPNOTSUPP); + if (vfs_getopt_size(opts, "size", &size_max) == 0 && + size_max != 0 && size_max != tmp->tm_size_max) + return (EOPNOTSUPP); + if (vfs_getopt_size(opts, "maxfilesize", &maxfilesize) == 0 && + maxfilesize != 0 && maxfilesize != tmp->tm_maxfilesize) + return (EOPNOTSUPP); + if (tmp->tm_nonc != + (vfs_getopt(opts, "nonc", NULL, NULL) == 0)) + return (EOPNOTSUPP); + if (tmp->tm_pgread != + (vfs_getopt(opts, "pgread", NULL, NULL) == 0)) + return (EOPNOTSUPP); + + /* + * These options can be modified. + */ + if (vfs_getopt_size(opts, "easize", &ea_max_size) != 0) tmp->tm_ea_memory_max = ea_max_size; - } - if (vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) && - !tmp->tm_ronly) { + tmp->tm_nomtime = (vfs_getopt(opts, "nomtime", NULL, 0) == 0); + + /* + * Handle read-write to read-only or vice versa. + */ + if (vfs_flagopt(opts, "ro", NULL, 0) && !tmp->tm_ronly) { /* RW -> RO */ return (tmpfs_rw_to_ro(mp)); - } else if (!vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) && - tmp->tm_ronly) { + } + if (!vfs_flagopt(opts, "ro", NULL, 0) && tmp->tm_ronly) { /* RO -> RW */ tmp->tm_ronly = 0; MNT_ILOCK(mp); mp->mnt_flag &= ~MNT_RDONLY; MNT_IUNLOCK(mp); } - tmp->tm_nomtime = vfs_getopt(mp->mnt_optnew, "nomtime", NULL, - 0) == 0; + + /* + * Check if fast path lookup is still supported. + */ MNT_ILOCK(mp); - if ((mp->mnt_flag & MNT_UNION) == 0) { + if (!tmp->tm_nonc && (mp->mnt_flag & MNT_UNION) == 0) { mp->mnt_kern_flag |= MNTK_FPLOOKUP; } else { mp->mnt_kern_flag &= ~MNTK_FPLOOKUP; @@ -392,25 +416,25 @@ tmpfs_mount(struct mount *mp) return (error); if (mp->mnt_cred->cr_ruid != 0 || - vfs_scanopt(mp->mnt_optnew, "gid", "%d", &root_gid) != 1) + vfs_scanopt(opts, "gid", "%d", &root_gid) != 1) root_gid = va.va_gid; if (mp->mnt_cred->cr_ruid != 0 || - vfs_scanopt(mp->mnt_optnew, "uid", "%d", &root_uid) != 1) + vfs_scanopt(opts, "uid", "%d", &root_uid) != 1) root_uid = va.va_uid; if (mp->mnt_cred->cr_ruid != 0 || - vfs_scanopt(mp->mnt_optnew, "mode", "%ho", &root_mode) != 1) + vfs_scanopt(opts, "mode", "%ho", &root_mode) != 1) root_mode = va.va_mode; - if (vfs_getopt_size(mp->mnt_optnew, "inodes", &nodes_max) != 0) + if (vfs_getopt_size(opts, "inodes", &nodes_max) != 0) nodes_max = 0; - if (vfs_getopt_size(mp->mnt_optnew, "size", &size_max) != 0) + if (vfs_getopt_size(opts, "size", &size_max) != 0) size_max = 0; - if (vfs_getopt_size(mp->mnt_optnew, "maxfilesize", &maxfilesize) != 0) + if (vfs_getopt_size(opts, "maxfilesize", &maxfilesize) != 0) maxfilesize = 0; - if (vfs_getopt_size(mp->mnt_optnew, "easize", &ea_max_size) != 0) + if (vfs_getopt_size(opts, "easize", &ea_max_size) != 0) ea_max_size = 0; - nonc = vfs_getopt(mp->mnt_optnew, "nonc", NULL, NULL) == 0; - nomtime = vfs_getopt(mp->mnt_optnew, "nomtime", NULL, NULL) == 0; - pgread = vfs_getopt(mp->mnt_optnew, "pgread", NULL, NULL) == 0; + nonc = vfs_getopt(opts, "nonc", NULL, NULL) == 0; + nomtime = vfs_getopt(opts, "nomtime", NULL, NULL) == 0; + pgread = vfs_getopt(opts, "pgread", NULL, NULL) == 0; /* Do not allow mounts if we do not have enough memory to preserve * the minimum reserved pages. */