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