unix: add mount_setattr support for linux
This brings in mount_setattr(2) support, added to Linux 5.12 kernel and
documented at https://man7.org/linux/man-pages/man2/mount_setattr.2.html
Change-Id: I5609980c18aef80f9429a8c8cec8c1e129f74ab7
Reviewed-on: https://go-review.googlesource.com/c/sys/+/363444
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
diff --git a/unix/linux/types.go b/unix/linux/types.go
index b43a528..1238146 100644
--- a/unix/linux/types.go
+++ b/unix/linux/types.go
@@ -877,6 +877,8 @@
AT_STATX_FORCE_SYNC = C.AT_STATX_FORCE_SYNC
AT_STATX_DONT_SYNC = C.AT_STATX_DONT_SYNC
+ AT_RECURSIVE = C.AT_RECURSIVE
+
AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
@@ -3865,3 +3867,7 @@
SHM_RDONLY = C.SHM_RDONLY
SHM_RND = C.SHM_RND
)
+
+// mount_setattr
+
+type MountAttr C.struct_mount_attr
diff --git a/unix/mkerrors.sh b/unix/mkerrors.sh
index a74ef58..4945739 100755
--- a/unix/mkerrors.sh
+++ b/unix/mkerrors.sh
@@ -239,6 +239,7 @@
#include <linux/magic.h>
#include <linux/memfd.h>
#include <linux/module.h>
+#include <linux/mount.h>
#include <linux/netfilter/nfnetlink.h>
#include <linux/netlink.h>
#include <linux/net_namespace.h>
@@ -520,7 +521,7 @@
$2 ~ /^HW_MACHINE$/ ||
$2 ~ /^SYSCTL_VERS/ ||
$2 !~ "MNT_BITS" &&
- $2 ~ /^(MS|MNT|UMOUNT)_/ ||
+ $2 ~ /^(MS|MNT|MOUNT|UMOUNT)_/ ||
$2 ~ /^NS_GET_/ ||
$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||
$2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|TFD)_/ ||
diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go
index bc9dc2e..4bc5baf 100644
--- a/unix/syscall_linux.go
+++ b/unix/syscall_linux.go
@@ -1775,6 +1775,16 @@
return mount(source, target, fstype, flags, datap)
}
+//sys mountSetattr(dirfd int, pathname string, flags uint, attr *MountAttr, size uintptr) (err error) = SYS_MOUNT_SETATTR
+
+// MountSetattr is a wrapper for mount_setattr(2).
+// https://man7.org/linux/man-pages/man2/mount_setattr.2.html
+//
+// Requires kernel >= 5.12.
+func MountSetattr(dirfd int, pathname string, flags uint, attr *MountAttr) error {
+ return mountSetattr(dirfd, pathname, flags, attr, unsafe.Sizeof(*attr))
+}
+
func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
if raceenabled {
raceReleaseMerge(unsafe.Pointer(&ioSync))
diff --git a/unix/zerrors_linux.go b/unix/zerrors_linux.go
index 4e4e7f8..d175aae 100644
--- a/unix/zerrors_linux.go
+++ b/unix/zerrors_linux.go
@@ -1476,6 +1476,18 @@
MNT_FORCE = 0x1
MODULE_INIT_IGNORE_MODVERSIONS = 0x1
MODULE_INIT_IGNORE_VERMAGIC = 0x2
+ MOUNT_ATTR_IDMAP = 0x100000
+ MOUNT_ATTR_NOATIME = 0x10
+ MOUNT_ATTR_NODEV = 0x4
+ MOUNT_ATTR_NODIRATIME = 0x80
+ MOUNT_ATTR_NOEXEC = 0x8
+ MOUNT_ATTR_NOSUID = 0x2
+ MOUNT_ATTR_NOSYMFOLLOW = 0x200000
+ MOUNT_ATTR_RDONLY = 0x1
+ MOUNT_ATTR_RELATIME = 0x0
+ MOUNT_ATTR_SIZE_VER0 = 0x20
+ MOUNT_ATTR_STRICTATIME = 0x20
+ MOUNT_ATTR__ATIME = 0x70
MSDOS_SUPER_MAGIC = 0x4d44
MSG_BATCH = 0x40000
MSG_CMSG_CLOEXEC = 0x40000000
diff --git a/unix/zsyscall_linux.go b/unix/zsyscall_linux.go
index fe6c232..93edda4 100644
--- a/unix/zsyscall_linux.go
+++ b/unix/zsyscall_linux.go
@@ -409,6 +409,21 @@
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func mountSetattr(dirfd int, pathname string, flags uint, attr *MountAttr, size uintptr) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(pathname)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_MOUNT_SETATTR, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(unsafe.Pointer(attr)), uintptr(size), 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Acct(path string) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go
index d887d9b..37b5214 100644
--- a/unix/ztypes_linux.go
+++ b/unix/ztypes_linux.go
@@ -743,6 +743,8 @@
AT_STATX_FORCE_SYNC = 0x2000
AT_STATX_DONT_SYNC = 0x4000
+ AT_RECURSIVE = 0x8000
+
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
@@ -3959,3 +3961,10 @@
SHM_RDONLY = 0x1000
SHM_RND = 0x2000
)
+
+type MountAttr struct {
+ Attr_set uint64
+ Attr_clr uint64
+ Propagation uint64
+ Userns_fd uint64
+}