mirror of
https://github.com/golang/sys.git
synced 2026-02-09 04:06:04 +03:00
Attempt to fix the linux ioctl FIDEDUPERANGE
This commit is contained in:
@@ -473,7 +473,14 @@ type Flock_t C.struct_flock
|
||||
|
||||
type FileCloneRange C.struct_file_clone_range
|
||||
|
||||
type FileDedupeRange C.struct_file_dedupe_range
|
||||
type RawFileDedupeRange C.struct_file_dedupe_range
|
||||
|
||||
type RawFileDedupeRangeInfo C.struct_file_dedupe_range_info
|
||||
|
||||
const (
|
||||
SizeofRawFileDedupeRange = C.sizeof_struct_file_dedupe_range
|
||||
SizeofRawFileDedupeRangeInfo = C.sizeof_struct_file_dedupe_range_info
|
||||
)
|
||||
|
||||
// Filesystem Encryption
|
||||
|
||||
|
||||
@@ -137,12 +137,49 @@ func IoctlFileClone(destFd, srcFd int) error {
|
||||
return ioctl(destFd, FICLONE, uintptr(srcFd))
|
||||
}
|
||||
|
||||
type FileDedupeRange struct {
|
||||
Src_offset uint64
|
||||
Src_length uint64
|
||||
Dest_count uint16
|
||||
Reserved1 uint16
|
||||
Reserved2 uint32
|
||||
Info []FileDedupeRangeInfo
|
||||
}
|
||||
|
||||
type FileDedupeRangeInfo struct {
|
||||
Dest_fd int64
|
||||
Dest_offset uint64
|
||||
Bytes_deduped uint64
|
||||
Status int32
|
||||
Reserved uint32
|
||||
}
|
||||
|
||||
// IoctlFileDedupeRange performs an FIDEDUPERANGE ioctl operation to share the
|
||||
// range of data conveyed in value with the file associated with the file
|
||||
// descriptor destFd. See the ioctl_fideduperange(2) man page for details.
|
||||
func IoctlFileDedupeRange(destFd int, value *FileDedupeRange) error {
|
||||
err := ioctl(destFd, FIDEDUPERANGE, uintptr(unsafe.Pointer(value)))
|
||||
runtime.KeepAlive(value)
|
||||
func IoctlFileDedupeRange(srcFd int, value *FileDedupeRange) error {
|
||||
buf := make([]byte, SizeofRawFileDedupeRange+
|
||||
len(value.Info)*SizeofRawFileDedupeRangeInfo)
|
||||
rawrange := (*FileDedupeRange)(unsafe.Pointer(&buf[0]))
|
||||
rawrange.Src_offset = value.Src_offset
|
||||
rawrange.Src_length = value.Src_length
|
||||
rawrange.Dest_count = uint16(len(value.Info))
|
||||
rawrange.Reserved1 = value.Reserved1
|
||||
rawrange.Reserved2 = value.Reserved2
|
||||
|
||||
for i := range value.Info {
|
||||
rawinfo := (*RawFileDedupeRangeInfo)(unsafe.Pointer(
|
||||
uintptr(unsafe.Pointer(&buf[0])) + uintptr(SizeofRawFileDedupeRange) +
|
||||
uintptr(SizeofRawFileDedupeRangeInfo)))
|
||||
rawinfo.Dest_fd = value.Info[i].Dest_fd
|
||||
rawinfo.Dest_offset = value.Info[i].Dest_offset
|
||||
rawinfo.Bytes_deduped = value.Info[i].Bytes_deduped
|
||||
rawinfo.Status = value.Info[i].Status
|
||||
rawinfo.Reserved = value.Info[i].Reserved
|
||||
}
|
||||
|
||||
err := ioctl(srcFd, FIDEDUPERANGE, uintptr(unsafe.Pointer(&buf[0])))
|
||||
runtime.KeepAlive(buf)
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ type FileCloneRange struct {
|
||||
Dest_offset uint64
|
||||
}
|
||||
|
||||
type FileDedupeRange struct {
|
||||
type RawFileDedupeRange struct {
|
||||
Src_offset uint64
|
||||
Src_length uint64
|
||||
Dest_count uint16
|
||||
@@ -91,6 +91,19 @@ type FileDedupeRange struct {
|
||||
Reserved2 uint32
|
||||
}
|
||||
|
||||
type RawFileDedupeRangeInfo struct {
|
||||
Dest_fd int64
|
||||
Dest_offset uint64
|
||||
Bytes_deduped uint64
|
||||
Status int32
|
||||
Reserved uint32
|
||||
}
|
||||
|
||||
const (
|
||||
SizeofRawFileDedupeRange = 0x18
|
||||
SizeofRawFileDedupeRangeInfo = 0x20
|
||||
)
|
||||
|
||||
type FscryptPolicy struct {
|
||||
Version uint8
|
||||
Contents_encryption_mode uint8
|
||||
|
||||
Reference in New Issue
Block a user