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