From nobody Tue May 19 06:54:50 2026 X-Original-To: dev-commits-src-main@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 4gKQQg038Vz6dgb4 for ; Tue, 19 May 2026 06:54:51 +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 4gKQQf5tskz3jfh for ; Tue, 19 May 2026 06:54:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779173690; 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=gLD/QH2bFasYYoOdKZadQ5LHUqiUMS8kZP7l1rQMLH4=; b=ycTR5gwbj3cBqRV1yYQ5wybkvBJsNi1Ka7V3DsTNnvuAY5aysyLPcWxiwMWm3fPHhgMR1g hISq0HPN8B/dhaYGX+TmLY6xHPKnD3XnGNgXMH8KEX0e0shMLOGMKEA3VCY5mMzPxrXQD4 MMaYVkNfMNyYEekA5rFkV1/GRVn1kTGWcv0s6rQUvmjyH+z2Xs5kqSiXNC1yikAPyc3Iw4 AXKGexJQQscIFFPZtWavLiwhLdrj7OCTwny2JJWPzReir6SanYe/+flpGHs8vrbL0CVZkZ NP0Fnml/jJK9zuchBEA+ARjJqHoAAKuNg2ul6btOzqqKERxPf/bAF5dinCz+nQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779173690; a=rsa-sha256; cv=none; b=ZrfZf4pNqPcZBbe3cAYtD2/OLyzl9UoEeSODYhSN5xG9ML8BaN1kDztqJZFg2Ei/5giNUV 2hoIMYcBceIRAee9nkm4M3C/qRBhkuOjV7TRuoWFYDuO4r0QXd40Aoao7vHFiDDFWqS0+C h5j/ge9j6mCY1wXc5A2nKMmdk0YuuLYZq/E8WIoppNF3mttQoWKwgSZH1quaSSdBo2UlCa vJ91op3R9O38E4gfDGmM40MW/wZAm5sgwYlvHvIdV3U2I0wCeO36Tzg5grQHw8IheOTs/g iQ/ogxL5oIjLVCKXKDgjf0VUv7EuHxckzx4bpLNBks+Y/dKcg3pVB0wNQYAQdg== 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=1779173690; 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=gLD/QH2bFasYYoOdKZadQ5LHUqiUMS8kZP7l1rQMLH4=; b=w8y2w4EcPkyDsqtEgNZePVMpbHhBG5k4vZ37rq2XRCx0TkeQdatc1gPNF+w7st+nZTXRio SoG7rjy0mOo0xf9xMZ02GQjaC5r+h+LpT+rWvmO5S1CFJJ/SMZMzbWo99XZaMOTXLdEmwv a/P5wDZAQHPYE598bmcb4BN+sR3eq0cl57SqLg9pmJLGvb84i6jPT4CXXOiFQi3VkX9ID0 IkWIAXC/8wjA47M19WJajOm02KIU36l02ds4L9+wye9Rfl34F8G3jgBbLDH29cUikgglSz BEcOBooM2LUm/19OrRJxDKkeNm4XI0JIi7kVya3ZqlpQjgeEjrMmLrjVpiF1/w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gKQQf5GcRz13S5 for ; Tue, 19 May 2026 06:54:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 25d3a by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 19 May 2026 06:54:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav Subject: git: 1cfc208a07b6 - main - tmpfs: Overhaul option handling on remount List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: 1cfc208a07b64a64377a4f8fe51c28f588a929cf Auto-Submitted: auto-generated Date: Tue, 19 May 2026 06:54:50 +0000 Message-Id: <6a0c093a.25d3a.5dda74c9@gitrepo.freebsd.org> The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=1cfc208a07b64a64377a4f8fe51c28f588a929cf commit 1cfc208a07b64a64377a4f8fe51c28f588a929cf Author: Dag-Erling Smørgrav AuthorDate: 2026-05-19 06:54:28 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2026-05-19 06:54:28 +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 --- 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 431893b77bb9..5a9b9782b9da 100644 --- a/sys/fs/tmpfs/tmpfs_vfsops.c +++ b/sys/fs/tmpfs/tmpfs_vfsops.c @@ -93,10 +93,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) { @@ -325,6 +321,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. */ @@ -338,44 +335,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; @@ -391,25 +415,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. */