xref: /titanic_53/usr/src/common/zev/zev.h (revision f8e3fee256188e330220739eb66f639d34816d4a)
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