From 289d7a0edf712062d9f1484b07bdf2383f48802f Mon Sep 17 00:00:00 2001 From: Alexey Perevalov Date: Fri, 1 Apr 2022 15:49:24 +0000 Subject: [PATCH] unix: add MoveMount syscall on linux This syscall is not yet described in linux man pages (https://github.com/mkerrisk/man-pages.git), but it was submitted to lkml https://lwn.net/Articles/802095/ This syscall appeared in linux v5.2. Change-Id: I0708bfceda8d7a7608d0d0e75e36c3d81302dedb Reviewed-on: https://go-review.googlesource.com/c/sys/+/397095 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gopher Robot Auto-Submit: Ian Lance Taylor Reviewed-by: Tobias Klauser --- unix/linux/types.go | 8 ++++++++ unix/syscall_linux.go | 1 + unix/zsyscall_linux.go | 20 ++++++++++++++++++++ unix/ztypes_linux.go | 8 ++++++++ 4 files changed, 37 insertions(+) diff --git a/unix/linux/types.go b/unix/linux/types.go index c8d176ef..80260dbc 100644 --- a/unix/linux/types.go +++ b/unix/linux/types.go @@ -905,6 +905,14 @@ const ( OPEN_TREE_CLONE = C.OPEN_TREE_CLONE OPEN_TREE_CLOEXEC = C.OPEN_TREE_CLOEXEC + + MOVE_MOUNT_F_SYMLINKS = C.MOVE_MOUNT_F_SYMLINKS + MOVE_MOUNT_F_AUTOMOUNTS = C.MOVE_MOUNT_F_AUTOMOUNTS + MOVE_MOUNT_F_EMPTY_PATH = C.MOVE_MOUNT_F_EMPTY_PATH + MOVE_MOUNT_T_SYMLINKS = C.MOVE_MOUNT_T_SYMLINKS + MOVE_MOUNT_T_AUTOMOUNTS = C.MOVE_MOUNT_T_AUTOMOUNTS + MOVE_MOUNT_T_EMPTY_PATH = C.MOVE_MOUNT_T_EMPTY_PATH + MOVE_MOUNT_SET_GROUP = C.MOVE_MOUNT_SET_GROUP ) type OpenHow C.struct_open_how diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index 298323eb..eeae6dbb 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -1859,6 +1859,7 @@ func Getpgrp() (pid int) { //sys MemfdCreate(name string, flags int) (fd int, err error) //sys Mkdirat(dirfd int, path string, mode uint32) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys MoveMount(fromDirfd int, fromPathName string, toDirfd int, toPathName string, flags int) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys OpenTree(dfd int, fileName string, flags uint) (r int, err error) //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) diff --git a/unix/zsyscall_linux.go b/unix/zsyscall_linux.go index ca65ac82..198b4ac0 100644 --- a/unix/zsyscall_linux.go +++ b/unix/zsyscall_linux.go @@ -1205,6 +1205,26 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func MoveMount(fromDirfd int, fromPathName string, toDirfd int, toPathName string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fromPathName) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(toPathName) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOVE_MOUNT, uintptr(fromDirfd), uintptr(unsafe.Pointer(_p0)), uintptr(toDirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/unix/ztypes_linux.go b/unix/ztypes_linux.go index e61891df..97f6aa6d 100644 --- a/unix/ztypes_linux.go +++ b/unix/ztypes_linux.go @@ -756,6 +756,14 @@ const ( AT_EACCESS = 0x200 OPEN_TREE_CLONE = 0x1 + + MOVE_MOUNT_F_SYMLINKS = 0x1 + MOVE_MOUNT_F_AUTOMOUNTS = 0x2 + MOVE_MOUNT_F_EMPTY_PATH = 0x4 + MOVE_MOUNT_T_SYMLINKS = 0x10 + MOVE_MOUNT_T_AUTOMOUNTS = 0x20 + MOVE_MOUNT_T_EMPTY_PATH = 0x40 + MOVE_MOUNT_SET_GROUP = 0x100 ) type OpenHow struct {