xref: /titanic_44/usr/src/common/zev/zev.h (revision 149d0affa57d708a9278120c8e260622dbb3667f)
1 #ifndef __ZEV_H__
2 #define __ZEV_H__
3 
4 #include <sys/types.h>
5 
6 #ifdef _KERNEL
7 #include <sys/dmu_objset.h>
8 #include <sys/dsl_dataset.h>
9 #include <sys/zfs_vfsops.h>
10 #include <sys/dsl_dir.h>
11 #include <sys/spa_impl.h>
12 #endif
13 
14 #define ZEVIOC				  ('z' << 8)
15 #define ZEV_IOC_GET_STATISTICS		  (ZEVIOC | 1)	/* get zev statistics */
16 #define ZEV_IOC_MUTE_POOL		  (ZEVIOC | 2)	/* no events for pool */
17 #define ZEV_IOC_UNMUTE_POOL		  (ZEVIOC | 3)	/* send pool events */
18 #define ZEV_IOC_SET_MAX_QUEUE_LEN	  (ZEVIOC | 4)	/* when to block ops */
19 #define ZEV_IOC_SET_POLL_WAKEUP_QUEUE_LEN (ZEVIOC | 5)	/* poll throttle */
20 
21 #define ZEV_OP_MIN			 1
22 #define ZEV_OP_ERROR			 1
23 #define	ZEV_OP_ZFS_MOUNT		 2
24 #define	ZEV_OP_ZFS_UMOUNT		 3
25 #define	ZEV_OP_ZVOL_WRITE		 4
26 #define	ZEV_OP_ZVOL_TRUNCATE		 5
27 #define	ZEV_OP_ZNODE_CLOSE_AFTER_UPDATE	 6
28 #define	ZEV_OP_ZNODE_CREATE		 7
29 #define	ZEV_OP_ZNODE_MKDIR		 8
30 #define	ZEV_OP_ZNODE_MAKE_XATTR_DIR	 9
31 #define	ZEV_OP_ZNODE_REMOVE		10
32 #define	ZEV_OP_ZNODE_RMDIR		11
33 #define	ZEV_OP_ZNODE_LINK		12
34 #define	ZEV_OP_ZNODE_SYMLINK		13
35 #define	ZEV_OP_ZNODE_RENAME		14
36 #define	ZEV_OP_ZNODE_WRITE		15
37 #define	ZEV_OP_ZNODE_TRUNCATE		16
38 #define	ZEV_OP_ZNODE_SETATTR		17
39 #define	ZEV_OP_ZNODE_ACL		18
40 #define	ZEV_OP_MAX			18
41 
42 /* zfs event records (as they are represented through the character device) */
43 
44 #pragma pack(1)
45 typedef struct zev_inode_info_t {
46 	uint64_t	ino;
47 	uint64_t	gen;
48 	uint64_t	mtime;
49 	uint64_t	ctime;
50 	uint64_t	size;
51 	uint64_t	mode;
52 	uint64_t	links;
53 	uint32_t	type;
54 	uint32_t	padding;
55 } zev_inode_info_t;
56 
57 #define ZEV_ERRSTR(rec)		((char *)(rec + 1))
58 #define ZEV_DATASET(rec)	((char *)(rec + 1))
59 #define ZEV_MOUNTPOINT(rec)	(((char *)(rec + 1)) + rec->dataset_len + 1)
60 #define ZEV_NAME(rec)		((char *)(rec + 1))
61 #define ZEV_SRCNAME(rec)	((char *)(rec + 1))
62 #define ZEV_DSTNAME(rec)	(((char *)(rec + 1)) + rec->srcname_len + 1)
63 #define ZEV_LINK(rec)		(((char *)(rec + 1)) + rec->name_len + 1)
64 
65 #define ZEV_COMMON_FIELDS						\
66 	uint32_t		record_len;				\
67 	uint32_t		op;					\
68 	uint64_t		op_time;				\
69 	uint64_t		guid;
70 
71 typedef struct zev_header_t {
72 	ZEV_COMMON_FIELDS;
73 } zev_header_t;
74 
75 typedef struct zev_error_t {
76 	ZEV_COMMON_FIELDS;
77 	uint32_t		failed_op;
78 	uint32_t		errstr_len;
79 	/* error string follows */
80 } zev_error_t;
81 
82 typedef struct zev_zfs_mount_t {
83 	ZEV_COMMON_FIELDS;
84 	uint64_t		root_ino;
85 	uint32_t		remount;
86 	uint32_t		dataset_len;
87 	uint32_t		mountpoint_len;
88 	uint32_t		padding;
89 	/* dataset follows */
90 	/* mountpoint follows */
91 } zev_zfs_mount_t;
92 
93 typedef struct zev_zfs_umount_t {
94 	ZEV_COMMON_FIELDS;
95 } zev_zfs_umount_t;
96 
97 typedef struct zev_zvol_truncate_t {
98 	ZEV_COMMON_FIELDS;
99 	uint64_t		offset;
100 	uint64_t		length;
101 	uint32_t		dataset_len;
102 	uint32_t		padding;
103 	/* dataset follows */
104 } zev_zvol_truncate_t;
105 
106 typedef struct zev_zvol_write_t {
107 	ZEV_COMMON_FIELDS;
108 	uint64_t		offset;
109 	uint64_t		length;
110 	uint32_t		dataset_len;
111 	uint32_t		padding;
112 	/* dataset follows */
113 } zev_zvol_write_t;
114 
115 typedef struct zev_znode_close_after_update_t {
116 	ZEV_COMMON_FIELDS;
117 	zev_inode_info_t	file;
118 } zev_znode_close_after_update_t;
119 
120 typedef struct zev_znode_create_t {
121 	ZEV_COMMON_FIELDS;
122 	zev_inode_info_t	file;
123 	zev_inode_info_t	parent;
124 	uint32_t		name_len;
125 	uint32_t		padding;
126 	/* name follows */
127 } zev_znode_create_t;
128 
129 typedef struct zev_znode_create_t zev_znode_mkdir_t;
130 typedef struct zev_znode_create_t zev_znode_make_xattr_dir_t;
131 
132 typedef struct zev_znode_remove_t {
133 	ZEV_COMMON_FIELDS;
134 	zev_inode_info_t	parent;
135 	uint32_t		name_len;
136 	uint32_t		padding;
137 	/* name follows */
138 } zev_znode_remove_t;
139 
140 typedef struct zev_znode_remove_t zev_znode_rmdir_t;
141 
142 typedef struct zev_znode_link_t {
143 	ZEV_COMMON_FIELDS;
144 	zev_inode_info_t	parent;
145 	zev_inode_info_t	file;
146 	uint32_t		name_len;
147 	uint32_t		padding;
148 	/* new_name follows */
149 } zev_znode_link_t;
150 
151 typedef struct zev_znode_symlink_t {
152 	ZEV_COMMON_FIELDS;
153 	zev_inode_info_t	parent;
154 	zev_inode_info_t	file;
155 	uint32_t		name_len;
156 	uint32_t		link_len;
157 	/* name follows */
158 	/* link follows */
159 } zev_znode_symlink_t;
160 
161 typedef struct zev_znode_rename_t {
162 	ZEV_COMMON_FIELDS;
163 	zev_inode_info_t	srcdir;
164 	zev_inode_info_t	dstdir;
165 	zev_inode_info_t	file;
166 	uint32_t		srcname_len;
167 	uint32_t		dstname_len;
168 	/* srcname follows */
169 	/* dstname follows */
170 } zev_znode_rename_t;
171 
172 typedef struct zev_znode_write_t {
173 	ZEV_COMMON_FIELDS;
174 	zev_inode_info_t	file;
175 	uint64_t		offset;
176 	uint64_t		length;
177 } zev_znode_write_t;
178 
179 typedef struct zev_znode_truncate_t {
180 	ZEV_COMMON_FIELDS;
181 	zev_inode_info_t	file;
182 	uint64_t		offset;
183 	uint64_t		length;
184 } zev_znode_truncate_t;
185 
186 typedef struct zev_znode_setattr_t {
187 	ZEV_COMMON_FIELDS;
188 	zev_inode_info_t	file;
189 } zev_znode_setattr_t;
190 
191 typedef struct zev_znode_acl_t {
192 	ZEV_COMMON_FIELDS;
193 	zev_inode_info_t	file;
194 } zev_znode_acl_t;
195 
196 /* convenience helper definition */
197 typedef union {
198 	zev_header_t				header;
199 
200 	union {
201 		zev_zfs_mount_t			mount;
202 		zev_zfs_umount_t		umount;
203 	} zfs;
204 	union {
205 		zev_zvol_truncate_t		truncate;
206 		zev_zvol_write_t		write;
207 	} zvol;
208 	union {
209 		zev_znode_close_after_update_t	close;
210 		zev_znode_create_t		create;
211 		zev_znode_mkdir_t		mkdir;
212 		zev_znode_make_xattr_dir_t	mkxattrdir;
213 		zev_znode_remove_t		remove;
214 		zev_znode_rmdir_t		rmdir;
215 		zev_znode_link_t		link;
216 		zev_znode_symlink_t		symlink;
217 		zev_znode_rename_t		rename;
218 		zev_znode_write_t		write;
219 		zev_znode_truncate_t		truncate;
220 		zev_znode_setattr_t		setattr;
221 		zev_znode_acl_t			acl;
222 	} znode;
223 } zev_event_t;
224 
225 
226 
227 typedef struct zev_statistics_t {
228 	uint64_t	zev_queue_len;
229 	uint64_t	zev_bytes_read;
230 	/* runtime settings */
231 	uint64_t	zev_max_queue_len;
232 	uint64_t	zev_poll_wakeup_queue_len;
233 	/* counters */
234 	uint64_t	zev_cnt_total_events;
235 	uint64_t	zev_cnt_errors;
236 	/* zfsvfs ops */
237 	uint64_t	zev_cnt_zfs_mount;
238 	uint64_t	zev_cnt_zfs_umount;
239 	/* zvol ops */
240 	uint64_t	zev_cnt_zvol_write;
241 	uint64_t	zev_cnt_zvol_truncate;
242 	/* znode ops */
243 	uint64_t	zev_cnt_znode_close_after_update;
244 	uint64_t	zev_cnt_znode_create;
245 	uint64_t	zev_cnt_znode_remove;
246 	uint64_t	zev_cnt_znode_link;
247 	uint64_t	zev_cnt_znode_symlink;
248 	uint64_t	zev_cnt_znode_rename;
249 	uint64_t	zev_cnt_znode_write;
250 	uint64_t	zev_cnt_znode_truncate;
251 	uint64_t	zev_cnt_znode_setattr;
252 	uint64_t	zev_cnt_znode_acl;
253 } zev_statistics_t;
254 
255 typedef struct zev_ioctl_poolarg {
256 	uint64_t	zev_poolname_len;
257 	char		zev_poolname[MAXPATHLEN];
258 } zev_ioctl_poolarg_t;
259 #pragma pack()
260 
261 #ifdef _KERNEL
262 typedef struct zev_msg_t {
263 	struct zev_msg_t	*next;
264 	int			 size;
265 	/* data follows */
266 } zev_msg_t;
267 
268 void zev_queue_error(int op, char *fmt, ...);
269 void zev_queue_message(int op, zev_msg_t *msg);
270 void zev_queue_message_nvlist(int op, nvlist_t *nvl);
271 int zev_skip_pool(objset_t *os);
272 
273 #endif
274 
275 #endif /* __ZEV_H__ */
276 
277