xref: /titanic_51/usr/src/uts/common/fs/zev/zev_callbacks.c (revision b59bb2620ab5ebe4697f5334363a2f07d4b9c421)
1c035b1e8SAndreas Jaekel #include <sys/mode.h>
22bb8e5e2SAndreas Jaekel #include <sys/zfs_znode.h>
32bb8e5e2SAndreas Jaekel #include <sys/fs/zfs.h>
42bb8e5e2SAndreas Jaekel #include <sys/fs/zev.h>
52bb8e5e2SAndreas Jaekel #include <sys/zfs_events.h>
65e286361SAndreas Jaekel #include <sys/zev_checksums.h>
7e206ace3SAndreas Jaekel #include <sys/dmu_tx.h>
8443f0cd2SAndreas Jaekel #include <sys/mntent.h>
92bb8e5e2SAndreas Jaekel 
1063aba447SAndreas Jaekel #define ZEV_FILL_INODE_INFO(name, znode)				\
1163aba447SAndreas Jaekel 	do {								\
1263aba447SAndreas Jaekel 		uint64_t mtime[2], ctime[2];				\
1363aba447SAndreas Jaekel 		sa_bulk_attr_t bulk[2];					\
1463aba447SAndreas Jaekel 		int count = 0;						\
1563aba447SAndreas Jaekel 		timestruc_t mtime_s, ctime_s;				\
1663aba447SAndreas Jaekel 		SA_ADD_BULK_ATTR(bulk, count,				\
1763aba447SAndreas Jaekel 			         SA_ZPL_MTIME(znode->z_zfsvfs),		\
1863aba447SAndreas Jaekel 		                 NULL, &mtime, 16);			\
1963aba447SAndreas Jaekel 		SA_ADD_BULK_ATTR(bulk, count,				\
2063aba447SAndreas Jaekel 			         SA_ZPL_CTIME(znode->z_zfsvfs),		\
2163aba447SAndreas Jaekel 		                 NULL, &ctime, 16);			\
2263aba447SAndreas Jaekel 		if ((sa_bulk_lookup(znode->z_sa_hdl, bulk, count)) != 0) { \
2363aba447SAndreas Jaekel 			zev_queue_error(op, "znode write: "		\
2463aba447SAndreas Jaekel 			                "mtime/ctime unavailable");	\
2563aba447SAndreas Jaekel 			/* continue anyway, use fake data */		\
2663aba447SAndreas Jaekel 			mtime_s.tv_sec = ctime_s.tv_sec = 0;		\
2763aba447SAndreas Jaekel 		}							\
2863aba447SAndreas Jaekel 		ZFS_TIME_DECODE(&mtime_s, mtime);			\
2963aba447SAndreas Jaekel 		ZFS_TIME_DECODE(&ctime_s, ctime);			\
3063aba447SAndreas Jaekel 		rec->name.ino = znode->z_id;				\
3163aba447SAndreas Jaekel 		rec->name.gen = znode->z_gen;				\
3263aba447SAndreas Jaekel 		rec->name.mtime = mtime_s.tv_sec;			\
3363aba447SAndreas Jaekel 		rec->name.ctime = ctime_s.tv_sec;			\
3463aba447SAndreas Jaekel 		rec->name.size = znode->z_size;				\
3563aba447SAndreas Jaekel 		rec->name.type = znode->z_vnode->v_type;		\
36c035b1e8SAndreas Jaekel 		rec->name.mode =					\
37c035b1e8SAndreas Jaekel 			znode->z_mode | VTTOIF(znode->z_vnode->v_type);	\
3863aba447SAndreas Jaekel 		rec->name.links = znode->z_links;			\
3910874358SAndreas Jaekel 		rec->name.flags = znode->z_pflags & ZFS_XATTR ?		\
4010874358SAndreas Jaekel 			ZEV_FL_XATTR : 0;				\
41df8caf2dSSimon Klinkert 	/* CONSTCOND */							\
42aea44f72SAndreas Jaekel 	} while(0)
4363aba447SAndreas Jaekel 
442bb8e5e2SAndreas Jaekel void
452bb8e5e2SAndreas Jaekel zev_zfs_mount_cb(vfs_t *vfs, vnode_t *mpt, char *dataset, boolean_t remount)
462bb8e5e2SAndreas Jaekel {
479193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZFS_MOUNT;
489193e9c2SAndreas Jaekel 	char mountpoint[MAXPATHLEN+1];
4963aba447SAndreas Jaekel 	int mountpoint_len;
5063aba447SAndreas Jaekel 	int dataset_len;
5163aba447SAndreas Jaekel 	zev_zfs_mount_t *rec;
5263aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
5363aba447SAndreas Jaekel 	int msg_size;
54f66561e7SAndreas Jaekel 	znode_t *zp_root;
55d3b66d30SSimon Klinkert 	dmu_tx_t *tx;
56d3b66d30SSimon Klinkert 	int error;
57d3b66d30SSimon Klinkert 	uint64_t txg;
589193e9c2SAndreas Jaekel 
59564e7d37SAndreas Jaekel 	/*
60564e7d37SAndreas Jaekel 	 * workaround: this callback erronously got called for failed
61564e7d37SAndreas Jaekel 	 * mount attempts, and then crashed the system.  Detect this
62564e7d37SAndreas Jaekel 	 * from inside this callback as a workaround while the bugfix
63564e7d37SAndreas Jaekel 	 * in the zfs module is not universally available.
64564e7d37SAndreas Jaekel 	 */
65564e7d37SAndreas Jaekel 	if (vfs == NULL)
66564e7d37SAndreas Jaekel 		return;
67564e7d37SAndreas Jaekel 	if (vfs->vfs_data == NULL)
68564e7d37SAndreas Jaekel 		return;
69564e7d37SAndreas Jaekel 
70*b59bb262SJan Schlien 	/* vnodetopath() would deadlock for remounts, and we don't need them. */
71*b59bb262SJan Schlien 	if (remount)
72*b59bb262SJan Schlien 		return;
73*b59bb262SJan Schlien 
7498a270beSAndreas Jaekel 	zfsvfs_t *zfsvfs = (zfsvfs_t *)vfs->vfs_data;
75773b6339SSimon Klinkert 	if (zfsvfs->z_os->os_dsl_dataset->ds_is_snapshot)
7651cd2374SAndreas Jaekel 		return;
7798a270beSAndreas Jaekel 	if (zev_skip_pool(zfsvfs->z_os))
782bb8e5e2SAndreas Jaekel 		return;
79bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zfsvfs))
80bdbd253bSAndreas Jaekel 		return;
812bb8e5e2SAndreas Jaekel 	/* expensive, but we don't have many mount ops. */
822bb8e5e2SAndreas Jaekel 	if ((vnodetopath(NULL, mpt, mountpoint, sizeof(mountpoint),
832bb8e5e2SAndreas Jaekel 	    kcred)) != 0) {
8463aba447SAndreas Jaekel 		zev_queue_error(op, "unresolvable mountpoint, dataset=%s",
8563aba447SAndreas Jaekel 		                dataset);
862bb8e5e2SAndreas Jaekel 		return;
872bb8e5e2SAndreas Jaekel 	}
88f66561e7SAndreas Jaekel 	if (zfs_zget(zfsvfs, zfsvfs->z_root, &zp_root) != 0) {
89f66561e7SAndreas Jaekel 		zev_queue_error(op, "can't get root znode, dataset=%s",
90f66561e7SAndreas Jaekel 		                dataset);
91f66561e7SAndreas Jaekel 		return;
92f66561e7SAndreas Jaekel 	}
939193e9c2SAndreas Jaekel 
94d3b66d30SSimon Klinkert 	/* get current tgx by adding an empty tx */
95d3b66d30SSimon Klinkert 	tx = dmu_tx_create(zfsvfs->z_os);
96d3b66d30SSimon Klinkert 	error = dmu_tx_assign(tx, TXG_WAIT);
97d3b66d30SSimon Klinkert 	if (error) {
98d3b66d30SSimon Klinkert 		dmu_tx_abort(tx);
99d3b66d30SSimon Klinkert 		zev_queue_error(op, "can't create tx, dataset=%s", dataset);
100d3b66d30SSimon Klinkert 		return;
101d3b66d30SSimon Klinkert 	}
102d3b66d30SSimon Klinkert 	txg = dmu_tx_get_txg(tx);
103d3b66d30SSimon Klinkert 	dmu_tx_commit(tx);
104d3b66d30SSimon Klinkert 
10563aba447SAndreas Jaekel 	dataset_len = strlen(dataset);
10663aba447SAndreas Jaekel 	mountpoint_len = strlen(mountpoint);
10763aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + dataset_len + 1 + mountpoint_len + 1;
1085e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
10963aba447SAndreas Jaekel 	msg->size = msg_size;
11063aba447SAndreas Jaekel 	rec = (zev_zfs_mount_t *)(msg + 1);
11163aba447SAndreas Jaekel 	rec->record_len = msg_size;
11263aba447SAndreas Jaekel 	rec->op = op;
11363aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
11416a2f000SSimon Klinkert 	rec->guid = dsl_dataset_phys(zfsvfs->z_os->os_dsl_dataset)->ds_guid;
115d3b66d30SSimon Klinkert 	rec->txg = txg;
11663aba447SAndreas Jaekel 	rec->remount = remount;
11763aba447SAndreas Jaekel 	rec->dataset_len = dataset_len;
11863aba447SAndreas Jaekel 	rec->mountpoint_len = mountpoint_len;
119f66561e7SAndreas Jaekel 	ZEV_FILL_INODE_INFO(root, zp_root);
120f66561e7SAndreas Jaekel 	VN_RELE(ZTOV(zp_root));
121aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_DATASET(rec), dataset, dataset_len + 1);
122aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_MOUNTPOINT(rec), mountpoint, mountpoint_len + 1);
12363aba447SAndreas Jaekel 	zev_queue_message(op, msg);
1242bb8e5e2SAndreas Jaekel }
1252bb8e5e2SAndreas Jaekel 
1262bb8e5e2SAndreas Jaekel void
1272bb8e5e2SAndreas Jaekel zev_zfs_umount_cb(vfs_t *vfs)
1282bb8e5e2SAndreas Jaekel {
1299193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZFS_UMOUNT;
13063aba447SAndreas Jaekel 	zev_zfs_umount_t *rec;
13163aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
13263aba447SAndreas Jaekel 	int msg_size;
133443f0cd2SAndreas Jaekel 	struct vnode *vp;
134443f0cd2SAndreas Jaekel 	znode_t *zp;
135d3b66d30SSimon Klinkert 	dmu_tx_t *tx;
136d3b66d30SSimon Klinkert 	int error;
137d3b66d30SSimon Klinkert 	uint64_t txg;
1389193e9c2SAndreas Jaekel 
13998a270beSAndreas Jaekel 	zfsvfs_t *zfsvfs = (zfsvfs_t *)vfs->vfs_data;
140773b6339SSimon Klinkert 	if (zfsvfs->z_os->os_dsl_dataset->ds_is_snapshot)
14151cd2374SAndreas Jaekel 		return;
14298a270beSAndreas Jaekel 	if (zev_skip_pool(zfsvfs->z_os))
1432bb8e5e2SAndreas Jaekel 		return;
144bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zfsvfs))
145bdbd253bSAndreas Jaekel 		return;
1469193e9c2SAndreas Jaekel 
147d3b66d30SSimon Klinkert 	/* get current tgx by adding an empty tx */
148d3b66d30SSimon Klinkert 	tx = dmu_tx_create(zfsvfs->z_os);
149d3b66d30SSimon Klinkert 	error = dmu_tx_assign(tx, TXG_WAIT);
150d3b66d30SSimon Klinkert 	if (error) {
151d3b66d30SSimon Klinkert 		dmu_tx_abort(tx);
152d3b66d30SSimon Klinkert 		zev_queue_error(op, "can't create tx");
153d3b66d30SSimon Klinkert 		return;
154d3b66d30SSimon Klinkert 	}
155d3b66d30SSimon Klinkert 	txg = dmu_tx_get_txg(tx);
156d3b66d30SSimon Klinkert 	dmu_tx_commit(tx);
157d3b66d30SSimon Klinkert 
15863aba447SAndreas Jaekel 	msg_size = sizeof(*rec);
1595e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
16063aba447SAndreas Jaekel 	msg->size = msg_size;
16163aba447SAndreas Jaekel 	rec = (zev_zfs_umount_t *)(msg + 1);
16263aba447SAndreas Jaekel 	rec->record_len = msg_size;
16363aba447SAndreas Jaekel 	rec->op = op;
16463aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
16516a2f000SSimon Klinkert 	rec->guid = dsl_dataset_phys(zfsvfs->z_os->os_dsl_dataset)->ds_guid;
166d3b66d30SSimon Klinkert 	rec->txg = txg;
167443f0cd2SAndreas Jaekel 
168443f0cd2SAndreas Jaekel 	vp = vfs->vfs_vnodecovered;
169443f0cd2SAndreas Jaekel 	if (strcmp(vfssw[vp->v_vfsp->vfs_fstype].vsw_name, MNTTYPE_ZFS)) {
170443f0cd2SAndreas Jaekel 		cmn_err(CE_WARN, "covered inode not on zfs filesystem, "
171443f0cd2SAndreas Jaekel 		        "reporting all-zero inode struct.");
172443f0cd2SAndreas Jaekel 		memset(&rec->covered, 0, sizeof(rec->covered));
173443f0cd2SAndreas Jaekel 	} else {
174443f0cd2SAndreas Jaekel 		zp = VTOZ(vfs->vfs_vnodecovered);
175443f0cd2SAndreas Jaekel 		ZEV_FILL_INODE_INFO(covered, zp);
176443f0cd2SAndreas Jaekel 	}
177443f0cd2SAndreas Jaekel 
17863aba447SAndreas Jaekel 	zev_queue_message(op, msg);
1792bb8e5e2SAndreas Jaekel }
1802bb8e5e2SAndreas Jaekel 
1812bb8e5e2SAndreas Jaekel void
182e206ace3SAndreas Jaekel zev_zvol_truncate_cb(char *dataset,
183e206ace3SAndreas Jaekel                      objset_t *os,
184e206ace3SAndreas Jaekel                      dmu_tx_t *tx,
185e206ace3SAndreas Jaekel                      uint64_t off,
186e206ace3SAndreas Jaekel                      uint64_t len)
1872bb8e5e2SAndreas Jaekel {
1889193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZVOL_TRUNCATE;
18963aba447SAndreas Jaekel 	zev_zvol_truncate_t *rec;
19063aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
19163aba447SAndreas Jaekel 	int msg_size;
19263aba447SAndreas Jaekel 	int dataset_len;
1939193e9c2SAndreas Jaekel 
1942bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(os))
1952bb8e5e2SAndreas Jaekel 		return;
1969193e9c2SAndreas Jaekel 
19763aba447SAndreas Jaekel 	dataset_len = strlen(dataset);
19863aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + dataset_len + 1;
1995e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
20063aba447SAndreas Jaekel 	msg->size = msg_size;
20163aba447SAndreas Jaekel 	rec = (zev_zvol_truncate_t *)(msg + 1);
20263aba447SAndreas Jaekel 	rec->record_len = msg_size;
20363aba447SAndreas Jaekel 	rec->op = op;
20463aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
20516a2f000SSimon Klinkert 	rec->guid = dsl_dataset_phys(os->os_dsl_dataset)->ds_guid;
206d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
20763aba447SAndreas Jaekel 	rec->offset = off;
20863aba447SAndreas Jaekel 	rec->length = len;
20963aba447SAndreas Jaekel 	rec->dataset_len = dataset_len;
210aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_DATASET(rec), dataset, dataset_len + 1);
21163aba447SAndreas Jaekel 	zev_queue_message(op, msg);
2122bb8e5e2SAndreas Jaekel }
2132bb8e5e2SAndreas Jaekel 
2142bb8e5e2SAndreas Jaekel void
215e206ace3SAndreas Jaekel zev_zvol_write_cb(char *dataset,
216e206ace3SAndreas Jaekel                   objset_t *os,
217e206ace3SAndreas Jaekel                   dmu_tx_t *tx,
218e206ace3SAndreas Jaekel                   uint64_t off,
219e206ace3SAndreas Jaekel                   uint64_t len)
2202bb8e5e2SAndreas Jaekel {
2219193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZVOL_WRITE;
22263aba447SAndreas Jaekel 	zev_zvol_write_t *rec;
22363aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
22463aba447SAndreas Jaekel 	int msg_size;
22563aba447SAndreas Jaekel 	int dataset_len;
2269193e9c2SAndreas Jaekel 
2272bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(os))
2282bb8e5e2SAndreas Jaekel 		return;
2299193e9c2SAndreas Jaekel 
23063aba447SAndreas Jaekel 	dataset_len = strlen(dataset);
23163aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + dataset_len + 1;
2325e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
23363aba447SAndreas Jaekel 	msg->size = msg_size;
23463aba447SAndreas Jaekel 	rec = (zev_zvol_write_t *)(msg + 1);
23563aba447SAndreas Jaekel 	rec->record_len = msg_size;
23663aba447SAndreas Jaekel 	rec->op = op;
23763aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
23816a2f000SSimon Klinkert 	rec->guid = dsl_dataset_phys(os->os_dsl_dataset)->ds_guid;
239d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
24063aba447SAndreas Jaekel 	rec->offset = off;
24163aba447SAndreas Jaekel 	rec->length = len;
24263aba447SAndreas Jaekel 	rec->dataset_len = dataset_len;
243aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_DATASET(rec), dataset, dataset_len + 1);
24463aba447SAndreas Jaekel 	zev_queue_message(op, msg);
2452bb8e5e2SAndreas Jaekel }
2462bb8e5e2SAndreas Jaekel 
2472bb8e5e2SAndreas Jaekel void
2482bb8e5e2SAndreas Jaekel zev_znode_close_after_update_cb(znode_t *zp)
2492bb8e5e2SAndreas Jaekel {
2509193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_CLOSE_AFTER_UPDATE;
25163aba447SAndreas Jaekel 	zev_znode_close_after_update_t *rec;
25263aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
25363aba447SAndreas Jaekel 	int msg_size;
2549193e9c2SAndreas Jaekel 
2552bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
2562bb8e5e2SAndreas Jaekel 		return;
257bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
258bdbd253bSAndreas Jaekel 		return;
2599193e9c2SAndreas Jaekel 
26063aba447SAndreas Jaekel 	msg_size = sizeof(*rec);
2615e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
26263aba447SAndreas Jaekel 	msg->size = msg_size;
26363aba447SAndreas Jaekel 	rec = (zev_znode_close_after_update_t *)(msg + 1);
26463aba447SAndreas Jaekel 	rec->record_len = msg_size;
26563aba447SAndreas Jaekel 	rec->op = op;
26663aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
26716a2f000SSimon Klinkert 	rec->guid =
26816a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
26963aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
27063aba447SAndreas Jaekel 	zev_queue_message(op, msg);
2712bb8e5e2SAndreas Jaekel }
2722bb8e5e2SAndreas Jaekel 
2732bb8e5e2SAndreas Jaekel void
274e206ace3SAndreas Jaekel zev_znode_create_cb(znode_t *dzp,
275e206ace3SAndreas Jaekel                     znode_t *zp,
276e206ace3SAndreas Jaekel                     dmu_tx_t *tx,
277e206ace3SAndreas Jaekel                     char *name,
278e206ace3SAndreas Jaekel                     uint64_t txtype)
2792bb8e5e2SAndreas Jaekel {
2809193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_CREATE;
28163aba447SAndreas Jaekel 	zev_znode_create_t *rec;
28263aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
28363aba447SAndreas Jaekel 	int msg_size;
28463aba447SAndreas Jaekel 	int name_len;
2859193e9c2SAndreas Jaekel 
2862bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
2872bb8e5e2SAndreas Jaekel 		return;
288bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
289bdbd253bSAndreas Jaekel 		return;
2909193e9c2SAndreas Jaekel 
2912bb8e5e2SAndreas Jaekel 	int type = (int)txtype;
2922bb8e5e2SAndreas Jaekel 	switch(type) {
2932bb8e5e2SAndreas Jaekel 	case TX_CREATE:
2942bb8e5e2SAndreas Jaekel 	case TX_CREATE_ACL:
2952bb8e5e2SAndreas Jaekel 	case TX_CREATE_ATTR:
2962bb8e5e2SAndreas Jaekel 	case TX_CREATE_ACL_ATTR:
2979193e9c2SAndreas Jaekel 		op = ZEV_OP_ZNODE_CREATE;
2982bb8e5e2SAndreas Jaekel 		break;
2992bb8e5e2SAndreas Jaekel 	case TX_MKDIR:
3002bb8e5e2SAndreas Jaekel 	case TX_MKDIR_ACL:
3012bb8e5e2SAndreas Jaekel 	case TX_MKDIR_ATTR:
3022bb8e5e2SAndreas Jaekel 	case TX_MKDIR_ACL_ATTR:
3039193e9c2SAndreas Jaekel 		op = ZEV_OP_ZNODE_MKDIR;
3042bb8e5e2SAndreas Jaekel 		break;
3052bb8e5e2SAndreas Jaekel 	case TX_MKXATTR:
3069193e9c2SAndreas Jaekel 		op = ZEV_OP_ZNODE_MAKE_XATTR_DIR;
3072bb8e5e2SAndreas Jaekel 		break;
3082bb8e5e2SAndreas Jaekel 	default:
3099193e9c2SAndreas Jaekel 		zev_queue_error(ZEV_OP_ZNODE_CREATE,
3102bb8e5e2SAndreas Jaekel 		    "ERROR: ZNODE_CREATE: unknown txtype %d "
31198a270beSAndreas Jaekel 		    "(dir_inode=%d:%d inode=%d:%d name='%s')\n",
3122bb8e5e2SAndreas Jaekel 		    type,
31398a270beSAndreas Jaekel 		    dzp->z_gen,
3142bb8e5e2SAndreas Jaekel 		    dzp->z_id,
31598a270beSAndreas Jaekel 		    zp->z_gen,
3162bb8e5e2SAndreas Jaekel 		    zp->z_id,
3179193e9c2SAndreas Jaekel 		    name);
3182bb8e5e2SAndreas Jaekel 		return;
3192bb8e5e2SAndreas Jaekel 	}
3209193e9c2SAndreas Jaekel 
32163aba447SAndreas Jaekel 	/* all three types use the same struct, so this works for all types: */
32263aba447SAndreas Jaekel 	name_len = strlen(name);
32363aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + name_len + 1;
3245e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
32563aba447SAndreas Jaekel 	msg->size = msg_size;
32663aba447SAndreas Jaekel 	rec = (zev_znode_create_t *)(msg + 1);
32763aba447SAndreas Jaekel 	rec->record_len = msg_size;
32863aba447SAndreas Jaekel 	rec->op = op;
32963aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
33016a2f000SSimon Klinkert 	rec->guid =
33116a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
332d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
33363aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(parent, dzp);
33463aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
33563aba447SAndreas Jaekel 	rec->name_len = name_len;
336aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_NAME(rec), name, name_len + 1);
3371ca5a13bSAndreas Jaekel 	zev_create_checksum(rec, zp);
33863aba447SAndreas Jaekel 	zev_queue_message(op, msg);
3392bb8e5e2SAndreas Jaekel }
3402bb8e5e2SAndreas Jaekel 
3412bb8e5e2SAndreas Jaekel void
342e206ace3SAndreas Jaekel zev_znode_remove_cb(znode_t *dzp,
343e206ace3SAndreas Jaekel                     znode_t *zp,
344e206ace3SAndreas Jaekel                     dmu_tx_t *tx,
345e206ace3SAndreas Jaekel                     char *name,
346e206ace3SAndreas Jaekel                     uint64_t txtype)
3472bb8e5e2SAndreas Jaekel {
3489193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_REMOVE;
34963aba447SAndreas Jaekel 	zev_znode_remove_t *rec;
35063aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
35163aba447SAndreas Jaekel 	int msg_size;
35263aba447SAndreas Jaekel 	int name_len;
3539193e9c2SAndreas Jaekel 
3542bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(dzp->z_zfsvfs->z_os))
3552bb8e5e2SAndreas Jaekel 		return;
356bdbd253bSAndreas Jaekel 	if (zev_skip_fs(dzp->z_zfsvfs))
357bdbd253bSAndreas Jaekel 		return;
3589193e9c2SAndreas Jaekel 
3592bb8e5e2SAndreas Jaekel 	int type = (int)txtype;
3602bb8e5e2SAndreas Jaekel 	switch(type) {
3612bb8e5e2SAndreas Jaekel 	case TX_REMOVE:
3629193e9c2SAndreas Jaekel 		op = ZEV_OP_ZNODE_REMOVE;
3632bb8e5e2SAndreas Jaekel 		break;
3642bb8e5e2SAndreas Jaekel 	case TX_RMDIR:
3659193e9c2SAndreas Jaekel 		op = ZEV_OP_ZNODE_RMDIR;
3662bb8e5e2SAndreas Jaekel 		break;
3672bb8e5e2SAndreas Jaekel 	default:
3689193e9c2SAndreas Jaekel 		zev_queue_error(ZEV_OP_ZNODE_REMOVE,
3692bb8e5e2SAndreas Jaekel 		    "ERROR: ZNODE_REMOVE: unknown txtype %d "
37098a270beSAndreas Jaekel 		    "(dir_inode=%d:%d name='%s')\n",
3712bb8e5e2SAndreas Jaekel 		    type,
37298a270beSAndreas Jaekel 		    dzp->z_gen,
3732bb8e5e2SAndreas Jaekel 		    dzp->z_id,
3749193e9c2SAndreas Jaekel 		    name);
3752bb8e5e2SAndreas Jaekel 		return;
3762bb8e5e2SAndreas Jaekel 	}
3779193e9c2SAndreas Jaekel 
37863aba447SAndreas Jaekel 	/* both types use the same struct, so this works for all types: */
37963aba447SAndreas Jaekel 	name_len = strlen(name);
38063aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + name_len + 1;
3815e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
38263aba447SAndreas Jaekel 	msg->size = msg_size;
38363aba447SAndreas Jaekel 	rec = (zev_znode_remove_t *)(msg + 1);
38463aba447SAndreas Jaekel 	rec->record_len = msg_size;
38563aba447SAndreas Jaekel 	rec->op = op;
38663aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
38716a2f000SSimon Klinkert 	rec->guid =
38816a2f000SSimon Klinkert 		dsl_dataset_phys(dzp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
389d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
3906db5d4ecSAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
39163aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(parent, dzp);
39263aba447SAndreas Jaekel 	rec->name_len = name_len;
393aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_NAME(rec), name, name_len + 1);
39463aba447SAndreas Jaekel 	zev_queue_message(op, msg);
3952bb8e5e2SAndreas Jaekel }
3962bb8e5e2SAndreas Jaekel 
3972bb8e5e2SAndreas Jaekel void
398e206ace3SAndreas Jaekel zev_znode_link_cb(znode_t *dzp, znode_t *zp, dmu_tx_t *tx, char *name)
3992bb8e5e2SAndreas Jaekel {
4009193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_LINK;
40163aba447SAndreas Jaekel 	zev_znode_link_t *rec;
40263aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
40363aba447SAndreas Jaekel 	int msg_size;
40463aba447SAndreas Jaekel 	int name_len;
4059193e9c2SAndreas Jaekel 
4062bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
4072bb8e5e2SAndreas Jaekel 		return;
408bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
409bdbd253bSAndreas Jaekel 		return;
4109193e9c2SAndreas Jaekel 
41163aba447SAndreas Jaekel 	name_len = strlen(name);
41263aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + name_len + 1;
4135e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
41463aba447SAndreas Jaekel 	msg->size = msg_size;
41563aba447SAndreas Jaekel 	rec = (zev_znode_link_t *)(msg + 1);
41663aba447SAndreas Jaekel 	rec->record_len = msg_size;
41763aba447SAndreas Jaekel 	rec->op = op;
41863aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
41916a2f000SSimon Klinkert 	rec->guid =
42016a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
421d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
42263aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(parent, dzp);
42363aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
42463aba447SAndreas Jaekel 	rec->name_len = name_len;
425aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_NAME(rec), name, name_len + 1);
42663aba447SAndreas Jaekel 	zev_queue_message(op, msg);
4272bb8e5e2SAndreas Jaekel }
4282bb8e5e2SAndreas Jaekel 
4292bb8e5e2SAndreas Jaekel void
430e206ace3SAndreas Jaekel zev_znode_symlink_cb(znode_t *dzp,
431e206ace3SAndreas Jaekel                      znode_t *zp,
432e206ace3SAndreas Jaekel                      dmu_tx_t *tx,
433e206ace3SAndreas Jaekel                      char *name,
434e206ace3SAndreas Jaekel                      char *link)
4352bb8e5e2SAndreas Jaekel {
4369193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_SYMLINK;
43763aba447SAndreas Jaekel 	zev_znode_symlink_t *rec;
43863aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
43963aba447SAndreas Jaekel 	int msg_size;
44063aba447SAndreas Jaekel 	int name_len;
44163aba447SAndreas Jaekel 	int link_len;
4429193e9c2SAndreas Jaekel 
4432bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
4442bb8e5e2SAndreas Jaekel 		return;
445bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
446bdbd253bSAndreas Jaekel 		return;
4479193e9c2SAndreas Jaekel 
44863aba447SAndreas Jaekel 	name_len = strlen(name);
44963aba447SAndreas Jaekel 	link_len = strlen(link);
45063aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + name_len + 1 + link_len + 1;
4515e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
45263aba447SAndreas Jaekel 	msg->size = msg_size;
45363aba447SAndreas Jaekel 	rec = (zev_znode_symlink_t *)(msg + 1);
45463aba447SAndreas Jaekel 	rec->record_len = msg_size;
45563aba447SAndreas Jaekel 	rec->op = op;
45663aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
45716a2f000SSimon Klinkert 	rec->guid =
45816a2f000SSimon Klinkert 		dsl_dataset_phys(dzp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
459d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
46063aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(parent, dzp);
46163aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
46263aba447SAndreas Jaekel 	rec->name_len = name_len;
46363aba447SAndreas Jaekel 	rec->link_len = link_len;
464aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_NAME(rec), name, name_len + 1);
465aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_LINK(rec), link, link_len + 1);
4661ca5a13bSAndreas Jaekel 	zev_symlink_checksum(rec, link);
46763aba447SAndreas Jaekel 	zev_queue_message(op, msg);
4682bb8e5e2SAndreas Jaekel }
4692bb8e5e2SAndreas Jaekel 
4702bb8e5e2SAndreas Jaekel void
471e206ace3SAndreas Jaekel zev_znode_rename_cb(znode_t *sdzp,
472e206ace3SAndreas Jaekel                     char *sname,
473e206ace3SAndreas Jaekel                     znode_t *tdzp,
474e206ace3SAndreas Jaekel                     char *tname,
475e206ace3SAndreas Jaekel                     znode_t *szp,
476f8e3fee2SAndreas Jaekel                     znode_t *tzp,
477e206ace3SAndreas Jaekel                     dmu_tx_t *tx)
4782bb8e5e2SAndreas Jaekel {
4799193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_RENAME;
48063aba447SAndreas Jaekel 	zev_znode_rename_t *rec;
48163aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
48263aba447SAndreas Jaekel 	int msg_size;
48363aba447SAndreas Jaekel 	int srcname_len;
48463aba447SAndreas Jaekel 	int dstname_len;
4859193e9c2SAndreas Jaekel 
4862bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(szp->z_zfsvfs->z_os))
4872bb8e5e2SAndreas Jaekel 		return;
488bdbd253bSAndreas Jaekel 	if (zev_skip_fs(szp->z_zfsvfs))
489bdbd253bSAndreas Jaekel 		return;
4909193e9c2SAndreas Jaekel 
49163aba447SAndreas Jaekel 	srcname_len = strlen(sname);
49263aba447SAndreas Jaekel 	dstname_len = strlen(tname);
49363aba447SAndreas Jaekel 	msg_size = sizeof(*rec) + srcname_len + 1 + dstname_len + 1;
4945e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
49563aba447SAndreas Jaekel 	msg->size = msg_size;
49663aba447SAndreas Jaekel 	rec = (zev_znode_rename_t *)(msg + 1);
49763aba447SAndreas Jaekel 	rec->record_len = msg_size;
49863aba447SAndreas Jaekel 	rec->op = op;
49963aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
50016a2f000SSimon Klinkert 	rec->guid =
50116a2f000SSimon Klinkert 		dsl_dataset_phys(szp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
502d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
50363aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(srcdir, sdzp);
50463aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(dstdir, tdzp);
50563aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, szp);
506f8e3fee2SAndreas Jaekel 	if (tzp) {
507f8e3fee2SAndreas Jaekel 		ZEV_FILL_INODE_INFO(clobbered_file, tzp);
508f8e3fee2SAndreas Jaekel 	} else {
509f8e3fee2SAndreas Jaekel 		memset(&rec->clobbered_file, 0, sizeof(rec->clobbered_file));
510f8e3fee2SAndreas Jaekel 	}
51163aba447SAndreas Jaekel 	rec->srcname_len = srcname_len;
51263aba447SAndreas Jaekel 	rec->dstname_len = dstname_len;
513aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_SRCNAME(rec), sname, srcname_len + 1);
514aea44f72SAndreas Jaekel 	(void) memcpy(ZEV_DSTNAME(rec), tname, dstname_len + 1);
51563aba447SAndreas Jaekel 	zev_queue_message(op, msg);
5162bb8e5e2SAndreas Jaekel }
5172bb8e5e2SAndreas Jaekel 
5182bb8e5e2SAndreas Jaekel void
519e206ace3SAndreas Jaekel zev_znode_write_cb(znode_t *zp, dmu_tx_t *tx, uint64_t off, uint64_t len)
5202bb8e5e2SAndreas Jaekel {
5219193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_WRITE;
52263aba447SAndreas Jaekel 	zev_znode_write_t *rec;
52363aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
52463aba447SAndreas Jaekel 	int msg_size;
5255e286361SAndreas Jaekel 	zev_sig_t *sig_buf;
5265e286361SAndreas Jaekel 	uint64_t sig_buf_len;
5275e286361SAndreas Jaekel 	uint64_t sig_len;
5285e286361SAndreas Jaekel 	uint64_t sig_cnt;
5295e286361SAndreas Jaekel 	int ret;
5309193e9c2SAndreas Jaekel 
5312bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
5322bb8e5e2SAndreas Jaekel 		return;
533bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
534bdbd253bSAndreas Jaekel 		return;
5359193e9c2SAndreas Jaekel 
536b9710123SAndreas Jaekel 	ret = zev_get_checksums(&sig_buf, &sig_buf_len, &sig_cnt, 0,
5375e286361SAndreas Jaekel 	                        zp, off, len, zev_write);
5385e286361SAndreas Jaekel 	if (ret) {
5395e286361SAndreas Jaekel 		zev_queue_error(op,
5405e286361SAndreas Jaekel 		    "ERROR: ZNODE_WRITE: can't get checksum (inode=%d:%d)\n",
5415e286361SAndreas Jaekel 		    zp->z_gen,
5425e286361SAndreas Jaekel 		    zp->z_id);
5435e286361SAndreas Jaekel 		return;
5445e286361SAndreas Jaekel 	}
5455e286361SAndreas Jaekel 	sig_len = sig_cnt * sizeof(zev_sig_t);
5465e286361SAndreas Jaekel 
5475e286361SAndreas Jaekel 	msg_size = sizeof(*rec) + sig_len;
5485e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
54963aba447SAndreas Jaekel 	msg->size = msg_size;
55063aba447SAndreas Jaekel 	rec = (zev_znode_write_t *)(msg + 1);
55163aba447SAndreas Jaekel 	rec->record_len = msg_size;
55263aba447SAndreas Jaekel 	rec->op = op;
55363aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
55416a2f000SSimon Klinkert 	rec->guid =
55516a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
556d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
55763aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
55863aba447SAndreas Jaekel 	rec->offset = off;
55963aba447SAndreas Jaekel 	rec->length = len;
5605e286361SAndreas Jaekel 	rec->signature_cnt = sig_cnt;
561b9710123SAndreas Jaekel 	if (sig_cnt && sig_buf)
5625e286361SAndreas Jaekel 		memcpy(ZEV_SIGNATURES(rec), sig_buf, sig_len);
563b9710123SAndreas Jaekel 	if (sig_buf)
5645e286361SAndreas Jaekel 		zev_free(sig_buf, sig_buf_len);
56563aba447SAndreas Jaekel 	zev_queue_message(op, msg);
5662bb8e5e2SAndreas Jaekel }
5672bb8e5e2SAndreas Jaekel 
5682bb8e5e2SAndreas Jaekel void
569e206ace3SAndreas Jaekel zev_znode_truncate_cb(znode_t *zp, dmu_tx_t *tx, uint64_t off, uint64_t len)
5702bb8e5e2SAndreas Jaekel {
5719193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_TRUNCATE;
57263aba447SAndreas Jaekel 	zev_znode_truncate_t *rec;
57363aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
57463aba447SAndreas Jaekel 	int msg_size;
5755e286361SAndreas Jaekel 	zev_sig_t *sig_buf;
5765e286361SAndreas Jaekel 	uint64_t sig_buf_len;
5775e286361SAndreas Jaekel 	uint64_t sig_len;
5785e286361SAndreas Jaekel 	uint64_t sig_cnt;
5795e286361SAndreas Jaekel 	int ret;
5809193e9c2SAndreas Jaekel 
5812bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
5822bb8e5e2SAndreas Jaekel 		return;
583bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
584bdbd253bSAndreas Jaekel 		return;
5859193e9c2SAndreas Jaekel 
586b9710123SAndreas Jaekel 	ret = zev_get_checksums(&sig_buf, &sig_buf_len, &sig_cnt, 0,
5875e286361SAndreas Jaekel 	                        zp, off, len, zev_truncate);
5885e286361SAndreas Jaekel 	if (ret) {
5895e286361SAndreas Jaekel 		zev_queue_error(op,
5905e286361SAndreas Jaekel 		    "ERROR: ZNODE_TRUNCATE: can't get checksum (inode=%d:%d)\n",
5915e286361SAndreas Jaekel 		    zp->z_gen,
5925e286361SAndreas Jaekel 		    zp->z_id);
5935e286361SAndreas Jaekel 		return;
5945e286361SAndreas Jaekel 	}
5955e286361SAndreas Jaekel 	sig_len = sig_cnt * sizeof(zev_sig_t);
5965e286361SAndreas Jaekel 
5975e286361SAndreas Jaekel 	msg_size = sizeof(*rec) + sig_len;
5985e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
59963aba447SAndreas Jaekel 	msg->size = msg_size;
60063aba447SAndreas Jaekel 	rec = (zev_znode_truncate_t *)(msg + 1);
60163aba447SAndreas Jaekel 	rec->record_len = msg_size;
60263aba447SAndreas Jaekel 	rec->op = op;
60363aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
60416a2f000SSimon Klinkert 	rec->guid =
60516a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
606d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
60763aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
60863aba447SAndreas Jaekel 	rec->offset = off;
60963aba447SAndreas Jaekel 	rec->length = len;
6105e286361SAndreas Jaekel 	rec->signature_cnt = sig_cnt;
611b9710123SAndreas Jaekel 	if (sig_cnt && sig_buf)
6125e286361SAndreas Jaekel 		memcpy(ZEV_SIGNATURES(rec), sig_buf, sig_len);
613b9710123SAndreas Jaekel 	if (sig_buf)
6145e286361SAndreas Jaekel 		zev_free(sig_buf, sig_buf_len);
61563aba447SAndreas Jaekel 	zev_queue_message(op, msg);
6162bb8e5e2SAndreas Jaekel }
6172bb8e5e2SAndreas Jaekel 
6182bb8e5e2SAndreas Jaekel void
619e206ace3SAndreas Jaekel zev_znode_setattr_cb(znode_t *zp, dmu_tx_t *tx)
6202bb8e5e2SAndreas Jaekel {
6219193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_SETATTR;
62263aba447SAndreas Jaekel 	zev_znode_setattr_t *rec;
62363aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
62463aba447SAndreas Jaekel 	int msg_size;
6259193e9c2SAndreas Jaekel 
6262bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
6272bb8e5e2SAndreas Jaekel 		return;
628bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
629bdbd253bSAndreas Jaekel 		return;
6309193e9c2SAndreas Jaekel 
63163aba447SAndreas Jaekel 	msg_size = sizeof(*rec);
6325e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
63363aba447SAndreas Jaekel 	msg->size = msg_size;
63463aba447SAndreas Jaekel 	rec = (zev_znode_setattr_t *)(msg + 1);
63563aba447SAndreas Jaekel 	rec->record_len = msg_size;
63663aba447SAndreas Jaekel 	rec->op = op;
63763aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
63816a2f000SSimon Klinkert 	rec->guid =
63916a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
640d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
64163aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
64263aba447SAndreas Jaekel 	zev_queue_message(op, msg);
6432bb8e5e2SAndreas Jaekel }
6442bb8e5e2SAndreas Jaekel 
6452bb8e5e2SAndreas Jaekel void
646e206ace3SAndreas Jaekel zev_znode_acl_cb(znode_t *zp, dmu_tx_t *tx)
6472bb8e5e2SAndreas Jaekel {
6489193e9c2SAndreas Jaekel 	int op = ZEV_OP_ZNODE_ACL;
64963aba447SAndreas Jaekel 	zev_znode_acl_t *rec;
65063aba447SAndreas Jaekel 	zev_msg_t *msg = NULL;
65163aba447SAndreas Jaekel 	int msg_size;
6529193e9c2SAndreas Jaekel 
6532bb8e5e2SAndreas Jaekel 	if (zev_skip_pool(zp->z_zfsvfs->z_os))
6542bb8e5e2SAndreas Jaekel 		return;
655bdbd253bSAndreas Jaekel 	if (zev_skip_fs(zp->z_zfsvfs))
656bdbd253bSAndreas Jaekel 		return;
6579193e9c2SAndreas Jaekel 
65863aba447SAndreas Jaekel 	msg_size = sizeof(*rec);
6595e286361SAndreas Jaekel 	msg = zev_alloc(sizeof(*msg) + msg_size);
66063aba447SAndreas Jaekel 	msg->size = msg_size;
66163aba447SAndreas Jaekel 	rec = (zev_znode_acl_t *)(msg + 1);
66263aba447SAndreas Jaekel 	rec->record_len = msg_size;
66363aba447SAndreas Jaekel 	rec->op = op;
66463aba447SAndreas Jaekel 	rec->op_time = ddi_get_time();
66516a2f000SSimon Klinkert 	rec->guid =
66616a2f000SSimon Klinkert 		dsl_dataset_phys(zp->z_zfsvfs->z_os->os_dsl_dataset)->ds_guid;
667d3b66d30SSimon Klinkert 	rec->txg = dmu_tx_get_txg(tx);
66863aba447SAndreas Jaekel 	ZEV_FILL_INODE_INFO(file, zp);
66963aba447SAndreas Jaekel 	zev_queue_message(op, msg);
6702bb8e5e2SAndreas Jaekel }
6712bb8e5e2SAndreas Jaekel 
6722bb8e5e2SAndreas Jaekel rz_zev_callbacks_t zev_callbacks = {
6732bb8e5e2SAndreas Jaekel 	/* zfsvfs events */
6742bb8e5e2SAndreas Jaekel 	.rz_zev_zfs_mount                = zev_zfs_mount_cb,
6752bb8e5e2SAndreas Jaekel 	.rz_zev_zfs_umount               = zev_zfs_umount_cb,
6762bb8e5e2SAndreas Jaekel 
6772bb8e5e2SAndreas Jaekel 	/* zvol zil events */
6782bb8e5e2SAndreas Jaekel 	.rz_zev_zvol_truncate            = zev_zvol_truncate_cb,
6792bb8e5e2SAndreas Jaekel 	.rz_zev_zvol_write               = zev_zvol_write_cb,
6802bb8e5e2SAndreas Jaekel 
6812bb8e5e2SAndreas Jaekel 	/* znode zil events */
6822bb8e5e2SAndreas Jaekel 	.rz_zev_znode_close_after_update = zev_znode_close_after_update_cb,
6832bb8e5e2SAndreas Jaekel 	.rz_zev_znode_create             = zev_znode_create_cb,
6842bb8e5e2SAndreas Jaekel 	.rz_zev_znode_remove             = zev_znode_remove_cb,
6852bb8e5e2SAndreas Jaekel 	.rz_zev_znode_link               = zev_znode_link_cb,
6862bb8e5e2SAndreas Jaekel 	.rz_zev_znode_symlink            = zev_znode_symlink_cb,
6872bb8e5e2SAndreas Jaekel 	.rz_zev_znode_rename             = zev_znode_rename_cb,
6882bb8e5e2SAndreas Jaekel 	.rz_zev_znode_write              = zev_znode_write_cb,
6892bb8e5e2SAndreas Jaekel 	.rz_zev_znode_truncate           = zev_znode_truncate_cb,
6902bb8e5e2SAndreas Jaekel 	.rz_zev_znode_setattr            = zev_znode_setattr_cb,
6912bb8e5e2SAndreas Jaekel 	.rz_zev_znode_acl                = zev_znode_acl_cb,
6922bb8e5e2SAndreas Jaekel };
6932bb8e5e2SAndreas Jaekel 
694