1 #!/usr/sbin/dtrace -s
2 
3 /*
4  * This file and its contents are supplied under the terms of the
5  * Common Development and Distribution License ("CDDL"), version 1.0.
6  * You may only use this file in accordance with the terms of version
7  * 1.0 of the CDDL.
8  *
9  * A full copy of the text of the CDDL should have accompanied this
10  * source.  A copy of the CDDL is also available via the Internet at
11  * http://www.illumos.org/license/CDDL.
12  */
13 
14 /*
15  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
16  */
17 
18 /*
19  * Print input and output values for each NFSv3 andf NFSv4 operation,
20  * optionally for a specified client, share and zone.
21  *
22  * Usage: nfs-trace.d [<client ip>|all [<share path>|all] [<zone id>]]]
23  *
24  * example: nfs_trace.d 192.168.123.1 /mypool/fs1  0
25  *
26  * It is valid to specify <client ip> or <share path> as "all"
27  * to quantize data for all clients and/or all shares.
28  * Omitting <zone id> will quantize data for all zones.
29  */
30 
31 /*
32  * Unfortunately, trying to write this script using wildcards, for example:
33  *	nfsv3:::op-*-start {}
34  *	nfsv3:::op-*-done {}
35  * prints the operation-specific args[2] structure as the incorrect type.
36  * Until this is resolved it is necessary to explicitly list each operation.
37  *
38  * See nfs-time.d for an example of using the wildcard format when there are
39  * no operation-specific args (args[2]) being traced.
40  */
41 
42 #pragma D option flowindent
43 #pragma D option defaultargs
44 
45 dtrace:::BEGIN
46 {
47 	all_clients = (($$1 == NULL) || ($$1 == "all")) ? 1 : 0;
48 	all_shares = (($$2 == NULL) || ($$2 == "all")) ? 1 : 0;
49 	all_zones = ($$3 == NULL) ? 1 : 0;
50 
51 	client = $$1;
52 	share = $$2;
53 	zoneid = $3;
54 
55 	printf("%Y - client=%s share=%s zone=%s)\n", walltimestamp,
56 	    (all_clients) ? "all" : client,
57 	    (all_shares) ? "all" : share,
58 	    (all_zones) ? "all" : $$3);
59 }
60 
61 nfsv3:::op-getattr-start,
62 nfsv3:::op-setattr-start,
63 nfsv3:::op-lookup-start,
64 nfsv3:::op-access-start,
65 nfsv3:::op-commit-start,
66 nfsv3:::op-create-start,
67 nfsv3:::op-fsinfo-start,
68 nfsv3:::op-fsstat-start,
69 nfsv3:::op-link-start,
70 nfsv3:::op-mkdir-start,
71 nfsv3:::op-mknod-start,
72 nfsv3:::op-pathconf-start,
73 nfsv3:::op-read-start,
74 nfsv3:::op-readdir-start,
75 nfsv3:::op-readdirplus-start,
76 nfsv3:::op-readlink-start,
77 nfsv3:::op-remove-start,
78 nfsv3:::op-rename-start,
79 nfsv3:::op-rmdir-start,
80 nfsv3:::op-symlink-start,
81 nfsv3:::op-write-start
82 / ((all_clients) || (args[0]->ci_remote == client)) &&
83    ((all_shares) || (args[1]->noi_shrpath == share)) &&
84    ((all_zones) || (args[1]->noi_zoneid == zoneid)) /
85 {
86 	printf("\n");
87 	print(*args[0]);
88 	printf("\n");
89 	print(*args[1]);
90 	printf("\n");
91 	print(*args[2]);
92 	printf("\n");
93 }
94 
95 nfsv3:::op-getattr-done,
96 nfsv3:::op-setattr-done,
97 nfsv3:::op-lookup-done,
98 nfsv3:::op-access-done,
99 nfsv3:::op-commit-done,
100 nfsv3:::op-create-done,
101 nfsv3:::op-fsinfo-done,
102 nfsv3:::op-fsstat-done,
103 nfsv3:::op-link-done,
104 nfsv3:::op-mkdir-done,
105 nfsv3:::op-mknod-done,
106 nfsv3:::op-pathconf-done,
107 nfsv3:::op-read-done,
108 nfsv3:::op-readdir-done,
109 nfsv3:::op-readdirplus-done,
110 nfsv3:::op-readlink-done,
111 nfsv3:::op-remove-done,
112 nfsv3:::op-rename-done,
113 nfsv3:::op-rmdir-done,
114 nfsv3:::op-symlink-done,
115 nfsv3:::op-write-done
116 / ((all_clients) || (args[0]->ci_remote == client)) &&
117    ((all_shares) || (args[1]->noi_shrpath == share)) &&
118    ((all_zones) || (args[1]->noi_zoneid == zoneid)) /
119 {
120 	/*
121 	printf("\n");
122 	print(*args[0]);
123 	printf("\n");
124 	print(*args[1]);
125 	*/
126 	printf("\n");
127 	print(*args[2]);
128 	printf("\n");
129 }
130 
131 nfsv4:::op-access-start,
132 nfsv4:::op-close-start,
133 nfsv4:::op-commit-start,
134 nfsv4:::op-create-start,
135 nfsv4:::op-delegpurge-start,
136 nfsv4:::op-delegreturn-start,
137 nfsv4:::op-getattr-start,
138 nfsv4:::op-link-start,
139 nfsv4:::op-lock-start,
140 nfsv4:::op-lockt-start,
141 nfsv4:::op-locku-start,
142 nfsv4:::op-lookup-start,
143 nfsv4:::op-nverify-start,
144 nfsv4:::op-open-start,
145 nfsv4:::op-open-confirm-start,
146 nfsv4:::op-open-downgrade-start,
147 nfsv4:::op-openattr-start,
148 nfsv4:::op-putfh-start,
149 nfsv4:::op-read-start,
150 nfsv4:::op-readdir-start,
151 nfsv4:::op-release-lockowner-start,
152 nfsv4:::op-remove-start,
153 nfsv4:::op-rename-start,
154 nfsv4:::op-renew-start,
155 nfsv4:::op-secinfo-start,
156 nfsv4:::op-setattr-start,
157 nfsv4:::op-setclientid-start,
158 nfsv4:::op-setclientid-confirm-start,
159 nfsv4:::op-verify-start,
160 nfsv4:::op-write-start
161 / ((all_clients) || (args[0]->ci_remote == client)) &&
162    ((all_shares) || (args[1]->noi_shrpath == share)) &&
163    ((all_zones) || (args[1]->noi_zoneid == zoneid)) /
164 {
165 	printf("\n");
166 	print(*args[0]);
167 	printf("\n");
168 	print(*args[1]);
169 	printf("\n");
170 	print(*args[2]);
171 	printf("\n");
172 }
173 
174 /* These operations do not have args[2] */
175 nfsv4:::op-getfh-start,
176 nfsv4:::op-lookupp-start,
177 nfsv4:::op-putpubfh-start,
178 nfsv4:::op-putrootfh-start,
179 nfsv4:::op-readlink-start,
180 nfsv4:::op-restorefh-start,
181 nfsv4:::op-savefh-start
182 / ((all_clients) || (args[0]->ci_remote == client)) &&
183    ((all_shares) || (args[1]->noi_shrpath == share)) &&
184    ((all_zones) || (args[1]->noi_zoneid == zoneid)) /
185 {
186 	printf("\n");
187 	print(*args[0]);
188 	printf("\n");
189 	print(*args[1]);
190 	printf("\n");
191 }
192 
193 
194 nfsv4:::op-access-done,
195 nfsv4:::op-close-done,
196 nfsv4:::op-commit-done,
197 nfsv4:::op-create-done,
198 nfsv4:::op-delegpurge-done,
199 nfsv4:::op-delegreturn-done,
200 nfsv4:::op-getattr-done,
201 nfsv4:::op-getfh-done,
202 nfsv4:::op-link-done,
203 nfsv4:::op-lock-done,
204 nfsv4:::op-lockt-done,
205 nfsv4:::op-locku-done,
206 nfsv4:::op-lookup-done,
207 nfsv4:::op-lookupp-done,
208 nfsv4:::op-nverify-done,
209 nfsv4:::op-open-done,
210 nfsv4:::op-open-confirm-done,
211 nfsv4:::op-open-downgrade-done,
212 nfsv4:::op-openattr-done,
213 nfsv4:::op-putfh-done,
214 nfsv4:::op-putpubfh-done,
215 nfsv4:::op-putrootfh-done,
216 nfsv4:::op-read-done,
217 nfsv4:::op-readdir-done,
218 nfsv4:::op-readlink-done,
219 nfsv4:::op-release-lockowner-done,
220 nfsv4:::op-remove-done,
221 nfsv4:::op-rename-done,
222 nfsv4:::op-renew-done,
223 nfsv4:::op-restorefh-done,
224 nfsv4:::op-savefh-done,
225 nfsv4:::op-secinfo-done,
226 nfsv4:::op-setattr-done,
227 nfsv4:::op-setclientid-done,
228 nfsv4:::op-setclientid-confirm-done,
229 nfsv4:::op-verify-done,
230 nfsv4:::op-write-done
231 / ((all_clients) || (args[0]->ci_remote == client)) &&
232    ((all_shares) || (args[1]->noi_shrpath == share)) &&
233    ((all_zones) || (args[1]->noi_zoneid == zoneid)) /
234 {
235 	/*
236 	printf("\n");
237 	print(*args[0]);
238 	printf("\n");
239 	print(*args[1]);
240 	*/
241 	printf("\n");
242 	print(*args[2]);
243 	printf("\n");
244 }
245 
246 dtrace:::END
247 {
248 }
249