1*94047d49SGordon Ross #!/usr/sbin/dtrace -s
2*94047d49SGordon Ross /*
3*94047d49SGordon Ross  * This file and its contents are supplied under the terms of the
4*94047d49SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
5*94047d49SGordon Ross  * You may only use this file in accordance with the terms of version
6*94047d49SGordon Ross  * 1.0 of the CDDL.
7*94047d49SGordon Ross  *
8*94047d49SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
9*94047d49SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
10*94047d49SGordon Ross  * http://www.illumos.org/license/CDDL.
11*94047d49SGordon Ross  */
12*94047d49SGordon Ross 
13*94047d49SGordon Ross /*
14*94047d49SGordon Ross  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
15*94047d49SGordon Ross  */
16*94047d49SGordon Ross 
17*94047d49SGordon Ross /*
18*94047d49SGordon Ross  * User-level dtrace for testoplock
19*94047d49SGordon Ross  * Usage: dtrace -s tol.d -c ./testoplock
20*94047d49SGordon Ross  */
21*94047d49SGordon Ross 
22*94047d49SGordon Ross #pragma D option flowindent
23*94047d49SGordon Ross 
24*94047d49SGordon Ross self int trace;
25*94047d49SGordon Ross self int mask;
26*94047d49SGordon Ross 
27*94047d49SGordon Ross /*
28*94047d49SGordon Ross  * Trace almost everything
29*94047d49SGordon Ross  */
30*94047d49SGordon Ross pid$target:testoplock::entry
31*94047d49SGordon Ross {
32*94047d49SGordon Ross   self->trace++;
33*94047d49SGordon Ross }
34*94047d49SGordon Ross 
35*94047d49SGordon Ross /*
36*94047d49SGordon Ross  * If traced and not masked, print entry/return
37*94047d49SGordon Ross  */
38*94047d49SGordon Ross pid$target:testoplock::entry
39*94047d49SGordon Ross /self->trace > 0 && self->mask == 0/
40*94047d49SGordon Ross {
41*94047d49SGordon Ross   printf("\t0x%x", arg0);
42*94047d49SGordon Ross   printf("\t0x%x", arg1);
43*94047d49SGordon Ross   printf("\t0x%x", arg2);
44*94047d49SGordon Ross   printf("\t0x%x", arg3);
45*94047d49SGordon Ross   printf("\t0x%x", arg4);
46*94047d49SGordon Ross   printf("\t0x%x", arg5);
47*94047d49SGordon Ross }
48*94047d49SGordon Ross 
49*94047d49SGordon Ross /* Skip the bsearch calls. */
50*94047d49SGordon Ross pid$target:testoplock:xlate_nt_status:entry
51*94047d49SGordon Ross {
52*94047d49SGordon Ross   self->mask++;
53*94047d49SGordon Ross }
54*94047d49SGordon Ross 
55*94047d49SGordon Ross pid$target:testoplock:xlate_nt_status:return
56*94047d49SGordon Ross {
57*94047d49SGordon Ross   self->mask--;
58*94047d49SGordon Ross }
59*94047d49SGordon Ross 
60*94047d49SGordon Ross pid$target:testoplock::return
61*94047d49SGordon Ross /self->trace > 0 && self->mask == 0/
62*94047d49SGordon Ross {
63*94047d49SGordon Ross   printf("\t0x%x", arg1);
64*94047d49SGordon Ross }
65*94047d49SGordon Ross 
66*94047d49SGordon Ross pid$target:testoplock::return
67*94047d49SGordon Ross {
68*94047d49SGordon Ross   self->trace--;
69*94047d49SGordon Ross }
70*94047d49SGordon Ross 
71*94047d49SGordon Ross /* ---------------------- */
72*94047d49SGordon Ross 
73*94047d49SGordon Ross pid$target::smb_oplock_request:entry
74*94047d49SGordon Ross {
75*94047d49SGordon Ross 	self->sr = arg0;
76*94047d49SGordon Ross 	self->of = arg1;
77*94047d49SGordon Ross 	self->statep = arg2;
78*94047d49SGordon Ross 	this->state = *(uint32_t *)copyin(self->statep, 4);
79*94047d49SGordon Ross 	printf(" entry state=0x%x\n", this->state);
80*94047d49SGordon Ross }
81*94047d49SGordon Ross 
82*94047d49SGordon Ross pid$target::smb_oplock_request:return
83*94047d49SGordon Ross {
84*94047d49SGordon Ross 	this->sr = (userland pid`smb_request_t *)self->sr;
85*94047d49SGordon Ross 	this->state = *(uint32_t *)copyin(self->statep, 4);
86*94047d49SGordon Ross 	printf(" return state=0x%x\n", this->state);
87*94047d49SGordon Ross 	printf("\nsr->arg.open = ");
88*94047d49SGordon Ross 	print(this->sr->arg.open);
89*94047d49SGordon Ross }
90*94047d49SGordon Ross 
91*94047d49SGordon Ross pid$target::smb_oplock_break_cmn:entry
92*94047d49SGordon Ross {
93*94047d49SGordon Ross 	this->node = (userland pid`smb_node_t *)arg0;
94*94047d49SGordon Ross 	this->ofile = (userland pid`smb_ofile_t *)arg1;
95*94047d49SGordon Ross 	printf("\nnode->n_oplock = ");
96*94047d49SGordon Ross 	print(this->node->n_oplock);
97*94047d49SGordon Ross 	printf("\nofile->f_oplock = ");
98*94047d49SGordon Ross 	print(this->ofile->f_oplock);
99*94047d49SGordon Ross }
100*94047d49SGordon Ross 
101*94047d49SGordon Ross pid$target::smb_oplock_ind_break:entry
102*94047d49SGordon Ross {
103*94047d49SGordon Ross 	this->ofile = (userland pid`smb_ofile_t *)arg0;
104*94047d49SGordon Ross 	printf("\nofile->f_oplock = ");
105*94047d49SGordon Ross 	print(this->ofile->f_oplock);
106*94047d49SGordon Ross }
107