Repository: go
Issue: x/sys/unix: Missing MS_* Flags on FreeBSD
Labels: help wanted,OS-FreeBSD,NeedsInvestigation,FeatureRequest,compiler/runtime

### What version of Go are you using (`go version`)?

<pre>
$ go version
go version go1.20.3 freebsd/amd64
</pre>

### Does this issue reproduce with the latest release?

yes.

### What operating system and processor architecture are you using (`go env`)?

<details><summary><code>go env</code> Output</summary><br><pre>
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/meena/.cache/go-build"
GOENV="/home/meena/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="freebsd"
GOINSECURE=""
GOMODCACHE="/home/meena/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="freebsd"
GOPATH="/home/meena/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go120"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go120/pkg/tool/freebsd_amd64"
GOVCS=""
GOVERSION="go1.20.3"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="cc"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-O2 -g"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-O2 -g"
CGO_FFLAGS="-O2 -g"
CGO_LDFLAGS="-O2 -g"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build37119700=/tmp/go-build -gno-record-gcc-switches"
</pre></details>

### What did you do?

```
% go install github.com:/lxc/lxd/lxd-agent
```

### What did you expect to see?

a successful compile


### What did you see instead?

```
# github.com/lxc/lxd/lxd/storage/filesystem
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:176:32: undefined: unix.MS_SYNCHRONOUS
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:177:32: undefined: unix.MS_NOATIME
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:178:31: undefined: unix.MS_BIND
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:180:32: undefined: unix.MS_NODEV
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:181:32: undefined: unix.MS_NODIRATIME
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:182:31: undefined: unix.MS_DIRSYNC
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:183:32: undefined: unix.MS_NOEXEC
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:184:31: undefined: unix.MS_LAZYTIME
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:185:31: undefined: unix.MS_MANDLOCK
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:186:31: undefined: unix.MS_NOATIME
go/pkg/mod/github.com/lxc/lxd@v0.0.0-20230425125636-f8330b39bba3/lxd/storage/filesystem/fs.go:186:31: too many errors
```

Most of these flags exist on FreeBSD, but under a different prefix:

```
sys/sys/mount.h:#define MNT_VNODE_FOREACH_ALL(vp, mp, mvp)				\
sys/sys/mount.h:#define MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp)				\
sys/sys/mount.h:#define MNT_VNODE_FOREACH_LAZY(vp, mp, mvp, cb, cbarg)			\
sys/sys/mount.h:#define MNT_VNODE_FOREACH_LAZY_ABORT(mp, mvp)				\
sys/sys/mount.h:#define	MNT_ILOCK(mp)	mtx_lock(&(mp)->mnt_mtx)
sys/sys/mount.h:#define	MNT_ITRYLOCK(mp) mtx_trylock(&(mp)->mnt_mtx)
sys/sys/mount.h:#define	MNT_IUNLOCK(mp)	mtx_unlock(&(mp)->mnt_mtx)
sys/sys/mount.h:#define	MNT_MTX(mp)	(&(mp)->mnt_mtx)
sys/sys/mount.h:#define	MNT_REF(mp)	do {						\
sys/sys/mount.h:#define	MNT_REL(mp)	do {						\
sys/sys/mount.h:#define MNTOPT_NAMES							\
sys/sys/mount.h:#define	MNT_RDONLY	0x0000000000000001ULL /* read only filesystem */
sys/sys/mount.h:#define	MNT_SYNCHRONOUS	0x0000000000000002ULL /* fs written synchronously */
sys/sys/mount.h:#define	MNT_NOEXEC	0x0000000000000004ULL /* can't exec from filesystem */
sys/sys/mount.h:#define	MNT_NOSUID	0x0000000000000008ULL /* don't honor setuid fs bits */
sys/sys/mount.h:#define	MNT_NFS4ACLS	0x0000000000000010ULL /* enable NFS version 4 ACLs */
sys/sys/mount.h:#define	MNT_UNION	0x0000000000000020ULL /* union with underlying fs */
sys/sys/mount.h:#define	MNT_ASYNC	0x0000000000000040ULL /* fs written asynchronously */
sys/sys/mount.h:#define	MNT_SUIDDIR	0x0000000000100000ULL /* special SUID dir handling */
sys/sys/mount.h:#define	MNT_SOFTDEP	0x0000000000200000ULL /* using soft updates */
sys/sys/mount.h:#define	MNT_NOSYMFOLLOW	0x0000000000400000ULL /* do not follow symlinks */
sys/sys/mount.h:#define	MNT_GJOURNAL	0x0000000002000000ULL /* GEOM journal support enabled */
sys/sys/mount.h:#define	MNT_MULTILABEL	0x0000000004000000ULL /* MAC support for objects */
sys/sys/mount.h:#define	MNT_ACLS	0x0000000008000000ULL /* ACL support enabled */
sys/sys/mount.h:#define	MNT_NOATIME	0x0000000010000000ULL /* dont update file access time */
sys/sys/mount.h:#define	MNT_NOCLUSTERR	0x0000000040000000ULL /* disable cluster read */
sys/sys/mount.h:#define	MNT_NOCLUSTERW	0x0000000080000000ULL /* disable cluster write */
sys/sys/mount.h:#define	MNT_SUJ		0x0000000100000000ULL /* using journaled soft updates */
sys/sys/mount.h:#define	MNT_AUTOMOUNTED	0x0000000200000000ULL /* mounted by automountd(8) */
sys/sys/mount.h:#define	MNT_UNTRUSTED	0x0000000800000000ULL /* filesys metadata untrusted */
sys/sys/mount.h:#define	MNT_EXRDONLY	0x0000000000000080ULL	/* exported read only */
sys/sys/mount.h:#define	MNT_EXPORTED	0x0000000000000100ULL	/* filesystem is exported */
sys/sys/mount.h:#define	MNT_DEFEXPORTED	0x0000000000000200ULL	/* exported to the world */
sys/sys/mount.h:#define	MNT_EXPORTANON	0x0000000000000400ULL	/* anon uid mapping for all */
sys/sys/mount.h:#define	MNT_EXKERB	0x0000000000000800ULL	/* exported with Kerberos */
sys/sys/mount.h:#define	MNT_EXPUBLIC	0x0000000020000000ULL	/* public export (WebNFS) */
sys/sys/mount.h:#define	MNT_EXTLS	0x0000004000000000ULL /* require TLS */
sys/sys/mount.h:#define	MNT_EXTLSCERT	0x0000008000000000ULL /* require TLS with client cert */
sys/sys/mount.h:#define	MNT_EXTLSCERTUSER 0x0000010000000000ULL /* require TLS with user cert */
sys/sys/mount.h:#define	MNT_LOCAL	0x0000000000001000ULL /* filesystem is stored locally */
sys/sys/mount.h:#define	MNT_QUOTA	0x0000000000002000ULL /* quotas are enabled on fs */
sys/sys/mount.h:#define	MNT_ROOTFS	0x0000000000004000ULL /* identifies the root fs */
sys/sys/mount.h:#define	MNT_USER	0x0000000000008000ULL /* mounted by a user */
sys/sys/mount.h:#define	MNT_IGNORE	0x0000000000800000ULL /* do not show entry in df */
sys/sys/mount.h:#define	MNT_VERIFIED	0x0000000400000000ULL /* filesystem is verified */
sys/sys/mount.h:#define	MNT_VISFLAGMASK	(MNT_RDONLY	| MNT_SYNCHRONOUS | MNT_NOEXEC	| \
sys/sys/mount.h:#define	MNT_UPDATEMASK (MNT_NOSUID	| MNT_NOEXEC	| \
sys/sys/mount.h:#define	MNT_UPDATE	0x0000000000010000ULL /* not real mount, just update */
sys/sys/mount.h:#define	MNT_DELEXPORT	0x0000000000020000ULL /* delete export host lists */
sys/sys/mount.h:#define	MNT_RELOAD	0x0000000000040000ULL /* reload filesystem data */
sys/sys/mount.h:#define	MNT_FORCE	0x0000000000080000ULL /* force unmount or readonly */
sys/sys/mount.h:#define	MNT_SNAPSHOT	0x0000000001000000ULL /* snapshot the filesystem */
sys/sys/mount.h:#define	MNT_NONBUSY	0x0000000004000000ULL /* check vnode use counts. */
sys/sys/mount.h:#define	MNT_BYFSID	0x0000000008000000ULL /* specify filesystem by ID. */
sys/sys/mount.h:#define	MNT_NOCOVER	0x0000001000000000ULL /* Do not cover a mount point */
sys/sys/mount.h:#define	MNT_EMPTYDIR	0x0000002000000000ULL /* Only mount on empty dir */
sys/sys/mount.h:#define	MNT_RECURSE	0x0000100000000000ULL /* recursively unmount uppers */
sys/sys/mount.h:#define	MNT_DEFERRED    0x0000200000000000ULL /* unmount in async context */
sys/sys/mount.h:#define	MNT_CMDFLAGS   (MNT_UPDATE	| MNT_DELEXPORT	| MNT_RELOAD	| \
sys/sys/mount.h:#define MNTK_UNMOUNTF	0x00000001	/* forced unmount in progress */
sys/sys/mount.h:#define MNTK_ASYNC	0x00000002	/* filtered async flag */
sys/sys/mount.h:#define MNTK_SOFTDEP	0x00000004	/* async disabled by softdep */
sys/sys/mount.h:#define MNTK_NOMSYNC	0x00000008	/* don't do msync */
sys/sys/mount.h:#define	MNTK_DRAINING	0x00000010	/* lock draining is happening */
sys/sys/mount.h:#define	MNTK_REFEXPIRE	0x00000020	/* refcount expiring is happening */
sys/sys/mount.h:#define MNTK_EXTENDED_SHARED	0x00000040 /* Allow shared locking for more ops */
sys/sys/mount.h:#define	MNTK_SHARED_WRITES	0x00000080 /* Allow shared locking for writes */
sys/sys/mount.h:#define	MNTK_NO_IOPF	0x00000100	/* Disallow page faults during reads
sys/sys/mount.h:#define	MNTK_RECURSE		0x00000200 /* pending recursive unmount */
sys/sys/mount.h:#define	MNTK_UPPER_WAITER	0x00000400 /* waiting to drain MNTK_UPPER_PENDING */
sys/sys/mount.h:#define	MNTK_UNLOCKED_INSMNTQUE	0x00001000 /* fs does not lock the vnode for insmntque */
sys/sys/mount.h:#define	MNTK_UNMAPPED_BUFS	0x00002000
sys/sys/mount.h:#define	MNTK_USES_BCACHE	0x00004000 /* FS uses the buffer cache. */
sys/sys/mount.h:#define	MNTK_VMSETSIZE_BUG	0x00010000
sys/sys/mount.h:#define	MNTK_UNIONFS	0x00020000	/* A hack for F_ISUNIONSTACK */
sys/sys/mount.h:#define	MNTK_FPLOOKUP	0x00040000	/* fast path lookup is supported */
sys/sys/mount.h:#define	MNTK_SUSPEND_ALL	0x00080000 /* Suspended by all-fs suspension */
sys/sys/mount.h:#define	MNTK_TASKQUEUE_WAITER	0x00100000 /* Waiting on unmount taskqueue */
sys/sys/mount.h:#define	MNTK_NOASYNC	0x00800000	/* disable async */
sys/sys/mount.h:#define	MNTK_UNMOUNT	0x01000000	/* unmount in progress */
sys/sys/mount.h:#define	MNTK_MWAIT	0x02000000	/* waiting for unmount to finish */
sys/sys/mount.h:#define	MNTK_SUSPEND	0x08000000	/* request write suspension */
sys/sys/mount.h:#define	MNTK_SUSPEND2	0x04000000	/* block secondary writes */
sys/sys/mount.h:#define	MNTK_SUSPENDED	0x10000000	/* write operations are suspended */
sys/sys/mount.h:#define	MNTK_NULL_NOCACHE	0x20000000 /* auto disable cache for nullfs
sys/sys/mount.h:#define MNTK_LOOKUP_SHARED	0x40000000 /* FS supports shared lock lookups */
sys/sys/mount.h:#define MNT_WAIT	1	/* synchronously wait for I/O to complete */
sys/sys/mount.h:#define MNT_NOWAIT	2	/* start all I/O, but do not wait for it */
sys/sys/mount.h:#define MNT_LAZY	3	/* push data not written by filesystem syncer */
sys/sys/mount.h:#define MNT_SUSPEND	4	/* Suspend file system after sync */
sys/kern/vfs_subr.c:#define	MNT_FLAG(flag)	do {						\
sys/kern/vfs_subr.c:#define	MNT_KERN_FLAG(flag)	do {					\
```