xref: /illumos-gate/usr/src/cmd/smbsrv/dtrace/nbl-conflict.d (revision 1c53c56f27c8091f8066fb65aceeca8ee8b6df7a)
1*1c53c56fSGordon Ross #!/usr/sbin/dtrace -s
2*1c53c56fSGordon Ross 
3*1c53c56fSGordon Ross /*
4*1c53c56fSGordon Ross  * This file and its contents are supplied under the terms of the
5*1c53c56fSGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
6*1c53c56fSGordon Ross  * You may only use this file in accordance with the terms of version
7*1c53c56fSGordon Ross  * 1.0 of the CDDL.
8*1c53c56fSGordon Ross  *
9*1c53c56fSGordon Ross  * A full copy of the text of the CDDL should have accompanied this
10*1c53c56fSGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
11*1c53c56fSGordon Ross  * http://www.illumos.org/license/CDDL.
12*1c53c56fSGordon Ross  */
13*1c53c56fSGordon Ross 
14*1c53c56fSGordon Ross /*
15*1c53c56fSGordon Ross  * Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
16*1c53c56fSGordon Ross  */
17*1c53c56fSGordon Ross 
18*1c53c56fSGordon Ross /*
19*1c53c56fSGordon Ross  * This dtrace script shows how to track down the owners of locks
20*1c53c56fSGordon Ross  * that prevent I/O in filesystems with mandatory locking enabled
21*1c53c56fSGordon Ross  * (eg. ZFS with nbmand=on).  This script is not in any way specific
22*1c53c56fSGordon Ross  * to SMB, but this problem is most often seen when SMB is in use
23*1c53c56fSGordon Ross  * because SMB requires mandatory locking semantics.
24*1c53c56fSGordon Ross  *
25*1c53c56fSGordon Ross  * Run this script, eg. dtrace -s nbl-conflict.d
26*1c53c56fSGordon Ross  * taking note of these fields in the dtrace output:
27*1c53c56fSGordon Ross  *	conflict_lock:  .l_sysid .l_pid
28*1c53c56fSGordon Ross  *	conflict_shrlock: .s_sysid .s_pid
29*1c53c56fSGordon Ross  *
30*1c53c56fSGordon Ross  * The sysid values tell you if a local or remote owner has the
31*1c53c56fSGordon Ross  * lock or share preventing I/O, and the pid tells which process.
32*1c53c56fSGordon Ross  */
33*1c53c56fSGordon Ross 
34*1c53c56fSGordon Ross sdt::nbl_lock_conflict:conflict_lock
35*1c53c56fSGordon Ross {
36*1c53c56fSGordon Ross 	this->lock = (lock_descriptor_t *)arg0;
37*1c53c56fSGordon Ross 	print(this->lock->l_flock);
38*1c53c56fSGordon Ross }
39*1c53c56fSGordon Ross 
40*1c53c56fSGordon Ross sdt::nbl_share_conflict:conflict_shrlock
41*1c53c56fSGordon Ross {
42*1c53c56fSGordon Ross 	this->shrl = (struct shrlock *)arg0;
43*1c53c56fSGordon Ross 	print(*(this->shrl));
44*1c53c56fSGordon Ross }
45*1c53c56fSGordon Ross 
46*1c53c56fSGordon Ross /*
47*1c53c56fSGordon Ross  * The above probe action in nbl_share_conflict shows conflicts
48*1c53c56fSGordon Ross  * with read/write operations (eg. from the NFS server).
49*1c53c56fSGordon Ross  * This probe action shows share reservation conflicts at open.
50*1c53c56fSGordon Ross  * (Remove this if you're only interested in I/O conflicts.)
51*1c53c56fSGordon Ross  */
52*1c53c56fSGordon Ross sdt::add_share:conflict_shrlock
53*1c53c56fSGordon Ross {
54*1c53c56fSGordon Ross 	this->shrl = (struct shrlock *)arg0;
55*1c53c56fSGordon Ross 	print(*(this->shrl));
56*1c53c56fSGordon Ross }
57