mirror of
https://github.com/versity/scoutfs-go.git
synced 2026-01-07 12:15:20 +00:00
add scoutfs move_blocks
This commit is contained in:
42
scoutfs.go
42
scoutfs.go
@@ -10,6 +10,7 @@ import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
"os"
|
||||
@@ -716,3 +717,44 @@ func GetDF(f *os.File) (DiskUsage, error) {
|
||||
FreeDataBlocks: dataFree,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// MoveData will move all of the extents in "from" file handle
|
||||
// and append to the end of "to" file handle.
|
||||
// The end of "to" must be 4KB aligned boundary.
|
||||
// errors this can return:
|
||||
// EINVAL: from_off, len, or to_off aren't a multiple of 4KB; the source
|
||||
// and destination files are the same inode; either the source or
|
||||
// destination is not a regular file; the destination file has
|
||||
// an existing overlapping extent.
|
||||
// EOVERFLOW: either from_off + len or to_off + len exceeded 64bits.
|
||||
// EBADF: from_fd isn't a valid open file descriptor.
|
||||
// EXDEV: the source and destination files are in different filesystems.
|
||||
// EISDIR: either the source or destination is a directory.
|
||||
// ENODATA: either the source or destination file have offline extents.
|
||||
func MoveData(from, to *os.File) error {
|
||||
ffi, err := from.Stat()
|
||||
if err != nil {
|
||||
return fmt.Errorf("stat from: %v", err)
|
||||
}
|
||||
tfi, err := to.Stat()
|
||||
if err != nil {
|
||||
return fmt.Errorf("stat to: %v", err)
|
||||
}
|
||||
|
||||
mb := moveBlocks{
|
||||
From_fd: uint64(from.Fd()),
|
||||
From_off: 0,
|
||||
Len: uint64(ffi.Size()),
|
||||
To_off: uint64(tfi.Size()),
|
||||
}
|
||||
|
||||
_, err = scoutfsctl(to, IOCMOVEBLOCKS, unsafe.Pointer(&mb))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
from.Truncate(0)
|
||||
from.Seek(0, io.SeekStart)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user