1 #include <sys/atomic.h>
2 #include <sys/zfs_events.h>
3
4 krwlock_t rz_zev_rwlock;
5 volatile boolean_t rz_zev_is_active = B_FALSE;
6
7 void
rz_zev_init()8 rz_zev_init()
9 {
10 rw_init(&rz_zev_rwlock, NULL, RW_DRIVER, NULL);
11 }
12
13 void
rz_zev_fini()14 rz_zev_fini()
15 {
16 rw_destroy(&rz_zev_rwlock);
17 }
18
19 boolean_t
rz_zev_active(void)20 rz_zev_active(void)
21 {
22 return rz_zev_is_active;
23 }
24
25 void
rz_zev_set_active(boolean_t active)26 rz_zev_set_active(boolean_t active)
27 {
28 rz_zev_is_active = active;
29 }
30
31 struct rz_zev_ops_counters {
32 /* zfsvfs ops */
33 uint64_t rz_zev_zfs_mount;
34 uint64_t rz_zev_zfs_umount;
35 /* zvol ops */
36 uint64_t rz_zev_zvol_write;
37 uint64_t rz_zev_zvol_truncate;
38 /* znode ops */
39 uint64_t rz_zev_znode_close_after_update;
40 uint64_t rz_zev_znode_create;
41 uint64_t rz_zev_znode_remove;
42 uint64_t rz_zev_znode_link;
43 uint64_t rz_zev_znode_symlink;
44 uint64_t rz_zev_znode_rename;
45 uint64_t rz_zev_znode_write;
46 uint64_t rz_zev_znode_truncate;
47 uint64_t rz_zev_znode_setattr;
48 uint64_t rz_zev_znode_acl;
49 /* general statistics */
50 uint64_t rz_zev_total;
51 } rz_zev_ops_counters = {
52 .rz_zev_zfs_mount = 0,
53 .rz_zev_zfs_umount = 0,
54 .rz_zev_zvol_write = 0,
55 .rz_zev_zvol_truncate = 0,
56 .rz_zev_znode_close_after_update = 0,
57 .rz_zev_znode_create = 0,
58 .rz_zev_znode_remove = 0,
59 .rz_zev_znode_link = 0,
60 .rz_zev_znode_symlink = 0,
61 .rz_zev_znode_rename = 0,
62 .rz_zev_znode_write = 0,
63 .rz_zev_znode_truncate = 0,
64 .rz_zev_znode_setattr = 0,
65 .rz_zev_znode_acl = 0,
66 .rz_zev_total = 0,
67 };
68
69 static void
rz_zev_inc_total_ops_count(void)70 rz_zev_inc_total_ops_count(void)
71 {
72 atomic_inc_64(&rz_zev_ops_counters.rz_zev_total);
73 DTRACE_PROBE1(rz_zev_ops_counter_total, unit64_t,
74 rz_zev_ops_counters.rz_zev_total); /* non-atomic access */
75 }
76
77 #define RZ_COUNTER_CB(opname, ...) \
78 void \
79 rz_zev_counter_##opname(__VA_ARGS__) \
80 { \
81 atomic_inc_64(&rz_zev_ops_counters.rz_zev_##opname); \
82 DTRACE_PROBE1(rz_zev_ops_counter_##opname, uint64_t, \
83 rz_zev_ops_counters.rz_zev_##opname); \
84 rz_zev_inc_total_ops_count(); \
85 }
86
87 /* zfsvfs */
88 RZ_COUNTER_CB(zfs_mount, vfs_t *vfs, vnode_t *mpt, char *dataset,
89 boolean_t remount)
90 RZ_COUNTER_CB(zfs_umount, vfs_t *vfs)
91 /* zvol */
92 RZ_COUNTER_CB(zvol_truncate, char *dataset, objset_t *os, dmu_tx_t *tx,
93 uint64_t off, uint64_t len)
94 RZ_COUNTER_CB(zvol_write, char *dataset, objset_t *os, dmu_tx_t *tx,
95 uint64_t off, uint64_t len)
96 /* znode */
97 RZ_COUNTER_CB(znode_close_after_update, znode_t *zp)
98 RZ_COUNTER_CB(znode_create, znode_t *dzp, znode_t *zp,
99 dmu_tx_t *tx, char *name, uint64_t txmode)
100 RZ_COUNTER_CB(znode_remove, znode_t *dzp, znode_t *zp,
101 dmu_tx_t *tx, char *name, uint64_t txmode)
102 RZ_COUNTER_CB(znode_link, znode_t *dzp, znode_t *zp, dmu_tx_t *tx, char *name)
103 RZ_COUNTER_CB(znode_symlink, znode_t *dzp, znode_t *zp,
104 dmu_tx_t *tx, char *name, char *link)
105 RZ_COUNTER_CB(znode_rename, znode_t *sdzp,
106 char *sname, znode_t *tdzp, char *tname, znode_t *szp,
107 znode_t *tzp, dmu_tx_t *tx)
108 RZ_COUNTER_CB(znode_write, znode_t *zp, dmu_tx_t *tx,
109 uint64_t off, uint64_t len)
110 RZ_COUNTER_CB(znode_truncate, znode_t *zp, dmu_tx_t *tx,
111 uint64_t off, uint64_t len)
112 RZ_COUNTER_CB(znode_setattr, znode_t *zp, dmu_tx_t *tx)
113 RZ_COUNTER_CB(znode_acl, znode_t *zp, dmu_tx_t *tx)
114
115 rz_zev_callbacks_t rz_zev_counter_callbacks = {
116 /* zfsvfs */
117 rz_zev_counter_zfs_mount, /* mount */
118 rz_zev_counter_zfs_umount, /* umount */
119 /* zvol */
120 rz_zev_counter_zvol_truncate, /* zvol truncate */
121 rz_zev_counter_zvol_write, /* zvol write */
122 /* znode */
123 rz_zev_counter_znode_close_after_update, /* close */
124 rz_zev_counter_znode_create, /* create */
125 rz_zev_counter_znode_remove, /* remove */
126 rz_zev_counter_znode_link, /* link */
127 rz_zev_counter_znode_symlink, /* symlink */
128 rz_zev_counter_znode_rename, /* rename */
129 rz_zev_counter_znode_write, /* write */
130 rz_zev_counter_znode_truncate, /* truncate */
131 rz_zev_counter_znode_setattr, /* setattr */
132 rz_zev_counter_znode_acl, /* acl */
133 };
134
135 /*
136 * Hooks for write operation event callbacks. Will be changed by
137 * a loadable module if event callbacks are desired.
138 */
139
140 rz_zev_callbacks_t *rz_zev_default_callbacks = &rz_zev_counter_callbacks;
141 rz_zev_callbacks_t *rz_zev_callbacks = &rz_zev_counter_callbacks;
142
143