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