From 0a5406a5449cd9832275d0f9f1460f17d19301f0 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Fri, 12 Nov 2021 01:10:54 -0800 Subject: [PATCH] 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 Reviewed-by: Tobias Klauser Run-TryBot: Tobias Klauser --- unix/linux/types.go | 6 ++++++ unix/mkerrors.sh | 3 ++- unix/syscall_linux.go | 10 ++++++++++ unix/zerrors_linux.go | 12 ++++++++++++ unix/zsyscall_linux.go | 15 +++++++++++++++ unix/ztypes_linux.go | 9 +++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) diff --git a/unix/linux/types.go b/unix/linux/types.go index b43a528d..12381463 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -877,6 +877,8 @@ const ( 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 @@ const ( 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 a74ef58f..4945739e 100755 --- a/unix/mkerrors.sh +++ b/unix/mkerrors.sh @@ -239,6 +239,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -520,7 +521,7 @@ ccflags="$@" $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 bc9dc2e1..4bc5baf7 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -1775,6 +1775,16 @@ func Mount(source string, target string, fstype string, flags uintptr, data stri 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 4e4e7f82..d175aae8 100644 --- a/unix/zerrors_linux.go +++ b/unix/zerrors_linux.go @@ -1476,6 +1476,18 @@ const ( 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 fe6c232c..93edda4c 100644 --- a/unix/zsyscall_linux.go +++ b/unix/zsyscall_linux.go @@ -409,6 +409,21 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt // 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 d887d9b5..37b52143 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -743,6 +743,8 @@ const ( 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 @@ const ( SHM_RDONLY = 0x1000 SHM_RND = 0x2000 ) + +type MountAttr struct { + Attr_set uint64 + Attr_clr uint64 + Propagation uint64 + Userns_fd uint64 +}