12bb8e5e2SAndreas Jaekel #ifndef __ZEV_H__ 22bb8e5e2SAndreas Jaekel #define __ZEV_H__ 32bb8e5e2SAndreas Jaekel 42bb8e5e2SAndreas Jaekel #include <sys/types.h> 59db22157SAndreas Jaekel #include <sys/param.h> 6e9a5e479SAndreas Jaekel #include <sys/atomic.h> 75e286361SAndreas Jaekel #include <sys/sha1.h> 82bb8e5e2SAndreas Jaekel 92bb8e5e2SAndreas Jaekel #ifdef _KERNEL 102bb8e5e2SAndreas Jaekel #include <sys/dmu_objset.h> 112bb8e5e2SAndreas Jaekel #include <sys/dsl_dataset.h> 122bb8e5e2SAndreas Jaekel #include <sys/zfs_vfsops.h> 132bb8e5e2SAndreas Jaekel #include <sys/dsl_dir.h> 142bb8e5e2SAndreas Jaekel #include <sys/spa_impl.h> 152bb8e5e2SAndreas Jaekel #endif 162bb8e5e2SAndreas Jaekel 17e9a5e479SAndreas Jaekel #define ZEV_MAX_QUEUE_NAME_LEN 40 18e9a5e479SAndreas Jaekel #define ZEV_MAX_QUEUES 63 19e9a5e479SAndreas Jaekel #define ZEV_CONTROL_DEVICE_NAME "ctrl" 20e9a5e479SAndreas Jaekel 21e9a5e479SAndreas Jaekel /* global limit, no queue may grow larger than this. */ 22e9a5e479SAndreas Jaekel #define ZEV_MAX_QUEUE_LEN (1 * 1024 * 1024 * 1024) 23e9a5e479SAndreas Jaekel 24e9a5e479SAndreas Jaekel /* Don't wake up poll()ing processes for every single message. */ 254ca7dd5eSAndreas Jaekel #define ZEV_DEFAULT_POLL_WAKEUP_QUEUE_LEN 8192 26e9a5e479SAndreas Jaekel #define ZEV_MAX_POLL_WAKEUP_QUEUE_LEN 65536 27e9a5e479SAndreas Jaekel 282bb8e5e2SAndreas Jaekel #define ZEVIOC ('z' << 8) 29e9a5e479SAndreas Jaekel #define ZEV_IOC_GET_GLOBAL_STATISTICS (ZEVIOC | 1) /* get global stats */ 30205a9bc9SAndreas Jaekel #define ZEV_IOC_MUTE_POOL (ZEVIOC | 2) /* no events for pool */ 31205a9bc9SAndreas Jaekel #define ZEV_IOC_UNMUTE_POOL (ZEVIOC | 3) /* send pool events */ 32205a9bc9SAndreas Jaekel #define ZEV_IOC_SET_MAX_QUEUE_LEN (ZEVIOC | 4) /* when to block ops */ 33205a9bc9SAndreas Jaekel #define ZEV_IOC_SET_POLL_WAKEUP_QUEUE_LEN (ZEVIOC | 5) /* poll throttle */ 3401c2c787SAndreas Jaekel #define ZEV_IOC_MARK (ZEVIOC | 6) /* add mark to queue */ 35c035b1e8SAndreas Jaekel #define ZEV_IOC_GET_GEN (ZEVIOC | 7) /* get generation no. */ 36e9a5e479SAndreas Jaekel #define ZEV_IOC_ADD_QUEUE (ZEVIOC | 8) /* create new queue */ 37e9a5e479SAndreas Jaekel #define ZEV_IOC_REMOVE_QUEUE (ZEVIOC | 9) /* delete queue */ 38e9a5e479SAndreas Jaekel #define ZEV_IOC_GET_QUEUE_PROPERTIES (ZEVIOC | 10) /* get properties */ 39e9a5e479SAndreas Jaekel #define ZEV_IOC_SET_QUEUE_PROPERTIES (ZEVIOC | 11) /* set properties */ 40e9a5e479SAndreas Jaekel #define ZEV_IOC_GET_QUEUE_STATISTICS (ZEVIOC | 12) /* get queue stats */ 41e9a5e479SAndreas Jaekel #define ZEV_IOC_GET_DEBUG_INFO (ZEVIOC | 13) /* get internal info */ 42e9a5e479SAndreas Jaekel #define ZEV_IOC_GET_QUEUE_LIST (ZEVIOC | 14) /* get queue list */ 43b9710123SAndreas Jaekel #define ZEV_IOC_GET_FILE_SIGNATURES (ZEVIOC | 15) /* get beaver sigs */ 442bb8e5e2SAndreas Jaekel 452bb8e5e2SAndreas Jaekel #define ZEV_OP_MIN 1 4668a46c64SAndreas Jaekel #define ZEV_OP_ERROR 1 4701c2c787SAndreas Jaekel #define ZEV_OP_MARK 2 4801c2c787SAndreas Jaekel #define ZEV_OP_ZFS_MOUNT 3 4901c2c787SAndreas Jaekel #define ZEV_OP_ZFS_UMOUNT 4 5001c2c787SAndreas Jaekel #define ZEV_OP_ZVOL_WRITE 5 5101c2c787SAndreas Jaekel #define ZEV_OP_ZVOL_TRUNCATE 6 5201c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_CLOSE_AFTER_UPDATE 7 5301c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_CREATE 8 5401c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_MKDIR 9 5501c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_MAKE_XATTR_DIR 10 5601c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_REMOVE 11 5701c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_RMDIR 12 5801c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_LINK 13 5901c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_SYMLINK 14 6001c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_RENAME 15 6101c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_WRITE 16 6201c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_TRUNCATE 17 6301c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_SETATTR 18 6401c2c787SAndreas Jaekel #define ZEV_OP_ZNODE_ACL 19 6501c2c787SAndreas Jaekel #define ZEV_OP_MAX 19 6668a46c64SAndreas Jaekel 67e9a5e479SAndreas Jaekel /* zev event flags */ 68e9a5e479SAndreas Jaekel #define ZEV_FL_XATTR 0x0001 69e9a5e479SAndreas Jaekel 70e9a5e479SAndreas Jaekel /* zev queue flags */ 71e9a5e479SAndreas Jaekel #define ZEV_FL_BLOCK_WHILE_QUEUE_FULL 0x0001 72e9a5e479SAndreas Jaekel #define ZEV_FL_PERSISTENT 0x0002 73b434d29cSAndreas Jaekel #define ZEV_FL_INITIALLY_EMPTY 0x0004 74e9a5e479SAndreas Jaekel 75b9710123SAndreas Jaekel /* checksum block sizes */ 76b9710123SAndreas Jaekel #define ZEV_L0_SIZE 4096 77b9710123SAndreas Jaekel #define ZEV_L1_SIZE (256 * ZEV_L0_SIZE) 7810874358SAndreas Jaekel 7968a46c64SAndreas Jaekel /* zfs event records (as they are represented through the character device) */ 8068a46c64SAndreas Jaekel 81108668daSAndreas Jaekel #pragma pack(1) 8268a46c64SAndreas Jaekel typedef struct zev_inode_info_t { 8368a46c64SAndreas Jaekel uint64_t ino; 8468a46c64SAndreas Jaekel uint64_t gen; 8568a46c64SAndreas Jaekel uint64_t mtime; 8668a46c64SAndreas Jaekel uint64_t ctime; 8768a46c64SAndreas Jaekel uint64_t size; 8868a46c64SAndreas Jaekel uint64_t mode; 8968a46c64SAndreas Jaekel uint64_t links; 90108668daSAndreas Jaekel uint32_t type; 9110874358SAndreas Jaekel uint32_t flags; 9268a46c64SAndreas Jaekel } zev_inode_info_t; 9368a46c64SAndreas Jaekel 9468a46c64SAndreas Jaekel #define ZEV_ERRSTR(rec) ((char *)(rec + 1)) 9568a46c64SAndreas Jaekel #define ZEV_DATASET(rec) ((char *)(rec + 1)) 9668a46c64SAndreas Jaekel #define ZEV_MOUNTPOINT(rec) (((char *)(rec + 1)) + rec->dataset_len + 1) 9768a46c64SAndreas Jaekel #define ZEV_NAME(rec) ((char *)(rec + 1)) 9868a46c64SAndreas Jaekel #define ZEV_SRCNAME(rec) ((char *)(rec + 1)) 9968a46c64SAndreas Jaekel #define ZEV_DSTNAME(rec) (((char *)(rec + 1)) + rec->srcname_len + 1) 10068a46c64SAndreas Jaekel #define ZEV_LINK(rec) (((char *)(rec + 1)) + rec->name_len + 1) 10101c2c787SAndreas Jaekel #define ZEV_PAYLOAD(rec) ((char *)(rec + 1)) 1025e286361SAndreas Jaekel #define ZEV_SIGNATURES(rec) ((char *)(rec + 1)) 10368a46c64SAndreas Jaekel 104108668daSAndreas Jaekel #define ZEV_COMMON_FIELDS \ 105108668daSAndreas Jaekel uint32_t record_len; \ 106108668daSAndreas Jaekel uint32_t op; \ 107108668daSAndreas Jaekel uint64_t op_time; \ 108b9df2829SAndreas Jaekel uint64_t guid 109108668daSAndreas Jaekel 1105e286361SAndreas Jaekel typedef struct zev_sig_t { 1115e286361SAndreas Jaekel uint16_t level; 1125e286361SAndreas Jaekel uint16_t padding1; 1135e286361SAndreas Jaekel uint32_t padding2; 1145e286361SAndreas Jaekel uint64_t block_offset; 1155e286361SAndreas Jaekel uint8_t value[SHA1_DIGEST_LENGTH]; /* 20 bytes -> no padding */ 1165e286361SAndreas Jaekel } zev_sig_t; 1175e286361SAndreas Jaekel 11868a46c64SAndreas Jaekel typedef struct zev_header_t { 119108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 12068a46c64SAndreas Jaekel } zev_header_t; 12168a46c64SAndreas Jaekel 12268a46c64SAndreas Jaekel typedef struct zev_error_t { 123108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 12468a46c64SAndreas Jaekel uint32_t failed_op; 12568a46c64SAndreas Jaekel uint32_t errstr_len; 12668a46c64SAndreas Jaekel /* error string follows */ 12768a46c64SAndreas Jaekel } zev_error_t; 12868a46c64SAndreas Jaekel 12901c2c787SAndreas Jaekel typedef struct zev_mark_t { 13001c2c787SAndreas Jaekel ZEV_COMMON_FIELDS; 13101c2c787SAndreas Jaekel uint64_t mark_id; 13201c2c787SAndreas Jaekel uint32_t payload_len; 13301c2c787SAndreas Jaekel uint32_t padding; 13401c2c787SAndreas Jaekel /* payload follows */ 13501c2c787SAndreas Jaekel } zev_mark_t; 13601c2c787SAndreas Jaekel 13768a46c64SAndreas Jaekel typedef struct zev_zfs_mount_t { 138108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 139f66561e7SAndreas Jaekel zev_inode_info_t root; 140108668daSAndreas Jaekel uint32_t remount; 14168a46c64SAndreas Jaekel uint32_t dataset_len; 14268a46c64SAndreas Jaekel uint32_t mountpoint_len; 143108668daSAndreas Jaekel uint32_t padding; 14468a46c64SAndreas Jaekel /* dataset follows */ 14568a46c64SAndreas Jaekel /* mountpoint follows */ 14668a46c64SAndreas Jaekel } zev_zfs_mount_t; 14768a46c64SAndreas Jaekel 14868a46c64SAndreas Jaekel typedef struct zev_zfs_umount_t { 149108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 150443f0cd2SAndreas Jaekel zev_inode_info_t covered; 15168a46c64SAndreas Jaekel } zev_zfs_umount_t; 15268a46c64SAndreas Jaekel 15368a46c64SAndreas Jaekel typedef struct zev_zvol_truncate_t { 154108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 155e206ace3SAndreas Jaekel uint64_t txg; 15668a46c64SAndreas Jaekel uint64_t offset; 15768a46c64SAndreas Jaekel uint64_t length; 15868a46c64SAndreas Jaekel uint32_t dataset_len; 159108668daSAndreas Jaekel uint32_t padding; 16068a46c64SAndreas Jaekel /* dataset follows */ 16168a46c64SAndreas Jaekel } zev_zvol_truncate_t; 16268a46c64SAndreas Jaekel 16368a46c64SAndreas Jaekel typedef struct zev_zvol_write_t { 164108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 165e206ace3SAndreas Jaekel uint64_t txg; 16668a46c64SAndreas Jaekel uint64_t offset; 16768a46c64SAndreas Jaekel uint64_t length; 16868a46c64SAndreas Jaekel uint32_t dataset_len; 169108668daSAndreas Jaekel uint32_t padding; 17068a46c64SAndreas Jaekel /* dataset follows */ 17168a46c64SAndreas Jaekel } zev_zvol_write_t; 17268a46c64SAndreas Jaekel 17368a46c64SAndreas Jaekel typedef struct zev_znode_close_after_update_t { 174108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 17568a46c64SAndreas Jaekel zev_inode_info_t file; 17668a46c64SAndreas Jaekel } zev_znode_close_after_update_t; 17768a46c64SAndreas Jaekel 17868a46c64SAndreas Jaekel typedef struct zev_znode_create_t { 179108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 180e206ace3SAndreas Jaekel uint64_t txg; 18168a46c64SAndreas Jaekel zev_inode_info_t file; 18268a46c64SAndreas Jaekel zev_inode_info_t parent; 1831ca5a13bSAndreas Jaekel zev_sig_t signature; 18468a46c64SAndreas Jaekel uint32_t name_len; 185108668daSAndreas Jaekel uint32_t padding; 18668a46c64SAndreas Jaekel /* name follows */ 18768a46c64SAndreas Jaekel } zev_znode_create_t; 18868a46c64SAndreas Jaekel 18968a46c64SAndreas Jaekel typedef struct zev_znode_create_t zev_znode_mkdir_t; 19068a46c64SAndreas Jaekel typedef struct zev_znode_create_t zev_znode_make_xattr_dir_t; 19168a46c64SAndreas Jaekel 19268a46c64SAndreas Jaekel typedef struct zev_znode_remove_t { 193108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 194e206ace3SAndreas Jaekel uint64_t txg; 1956db5d4ecSAndreas Jaekel zev_inode_info_t file; 19668a46c64SAndreas Jaekel zev_inode_info_t parent; 19768a46c64SAndreas Jaekel uint32_t name_len; 198108668daSAndreas Jaekel uint32_t padding; 19968a46c64SAndreas Jaekel /* name follows */ 20068a46c64SAndreas Jaekel } zev_znode_remove_t; 20168a46c64SAndreas Jaekel 20268a46c64SAndreas Jaekel typedef struct zev_znode_remove_t zev_znode_rmdir_t; 20368a46c64SAndreas Jaekel 20468a46c64SAndreas Jaekel typedef struct zev_znode_link_t { 205108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 206e206ace3SAndreas Jaekel uint64_t txg; 20768a46c64SAndreas Jaekel zev_inode_info_t parent; 20868a46c64SAndreas Jaekel zev_inode_info_t file; 20968a46c64SAndreas Jaekel uint32_t name_len; 210108668daSAndreas Jaekel uint32_t padding; 21168a46c64SAndreas Jaekel /* new_name follows */ 21268a46c64SAndreas Jaekel } zev_znode_link_t; 21368a46c64SAndreas Jaekel 21468a46c64SAndreas Jaekel typedef struct zev_znode_symlink_t { 215108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 216e206ace3SAndreas Jaekel uint64_t txg; 21768a46c64SAndreas Jaekel zev_inode_info_t parent; 21868a46c64SAndreas Jaekel zev_inode_info_t file; 2191ca5a13bSAndreas Jaekel zev_sig_t signature; 22068a46c64SAndreas Jaekel uint32_t name_len; 22168a46c64SAndreas Jaekel uint32_t link_len; 22268a46c64SAndreas Jaekel /* name follows */ 22368a46c64SAndreas Jaekel /* link follows */ 22468a46c64SAndreas Jaekel } zev_znode_symlink_t; 22568a46c64SAndreas Jaekel 22668a46c64SAndreas Jaekel typedef struct zev_znode_rename_t { 227108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 228e206ace3SAndreas Jaekel uint64_t txg; 22968a46c64SAndreas Jaekel zev_inode_info_t srcdir; 23068a46c64SAndreas Jaekel zev_inode_info_t dstdir; 23168a46c64SAndreas Jaekel zev_inode_info_t file; 232*f8e3fee2SAndreas Jaekel zev_inode_info_t clobbered_file; 23368a46c64SAndreas Jaekel uint32_t srcname_len; 23468a46c64SAndreas Jaekel uint32_t dstname_len; 23568a46c64SAndreas Jaekel /* srcname follows */ 23668a46c64SAndreas Jaekel /* dstname follows */ 23768a46c64SAndreas Jaekel } zev_znode_rename_t; 23868a46c64SAndreas Jaekel 23968a46c64SAndreas Jaekel typedef struct zev_znode_write_t { 240108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 241e206ace3SAndreas Jaekel uint64_t txg; 24268a46c64SAndreas Jaekel zev_inode_info_t file; 24368a46c64SAndreas Jaekel uint64_t offset; 24468a46c64SAndreas Jaekel uint64_t length; 2455e286361SAndreas Jaekel uint64_t signature_cnt; 2465e286361SAndreas Jaekel /* signatures follow */ 24768a46c64SAndreas Jaekel } zev_znode_write_t; 24868a46c64SAndreas Jaekel 24968a46c64SAndreas Jaekel typedef struct zev_znode_truncate_t { 250108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 251e206ace3SAndreas Jaekel uint64_t txg; 25268a46c64SAndreas Jaekel zev_inode_info_t file; 25368a46c64SAndreas Jaekel uint64_t offset; 25468a46c64SAndreas Jaekel uint64_t length; 2555e286361SAndreas Jaekel uint64_t signature_cnt; 2565e286361SAndreas Jaekel /* signatures follow */ 25768a46c64SAndreas Jaekel } zev_znode_truncate_t; 25868a46c64SAndreas Jaekel 25968a46c64SAndreas Jaekel typedef struct zev_znode_setattr_t { 260108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 261e206ace3SAndreas Jaekel uint64_t txg; 26268a46c64SAndreas Jaekel zev_inode_info_t file; 26368a46c64SAndreas Jaekel } zev_znode_setattr_t; 26468a46c64SAndreas Jaekel 26568a46c64SAndreas Jaekel typedef struct zev_znode_acl_t { 266108668daSAndreas Jaekel ZEV_COMMON_FIELDS; 267e206ace3SAndreas Jaekel uint64_t txg; 26868a46c64SAndreas Jaekel zev_inode_info_t file; 26968a46c64SAndreas Jaekel } zev_znode_acl_t; 27068a46c64SAndreas Jaekel 27168a46c64SAndreas Jaekel /* convenience helper definition */ 27268a46c64SAndreas Jaekel typedef union { 27368a46c64SAndreas Jaekel zev_header_t header; 27468a46c64SAndreas Jaekel 27501c2c787SAndreas Jaekel zev_error_t error; 27601c2c787SAndreas Jaekel zev_mark_t mark; 27768a46c64SAndreas Jaekel union { 27868a46c64SAndreas Jaekel zev_zfs_mount_t mount; 27968a46c64SAndreas Jaekel zev_zfs_umount_t umount; 28068a46c64SAndreas Jaekel } zfs; 28168a46c64SAndreas Jaekel union { 28268a46c64SAndreas Jaekel zev_zvol_truncate_t truncate; 28368a46c64SAndreas Jaekel zev_zvol_write_t write; 28468a46c64SAndreas Jaekel } zvol; 28568a46c64SAndreas Jaekel union { 28668a46c64SAndreas Jaekel zev_znode_close_after_update_t close; 28768a46c64SAndreas Jaekel zev_znode_create_t create; 28868a46c64SAndreas Jaekel zev_znode_mkdir_t mkdir; 28968a46c64SAndreas Jaekel zev_znode_make_xattr_dir_t mkxattrdir; 29068a46c64SAndreas Jaekel zev_znode_remove_t remove; 29168a46c64SAndreas Jaekel zev_znode_rmdir_t rmdir; 29268a46c64SAndreas Jaekel zev_znode_link_t link; 29368a46c64SAndreas Jaekel zev_znode_symlink_t symlink; 29468a46c64SAndreas Jaekel zev_znode_rename_t rename; 29568a46c64SAndreas Jaekel zev_znode_write_t write; 29668a46c64SAndreas Jaekel zev_znode_truncate_t truncate; 29768a46c64SAndreas Jaekel zev_znode_setattr_t setattr; 29868a46c64SAndreas Jaekel zev_znode_acl_t acl; 29968a46c64SAndreas Jaekel } znode; 30068a46c64SAndreas Jaekel } zev_event_t; 30168a46c64SAndreas Jaekel 30268a46c64SAndreas Jaekel 3032bb8e5e2SAndreas Jaekel 3042bb8e5e2SAndreas Jaekel typedef struct zev_statistics_t { 3052bb8e5e2SAndreas Jaekel uint64_t zev_queue_len; 3062bb8e5e2SAndreas Jaekel uint64_t zev_bytes_read; 307e9a5e479SAndreas Jaekel uint64_t zev_bytes_discarded; 308205a9bc9SAndreas Jaekel /* runtime settings */ 309205a9bc9SAndreas Jaekel uint64_t zev_max_queue_len; 3102bb8e5e2SAndreas Jaekel /* counters */ 3112bb8e5e2SAndreas Jaekel uint64_t zev_cnt_total_events; 312e9a5e479SAndreas Jaekel uint64_t zev_cnt_discarded_events; 3132bb8e5e2SAndreas Jaekel uint64_t zev_cnt_errors; 31401c2c787SAndreas Jaekel uint64_t zev_cnt_marks; 3152bb8e5e2SAndreas Jaekel /* zfsvfs ops */ 3162bb8e5e2SAndreas Jaekel uint64_t zev_cnt_zfs_mount; 3172bb8e5e2SAndreas Jaekel uint64_t zev_cnt_zfs_umount; 3182bb8e5e2SAndreas Jaekel /* zvol ops */ 3192bb8e5e2SAndreas Jaekel uint64_t zev_cnt_zvol_write; 3202bb8e5e2SAndreas Jaekel uint64_t zev_cnt_zvol_truncate; 3212bb8e5e2SAndreas Jaekel /* znode ops */ 3222bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_close_after_update; 3232bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_create; 3242bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_remove; 3252bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_link; 3262bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_symlink; 3272bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_rename; 3282bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_write; 3292bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_truncate; 3302bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_setattr; 3312bb8e5e2SAndreas Jaekel uint64_t zev_cnt_znode_acl; 3322bb8e5e2SAndreas Jaekel } zev_statistics_t; 3332bb8e5e2SAndreas Jaekel 334e9a5e479SAndreas Jaekel typedef struct zev_queue_name { 335e9a5e479SAndreas Jaekel uint64_t zev_namelen; 336e9a5e479SAndreas Jaekel char zev_name[ZEV_MAX_QUEUE_NAME_LEN]; 337e9a5e479SAndreas Jaekel } zev_queue_name_t; 338e9a5e479SAndreas Jaekel 3392bb8e5e2SAndreas Jaekel typedef struct zev_ioctl_poolarg { 3402bb8e5e2SAndreas Jaekel uint64_t zev_poolname_len; 3412bb8e5e2SAndreas Jaekel char zev_poolname[MAXPATHLEN]; 3422bb8e5e2SAndreas Jaekel } zev_ioctl_poolarg_t; 34301c2c787SAndreas Jaekel 34401c2c787SAndreas Jaekel typedef struct zev_ioctl_mark { 34501c2c787SAndreas Jaekel uint64_t zev_mark_id; 34601c2c787SAndreas Jaekel uint64_t zev_guid; 34701c2c787SAndreas Jaekel uint32_t zev_payload_len; 34846c85740SAndreas Jaekel uint32_t padding; 34901c2c787SAndreas Jaekel /* payload follows */ 35001c2c787SAndreas Jaekel } zev_ioctl_mark_t; 351c035b1e8SAndreas Jaekel 352c035b1e8SAndreas Jaekel typedef struct zev_ioctl_get_gen { 353c035b1e8SAndreas Jaekel /* input */ 354c035b1e8SAndreas Jaekel uint64_t inode; 355c035b1e8SAndreas Jaekel uint32_t fd; /* open fd to any object on the same fs */ 356c035b1e8SAndreas Jaekel /* noput */ 357c035b1e8SAndreas Jaekel uint32_t padding; 358c035b1e8SAndreas Jaekel /* output */ 359c035b1e8SAndreas Jaekel uint64_t generation; 360c035b1e8SAndreas Jaekel uint64_t crtime; 361c035b1e8SAndreas Jaekel uint64_t guid; 362c035b1e8SAndreas Jaekel char dataset[MAXPATHLEN]; 363c035b1e8SAndreas Jaekel } zev_ioctl_get_gen_t; 364e9a5e479SAndreas Jaekel 365e9a5e479SAndreas Jaekel typedef struct zev_ioctl_set_queue_properties { 366e9a5e479SAndreas Jaekel uint64_t zev_max_queue_len; 367e9a5e479SAndreas Jaekel uint64_t zev_poll_wakeup_threshold; 368e9a5e479SAndreas Jaekel uint16_t zev_flags; 3694ca7dd5eSAndreas Jaekel uint16_t padding1; 3704ca7dd5eSAndreas Jaekel uint32_t padding2; 3714ca7dd5eSAndreas Jaekel zev_queue_name_t zev_queue_name; 372e9a5e479SAndreas Jaekel } zev_ioctl_set_queue_properties_t; 373e9a5e479SAndreas Jaekel 374e9a5e479SAndreas Jaekel typedef struct zev_ioctl_set_queue_properties zev_ioctl_get_queue_properties_t; 375e9a5e479SAndreas Jaekel 376e9a5e479SAndreas Jaekel typedef struct zev_ioctl_add_queue { 377e9a5e479SAndreas Jaekel uint64_t zev_max_queue_len; 378e9a5e479SAndreas Jaekel uint32_t padding; 379e9a5e479SAndreas Jaekel uint16_t zev_flags; 380e9a5e479SAndreas Jaekel uint16_t zev_namelen; 381e9a5e479SAndreas Jaekel char zev_name[ZEV_MAX_QUEUE_NAME_LEN]; 382e9a5e479SAndreas Jaekel } zev_ioctl_add_queue_t; 383e9a5e479SAndreas Jaekel 384e9a5e479SAndreas Jaekel typedef struct zev_ioctl_remove_queue { 3854ca7dd5eSAndreas Jaekel zev_queue_name_t zev_queue_name; 386e9a5e479SAndreas Jaekel } zev_ioctl_remove_queue_t; 387e9a5e479SAndreas Jaekel 388e9a5e479SAndreas Jaekel typedef struct zev_ioctl_get_queue_statistics { 3894ca7dd5eSAndreas Jaekel zev_queue_name_t zev_queue_name; 390e9a5e479SAndreas Jaekel zev_statistics_t zev_statistics; 391e9a5e479SAndreas Jaekel } zev_ioctl_get_queue_statistics_t; 392e9a5e479SAndreas Jaekel 393e9a5e479SAndreas Jaekel typedef struct zev_ioctl_debug_info { 394e9a5e479SAndreas Jaekel uint64_t zev_memory_allocated; 3955e286361SAndreas Jaekel uint64_t zev_chksum_cache_size; 3965e286361SAndreas Jaekel uint64_t zev_chksum_cache_hits; 3975e286361SAndreas Jaekel uint64_t zev_chksum_cache_misses; 398e9a5e479SAndreas Jaekel } zev_ioctl_debug_info_t; 399e9a5e479SAndreas Jaekel 400e9a5e479SAndreas Jaekel typedef struct zev_ioctl_get_queue_list { 401e9a5e479SAndreas Jaekel uint64_t zev_n_queues; 402e9a5e479SAndreas Jaekel zev_queue_name_t zev_queue_name[ZEV_MAX_QUEUES]; 403e9a5e479SAndreas Jaekel } zev_ioctl_get_queue_list_t; 404e9a5e479SAndreas Jaekel 405b9710123SAndreas Jaekel typedef struct zev_ioctl_get_signatures { 406b9710123SAndreas Jaekel /* in */ 407b9710123SAndreas Jaekel uint64_t zev_offset; 408b9710123SAndreas Jaekel uint64_t zev_len; 409b9710123SAndreas Jaekel uint32_t zev_fd; 410b9710123SAndreas Jaekel uint32_t zev_bufsize; 411b9710123SAndreas Jaekel /* out */ 412b9710123SAndreas Jaekel uint64_t zev_signature_cnt; 413b9710123SAndreas Jaekel /* up to zev_bufsize bytes of checksums will be written here */ 414b9710123SAndreas Jaekel } zev_ioctl_get_signatures_t; 415b9710123SAndreas Jaekel 416108668daSAndreas Jaekel #pragma pack() 4172bb8e5e2SAndreas Jaekel 4182bb8e5e2SAndreas Jaekel #ifdef _KERNEL 419e9a5e479SAndreas Jaekel 420e9a5e479SAndreas Jaekel extern uint64_t zev_memory_allocated; 421e9a5e479SAndreas Jaekel extern uint64_t zev_memory_freed; 422e9a5e479SAndreas Jaekel 423e9a5e479SAndreas Jaekel #define ZEV_MEM_ADD(memsize) \ 424e9a5e479SAndreas Jaekel do { \ 425e9a5e479SAndreas Jaekel int64_t tmp_delta = (int64_t)(memsize); \ 426e9a5e479SAndreas Jaekel atomic_add_64(&zev_memory_allocated, tmp_delta); \ 427e9a5e479SAndreas Jaekel } while(0) 428e9a5e479SAndreas Jaekel 429e9a5e479SAndreas Jaekel #define ZEV_MEM_SUB(memsize) \ 430e9a5e479SAndreas Jaekel do { \ 431e9a5e479SAndreas Jaekel int64_t tmp_delta = (int64_t)(memsize); \ 432e9a5e479SAndreas Jaekel atomic_add_64(&zev_memory_freed, tmp_delta); \ 433e9a5e479SAndreas Jaekel } while(0) 434e9a5e479SAndreas Jaekel 4355e286361SAndreas Jaekel void *zev_alloc(ssize_t sz); 4365e286361SAndreas Jaekel void *zev_zalloc(ssize_t sz); 4375e286361SAndreas Jaekel void zev_free(void *ptr, ssize_t sz); 438e9a5e479SAndreas Jaekel 43968a46c64SAndreas Jaekel typedef struct zev_msg_t { 44068a46c64SAndreas Jaekel struct zev_msg_t *next; 441e9a5e479SAndreas Jaekel struct zev_msg_t *prev; 442e9a5e479SAndreas Jaekel uint64_t seq; 443e9a5e479SAndreas Jaekel uint16_t size; 444e9a5e479SAndreas Jaekel uint16_t read; 44568a46c64SAndreas Jaekel /* data follows */ 44668a46c64SAndreas Jaekel } zev_msg_t; 44768a46c64SAndreas Jaekel 44868a46c64SAndreas Jaekel void zev_queue_error(int op, char *fmt, ...); 44968a46c64SAndreas Jaekel void zev_queue_message(int op, zev_msg_t *msg); 45068a46c64SAndreas Jaekel void zev_queue_message_nvlist(int op, nvlist_t *nvl); 4512bb8e5e2SAndreas Jaekel int zev_skip_pool(objset_t *os); 45268a46c64SAndreas Jaekel 4532bb8e5e2SAndreas Jaekel #endif 4542bb8e5e2SAndreas Jaekel 4552bb8e5e2SAndreas Jaekel #endif /* __ZEV_H__ */ 4562bb8e5e2SAndreas Jaekel 457