2016-09-14 17:29:46 +00:00
|
|
|
package btrfs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/binary"
|
|
|
|
"encoding/hex"
|
|
|
|
"github.com/dennwc/btrfs/ioctl"
|
|
|
|
"os"
|
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
|
|
|
var order = binary.LittleEndian
|
|
|
|
|
|
|
|
const ioctlMagic = 0x94
|
|
|
|
|
|
|
|
const devicePathNameMax = 1024
|
|
|
|
|
|
|
|
const (
|
|
|
|
FSIDSize = 16
|
|
|
|
UUIDSize = 16
|
|
|
|
)
|
|
|
|
|
2016-09-16 17:09:14 +00:00
|
|
|
var zeroUUID UUID
|
|
|
|
|
2016-09-14 17:29:46 +00:00
|
|
|
type UUID [UUIDSize]byte
|
|
|
|
|
2016-09-16 17:09:14 +00:00
|
|
|
func (id UUID) String() string {
|
|
|
|
if id == zeroUUID {
|
|
|
|
return "<zero>"
|
|
|
|
}
|
|
|
|
buf := make([]byte, UUIDSize*2+4)
|
|
|
|
i := 0
|
|
|
|
i += hex.Encode(buf[i:], id[:4])
|
|
|
|
buf[i] = '-'
|
|
|
|
i++
|
|
|
|
i += hex.Encode(buf[i:], id[4:6])
|
|
|
|
buf[i] = '-'
|
|
|
|
i++
|
|
|
|
i += hex.Encode(buf[i:], id[6:8])
|
|
|
|
buf[i] = '-'
|
|
|
|
i++
|
|
|
|
i += hex.Encode(buf[i:], id[8:10])
|
|
|
|
buf[i] = '-'
|
|
|
|
i++
|
|
|
|
i += hex.Encode(buf[i:], id[10:])
|
|
|
|
return string(buf)
|
|
|
|
}
|
2016-09-14 17:29:46 +00:00
|
|
|
|
|
|
|
type FSID [FSIDSize]byte
|
|
|
|
|
|
|
|
func (id FSID) String() string { return hex.EncodeToString(id[:]) }
|
|
|
|
|
|
|
|
const volNameMax = 4087
|
|
|
|
|
|
|
|
// this should be 4k
|
|
|
|
type btrfs_ioctl_vol_args struct {
|
|
|
|
fd int64
|
|
|
|
name [volNameMax + 1]byte
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_qgroup_limit struct {
|
|
|
|
flags uint64
|
|
|
|
max_referenced uint64
|
|
|
|
max_exclusive uint64
|
|
|
|
rsv_referenced uint64
|
|
|
|
rsv_exclusive uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_qgroup_inherit struct {
|
|
|
|
flags uint64
|
|
|
|
num_qgroups uint64
|
|
|
|
num_ref_copies uint64
|
|
|
|
num_excl_copies uint64
|
|
|
|
lim btrfs_qgroup_limit
|
|
|
|
//qgroups [0]uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_qgroup_limit_args struct {
|
|
|
|
qgroupid uint64
|
|
|
|
lim btrfs_qgroup_limit
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_vol_args_v2_u1 struct {
|
|
|
|
size uint64
|
|
|
|
qgroup_inherit *btrfs_qgroup_inherit
|
|
|
|
}
|
|
|
|
|
|
|
|
const subvolNameMax = 4039
|
|
|
|
|
2016-09-15 17:39:46 +00:00
|
|
|
type subvolFlags uint64
|
|
|
|
|
|
|
|
// flags for subvolumes
|
|
|
|
//
|
|
|
|
// Used by:
|
|
|
|
// struct btrfs_ioctl_vol_args_v2.flags
|
|
|
|
//
|
|
|
|
// BTRFS_SUBVOL_RDONLY is also provided/consumed by the following ioctls:
|
|
|
|
// - BTRFS_IOC_SUBVOL_GETFLAGS
|
|
|
|
// - BTRFS_IOC_SUBVOL_SETFLAGS
|
|
|
|
const (
|
|
|
|
subvolCreateAsync = subvolFlags(1 << 0)
|
|
|
|
subvolReadOnly = subvolFlags(1 << 1)
|
|
|
|
subvolQGroupInherit = subvolFlags(1 << 2)
|
|
|
|
)
|
|
|
|
|
2016-09-14 17:29:46 +00:00
|
|
|
type btrfs_ioctl_vol_args_v2 struct {
|
|
|
|
fd int64
|
|
|
|
transid uint64
|
2016-09-15 17:39:46 +00:00
|
|
|
flags subvolFlags
|
2016-09-14 17:29:46 +00:00
|
|
|
btrfs_ioctl_vol_args_v2_u1
|
|
|
|
unused [2]uint64
|
|
|
|
name [subvolNameMax + 1]byte
|
|
|
|
}
|
|
|
|
|
|
|
|
// structure to report errors and progress to userspace, either as a
|
|
|
|
// result of a finished scrub, a canceled scrub or a progress inquiry
|
|
|
|
type btrfs_scrub_progress struct {
|
|
|
|
data_extents_scrubbed uint64 // # of data extents scrubbed
|
|
|
|
tree_extents_scrubbed uint64 // # of tree extents scrubbed
|
|
|
|
data_bytes_scrubbed uint64 // # of data bytes scrubbed
|
|
|
|
tree_bytes_scrubbed uint64 // # of tree bytes scrubbed
|
|
|
|
read_errors uint64 // # of read errors encountered (EIO)
|
|
|
|
csum_errors uint64 // # of failed csum checks
|
|
|
|
// # of occurences, where the metadata of a tree block did not match the expected values, like generation or logical
|
|
|
|
verify_errors uint64
|
|
|
|
// # of 4k data block for which no csum is present, probably the result of data written with nodatasum
|
|
|
|
no_csum uint64
|
|
|
|
csum_discards uint64 // # of csum for which no data was found in the extent tree.
|
|
|
|
super_errors uint64 // # of bad super blocks encountered
|
|
|
|
malloc_errors uint64 // # of internal kmalloc errors. These will likely cause an incomplete scrub
|
|
|
|
uncorrectable_errors uint64 // # of errors where either no intact copy was found or the writeback failed
|
|
|
|
corrected_errors uint64 // # of errors corrected
|
|
|
|
// last physical address scrubbed. In case a scrub was aborted, this can be used to restart the scrub
|
|
|
|
last_physical uint64
|
|
|
|
// # of occurences where a read for a full (64k) bio failed, but the re-
|
|
|
|
// check succeeded for each 4k piece. Intermittent error.
|
|
|
|
unverified_errors uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_scrub_args struct {
|
|
|
|
devid uint64 // in
|
|
|
|
start uint64 // in
|
|
|
|
end uint64 // in
|
|
|
|
flags uint64 // in
|
|
|
|
progress btrfs_scrub_progress // out
|
|
|
|
// pad to 1k
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [1024 - 4*8 - unsafe.Sizeof(btrfs_scrub_progress{})]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type contReadingFromSrcdevMode uint64
|
|
|
|
|
|
|
|
const (
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_ALWAYS contReadingFromSrcdevMode = 0
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_CONT_READING_FROM_SRCDEV_MODE_AVOID contReadingFromSrcdevMode = 1
|
|
|
|
)
|
|
|
|
|
|
|
|
type btrfs_ioctl_dev_replace_start_params struct {
|
|
|
|
srcdevid uint64 // in, if 0, use srcdev_name instead
|
|
|
|
cont_reading_from_srcdev_mode contReadingFromSrcdevMode // in
|
|
|
|
srcdev_name [devicePathNameMax + 1]byte // in
|
|
|
|
tgtdev_name [devicePathNameMax + 1]byte // in
|
|
|
|
}
|
|
|
|
|
|
|
|
type devReplaceState uint64
|
|
|
|
|
|
|
|
const (
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED devReplaceState = 0
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED devReplaceState = 1
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED devReplaceState = 2
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED devReplaceState = 3
|
|
|
|
_BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED devReplaceState = 4
|
|
|
|
)
|
|
|
|
|
|
|
|
type btrfs_ioctl_dev_replace_status_params struct {
|
|
|
|
replace_state devReplaceState // out
|
|
|
|
progress_1000 uint64 // out, 0 <= x <= 1000
|
|
|
|
time_started uint64 // out, seconds since 1-Jan-1970
|
|
|
|
time_stopped uint64 // out, seconds since 1-Jan-1970
|
|
|
|
num_write_errors uint64 // out
|
|
|
|
num_uncorrectable_read_errors uint64 // out
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_dev_replace_args_u1 struct {
|
|
|
|
cmd uint64 // in
|
|
|
|
result uint64 // out
|
|
|
|
start btrfs_ioctl_dev_replace_start_params // in
|
|
|
|
spare [64]uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_dev_replace_args_u2 struct {
|
|
|
|
cmd uint64 // in
|
|
|
|
result uint64 // out
|
|
|
|
status btrfs_ioctl_dev_replace_status_params // out
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [unsafe.Sizeof(btrfs_ioctl_dev_replace_start_params{}) - unsafe.Sizeof(btrfs_ioctl_dev_replace_status_params{})]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
spare [64]uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_dev_info_args struct {
|
|
|
|
devid uint64 // in/out
|
|
|
|
uuid UUID // in/out
|
|
|
|
bytes_used uint64 // out
|
|
|
|
total_bytes uint64 // out
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [379]uint64 // pad to 4k
|
2016-09-14 17:29:46 +00:00
|
|
|
path [devicePathNameMax]byte // out
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_fs_info_args struct {
|
|
|
|
max_id uint64 // out
|
|
|
|
num_devices uint64 // out
|
|
|
|
fsid FSID // out
|
|
|
|
nodesize uint32 // out
|
|
|
|
sectorsize uint32 // out
|
|
|
|
clone_alignment uint32 // out
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [122*8 + 4]byte // pad to 1k
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_feature_flags struct {
|
|
|
|
compat_flags FeatureFlags
|
|
|
|
compat_ro_flags FeatureFlags
|
|
|
|
incompat_flags IncompatFeatures
|
|
|
|
}
|
|
|
|
|
|
|
|
type argRange [8]byte
|
|
|
|
|
|
|
|
func (u argRange) asN() uint64 {
|
|
|
|
return order.Uint64(u[:])
|
|
|
|
}
|
|
|
|
func (u argRange) asMinMax() (min, max uint32) {
|
|
|
|
return order.Uint32(u[:4]), order.Uint32(u[4:])
|
|
|
|
}
|
|
|
|
|
|
|
|
// balance control ioctl modes
|
|
|
|
//#define BTRFS_BALANCE_CTL_PAUSE 1
|
|
|
|
//#define BTRFS_BALANCE_CTL_CANCEL 2
|
|
|
|
//#define BTRFS_BALANCE_CTL_RESUME 3
|
|
|
|
|
|
|
|
// this is packed, because it should be exactly the same as its disk
|
|
|
|
// byte order counterpart (struct btrfs_disk_balance_args)
|
|
|
|
type btrfs_balance_args struct {
|
|
|
|
profiles uint64
|
|
|
|
// usage filter
|
|
|
|
// BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N'
|
|
|
|
// BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max
|
|
|
|
usage argRange
|
|
|
|
devid uint64
|
|
|
|
pstart uint64
|
|
|
|
pend uint64
|
|
|
|
vstart uint64
|
|
|
|
vend uint64
|
|
|
|
target uint64
|
|
|
|
flags uint64
|
|
|
|
// BTRFS_BALANCE_ARGS_LIMIT with value 'limit' (limit number of processed chunks)
|
|
|
|
// BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum and maximum
|
|
|
|
limit argRange
|
|
|
|
stripes_min uint32
|
|
|
|
stripes_max uint32
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [48]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// report balance progress to userspace
|
|
|
|
type btrfs_balance_progress struct {
|
|
|
|
expected uint64 // estimated # of chunks that will be relocated to fulfill the request
|
|
|
|
considered uint64 // # of chunks we have considered so far
|
|
|
|
completed uint64 // # of chunks relocated so far
|
|
|
|
}
|
|
|
|
|
|
|
|
type balanceState uint64
|
|
|
|
|
|
|
|
const (
|
|
|
|
_BTRFS_BALANCE_STATE_RUNNING balanceState = (1 << 0)
|
|
|
|
_BTRFS_BALANCE_STATE_PAUSE_REQ balanceState = (1 << 1)
|
|
|
|
_BTRFS_BALANCE_STATE_CANCEL_REQ balanceState = (1 << 2)
|
|
|
|
)
|
|
|
|
|
|
|
|
type btrfs_ioctl_balance_args struct {
|
2016-09-16 17:09:14 +00:00
|
|
|
flags uint64 // in/out
|
|
|
|
state balanceState // out
|
|
|
|
data btrfs_balance_args // in/out
|
|
|
|
meta btrfs_balance_args // in/out
|
|
|
|
sys btrfs_balance_args // in/out
|
|
|
|
stat btrfs_balance_progress // out
|
|
|
|
_ [72 * 8]byte // pad to 1k
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const _BTRFS_INO_LOOKUP_PATH_MAX = 4080
|
|
|
|
|
|
|
|
type btrfs_ioctl_ino_lookup_args struct {
|
|
|
|
treeid uint64
|
|
|
|
objectid uint64
|
|
|
|
name [_BTRFS_INO_LOOKUP_PATH_MAX]byte
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_search_key struct {
|
|
|
|
tree_id uint64 // which root are we searching. 0 is the tree of tree roots
|
|
|
|
// keys returned will be >= min and <= max
|
|
|
|
min_objectid uint64
|
|
|
|
max_objectid uint64
|
|
|
|
// keys returned will be >= min and <= max
|
|
|
|
min_offset uint64
|
|
|
|
max_offset uint64
|
|
|
|
// max and min transids to search for
|
|
|
|
min_transid uint64
|
|
|
|
max_transid uint64
|
|
|
|
// keys returned will be >= min and <= max
|
|
|
|
min_type uint32
|
|
|
|
max_type uint32
|
|
|
|
// how many items did userland ask for, and how many are we returning
|
|
|
|
nr_items uint32
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [36]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_search_header struct {
|
|
|
|
transid uint64
|
|
|
|
objectid uint64
|
|
|
|
offset uint64
|
|
|
|
typ uint32
|
|
|
|
len uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
const _BTRFS_SEARCH_ARGS_BUFSIZE = (4096 - unsafe.Sizeof(btrfs_ioctl_search_key{}))
|
|
|
|
|
|
|
|
// the buf is an array of search headers where
|
|
|
|
// each header is followed by the actual item
|
|
|
|
// the type field is expanded to 32 bits for alignment
|
|
|
|
type btrfs_ioctl_search_args struct {
|
|
|
|
key btrfs_ioctl_search_key
|
|
|
|
buf [_BTRFS_SEARCH_ARGS_BUFSIZE]byte
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extended version of TREE_SEARCH ioctl that can return more than 4k of bytes.
|
|
|
|
// The allocated size of the buffer is set in buf_size.
|
|
|
|
type btrfs_ioctl_search_args_v2 struct {
|
|
|
|
key btrfs_ioctl_search_key // in/out - search parameters
|
|
|
|
buf_size uint64 // in - size of buffer; out - on EOVERFLOW: needed size to store item
|
|
|
|
//buf [0]uint64 // out - found items
|
|
|
|
}
|
|
|
|
|
|
|
|
// With a @src_length of zero, the range from @src_offset->EOF is cloned!
|
|
|
|
type btrfs_ioctl_clone_range_args struct {
|
|
|
|
src_fd int64
|
|
|
|
src_offset uint64
|
|
|
|
src_length uint64
|
|
|
|
dest_offset uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
// flags for the defrag range ioctl
|
|
|
|
type defragRange uint64
|
|
|
|
|
|
|
|
const (
|
|
|
|
_BTRFS_DEFRAG_RANGE_COMPRESS defragRange = 1
|
|
|
|
_BTRFS_DEFRAG_RANGE_START_IO defragRange = 2
|
|
|
|
)
|
|
|
|
|
|
|
|
const _BTRFS_SAME_DATA_DIFFERS = 1
|
|
|
|
|
|
|
|
// For extent-same ioctl
|
|
|
|
type btrfs_ioctl_same_extent_info struct {
|
|
|
|
fd int64 // in - destination file
|
|
|
|
logical_offset uint64 // in - start of extent in destination
|
|
|
|
bytes_deduped uint64 // out - total # of bytes we were able to dedupe from this file
|
|
|
|
// out; status of this dedupe operation:
|
|
|
|
// 0 if dedup succeeds
|
|
|
|
// < 0 for error
|
|
|
|
// == BTRFS_SAME_DATA_DIFFERS if data differs
|
|
|
|
status int32
|
|
|
|
reserved uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_same_args struct {
|
|
|
|
logical_offset uint64 // in - start of extent in source
|
|
|
|
length uint64 // in - length of extent
|
|
|
|
dest_count uint16 // in - total elements in info array
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [6]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
//info [0]btrfs_ioctl_same_extent_info
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_defrag_range_args struct {
|
|
|
|
start uint64 // start of the defrag operation
|
|
|
|
len uint64 // number of bytes to defrag, use (u64)-1 to say all
|
|
|
|
// flags for the operation, which can include turning
|
|
|
|
// on compression for this one defrag
|
|
|
|
flags uint64
|
|
|
|
// any extent bigger than this will be considered
|
|
|
|
// already defragged. Use 0 to take the kernel default
|
|
|
|
// Use 1 to say every single extent must be rewritten
|
|
|
|
extent_thresh uint32
|
|
|
|
// which compression method to use if turning on compression
|
|
|
|
// for this defrag operation. If unspecified, zlib will be used
|
|
|
|
compress_type uint32
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [16]byte // spare for later
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_space_info struct {
|
|
|
|
flags uint64
|
|
|
|
total_bytes uint64
|
|
|
|
used_bytes uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_space_args struct {
|
|
|
|
space_slots uint64
|
|
|
|
total_spaces uint64
|
|
|
|
//spaces [0]btrfs_ioctl_space_info
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_data_container struct {
|
|
|
|
bytes_left uint32 // out -- bytes not needed to deliver output
|
|
|
|
bytes_missing uint32 // out -- additional bytes needed for result
|
|
|
|
elem_cnt uint32 // out
|
|
|
|
elem_missed uint32 // out
|
|
|
|
//val [0]uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_ino_path_args struct {
|
2016-09-16 17:09:14 +00:00
|
|
|
inum uint64 // in
|
|
|
|
size uint64 // in
|
|
|
|
_ [32]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
// struct btrfs_data_container *fspath; out
|
|
|
|
fspath uint64 // out
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_logical_ino_args struct {
|
2016-09-16 17:09:14 +00:00
|
|
|
logical uint64 // in
|
|
|
|
size uint64 // in
|
|
|
|
_ [32]byte
|
2016-09-14 17:29:46 +00:00
|
|
|
// struct btrfs_data_container *inodes; out
|
|
|
|
inodes uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
// disk I/O failure stats
|
|
|
|
const (
|
|
|
|
_BTRFS_DEV_STAT_WRITE_ERRS = iota // EIO or EREMOTEIO from lower layers
|
|
|
|
_BTRFS_DEV_STAT_READ_ERRS // EIO or EREMOTEIO from lower layers
|
|
|
|
_BTRFS_DEV_STAT_FLUSH_ERRS // EIO or EREMOTEIO from lower layers
|
|
|
|
|
|
|
|
// stats for indirect indications for I/O failures
|
|
|
|
|
|
|
|
// checksum error, bytenr error or contents is illegal: this is an
|
|
|
|
// indication that the block was damaged during read or write, or written to
|
|
|
|
// wrong location or read from wrong location
|
|
|
|
_BTRFS_DEV_STAT_CORRUPTION_ERRS
|
|
|
|
_BTRFS_DEV_STAT_GENERATION_ERRS // an indication that blocks have not been written
|
|
|
|
|
|
|
|
_BTRFS_DEV_STAT_VALUES_MAX
|
|
|
|
)
|
|
|
|
|
|
|
|
// Reset statistics after reading; needs SYS_ADMIN capability
|
|
|
|
const _BTRFS_DEV_STATS_RESET = (1 << 0)
|
|
|
|
|
|
|
|
type btrfs_ioctl_get_dev_stats struct {
|
|
|
|
devid uint64 // in
|
|
|
|
nr_items uint64 // in/out
|
|
|
|
flags uint64 // in/out
|
|
|
|
values [_BTRFS_DEV_STAT_VALUES_MAX]uint64 // out values
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [128 - 2 - _BTRFS_DEV_STAT_VALUES_MAX]uint64 // pad to 1k
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
|
|
|
_BTRFS_QUOTA_CTL_ENABLE = 1
|
|
|
|
_BTRFS_QUOTA_CTL_DISABLE = 2
|
|
|
|
// 3 has formerly been reserved for BTRFS_QUOTA_CTL_RESCAN
|
|
|
|
)
|
|
|
|
|
|
|
|
type btrfs_ioctl_quota_ctl_args struct {
|
|
|
|
cmd uint64
|
|
|
|
status uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_quota_rescan_args struct {
|
|
|
|
flags uint64
|
|
|
|
progress uint64
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [6]uint64
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_qgroup_assign_args struct {
|
|
|
|
assign uint64
|
|
|
|
src uint64
|
|
|
|
dst uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_qgroup_create_args struct {
|
|
|
|
create uint64
|
|
|
|
qgroupid uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_timespec struct {
|
|
|
|
sec uint64
|
|
|
|
nsec uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
type btrfs_ioctl_received_subvol_args struct {
|
|
|
|
uuid UUID // in
|
|
|
|
stransid uint64 // in
|
|
|
|
rtransid uint64 // out
|
|
|
|
stime btrfs_ioctl_timespec // in
|
|
|
|
rtime btrfs_ioctl_timespec // out
|
|
|
|
flags uint64 // in
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [16]uint64 // in
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
|
|
|
// Caller doesn't want file data in the send stream, even if the
|
|
|
|
// search of clone sources doesn't find an extent. UPDATE_EXTENT
|
|
|
|
// commands will be sent instead of WRITE commands.
|
|
|
|
_BTRFS_SEND_FLAG_NO_FILE_DATA = 0x1
|
|
|
|
// Do not add the leading stream header. Used when multiple snapshots
|
|
|
|
// are sent back to back.
|
|
|
|
_BTRFS_SEND_FLAG_OMIT_STREAM_HEADER = 0x2
|
|
|
|
// Omit the command at the end of the stream that indicated the end
|
|
|
|
// of the stream. This option is used when multiple snapshots are
|
|
|
|
// sent back to back.
|
|
|
|
_BTRFS_SEND_FLAG_OMIT_END_CMD = 0x4
|
|
|
|
|
|
|
|
_BTRFS_SEND_FLAG_MASK = _BTRFS_SEND_FLAG_NO_FILE_DATA |
|
|
|
|
_BTRFS_SEND_FLAG_OMIT_STREAM_HEADER |
|
|
|
|
_BTRFS_SEND_FLAG_OMIT_END_CMD
|
|
|
|
)
|
|
|
|
|
|
|
|
type btrfs_ioctl_send_args struct {
|
|
|
|
send_fd int64 // in
|
|
|
|
clone_sources_count uint64 // in
|
|
|
|
clone_sources *uint64 // in
|
|
|
|
parent_root uint64 // in
|
|
|
|
flags uint64 // in
|
2016-09-16 17:09:14 +00:00
|
|
|
_ [4]uint64 // in
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
_BTRFS_IOC_SNAP_CREATE = ioctl.IOW(ioctlMagic, 1, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_DEFRAG = ioctl.IOW(ioctlMagic, 2, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_RESIZE = ioctl.IOW(ioctlMagic, 3, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_SCAN_DEV = ioctl.IOW(ioctlMagic, 4, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_TRANS_START = ioctl.IO(ioctlMagic, 6)
|
|
|
|
_BTRFS_IOC_TRANS_END = ioctl.IO(ioctlMagic, 7)
|
|
|
|
_BTRFS_IOC_SYNC = ioctl.IO(ioctlMagic, 8)
|
|
|
|
_BTRFS_IOC_CLONE = ioctl.IOW(ioctlMagic, 9, 4) // int32
|
|
|
|
_BTRFS_IOC_ADD_DEV = ioctl.IOW(ioctlMagic, 10, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_RM_DEV = ioctl.IOW(ioctlMagic, 11, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_BALANCE = ioctl.IOW(ioctlMagic, 12, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_CLONE_RANGE = ioctl.IOW(ioctlMagic, 13, unsafe.Sizeof(btrfs_ioctl_clone_range_args{}))
|
|
|
|
_BTRFS_IOC_SUBVOL_CREATE = ioctl.IOW(ioctlMagic, 14, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_SNAP_DESTROY = ioctl.IOW(ioctlMagic, 15, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_DEFRAG_RANGE = ioctl.IOW(ioctlMagic, 16, unsafe.Sizeof(btrfs_ioctl_defrag_range_args{}))
|
|
|
|
_BTRFS_IOC_TREE_SEARCH = ioctl.IOWR(ioctlMagic, 17, unsafe.Sizeof(btrfs_ioctl_search_args{}))
|
|
|
|
_BTRFS_IOC_INO_LOOKUP = ioctl.IOWR(ioctlMagic, 18, unsafe.Sizeof(btrfs_ioctl_ino_lookup_args{}))
|
|
|
|
_BTRFS_IOC_DEFAULT_SUBVOL = ioctl.IOW(ioctlMagic, 19, 8) // uint64
|
|
|
|
_BTRFS_IOC_SPACE_INFO = ioctl.IOWR(ioctlMagic, 20, unsafe.Sizeof(btrfs_ioctl_space_args{}))
|
|
|
|
_BTRFS_IOC_START_SYNC = ioctl.IOR(ioctlMagic, 24, 8) // uint64
|
|
|
|
_BTRFS_IOC_WAIT_SYNC = ioctl.IOW(ioctlMagic, 22, 8) // uint64
|
2016-09-15 17:39:46 +00:00
|
|
|
_BTRFS_IOC_SNAP_CREATE_V2 = ioctl.IOW(ioctlMagic, 23, unsafe.Sizeof(btrfs_ioctl_vol_args_v2{}))
|
|
|
|
_BTRFS_IOC_SUBVOL_CREATE_V2 = ioctl.IOW(ioctlMagic, 24, unsafe.Sizeof(btrfs_ioctl_vol_args_v2{}))
|
2016-09-14 17:29:46 +00:00
|
|
|
_BTRFS_IOC_SUBVOL_GETFLAGS = ioctl.IOR(ioctlMagic, 25, 8) // uint64
|
|
|
|
_BTRFS_IOC_SUBVOL_SETFLAGS = ioctl.IOW(ioctlMagic, 26, 8) // uint64
|
|
|
|
_BTRFS_IOC_SCRUB = ioctl.IOWR(ioctlMagic, 27, unsafe.Sizeof(btrfs_ioctl_scrub_args{}))
|
|
|
|
_BTRFS_IOC_SCRUB_CANCEL = ioctl.IO(ioctlMagic, 28)
|
|
|
|
_BTRFS_IOC_SCRUB_PROGRESS = ioctl.IOWR(ioctlMagic, 29, unsafe.Sizeof(btrfs_ioctl_scrub_args{}))
|
|
|
|
_BTRFS_IOC_DEV_INFO = ioctl.IOWR(ioctlMagic, 30, unsafe.Sizeof(btrfs_ioctl_dev_info_args{}))
|
|
|
|
_BTRFS_IOC_FS_INFO = ioctl.IOR(ioctlMagic, 31, unsafe.Sizeof(btrfs_ioctl_fs_info_args{}))
|
|
|
|
_BTRFS_IOC_BALANCE_CTL = ioctl.IOW(ioctlMagic, 33, 4) // int32
|
|
|
|
_BTRFS_IOC_BALANCE_PROGRESS = ioctl.IOR(ioctlMagic, 34, unsafe.Sizeof(btrfs_ioctl_balance_args{}))
|
|
|
|
_BTRFS_IOC_INO_PATHS = ioctl.IOWR(ioctlMagic, 35, unsafe.Sizeof(btrfs_ioctl_ino_path_args{}))
|
|
|
|
_BTRFS_IOC_LOGICAL_INO = ioctl.IOWR(ioctlMagic, 36, unsafe.Sizeof(btrfs_ioctl_ino_path_args{}))
|
|
|
|
_BTRFS_IOC_SET_RECEIVED_SUBVOL = ioctl.IOWR(ioctlMagic, 37, unsafe.Sizeof(btrfs_ioctl_received_subvol_args{}))
|
|
|
|
_BTRFS_IOC_SEND = ioctl.IOW(ioctlMagic, 38, unsafe.Sizeof(btrfs_ioctl_send_args{}))
|
|
|
|
_BTRFS_IOC_DEVICES_READY = ioctl.IOR(ioctlMagic, 39, unsafe.Sizeof(btrfs_ioctl_vol_args{}))
|
|
|
|
_BTRFS_IOC_QUOTA_CTL = ioctl.IOWR(ioctlMagic, 40, unsafe.Sizeof(btrfs_ioctl_quota_ctl_args{}))
|
|
|
|
_BTRFS_IOC_QGROUP_ASSIGN = ioctl.IOW(ioctlMagic, 41, unsafe.Sizeof(btrfs_ioctl_qgroup_assign_args{}))
|
|
|
|
_BTRFS_IOC_QGROUP_CREATE = ioctl.IOW(ioctlMagic, 42, unsafe.Sizeof(btrfs_ioctl_qgroup_create_args{}))
|
|
|
|
_BTRFS_IOC_QGROUP_LIMIT = ioctl.IOR(ioctlMagic, 43, unsafe.Sizeof(btrfs_ioctl_qgroup_limit_args{}))
|
|
|
|
_BTRFS_IOC_QUOTA_RESCAN = ioctl.IOW(ioctlMagic, 44, unsafe.Sizeof(btrfs_ioctl_quota_rescan_args{}))
|
|
|
|
_BTRFS_IOC_QUOTA_RESCAN_STATUS = ioctl.IOR(ioctlMagic, 45, unsafe.Sizeof(btrfs_ioctl_quota_rescan_args{}))
|
|
|
|
_BTRFS_IOC_QUOTA_RESCAN_WAIT = ioctl.IO(ioctlMagic, 46)
|
|
|
|
_BTRFS_IOC_GET_FSLABEL = ioctl.IOR(ioctlMagic, 49, BTRFS_LABEL_SIZE)
|
|
|
|
_BTRFS_IOC_SET_FSLABEL = ioctl.IOW(ioctlMagic, 50, BTRFS_LABEL_SIZE)
|
|
|
|
_BTRFS_IOC_GET_DEV_STATS = ioctl.IOWR(ioctlMagic, 52, unsafe.Sizeof(btrfs_ioctl_get_dev_stats{}))
|
|
|
|
_BTRFS_IOC_DEV_REPLACE = ioctl.IOWR(ioctlMagic, 53, unsafe.Sizeof(btrfs_ioctl_dev_replace_args_u1{}))
|
|
|
|
_BTRFS_IOC_FILE_EXTENT_SAME = ioctl.IOWR(ioctlMagic, 54, unsafe.Sizeof(btrfs_ioctl_same_args{}))
|
|
|
|
_BTRFS_IOC_GET_FEATURES = ioctl.IOR(ioctlMagic, 57, unsafe.Sizeof(btrfs_ioctl_feature_flags{}))
|
|
|
|
_BTRFS_IOC_SET_FEATURES = ioctl.IOW(ioctlMagic, 57, unsafe.Sizeof([2]btrfs_ioctl_feature_flags{}))
|
|
|
|
_BTRFS_IOC_GET_SUPPORTED_FEATURES = ioctl.IOR(ioctlMagic, 57, unsafe.Sizeof([3]btrfs_ioctl_feature_flags{}))
|
|
|
|
)
|
|
|
|
|
2016-09-15 17:39:46 +00:00
|
|
|
func iocSnapCreate(f *os.File, in *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SNAP_CREATE, in)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSnapCreateV2(f *os.File, in *btrfs_ioctl_vol_args_v2) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SNAP_CREATE_V2, in)
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func iocDefrag(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_DEFRAG, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocResize(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_RESIZE, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocScanDev(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SCAN_DEV, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocTransStart(f *os.File) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_TRANS_START, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocTransEnd(f *os.File) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_TRANS_END, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSync(f *os.File) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SYNC, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocClone(f *os.File, out *int32) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_CLONE, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocAddDev(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_ADD_DEV, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocRmDev(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_RM_DEV, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocBalance(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_BALANCE, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocCloneRange(f *os.File, out *btrfs_ioctl_clone_range_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_CLONE_RANGE, out)
|
|
|
|
}
|
|
|
|
|
2016-09-15 17:39:46 +00:00
|
|
|
func iocSubvolCreate(f *os.File, in *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SUBVOL_CREATE, in)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSubvolCreateV2(f *os.File, in *btrfs_ioctl_vol_args_v2) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SUBVOL_CREATE, in)
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
2016-09-15 17:39:46 +00:00
|
|
|
func iocSnapDestroy(f *os.File, in *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SNAP_DESTROY, in)
|
2016-09-14 17:29:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func iocDefragRange(f *os.File, out *btrfs_ioctl_defrag_range_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_DEFRAG_RANGE, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocTreeSearch(f *os.File, out *btrfs_ioctl_search_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_TREE_SEARCH, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocInoLookup(f *os.File, out *btrfs_ioctl_ino_lookup_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_INO_LOOKUP, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocDefaultSubvol(f *os.File, out *uint64) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_DEFAULT_SUBVOL, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSpaceInfo(f *os.File, out *btrfs_ioctl_space_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SPACE_INFO, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocStartSync(f *os.File, out *uint64) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_START_SYNC, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocWaitSync(f *os.File, out *uint64) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_WAIT_SYNC, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSubvolGetflags(f *os.File, out *uint64) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SUBVOL_GETFLAGS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSubvolSetflags(f *os.File, out *uint64) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SUBVOL_SETFLAGS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocScrub(f *os.File, out *btrfs_ioctl_scrub_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SCRUB, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocScrubCancel(f *os.File) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SCRUB_CANCEL, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocScrubProgress(f *os.File, out *btrfs_ioctl_scrub_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SCRUB_PROGRESS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocDevInfo(f *os.File, out *btrfs_ioctl_dev_info_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_DEV_INFO, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocBalanceCtl(f *os.File, out *int32) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_BALANCE_CTL, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocBalanceProgress(f *os.File, out *btrfs_ioctl_balance_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_BALANCE_PROGRESS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocInoPaths(f *os.File, out *btrfs_ioctl_ino_path_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_INO_PATHS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocLogicalIno(f *os.File, out *btrfs_ioctl_ino_path_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_LOGICAL_INO, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSetReceivedSubvol(f *os.File, out *btrfs_ioctl_received_subvol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SET_RECEIVED_SUBVOL, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSend(f *os.File, out *btrfs_ioctl_send_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SEND, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocDevicesReady(f *os.File, out *btrfs_ioctl_vol_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_DEVICES_READY, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQuotaCtl(f *os.File, out *btrfs_ioctl_quota_ctl_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QUOTA_CTL, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQgroupAssign(f *os.File, out *btrfs_ioctl_qgroup_assign_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QGROUP_ASSIGN, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQgroupCreate(f *os.File, out *btrfs_ioctl_qgroup_create_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QGROUP_CREATE, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQgroupLimit(f *os.File, out *btrfs_ioctl_qgroup_limit_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QGROUP_LIMIT, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQuotaRescan(f *os.File, out *btrfs_ioctl_quota_rescan_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QUOTA_RESCAN, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQuotaRescanStatus(f *os.File, out *btrfs_ioctl_quota_rescan_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QUOTA_RESCAN_STATUS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocQuotaRescanWait(f *os.File) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_QUOTA_RESCAN_WAIT, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocGetFslabel(f *os.File, out *[BTRFS_LABEL_SIZE]byte) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_GET_FSLABEL, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSetFslabel(f *os.File, out *[BTRFS_LABEL_SIZE]byte) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SET_FSLABEL, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocGetDevStats(f *os.File, out *btrfs_ioctl_get_dev_stats) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_GET_DEV_STATS, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
//func iocDevReplace(f *os.File, out *btrfs_ioctl_dev_replace_args) error {
|
|
|
|
// return ioctl.Do(f, _BTRFS_IOC_DEV_REPLACE, out)
|
|
|
|
//}
|
|
|
|
|
|
|
|
func iocFileExtentSame(f *os.File, out *btrfs_ioctl_same_args) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_FILE_EXTENT_SAME, out)
|
|
|
|
}
|
|
|
|
|
|
|
|
func iocSetFeatures(f *os.File, out *[2]btrfs_ioctl_feature_flags) error {
|
|
|
|
return ioctl.Do(f, _BTRFS_IOC_SET_FEATURES, out)
|
|
|
|
}
|