Attempt to fix the linux ioctl FIDEDUPERANGE

This commit is contained in:
Lluís Batlle i Rossell
2021-01-16 17:54:46 +01:00
parent 4bcb84eeeb
commit 1d89081d20
3 changed files with 62 additions and 5 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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