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