Преглед изворни кода

x/sys/unix: add support for O_TMPFILE in Linux

Since Linux 3.11, O_TMPFILE flag can be used in open syscall to create
an unnamed file in a directory. The file occupies space in the
filesystem, and can be given a name using linkat syscall. If the file is
closed without being given a name, its contents are deleted.

See the manpage open(2) in Linux for details.

Exports O_TMPFILE for Linux in 386 and amd64 (other architectures
already had it). Exports Linkat syscall and AT_SYMLINK_FOLLOW (used for
giving a name to the file) for all Linux in all architectures.

Fixes golang/go#7830.

Change-Id: Ib82e44f405b227e227b9cbf317c2657b32e046f5
Reviewed-on: https://go-review.googlesource.com/21003
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Caio Marcelo de Oliveira Filho пре 9 година
родитељ
комит
23999e87b4

+ 2 - 2
unix/syscall_linux.go

@@ -36,10 +36,10 @@ func Creat(path string, mode uint32) (fd int, err error) {
 	return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
 	return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
 }
 }
 
 
-//sys	linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error)
+//sys	Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error)
 
 
 func Link(oldpath string, newpath string) (err error) {
 func Link(oldpath string, newpath string) (err error) {
-	return linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)
+	return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)
 }
 }
 
 
 func Mkdir(path string, mode uint32) (err error) {
 func Mkdir(path string, mode uint32) (err error) {

+ 1 - 0
unix/types_linux.go

@@ -400,6 +400,7 @@ type EpollEvent C.struct_my_epoll_event
 const (
 const (
 	AT_FDCWD            = C.AT_FDCWD
 	AT_FDCWD            = C.AT_FDCWD
 	AT_REMOVEDIR        = C.AT_REMOVEDIR
 	AT_REMOVEDIR        = C.AT_REMOVEDIR
+	AT_SYMLINK_FOLLOW   = C.AT_SYMLINK_FOLLOW
 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
 	AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
 )
 )
 
 

+ 1 - 0
unix/zerrors_linux_386.go

@@ -826,6 +826,7 @@ const (
 	O_RDWR                           = 0x2
 	O_RDWR                           = 0x2
 	O_RSYNC                          = 0x101000
 	O_RSYNC                          = 0x101000
 	O_SYNC                           = 0x101000
 	O_SYNC                           = 0x101000
+	O_TMPFILE                        = 0x410000
 	O_TRUNC                          = 0x200
 	O_TRUNC                          = 0x200
 	O_WRONLY                         = 0x1
 	O_WRONLY                         = 0x1
 	PACKET_ADD_MEMBERSHIP            = 0x1
 	PACKET_ADD_MEMBERSHIP            = 0x1

+ 1 - 0
unix/zerrors_linux_amd64.go

@@ -826,6 +826,7 @@ const (
 	O_RDWR                           = 0x2
 	O_RDWR                           = 0x2
 	O_RSYNC                          = 0x101000
 	O_RSYNC                          = 0x101000
 	O_SYNC                           = 0x101000
 	O_SYNC                           = 0x101000
+	O_TMPFILE                        = 0x410000
 	O_TRUNC                          = 0x200
 	O_TRUNC                          = 0x200
 	O_WRONLY                         = 0x1
 	O_WRONLY                         = 0x1
 	PACKET_ADD_MEMBERSHIP            = 0x1
 	PACKET_ADD_MEMBERSHIP            = 0x1

+ 1 - 1
unix/zsyscall_linux_386.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_amd64.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_arm.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_arm64.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_mips64.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_mips64le.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_ppc64.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 1 - 1
unix/zsyscall_linux_ppc64le.go

@@ -14,7 +14,7 @@ var _ syscall.Errno
 
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
 
-func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
+func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
 	var _p0 *byte
 	var _p0 *byte
 	_p0, err = BytePtrFromString(oldpath)
 	_p0, err = BytePtrFromString(oldpath)
 	if err != nil {
 	if err != nil {

+ 2 - 1
unix/ztypes_linux_386.go

@@ -574,8 +574,9 @@ type EpollEvent struct {
 
 
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
-	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
+	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 
 type Termios struct {
 type Termios struct {

+ 2 - 1
unix/ztypes_linux_amd64.go

@@ -592,8 +592,9 @@ type EpollEvent struct {
 
 
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
-	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
+	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 
 type Termios struct {
 type Termios struct {

+ 2 - 1
unix/ztypes_linux_arm.go

@@ -563,8 +563,9 @@ type EpollEvent struct {
 
 
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
-	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
+	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 
 type Termios struct {
 type Termios struct {

+ 1 - 0
unix/ztypes_linux_arm64.go

@@ -580,6 +580,7 @@ type EpollEvent struct {
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
 	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 

+ 1 - 0
unix/ztypes_linux_mips64.go

@@ -585,6 +585,7 @@ type EpollEvent struct {
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
 	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 

+ 1 - 0
unix/ztypes_linux_mips64le.go

@@ -585,6 +585,7 @@ type EpollEvent struct {
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
 	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 

+ 1 - 0
unix/ztypes_linux_ppc64.go

@@ -590,6 +590,7 @@ type EpollEvent struct {
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
 	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )
 
 

+ 1 - 0
unix/ztypes_linux_ppc64le.go

@@ -590,6 +590,7 @@ type EpollEvent struct {
 const (
 const (
 	AT_FDCWD            = -0x64
 	AT_FDCWD            = -0x64
 	AT_REMOVEDIR        = 0x200
 	AT_REMOVEDIR        = 0x200
+	AT_SYMLINK_FOLLOW   = 0x400
 	AT_SYMLINK_NOFOLLOW = 0x100
 	AT_SYMLINK_NOFOLLOW = 0x100
 )
 )