#ifndef VFS_HAMMER_IOCTL_H_
#define VFS_HAMMER_IOCTL_H_
#include <sys/param.h>
#include <sys/ioccom.h>
#include "hammer_disk.h"
struct hammer_ioc_head {
int32_t flags;
int32_t error;
int32_t reserved01[4];
};
#define HAMMER_IOC_HEAD_ERROR 0x00008000
#define HAMMER_IOC_HEAD_INTR 0x00010000
#define HAMMER_IOC_DO_BTREE 0x00020000
#define HAMMER_IOC_DO_INODES 0x00040000
#define HAMMER_IOC_DO_DATA 0x00080000
#define HAMMER_IOC_DO_DIRS 0x00100000
#define HAMMER_IOC_DO_FLAGS (HAMMER_IOC_DO_BTREE | \
HAMMER_IOC_DO_INODES | \
HAMMER_IOC_DO_DATA | \
HAMMER_IOC_DO_DIRS)
struct hammer_ioc_prune_elm {
hammer_tid_t beg_tid;
hammer_tid_t end_tid;
hammer_tid_t mod_tid;
};
#define HAMMER_MAX_PRUNE_ELMS (1024*1024/24)
struct hammer_ioc_prune {
struct hammer_ioc_head head;
int nelms;
int reserved01;
struct hammer_base_elm key_beg;
struct hammer_base_elm key_end;
struct hammer_base_elm key_cur;
int64_t stat_scanrecords;
int64_t stat_rawrecords;
int64_t stat_dirrecords;
int64_t stat_bytes;
int64_t stat_realignments;
hammer_tid_t stat_oldest_tid;
int64_t reserved02[6];
struct hammer_ioc_prune_elm *elms;
};
#define HAMMER_IOC_PRUNE_ALL 0x0001
struct hammer_ioc_rebalance {
struct hammer_ioc_head head;
int saturation;
int reserved01;
struct hammer_base_elm key_beg;
struct hammer_base_elm key_end;
struct hammer_base_elm key_cur;
int64_t stat_ncount;
int64_t stat_deletions;
int64_t stat_collisions;
int64_t stat_nrebal;
int32_t allpfs;
int32_t reserved02;
};
#define HAMMER_MAX_HISTORY_ELMS 64
struct hammer_ioc_hist_entry {
hammer_tid_t tid;
uint32_t time32;
uint32_t reserved01;
};
struct hammer_ioc_history {
struct hammer_ioc_head head;
int64_t obj_id;
hammer_tid_t beg_tid;
hammer_tid_t nxt_tid;
hammer_tid_t end_tid;
int64_t key;
int64_t nxt_key;
int count;
int reserve01;
struct hammer_ioc_hist_entry hist_ary[HAMMER_MAX_HISTORY_ELMS];
};
#define HAMMER_IOC_HISTORY_ATKEY 0x0001
#define HAMMER_IOC_HISTORY_NEXT_TID 0x0002
#define HAMMER_IOC_HISTORY_NEXT_KEY 0x0004
#define HAMMER_IOC_HISTORY_EOF 0x0008
#define HAMMER_IOC_HISTORY_UNSYNCED 0x0010
struct hammer_ioc_reblock {
struct hammer_ioc_head head;
int32_t free_level;
uint32_t reserved01;
struct hammer_base_elm key_beg;
struct hammer_base_elm key_end;
struct hammer_base_elm key_cur;
int64_t btree_count;
int64_t reserved02;
int64_t data_count;
int64_t data_byte_count;
int64_t btree_moves;
int64_t reserved03;
int64_t data_moves;
int64_t data_byte_moves;
int16_t allpfs;
int16_t vol_no;
int32_t reserved04;
};
enum hammer_synctid_op {
HAMMER_SYNCTID_NONE,
HAMMER_SYNCTID_ASYNC,
HAMMER_SYNCTID_SYNC1,
HAMMER_SYNCTID_SYNC2
};
struct hammer_ioc_synctid {
struct hammer_ioc_head head;
enum hammer_synctid_op op;
hammer_tid_t tid;
};
struct hammer_ioc_info {
struct hammer_ioc_head head;
char vol_label[64];
hammer_uuid_t vol_fsid;
hammer_uuid_t vol_fstype;
int version;
int nvolumes;
int rootvol;
int reserved01;
int64_t bigblocks;
int64_t freebigblocks;
int64_t rsvbigblocks;
int64_t inodes;
int64_t reservedext[16];
};
struct hammer_ioc_pseudofs_rw {
struct hammer_ioc_head head;
int pfs_id;
uint32_t bytes;
uint32_t version;
uint32_t reserved01;
hammer_pseudofs_data_t ondisk;
};
#define HAMMER_IOC_PSEUDOFS_VERSION 1
struct hammer_ioc_mirror_rw {
struct hammer_ioc_head head;
struct hammer_base_elm key_beg;
struct hammer_base_elm key_end;
struct hammer_base_elm key_cur;
hammer_tid_t tid_beg;
hammer_tid_t tid_end;
void *ubuf;
int count;
int size;
int pfs_id;
int reserved01;
hammer_uuid_t shared_uuid;
};
#define HAMMER_IOC_MIRROR_NODATA 0x0001
struct hammer_ioc_mrecord_head {
uint32_t signature;
hammer_crc_t rec_crc;
uint32_t rec_size;
uint32_t type;
};
struct hammer_ioc_mrecord_rec {
struct hammer_ioc_mrecord_head head;
struct hammer_btree_leaf_elm leaf;
};
struct hammer_ioc_mrecord_skip {
struct hammer_ioc_mrecord_head head;
struct hammer_base_elm skip_beg;
struct hammer_base_elm skip_end;
};
struct hammer_ioc_mrecord_update {
struct hammer_ioc_mrecord_head head;
hammer_tid_t tid;
};
struct hammer_ioc_mrecord_sync {
struct hammer_ioc_mrecord_head head;
};
struct hammer_ioc_mrecord_pfs {
struct hammer_ioc_mrecord_head head;
uint32_t version;
uint32_t reserved01;
struct hammer_pseudofs_data pfsd;
};
struct hammer_ioc_version {
struct hammer_ioc_head head;
uint32_t cur_version;
uint32_t min_version;
uint32_t wip_version;
uint32_t max_version;
char description[64];
};
struct hammer_ioc_volume {
struct hammer_ioc_head head;
char device_name[MAXPATHLEN];
int32_t vol_no;
uint8_t flag;
uint8_t reserved[3];
int64_t vol_size;
int64_t boot_area_size;
int64_t memory_log_size;
};
#define HAMMER_IOC_VOLUME_REBLOCK 1
struct hammer_ioc_volume_list {
struct hammer_ioc_volume *vols;
int nvols;
};
typedef union hammer_ioc_mrecord_any {
struct hammer_ioc_mrecord_head head;
struct hammer_ioc_mrecord_rec rec;
struct hammer_ioc_mrecord_skip skip;
struct hammer_ioc_mrecord_update update;
struct hammer_ioc_mrecord_update sync;
struct hammer_ioc_mrecord_pfs pfs;
struct hammer_ioc_version version;
} *hammer_ioc_mrecord_any_t;
#define HAMMER_MREC_TYPE_RESERVED 0
#define HAMMER_MREC_TYPE_REC 1
#define HAMMER_MREC_TYPE_PFSD 2
#define HAMMER_MREC_TYPE_UPDATE 3
#define HAMMER_MREC_TYPE_SYNC 4
#define HAMMER_MREC_TYPE_SKIP 5
#define HAMMER_MREC_TYPE_PASS 6
#define HAMMER_MREC_TYPE_TERM 7
#define HAMMER_MREC_TYPE_IDLE 8
#define HAMMER_MREC_TYPE_REC_BADCRC (HAMMER_MREC_TYPE_REC | \
HAMMER_MRECF_CRC_ERROR)
#define HAMMER_MREC_TYPE_REC_NODATA (HAMMER_MREC_TYPE_REC | \
HAMMER_MRECF_NODATA)
#define HAMMER_MRECF_TYPE_LOMASK 0x000000FF
#define HAMMER_MRECF_TYPE_MASK 0x800000FF
#define HAMMER_MRECF_CRC_ERROR 0x80000000
#define HAMMER_MRECF_DATA_CRC_BAD 0x40000000
#define HAMMER_MRECF_RECD_CRC_BAD 0x20000000
#define HAMMER_MRECF_NODATA 0x10000000
#define HAMMER_MREC_CRCOFF (offsetof(struct hammer_ioc_mrecord_head, rec_size))
#define HAMMER_MREC_HEADSIZE sizeof(struct hammer_ioc_mrecord_head)
#define HAMMER_IOC_MIRROR_SIGNATURE 0x4dd97272U
#define HAMMER_IOC_MIRROR_SIGNATURE_REV 0x7272d94dU
#define HAMMER_SNAPS_PER_IOCTL 16
#define HAMMER_IOC_SNAPSHOT_EOF 0x0008
struct hammer_ioc_snapshot {
struct hammer_ioc_head head;
int reserved01;
uint32_t index;
uint32_t count;
struct hammer_snapshot_data snaps[HAMMER_SNAPS_PER_IOCTL];
};
struct hammer_ioc_config {
struct hammer_ioc_head head;
uint32_t reserved01;
uint32_t reserved02;
uint64_t reserved03[4];
struct hammer_config_data config;
};
struct hammer_ioc_dedup {
struct hammer_ioc_head head;
struct hammer_base_elm elm1;
struct hammer_base_elm elm2;
};
#define HAMMER_IOC_DEDUP_CMP_FAILURE 0x0001
#define HAMMER_IOC_DEDUP_UNDERFLOW 0x0002
#define HAMMER_IOC_DEDUP_INVALID_ZONE 0x0004
struct hammer_ioc_data {
struct hammer_ioc_head head;
struct hammer_base_elm elm;
struct hammer_btree_leaf_elm leaf;
void *ubuf;
int size;
};
#define HAMMERIOC_PRUNE _IOWR('h',1,struct hammer_ioc_prune)
#define HAMMERIOC_GETHISTORY _IOWR('h',2,struct hammer_ioc_history)
#define HAMMERIOC_REBLOCK _IOWR('h',3,struct hammer_ioc_reblock)
#define HAMMERIOC_SYNCTID _IOWR('h',4,struct hammer_ioc_synctid)
#define HAMMERIOC_SET_PSEUDOFS _IOWR('h',5,struct hammer_ioc_pseudofs_rw)
#define HAMMERIOC_GET_PSEUDOFS _IOWR('h',6,struct hammer_ioc_pseudofs_rw)
#define HAMMERIOC_MIRROR_READ _IOWR('h',7,struct hammer_ioc_mirror_rw)
#define HAMMERIOC_MIRROR_WRITE _IOWR('h',8,struct hammer_ioc_mirror_rw)
#define HAMMERIOC_UPG_PSEUDOFS _IOWR('h',9,struct hammer_ioc_pseudofs_rw)
#define HAMMERIOC_DGD_PSEUDOFS _IOWR('h',10,struct hammer_ioc_pseudofs_rw)
#define HAMMERIOC_RMR_PSEUDOFS _IOWR('h',11,struct hammer_ioc_pseudofs_rw)
#define HAMMERIOC_WAI_PSEUDOFS _IOWR('h',12,struct hammer_ioc_pseudofs_rw)
#define HAMMERIOC_GET_VERSION _IOWR('h',13,struct hammer_ioc_version)
#define HAMMERIOC_SET_VERSION _IOWR('h',14,struct hammer_ioc_version)
#define HAMMERIOC_REBALANCE _IOWR('h',15,struct hammer_ioc_rebalance)
#define HAMMERIOC_GET_INFO _IOR('h',16,struct hammer_ioc_info)
#define HAMMERIOC_ADD_VOLUME _IOWR('h',17,struct hammer_ioc_volume)
#define HAMMERIOC_ADD_SNAPSHOT _IOWR('h',18,struct hammer_ioc_snapshot)
#define HAMMERIOC_DEL_SNAPSHOT _IOWR('h',19,struct hammer_ioc_snapshot)
#define HAMMERIOC_GET_SNAPSHOT _IOWR('h',20,struct hammer_ioc_snapshot)
#define HAMMERIOC_GET_CONFIG _IOWR('h',21,struct hammer_ioc_config)
#define HAMMERIOC_SET_CONFIG _IOWR('h',22,struct hammer_ioc_config)
#define HAMMERIOC_DEL_VOLUME _IOWR('h',24,struct hammer_ioc_volume)
#define HAMMERIOC_DEDUP _IOWR('h',25,struct hammer_ioc_dedup)
#define HAMMERIOC_GET_DATA _IOWR('h',26,struct hammer_ioc_data)
#define HAMMERIOC_LIST_VOLUMES _IOWR('h',27,struct hammer_ioc_volume_list)
#define HAMMERIOC_SCAN_PSEUDOFS _IOWR('h',28,struct hammer_ioc_pseudofs_rw)
#endif