2024-12-12 19:44:53 +00:00
|
|
|
//go:build amd64 || arm64 || riscv64
|
2024-05-27 15:46:15 +00:00
|
|
|
|
|
|
|
package vfs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"golang.org/x/sys/unix"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2024-09-30 10:46:23 +00:00
|
|
|
// https://godbolt.org/z/1PcK5vea3
|
2024-05-27 15:46:15 +00:00
|
|
|
_F2FS_IOC_START_ATOMIC_WRITE = 62721
|
|
|
|
_F2FS_IOC_COMMIT_ATOMIC_WRITE = 62722
|
|
|
|
_F2FS_IOC_ABORT_ATOMIC_WRITE = 62725
|
2024-10-25 16:09:18 +00:00
|
|
|
_F2FS_IOC_GET_FEATURES = 2147808524 // -2147158772
|
2024-05-27 15:46:15 +00:00
|
|
|
_F2FS_FEATURE_ATOMIC_WRITE = 4
|
|
|
|
)
|
|
|
|
|
2024-08-15 00:30:58 +00:00
|
|
|
// notest
|
|
|
|
|
2024-05-27 15:46:15 +00:00
|
|
|
func osBatchAtomic(file *os.File) bool {
|
|
|
|
flags, err := unix.IoctlGetInt(int(file.Fd()), _F2FS_IOC_GET_FEATURES)
|
|
|
|
return err == nil && flags&_F2FS_FEATURE_ATOMIC_WRITE != 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *vfsFile) BeginAtomicWrite() error {
|
|
|
|
return unix.IoctlSetInt(int(f.Fd()), _F2FS_IOC_START_ATOMIC_WRITE, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *vfsFile) CommitAtomicWrite() error {
|
|
|
|
return unix.IoctlSetInt(int(f.Fd()), _F2FS_IOC_COMMIT_ATOMIC_WRITE, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *vfsFile) RollbackAtomicWrite() error {
|
|
|
|
return unix.IoctlSetInt(int(f.Fd()), _F2FS_IOC_ABORT_ATOMIC_WRITE, 0)
|
|
|
|
}
|