changeset 21416:fe2f621c52e3

1841 SMB dtrace provider is incomplete 11180 SMB2 IOCTL FSCTL_LMR_REQUEST_RESILIENCY Returns Incorrect Response Portions contributed by: Joyce McIntosh <joyce.mcintosh@nexenta.com> Reviewed by: Evan Layton <evan.layton@nexenta.com> Reviewed by: Matt Barden <matt.barden@nexenta.com> Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com> Approved by: Richard Lowe <richlowe@richlowe.net>
author Gordon Ross <gwr@nexenta.com>
date Wed, 27 Nov 2013 23:58:32 -0500
parents 4526915ff3e9
children b31813fb5cdc
files usr/src/cmd/smbsrv/dtrace/Makefile usr/src/cmd/smbsrv/dtrace/smb-trace.d usr/src/cmd/smbsrv/dtrace/smb2-trace.d usr/src/cmd/smbsrv/dtrace/smbsrv.d usr/src/cmd/smbsrv/fksmbd/Watch-all.d usr/src/cmd/smbsrv/fksmbd/Watch-fksmb.d usr/src/lib/libdtrace/Makefile.com usr/src/lib/libdtrace/common/smb.d usr/src/lib/smbsrv/libfksmbsrv/Makefile usr/src/lib/smbsrv/libfksmbsrv/Makefile.com usr/src/lib/smbsrv/libfksmbsrv/common/fksmb_dt.c usr/src/lib/smbsrv/libfksmbsrv/common/fksmb_dt.d usr/src/lib/smbsrv/libfksmbsrv/common/sys/sdt.h usr/src/pkg/manifests/developer-dtrace.mf usr/src/pkg/manifests/service-file-system-smb.mf usr/src/tools/quick/make-smbsrv usr/src/uts/common/dtrace/sdt_subr.c usr/src/uts/common/fs/smbsrv/smb2_cancel.c usr/src/uts/common/fs/smbsrv/smb2_change_notify.c usr/src/uts/common/fs/smbsrv/smb2_close.c usr/src/uts/common/fs/smbsrv/smb2_create.c usr/src/uts/common/fs/smbsrv/smb2_dispatch.c usr/src/uts/common/fs/smbsrv/smb2_echo.c usr/src/uts/common/fs/smbsrv/smb2_flush.c usr/src/uts/common/fs/smbsrv/smb2_ioctl.c usr/src/uts/common/fs/smbsrv/smb2_lock.c usr/src/uts/common/fs/smbsrv/smb2_logoff.c usr/src/uts/common/fs/smbsrv/smb2_negotiate.c usr/src/uts/common/fs/smbsrv/smb2_oplock.c usr/src/uts/common/fs/smbsrv/smb2_query_dir.c usr/src/uts/common/fs/smbsrv/smb2_query_info.c usr/src/uts/common/fs/smbsrv/smb2_read.c usr/src/uts/common/fs/smbsrv/smb2_session_setup.c usr/src/uts/common/fs/smbsrv/smb2_set_info.c usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c usr/src/uts/common/fs/smbsrv/smb2_tree_disconn.c usr/src/uts/common/fs/smbsrv/smb2_write.c usr/src/uts/common/fs/smbsrv/smb_close.c usr/src/uts/common/fs/smbsrv/smb_common_transact.c usr/src/uts/common/fs/smbsrv/smb_create.c usr/src/uts/common/fs/smbsrv/smb_delete.c usr/src/uts/common/fs/smbsrv/smb_directory.c usr/src/uts/common/fs/smbsrv/smb_dispatch.c usr/src/uts/common/fs/smbsrv/smb_echo.c usr/src/uts/common/fs/smbsrv/smb_find.c usr/src/uts/common/fs/smbsrv/smb_flush.c usr/src/uts/common/fs/smbsrv/smb_fsinfo.c usr/src/uts/common/fs/smbsrv/smb_lock_byte_range.c usr/src/uts/common/fs/smbsrv/smb_locking_andx.c usr/src/uts/common/fs/smbsrv/smb_logoff_andx.c usr/src/uts/common/fs/smbsrv/smb_negotiate.c usr/src/uts/common/fs/smbsrv/smb_nt_cancel.c usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c usr/src/uts/common/fs/smbsrv/smb_nt_transact_create.c usr/src/uts/common/fs/smbsrv/smb_nt_transact_notify_change.c usr/src/uts/common/fs/smbsrv/smb_open_andx.c usr/src/uts/common/fs/smbsrv/smb_print.c usr/src/uts/common/fs/smbsrv/smb_process_exit.c usr/src/uts/common/fs/smbsrv/smb_query_fileinfo.c usr/src/uts/common/fs/smbsrv/smb_read.c usr/src/uts/common/fs/smbsrv/smb_rename.c usr/src/uts/common/fs/smbsrv/smb_seek.c usr/src/uts/common/fs/smbsrv/smb_session.c usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c usr/src/uts/common/fs/smbsrv/smb_set_fileinfo.c usr/src/uts/common/fs/smbsrv/smb_trans2_find.c usr/src/uts/common/fs/smbsrv/smb_tree_connect.c usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c usr/src/uts/common/fs/smbsrv/smb_write.c usr/src/uts/common/smbsrv/smb_kproto.h usr/src/uts/common/smbsrv/smb_ktypes.h usr/src/uts/common/sys/sdt.h
diffstat 72 files changed, 1933 insertions(+), 756 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/smbsrv/dtrace/Makefile	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/cmd/smbsrv/dtrace/Makefile	Wed Nov 27 23:58:32 2013 -0500
@@ -22,11 +22,11 @@
 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
-# Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+# Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
 #
 
 SRCS=	smbd-all.d smbd-authsvc.d smbd-doorsvc.d smbd-pipesvc.d \
-	smbnode.d smbsrv.d smbvfs.d
+	smbnode.d smbsrv.d smbvfs.d smb-trace.d smb2-trace.d
 
 include ../../Makefile.cmd
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/smbsrv/dtrace/smb-trace.d	Wed Nov 27 23:58:32 2013 -0500
@@ -0,0 +1,44 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source.  A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
+ */
+
+/*
+ * Example using the "smb" dtrace provider.
+ * Traces all SMB commands.
+ *
+ * All these probes provide:
+ *	args[0]  conninfo_t
+ *	args[1]  smbopinfo_t
+ * Some also provide one of: (not used here)
+ *	args[2]  smb_name_args_t
+ *	args[2]  smb_open_args_t
+ *	args[2]  smb_rw_args_t
+ */
+
+smb:::op-*-start
+{
+	printf("clnt=%s mid=0x%x uid=0x%x tid=0x%x\n",
+	       args[0]->ci_remote,
+	       args[1]->soi_mid,
+	       args[1]->soi_uid,
+	       args[1]->soi_tid);
+}
+
+smb:::op-*-done
+{
+	printf("clnt=%s mid=0x%x status=0x%x\n",
+	       args[0]->ci_remote,
+	       args[1]->soi_mid,
+	       args[1]->soi_status);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/smbsrv/dtrace/smb2-trace.d	Wed Nov 27 23:58:32 2013 -0500
@@ -0,0 +1,43 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source.  A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
+ */
+
+/*
+ * Example using the "smb2" dtrace provider.
+ * Traces all SMB commands.
+ *
+ * All these probes provide:
+ *	args[0]  conninfo_t
+ *	args[1]  smb2opinfo_t
+ * Some also provide one of: (not used here)
+ *	args[2]  smb_open_args_t
+ *	args[2]  smb_rw_args_t
+ */
+
+smb2:::op-*-start
+{
+	printf("clnt=%s mid=0x%x uid=0x%x tid=0x%x\n",
+	       args[0]->ci_remote,
+	       args[1]->soi_mid,
+	       args[1]->soi_uid,
+	       args[1]->soi_tid);
+}
+
+smb2:::op-*-done
+{
+	printf("clnt=%s mid=0x%x status=0x%x\n",
+	       args[0]->ci_remote,
+	       args[1]->soi_mid,
+	       args[1]->soi_status);
+}
--- a/usr/src/cmd/smbsrv/dtrace/smbsrv.d	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/cmd/smbsrv/dtrace/smbsrv.d	Wed Nov 27 23:58:32 2013 -0500
@@ -11,7 +11,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -19,8 +19,6 @@
  * Usage: dtrace -s smbsrv.d
  */
 
-#pragma D option flowindent
-
 self int trace;
 self int mask;
 
@@ -87,3 +85,26 @@
 {
 	self->trace--;
 }
+
+/*
+ * Use the "smb", "smb2" dtrace providers.
+ */
+
+smb:::op-*-start,
+smb2:::op-*-start
+{
+	printf("clnt=%s mid=0x%x uid=0x%x tid=0x%x\n",
+	       args[0]->ci_remote,
+	       args[1]->soi_mid,
+	       args[1]->soi_uid,
+	       args[1]->soi_tid);
+}
+
+smb:::op-*-done,
+smb2:::op-*-done
+{
+	printf("clnt=%s mid=0x%x status=0x%x\n",
+	       args[0]->ci_remote,
+	       args[1]->soi_mid,
+	       args[1]->soi_status);
+}
--- a/usr/src/cmd/smbsrv/fksmbd/Watch-all.d	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/cmd/smbsrv/fksmbd/Watch-all.d	Wed Nov 27 23:58:32 2013 -0500
@@ -11,7 +11,7 @@
  */
 
 /*
- * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -19,8 +19,6 @@
  * Usage: dtrace -s Watch-all.d -p $PID
  */
 
-#pragma D option flowindent
-
 self int trace;
 self int mask;
 
@@ -34,7 +32,7 @@
 pid$target:libsmbns.so.1::entry,
 pid$target:libsmb.so.1::entry
 {
-  self->trace++;
+	self->trace++;
 }
 
 /*
@@ -48,10 +46,12 @@
 pid$target:libsmb.so.1::entry
 /self->trace > 0 && self->mask == 0/
 {
-  printf("\t0x%x", arg0);
-  printf("\t0x%x", arg1);
-  printf("\t0x%x", arg2);
-  printf("\t0x%x", arg3);
+	printf("\t0x%x", arg0);
+	printf("\t0x%x", arg1);
+	printf("\t0x%x", arg2);
+	printf("\t0x%x", arg3);
+	printf("\t0x%x", arg4);
+	printf("\t0x%x", arg5);
 }
 
 /*
@@ -69,7 +69,7 @@
 pid$target::smb_strupr:entry,
 pid$target::smb_wcequiv_strlen:entry
 {
-  self->mask++;
+	self->mask++;
 }
 
 /*
@@ -86,7 +86,7 @@
 pid$target::smb_strupr:return,
 pid$target::smb_wcequiv_strlen:return
 {
-  self->mask--;
+	self->mask--;
 }
 
 pid$target:fksmbd::return,
@@ -97,7 +97,7 @@
 pid$target:libsmb.so.1::return
 /self->trace > 0 && self->mask == 0/
 {
-  printf("\t0x%x", arg1);
+	printf("\t0x%x", arg1);
 }
 
 pid$target:fksmbd::return,
@@ -107,5 +107,55 @@
 pid$target:libsmbns.so.1::return,
 pid$target:libsmb.so.1::return
 {
-  self->trace--;
+	self->trace--;
+}
+
+/*
+ * fksmb dtrace provder
+ */
+
+fksmb$target:::smb_start
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x uid=0x%x tid=0x%x\n",
+	    this->pn,
+	    this->sr->smb_mid,
+	    this->sr->smb_uid,
+	    this->sr->smb_tid);
 }
+
+fksmb$target:::smb_done
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x status=0x%x\n",
+	    this->pn,
+	    this->sr->smb_mid,
+	    this->sr->smb_error.status);
+}
+
+fksmb$target:::smb2_start
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x uid=0x%x tid=0x%x\n",
+	    this->pn,
+	    this->sr->smb2_messageid,
+	    this->sr->smb2_ssnid,
+	    this->sr->smb_tid);
+}
+
+fksmb$target:::smb2_done
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x status=0x%x\n",
+	    this->pn,
+	    this->sr->smb2_messageid,
+	    this->sr->smb2_status);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/smbsrv/fksmbd/Watch-fksmb.d	Wed Nov 27 23:58:32 2013 -0500
@@ -0,0 +1,72 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source.  A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
+ */
+
+/*
+ * Example using the "fksmb$pid" dtrace provider.
+ * Traces all SMB commands using the probes:
+ *	start, done
+ * all of which have two args:
+ *	args[0]: char * (probe-name)
+ *	args[1]: ulong (struct smb_request *)
+ *
+ * Note: the "userland" type classifier causes dtrace to
+ * automatically copyin the struct for us.  (Nice!)
+ */
+
+fksmb$target:::smb_start
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x uid=0x%x tid=0x%x\n",
+	    this->pn,
+	    this->sr->smb_mid,
+	    this->sr->smb_uid,
+	    this->sr->smb_tid);
+}
+
+fksmb$target:::smb_done
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x status=0x%x\n",
+	    this->pn,
+	    this->sr->smb_mid,
+	    this->sr->smb_error.status);
+}
+
+fksmb$target:::smb2_start
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x uid=0x%x tid=0x%x\n",
+	    this->pn,
+	    this->sr->smb2_messageid,
+	    this->sr->smb2_ssnid,
+	    this->sr->smb_tid);
+}
+
+fksmb$target:::smb2_done
+{
+	this->pn = copyinstr(arg0);
+	this->sr = (userland pid`smb_request_t *)arg1;
+
+	printf(" %s mid=0x%x status=0x%x\n",
+	    this->pn,
+	    this->sr->smb2_messageid,
+	    this->sr->smb2_status);
+}
--- a/usr/src/lib/libdtrace/Makefile.com	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/lib/libdtrace/Makefile.com	Wed Nov 27 23:58:32 2013 -0500
@@ -96,6 +96,7 @@
 	sched.d \
 	signal.d \
 	scsi.d \
+	smb.d \
 	srp.d \
 	sysevent.d \
 	tcp.d \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/lib/libdtrace/common/smb.d	Wed Nov 27 23:58:32 2013 -0500
@@ -0,0 +1,161 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
+ */
+
+#pragma	D depends_on library ip.d
+#pragma	D depends_on library net.d
+#pragma	D depends_on module genunix
+#pragma	D depends_on module smbsrv
+
+#pragma D binding "1.5" translator
+translator conninfo_t < struct smb_request *P > {
+	ci_protocol =
+	    P->session->ipaddr.a_family == AF_INET6 ? "tcp6" :
+	    P->session->ipaddr.a_family == AF_INET ? "tcp" :
+	    "<unknown>";
+	ci_local = "<any>"; /* not interesting */
+	ci_remote = P->session->ip_addr_str;
+};
+
+/*
+ * The smbopinfo_t structure describes the internal form of a
+ * single SMB request (SMB v1).
+ */
+typedef struct smbopinfo {
+	cred_t   *soi_cred;		/* credentials for operation */
+	string   soi_share;		/* share name */
+	string   soi_curpath;		/* file handle path (if any) */
+	uint64_t soi_sid;		/* session id */
+	uint32_t soi_pid;		/* process id */
+	uint32_t soi_status;		/* status */
+	uint16_t soi_tid;		/* tree id */
+	uint16_t soi_uid;		/* user id */
+	uint16_t soi_mid;		/* request id */
+	uint16_t soi_fid;		/* file id */
+	uint16_t soi_flags2;		/* flags2 */
+	uint8_t  soi_flags;		/* flags */
+} smbopinfo_t;
+
+#pragma D binding "1.5" translator
+translator smbopinfo_t < struct smb_request *P > {
+	soi_cred	= (cred_t *)P->user_cr;
+	soi_sid		= P->session->s_kid;
+	soi_pid		= P->smb_pid;
+	soi_status	= P->smb_error.status;
+	soi_tid		= P->smb_tid;
+	soi_uid		= P->smb_uid;
+	soi_mid		= P->smb_mid;
+	soi_fid		= P->smb_fid;
+	soi_flags2	= P->smb_flg2;
+	soi_flags	= P->smb_flg;
+
+	soi_share = (P->tid_tree == NULL) ? "<NULL>" :
+	    P->tid_tree->t_sharename;
+
+	soi_curpath = (P->fid_ofile == NULL ||
+	    P->fid_ofile->f_node == NULL ||
+	    P->fid_ofile->f_node->vp == NULL ||
+	    P->fid_ofile->f_node->vp->v_path == NULL) ? "<NULL>" :
+	    P->fid_ofile->f_node->vp->v_path;
+};
+
+typedef struct smb_rw_args {
+	off_t	soa_offset;
+	uint_t	soa_count;
+} smb_rw_args_t;
+
+#pragma D binding "1.5" translator
+translator smb_rw_args_t < smb_request_t *P > {
+	soa_offset = P->arg.rw->rw_offset;
+	soa_count  = P->arg.rw->rw_count;
+};
+
+typedef struct smb_name_args {
+	string	soa_name;
+} smb_name_args_t;
+
+#pragma D binding "1.5" translator
+translator smb_name_args_t < smb_request_t *P > {
+	soa_name = (P->arg.dirop.fqi.fq_path.pn_path == NULL) ? "<NULL>" :
+	    P->arg.dirop.fqi.fq_path.pn_path;
+};
+
+typedef struct smb_open_args {
+	string		soa_name;
+	uint32_t	soa_desired_access;
+	uint32_t	soa_share_access;
+	uint32_t	soa_create_options;
+	uint32_t	soa_create_disposition;
+} smb_open_args_t;
+
+#pragma D binding "1.5" translator
+translator smb_open_args_t < smb_request_t *P > {
+	soa_name = (P->arg.open.fqi.fq_path.pn_path == NULL) ? "<NULL>" :
+	    P->arg.open.fqi.fq_path.pn_path;
+	soa_desired_access = P->arg.open.desired_access;
+	soa_share_access   = P->arg.open.share_access;
+	soa_create_options = P->arg.open.create_options;
+	soa_create_disposition = P->arg.open.create_disposition;
+};
+
+/*
+ * The smb2opinfo_t structure describes the internal form of a
+ * single SMB2 request (SMB v2 and later).
+ */
+typedef struct smb2opinfo {
+	cred_t   *soi_cred;		/* credentials for operation */
+	string   soi_share;		/* share name */
+	string   soi_curpath;		/* file handle path (if any) */
+	uint64_t soi_sid;		/* (internal) session ID */
+	uint64_t soi_mid;		/* Message ID */
+	uint64_t soi_asyncid;		/* Message ID (when async) */
+	uint64_t soi_uid;		/* user ID (SMB2 Session ID) */
+	uint32_t soi_tid;		/* tree ID */
+	uint32_t soi_status;
+	uint32_t soi_flags;
+} smb2opinfo_t;
+
+#pragma D binding "1.5" translator
+translator smb2opinfo_t < struct smb_request *P > {
+	soi_cred	= (cred_t *)P->user_cr;
+	soi_sid		= P->session->s_kid;
+	soi_mid		= P->smb2_messageid;
+	soi_asyncid	= P->smb2_async_id;
+	soi_uid		= P->smb2_ssnid;
+	soi_tid		= P->smb_tid;
+	soi_status	= P->smb2_status;
+	soi_flags	= P->smb2_hdr_flags;
+
+	soi_share = (P->tid_tree == NULL) ? "<NULL>" :
+	    P->tid_tree->t_sharename;
+
+	soi_curpath = (P->fid_ofile == NULL ||
+	    P->fid_ofile->f_node == NULL ||
+	    P->fid_ofile->f_node->vp == NULL ||
+	    P->fid_ofile->f_node->vp->v_path == NULL) ? "<NULL>" :
+	    P->fid_ofile->f_node->vp->v_path;
+};
--- a/usr/src/lib/smbsrv/libfksmbsrv/Makefile	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/lib/smbsrv/libfksmbsrv/Makefile	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,13 @@
 # Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
-# Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+# Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
 #
 
 include ../Makefile.smbsrv
+
+CLOBBERFILES +=  common/fksmb_dt.h
+all: install_h
+install_h: common/fksmb_dt.h
+common/fksmb_dt.h : common/fksmb_dt.d
+	$(DTRACE) -xnolibs -h -o $@ -s common/fksmb_dt.d
--- a/usr/src/lib/smbsrv/libfksmbsrv/Makefile.com	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/lib/smbsrv/libfksmbsrv/Makefile.com	Wed Nov 27 23:58:32 2013 -0500
@@ -31,7 +31,6 @@
 
 OBJS_LOCAL = \
 		fksmb_cred.o \
-		fksmb_dt.o \
 		fksmb_fem.o \
 		fksmb_idmap.o \
 		fksmb_init.o \
@@ -178,6 +177,11 @@
 		smb_status2winerr.o \
 		xattr_common.o
 
+# This one can't be in OBJECTS, as it has to depend on
+# all of those for the COMPILE.d rule (which processes
+# all those objects collecting probe instances).
+DTRACE_OBJS = fksmb_dt.o
+
 OBJECTS = \
 	$(OBJS_LOCAL) \
 	$(OBJS_FS_SMBSRV) \
@@ -233,10 +237,6 @@
 	$(COMPILE.c) -o $@ $(SRC)/common/acl/acl_common.c
 	$(POST_PROCESS_O)
 
-pics/smb_status2winerr.o:  $(SRC)/common/smbclnt/smb_status2winerr.c
-	$(COMPILE.c) -o $@ $(SRC)/common/smbclnt/smb_status2winerr.c
-	$(POST_PROCESS_O)
-
 pics/pathname.o:	   $(SRC)/uts/common/fs/pathname.c
 	$(COMPILE.c) -o $@ $(SRC)/uts/common/fs/pathname.c
 	$(POST_PROCESS_O)
@@ -245,6 +245,10 @@
 	$(COMPILE.c) -o $@ $(SRC)/uts/common/os/refstr.c
 	$(POST_PROCESS_O)
 
+pics/smb_status2winerr.o:  $(SRC)/common/smbclnt/smb_status2winerr.c
+	$(COMPILE.c) -o $@ $(SRC)/common/smbclnt/smb_status2winerr.c
+	$(POST_PROCESS_O)
+
 pics/xattr_common.o:	   $(SRC)/common/xattr/xattr_common.c
 	$(COMPILE.c) -o $@ $(SRC)/common/xattr/xattr_common.c
 	$(POST_PROCESS_O)
@@ -255,3 +259,12 @@
 
 include ../../Makefile.targ
 include ../../../Makefile.targ
+
+EXTPICS= $(DTRACE_OBJS:%=pics/%)
+CLEANFILES += $(EXTPICS)
+
+$(OBJS) $(PICS) : ../common/fksmb_dt.h
+
+pics/fksmb_dt.o: ../common/fksmb_dt.d $(PICS)
+	$(COMPILE.d) -C -s ../common/fksmb_dt.d -o $@ $(PICS)
+	$(POST_PROCESS_O)
--- a/usr/src/lib/smbsrv/libfksmbsrv/common/fksmb_dt.c	Tue Mar 19 14:28:28 2019 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * This file and its contents are supplied under the terms of the
- * Common Development and Distribution License ("CDDL"), version 1.0.
- * You may only use this file in accordance with the terms of version
- * 1.0 of the CDDL.
- *
- * A full copy of the text of the CDDL should have accompanied this
- * source.  A copy of the CDDL is also available via the Internet at
- * http://www.illumos.org/license/CDDL.
- */
-
-/*
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
- */
-
-#include <smbsrv/smb_kproto.h>
-
-/*
- * See: DTRACE_PROBE... in smb_kproto.h
- */
-
-int fksmbd_dtrace_log = 0;
-
-void
-smb_dtrace1(const char *f, const char *n,
-	    const char *t1, long v1)
-{
-	if (fksmbd_dtrace_log) {
-		cmn_err(CE_CONT, "dtrace1:%s:%s,"
-		    " (%s) 0x%lx\n",
-		    f, n, t1, v1);
-	}
-}
-
-void
-smb_dtrace2(const char *f, const char *n,
-	    const char *t1, long v1,
-	    const char *t2, long v2)
-{
-	if (fksmbd_dtrace_log) {
-		cmn_err(CE_CONT, "dtrace2:%s:%s,"
-		    " (%s) 0x%lx, (%s) 0x%lx\n",
-		    f, n, t1, v1, t2, v2);
-	}
-}
-
-void
-smb_dtrace3(const char *f, const char *n,
-	    const char *t1, long v1,
-	    const char *t2, long v2,
-	    const char *t3, long v3)
-{
-	if (fksmbd_dtrace_log) {
-		cmn_err(CE_CONT, "dtrace3:%s:%s,"
-		    " (%s) 0x%lx, (%s) 0x%lx, (%s) 0x%lx\n",
-		    f, n, t1, v1, t2, v2, t3, v3);
-	}
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/lib/smbsrv/libfksmbsrv/common/fksmb_dt.d	Wed Nov 27 23:58:32 2013 -0500
@@ -0,0 +1,40 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source.  A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
+ */
+
+/*
+ * See: DTRACE_PROBE... in ./sys/sdt.h
+ */
+
+provider fksmb {
+	/* generic probes */
+	probe probe0(char *probename);
+	probe probe1(char *probename, unsigned long arg1);
+	probe probe2(char *probename, unsigned long arg1, unsigned long arg2);
+	probe probe3(char *probename, unsigned long arg1, unsigned long arg2,
+	    unsigned long arg3);
+	/* smb provider probes */
+	probe smb_start(char *probename, unsigned long arg1);
+	probe smb_done(char *probename, unsigned long arg1);
+	/* smb2 provider probes */
+	probe smb2_start(char *probename, unsigned long arg1);
+	probe smb2_done(char *probename, unsigned long arg1);
+};
+
+#pragma D attributes Evolving/Evolving/ISA provider fksmb provider
+#pragma D attributes Private/Private/Unknown provider fksmb module
+#pragma D attributes Private/Private/Unknown provider fksmb function
+#pragma D attributes Evolving/Evolving/ISA provider fksmb name
+#pragma D attributes Evolving/Evolving/ISA provider fksmb args
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/lib/smbsrv/libfksmbsrv/common/sys/sdt.h	Wed Nov 27 23:58:32 2013 -0500
@@ -0,0 +1,92 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
+ */
+
+#ifndef _SYS_SDT_H
+#define	_SYS_SDT_H
+
+#include <sys/stdint.h>
+#include <fksmb_dt.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+#error "libfksmbsrv/common/sys/sdt.h in kernel?"
+#endif
+
+/*
+ * DTrace SDT probes have different signatures in userland than they do in
+ * the kernel.  This file is strictly for libfksmbsrv, where we compile the
+ * smbsrv kernel code for user space.  In "fksmbd", we can use the probes
+ * defined for the (real, in-kernel) "smb" and "smb2" SDT provider by
+ * mapping them onto the USDT proviver defined in ../fksmb_dt.d
+ *
+ * An example of how to use these probes can be found in:
+ *	$SRC/cmd/smbsrv/fksmbd/Watch-fksmb.d
+ */
+
+/*
+ * Map "smb" provider probes.
+ */
+
+#define	DTRACE_SMB_START(name, type1, arg1) \
+	FKSMB_SMB_START(#name, (unsigned long)arg1)
+#define	DTRACE_SMB_DONE(name, type1, arg1) \
+	FKSMB_SMB_DONE(#name, (unsigned long)arg1)
+
+/*
+ * Map "smb2" provider probes.
+ */
+
+#define	DTRACE_SMB2_START(name, type1, arg1) \
+	FKSMB_SMB2_START(#name, (unsigned long)arg1)
+#define	DTRACE_SMB2_DONE(name, type1, arg1) \
+	FKSMB_SMB2_DONE(#name, (unsigned long)arg1)
+
+/*
+ * These are for the other (specialized) dtrace SDT probes sprinkled
+ * through the smbsrv code.  These are less often used.
+ */
+
+#define	DTRACE_PROBE(name, type1, arg1) \
+	FKSMB_PROBE0(#name)
+
+#define	DTRACE_PROBE1(name, type1, arg1) \
+	FKSMB_PROBE1(#name, (unsigned long)arg1)
+
+#define	DTRACE_PROBE2(name, type1, arg1, type2, arg2) \
+	FKSMB_PROBE2(#name, (unsigned long)arg1, (unsigned long)arg2)
+
+#define	DTRACE_PROBE3(name, type1, arg1, type2, arg2, type3, arg3) \
+	FKSMB_PROBE3(#name, (unsigned long)arg1, (unsigned long)arg2, \
+		(unsigned long)arg3)
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _SYS_SDT_H */
--- a/usr/src/pkg/manifests/developer-dtrace.mf	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/pkg/manifests/developer-dtrace.mf	Wed Nov 27 23:58:32 2013 -0500
@@ -200,6 +200,7 @@
 file path=usr/lib/dtrace/sched.d mode=0444
 file path=usr/lib/dtrace/scsi.d mode=0444
 file path=usr/lib/dtrace/signal.d mode=0444
+file path=usr/lib/dtrace/smb.d mode=0444
 file path=usr/lib/dtrace/srp.d mode=0444
 file path=usr/lib/dtrace/sysevent.d mode=0444
 file path=usr/lib/dtrace/tcp.d mode=0444
--- a/usr/src/pkg/manifests/service-file-system-smb.mf	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/pkg/manifests/service-file-system-smb.mf	Wed Nov 27 23:58:32 2013 -0500
@@ -78,6 +78,8 @@
 file path=usr/lib/mdb/proc/libmlsvc.so group=sys mode=0555
 file path=usr/lib/reparse/libreparse_smb.so.1
 file path=usr/lib/security/pam_smb_passwd.so.1
+file path=usr/lib/smbsrv/dtrace/smb-trace.d mode=0555
+file path=usr/lib/smbsrv/dtrace/smb2-trace.d mode=0555
 file path=usr/lib/smbsrv/dtrace/smbd-all.d mode=0555
 file path=usr/lib/smbsrv/dtrace/smbd-authsvc.d mode=0555
 file path=usr/lib/smbsrv/dtrace/smbd-doorsvc.d mode=0555
--- a/usr/src/tools/quick/make-smbsrv	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/tools/quick/make-smbsrv	Wed Nov 27 23:58:32 2013 -0500
@@ -11,7 +11,7 @@
 #
 
 #
-# Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
+# Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
 #
 
 # Use normal make (not dmake) by default.
--- a/usr/src/uts/common/dtrace/sdt_subr.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/dtrace/sdt_subr.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,6 +21,7 @@
 /*
  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <sys/sdt_impl.h>
@@ -97,6 +98,14 @@
 { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
 };
 
+static dtrace_pattr_t smb_attr = {
+{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA },
+{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA },
+};
+
 sdt_provider_t sdt_providers[] = {
 	{ "vtrace", "__vtrace_", &vtrace_attr },
 	{ "sysinfo", "__cpu_sysinfo_", &info_attr, DTRACE_PRIV_USER },
@@ -113,6 +122,8 @@
 	{ "iscsi", "__iscsi_", &iscsi_attr },
 	{ "nfsv3", "__nfsv3_", &stab_attr },
 	{ "nfsv4", "__nfsv4_", &stab_attr },
+	{ "smb", "__smb_", &smb_attr },
+	{ "smb2", "__smb2_", &smb_attr },
 	{ "xpv", "__xpv_", &xpv_attr },
 	{ "fc", "__fc_", &fc_attr },
 	{ "srp", "__srp_", &fc_attr },
@@ -875,6 +886,439 @@
 	    "nfsv4cbinfo_t *" },
 	{ "nfsv4", "cb-recall-done", 2, 2, "CB_RECALL4res *" },
 
+	/* Tables like this get really ugly when line-wrapped. */
+	/* BEGIN CSTYLED */
+	{ "smb", "op-Close-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Close-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Close-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Close-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-CloseAndTreeDisconnect-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CloseAndTreeDisconnect-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-CloseAndTreeDisconnect-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CloseAndTreeDisconnect-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Transaction-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Transaction-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Transaction-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Transaction-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-TransactionSecondary-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TransactionSecondary-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-TransactionSecondary-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TransactionSecondary-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Ioctl-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Ioctl-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Ioctl-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Ioctl-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Transaction2-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Transaction2-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Transaction2-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Transaction2-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Transaction2Secondary-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Transaction2Secondary-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Transaction2Secondary-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Transaction2Secondary-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-NtTransact-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtTransact-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-NtTransact-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtTransact-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-NtTransactSecondary-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtTransactSecondary-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-NtTransactSecondary-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtTransactSecondary-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Create-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Create-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Create-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-Create-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Create-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-CreateNew-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CreateNew-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-CreateNew-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-CreateNew-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CreateNew-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-CreateTemporary-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CreateTemporary-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-CreateTemporary-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-CreateTemporary-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CreateTemporary-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Delete-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Delete-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Delete-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-Delete-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Delete-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-CreateDirectory-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CreateDirectory-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-CreateDirectory-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-CreateDirectory-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CreateDirectory-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-DeleteDirectory-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-DeleteDirectory-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-DeleteDirectory-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-DeleteDirectory-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-DeleteDirectory-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-CheckDirectory-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CheckDirectory-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-CheckDirectory-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-CheckDirectory-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-CheckDirectory-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Invalid-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Invalid-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Invalid-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Invalid-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Echo-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Echo-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Echo-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Echo-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Search-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Search-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Search-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Search-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Find-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Find-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Find-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Find-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-FindClose-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-FindClose-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-FindClose-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-FindClose-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-FindUnique-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-FindUnique-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-FindUnique-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-FindUnique-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Flush-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Flush-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Flush-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Flush-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-QueryInformationDisk-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-QueryInformationDisk-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-QueryInformationDisk-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-QueryInformationDisk-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-LockByteRange-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LockByteRange-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-LockByteRange-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LockByteRange-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-LockingX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LockingX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-LockingX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LockingX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-LogoffX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LogoffX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-LogoffX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LogoffX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Negotiate-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Negotiate-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Negotiate-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Negotiate-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-NtCancel-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtCancel-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-NtCancel-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtCancel-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-NtCreateX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtCreateX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-NtCreateX-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-NtCreateX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtCreateX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-NtTransactCreate-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtTransactCreate-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-NtTransactCreate-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-NtTransactCreate-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtTransactCreate-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Open-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Open-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Open-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-Open-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Open-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-OpenX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-OpenX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-OpenX-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-OpenX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-OpenX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-OpenPrintFile-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-OpenPrintFile-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-OpenPrintFile-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb", "op-OpenPrintFile-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-OpenPrintFile-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-ClosePrintFile-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ClosePrintFile-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-ClosePrintFile-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ClosePrintFile-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-GetPrintQueue-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-GetPrintQueue-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-GetPrintQueue-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-GetPrintQueue-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-WritePrintFile-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WritePrintFile-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WritePrintFile-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WritePrintFile-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-ProcessExit-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ProcessExit-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-ProcessExit-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ProcessExit-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-QueryInformation-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-QueryInformation-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-QueryInformation-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-QueryInformation-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-QueryInformation-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-QueryInformation2-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-QueryInformation2-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-QueryInformation2-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-QueryInformation2-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Read-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Read-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Read-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-Read-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Read-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Read-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb", "op-LockAndRead-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LockAndRead-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-LockAndRead-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-LockAndRead-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-LockAndRead-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-LockAndRead-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb", "op-ReadRaw-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ReadRaw-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-ReadRaw-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ReadRaw-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-ReadX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ReadX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-ReadX-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-ReadX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-ReadX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-ReadX-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb", "op-Rename-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Rename-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Rename-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-Rename-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Rename-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-NtRename-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtRename-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-NtRename-start", 2, 0, "smb_request_t *", "smb_name_args_t *" },
+	{ "smb", "op-NtRename-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-NtRename-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Seek-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Seek-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Seek-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Seek-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-SessionSetupX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-SessionSetupX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-SessionSetupX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-SessionSetupX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-SetInformation-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-SetInformation-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-SetInformation-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-SetInformation-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-SetInformation2-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-SetInformation2-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-SetInformation2-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-SetInformation2-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-FindClose2-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-FindClose2-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-FindClose2-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-FindClose2-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-TreeConnect-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TreeConnect-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-TreeConnect-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TreeConnect-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-TreeConnectX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TreeConnectX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-TreeConnectX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TreeConnectX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-TreeDisconnect-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TreeDisconnect-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-TreeDisconnect-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-TreeDisconnect-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-UnlockByteRange-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-UnlockByteRange-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-UnlockByteRange-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-UnlockByteRange-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-Write-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Write-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Write-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-Write-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-Write-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-Write-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb", "op-WriteAndClose-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteAndClose-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteAndClose-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-WriteAndClose-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteAndClose-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteAndClose-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb", "op-WriteAndUnlock-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteAndUnlock-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteAndUnlock-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-WriteAndUnlock-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteAndUnlock-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteAndUnlock-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb", "op-WriteRaw-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteRaw-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteRaw-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteRaw-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+
+	{ "smb", "op-WriteX-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteX-start", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteX-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb", "op-WriteX-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb", "op-WriteX-done", 1, 0, "smb_request_t *", "smbopinfo_t *" },
+	{ "smb", "op-WriteX-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb2", "op-Cancel-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Cancel-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Cancel-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Cancel-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-ChangeNotify-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-ChangeNotify-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-ChangeNotify-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-ChangeNotify-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Close-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Close-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Close-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Close-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Create-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Create-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Create-start", 2, 0, "smb_request_t *", "smb_open_args_t *" },
+	{ "smb2", "op-Create-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Create-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Echo-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Echo-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Echo-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Echo-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Flush-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Flush-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Flush-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Flush-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Ioctl-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Ioctl-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Ioctl-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Ioctl-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Lock-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Lock-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Lock-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Lock-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Logoff-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Logoff-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Logoff-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Logoff-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Negotiate-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Negotiate-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Negotiate-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Negotiate-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-OplockBreak-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-OplockBreak-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-OplockBreak-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-OplockBreak-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-QueryDirectory-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-QueryDirectory-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-QueryDirectory-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-QueryDirectory-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-QueryInfo-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-QueryInfo-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-QueryInfo-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-QueryInfo-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Read-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Read-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Read-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb2", "op-Read-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Read-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Read-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	{ "smb2", "op-SessionSetup-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-SessionSetup-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-SessionSetup-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-SessionSetup-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-SetInfo-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-SetInfo-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-SetInfo-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-SetInfo-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-TreeConnect-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-TreeConnect-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-TreeConnect-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-TreeConnect-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-TreeDisconnect-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-TreeDisconnect-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-TreeDisconnect-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-TreeDisconnect-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+
+	{ "smb2", "op-Write-start", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Write-start", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Write-start", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+	{ "smb2", "op-Write-done", 0, 0, "smb_request_t *", "conninfo_t *" },
+	{ "smb2", "op-Write-done", 1, 0, "smb_request_t *", "smb2opinfo_t *" },
+	{ "smb2", "op-Write-done", 2, 0, "smb_request_t *", "smb_rw_args_t *" },
+
+	/* END CSTYLED */
+
 	{ "ip", "send", 0, 0, "mblk_t *", "pktinfo_t *" },
 	{ "ip", "send", 1, 1, "conn_t *", "csinfo_t *" },
 	{ "ip", "send", 2, 2, "void_ip_t *", "ipinfo_t *" },
--- a/usr/src/uts/common/fs/smbsrv/smb2_cancel.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_cancel.c	Wed Nov 27 23:58:32 2013 -0500
@@ -42,11 +42,15 @@
 	if (sr->smb2_next_command != 0)
 		return (EINVAL);
 
+	DTRACE_SMB2_START(op__Cancel, smb_request_t *, sr);
+
 	if (sr->smb2_hdr_flags & SMB2_FLAGS_ASYNC_COMMAND)
 		smb2_cancel_async(sr);
 	else
 		smb2_cancel_sync(sr);
 
+	DTRACE_SMB2_DONE(op__Cancel, smb_request_t *, sr);
+
 	return (0);
 }
 
@@ -65,12 +69,16 @@
 	if (sr->smb2_cmd_hdr != 0 || sr->smb2_next_command != 0)
 		return (SDRC_DROP_VC);
 
+	DTRACE_SMB2_START(op__Cancel, smb_request_t *, sr);
+
 	if (sr->smb2_hdr_flags & SMB2_FLAGS_ASYNC_COMMAND) {
 		smb2_cancel_async(sr);
 	} else {
 		smb2_cancel_sync(sr);
 	}
 
+	DTRACE_SMB2_DONE(op__Cancel, smb_request_t *, sr);
+
 	return (SDRC_NO_REPLY);
 }
 
--- a/usr/src/uts/common/fs/smbsrv/smb2_change_notify.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_change_notify.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -63,8 +63,10 @@
 		return (SDRC_ERROR);
 
 	status = smb2sr_lookup_fid(sr, &smb2fid);
+	DTRACE_SMB2_START(op__ChangeNotify, smb_request_t *, sr);
+
 	if (status != 0)
-		goto puterror;
+		goto errout; /* Bad FID */
 
 	CompletionFilter &= FILE_NOTIFY_VALID_MASK;
 	if (iFlags & SMB2_WATCH_TREE)
@@ -84,9 +86,13 @@
 		status = smb2sr_go_async(sr, smb2_change_notify_async);
 	}
 
+errout:
+	sr->smb2_status = status;
+	if (status != NT_STATUS_PENDING) {
+		DTRACE_SMB2_DONE(op__ChangeNotify, smb_request_t *, sr);
+	}
+
 	if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_SUCCESS) {
-		sr->smb2_status = status;
-
 		oBufLength = sr->raw_data.chain_offset;
 		(void) smb_mbc_encodef(
 		    &sr->reply, "wwlC",
@@ -95,7 +101,6 @@
 		    oBufLength,			/* l */
 		    &sr->raw_data);		/* C */
 	} else {
-	puterror:
 		smb2sr_put_error(sr, status);
 	}
 
@@ -144,9 +149,11 @@
 	 * Common part of notify, puts data in sr->raw_data
 	 */
 	status = smb_notify_act3(sr);
+
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__ChangeNotify, smb_request_t *, sr);
+
 	if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_SUCCESS) {
-		sr->smb2_status = status;
-
 		oBufLength = sr->raw_data.chain_offset;
 		(void) smb_mbc_encodef(
 		    &sr->reply, "wwlC",
--- a/usr/src/uts/common/fs/smbsrv/smb2_close.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_close.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -46,13 +46,17 @@
 	if (StructSize != 24)
 		return (SDRC_ERROR);
 
+	/*
+	 * Want FID lookup before the start probe.
+	 */
 	status = smb2sr_lookup_fid(sr, &smb2fid);
-	if (status) {
-		smb2sr_put_error(sr, status);
-		return (SDRC_SUCCESS);
-	}
 	of = sr->fid_ofile;
 
+	DTRACE_SMB2_START(op__Close, smb_request_t *, sr);
+
+	if (status)
+		goto errout; /* Bad FID */
+
 	bzero(&attr, sizeof (attr));
 	if (Flags & SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB) {
 		attr.sa_mask = SMB_AT_ALL;
@@ -69,6 +73,15 @@
 
 	smb_ofile_close(of, 0);
 
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Close, smb_request_t *, sr);
+
+	if (status) {
+		smb2sr_put_error(sr, status);
+		return (SDRC_SUCCESS);
+	}
+
 	/*
 	 * SMB2 Close reply
 	 */
--- a/usr/src/uts/common/fs/smbsrv/smb2_create.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_create.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -42,6 +42,7 @@
 } smb2_create_ctx_elem_t;
 
 typedef struct smb2_create_ctx {
+	mbuf_chain_t cc_in_mbc;
 	uint_t	cc_in_flags;	/* CCTX_... */
 	uint_t	cc_out_flags;	/* CCTX_... */
 	/* Elements we may see in the request. */
@@ -60,9 +61,9 @@
 } smb2_create_ctx_t;
 
 static uint32_t smb2_decode_create_ctx(
-	mbuf_chain_t *,	smb2_create_ctx_t *);
+	smb_request_t *, smb2_create_ctx_t *);
 static uint32_t smb2_encode_create_ctx(
-	mbuf_chain_t *, smb2_create_ctx_t *);
+	smb_request_t *, smb2_create_ctx_t *);
 static int smb2_encode_create_ctx_elem(
 	mbuf_chain_t *, smb2_create_ctx_elem_t *, uint32_t);
 static void smb2_free_create_ctx(smb2_create_ctx_t *);
@@ -73,7 +74,6 @@
 	smb_attr_t *attr;
 	smb2_create_ctx_elem_t *cce;
 	smb2_create_ctx_t cctx;
-	mbuf_chain_t cc_mbc;
 	smb_arg_open_t *op = &sr->arg.open;
 	smb_ofile_t *of = NULL;
 	uint16_t StructSize;
@@ -92,7 +92,7 @@
 	int rc = 0;
 
 	bzero(&cctx, sizeof (cctx));
-	bzero(&cc_mbc, sizeof (cc_mbc));
+	op->create_ctx = &cctx;	/* for debugging */
 
 	/*
 	 * Paranoia.  This will set sr->fid_ofile, so
@@ -105,13 +105,20 @@
 	}
 
 	/*
-	 * SMB2 Create request
+	 * Decode the SMB2 Create request
+	 *
+	 * Most decode errors return SDRC_ERROR, but
+	 * for some we give a more specific error.
+	 *
+	 * In the "decode section" (starts here) any
+	 * errors should either return SDRC_ERROR, or
+	 * if any cleanup is needed, goto errout.
 	 */
 	rc = smb_mbc_decodef(
 	    &sr->smb_data, "wbblqqlllllwwll",
 	    &StructSize,		/* w */
 	    &SecurityFlags,		/* b */
-	    &OplockLevel,		/* b */
+	    &op->op_oplock_level,	/* b */
 	    &ImpersonationLevel,	/* l */
 	    &SmbCreateFlags,		/* q */
 	    &Reserved4,			/* q */
@@ -133,15 +140,17 @@
 	 */
 	skip = (NameOffset + sr->smb2_cmd_hdr) -
 	    sr->smb_data.chain_offset;
-	if (skip < 0) {
-		status = NT_STATUS_OBJECT_PATH_INVALID;
-		goto errout;
-	}
+	if (skip < 0)
+		return (SDRC_ERROR);
 	if (skip > 0)
 		(void) smb_mbc_decodef(&sr->smb_data, "#.", skip);
 
 	/*
 	 * Get the path name
+	 *
+	 * Name too long is not technically a decode error,
+	 * but it's very rare, so we'll just skip the
+	 * dtrace probes for this error case.
 	 */
 	if (NameLength >= SMB_MAXPATHLEN) {
 		status = NT_STATUS_OBJECT_PATH_INVALID;
@@ -159,49 +168,6 @@
 	}
 	op->fqi.fq_dnode = sr->tid_tree->t_snode;
 
-	switch (OplockLevel) {
-	case SMB2_OPLOCK_LEVEL_NONE:
-		op->op_oplock_level = SMB_OPLOCK_NONE;
-		break;
-	case SMB2_OPLOCK_LEVEL_II:
-		op->op_oplock_level = SMB_OPLOCK_LEVEL_II;
-		break;
-	case SMB2_OPLOCK_LEVEL_EXCLUSIVE:
-		op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE;
-		break;
-	case SMB2_OPLOCK_LEVEL_BATCH:
-		op->op_oplock_level = SMB_OPLOCK_BATCH;
-		break;
-	case SMB2_OPLOCK_LEVEL_LEASE:
-		status = NT_STATUS_INVALID_PARAMETER;
-		goto errout;
-	}
-	op->op_oplock_levelII = B_TRUE;
-
-	/*
-	 * ImpersonationLevel (spec. says ignore)
-	 * SmbCreateFlags (spec. says ignore)
-	 */
-
-	if ((op->create_options & FILE_DELETE_ON_CLOSE) &&
-	    !(op->desired_access & DELETE)) {
-		status = NT_STATUS_INVALID_PARAMETER;
-		goto errout;
-	}
-	if (op->create_disposition > FILE_MAXIMUM_DISPOSITION) {
-		status = NT_STATUS_INVALID_PARAMETER;
-		goto errout;
-	}
-
-	if (op->dattr & FILE_FLAG_WRITE_THROUGH)
-		op->create_options |= FILE_WRITE_THROUGH;
-	if (op->dattr & FILE_FLAG_DELETE_ON_CLOSE)
-		op->create_options |= FILE_DELETE_ON_CLOSE;
-	if (op->dattr & FILE_FLAG_BACKUP_SEMANTICS)
-		op->create_options |= FILE_OPEN_FOR_BACKUP_INTENT;
-	if (op->create_options & FILE_OPEN_FOR_BACKUP_INTENT)
-		sr->user_cr = smb_user_getprivcred(sr->uid_user);
-
 	/*
 	 * If there is a "Create Context" payload, decode it.
 	 * This may carry things like a security descriptor,
@@ -218,68 +184,189 @@
 			goto errout;
 		}
 
-		rc = MBC_SHADOW_CHAIN(&cc_mbc, &sr->smb_data,
+		rc = MBC_SHADOW_CHAIN(&cctx.cc_in_mbc, &sr->smb_data,
 		    sr->smb2_cmd_hdr + CreateCtxOffset, CreateCtxLength);
 		if (rc) {
 			status = NT_STATUS_INVALID_PARAMETER;
 			goto errout;
 		}
-		status = smb2_decode_create_ctx(&cc_mbc, &cctx);
+		status = smb2_decode_create_ctx(sr, &cctx);
 		if (status)
 			goto errout;
-
-		if (cctx.cc_in_flags & CCTX_EA_BUFFER) {
-			status = NT_STATUS_EAS_NOT_SUPPORTED;
-			goto errout;
-		}
+	}
 
-		if (cctx.cc_in_flags & CCTX_SD_BUFFER) {
-			smb_sd_t sd;
-			cce = &cctx.cc_in_sec_desc;
-			status = smb_decode_sd(
-			    &cce->cce_mbc, &sd);
-			if (status)
-				goto errout;
-			op->sd = kmem_alloc(sizeof (sd), KM_SLEEP);
-			*op->sd = sd;
-		}
+	/*
+	 * Everything is decoded into some internal form, so
+	 * in this probe one can look at sr->arg.open etc.
+	 *
+	 * This marks the end of the "decode" section and the
+	 * beginning of the "body" section.  Any errors in
+	 * this section should use: goto cmd_done (which is
+	 * just before the dtrace "done" probe).
+	 */
+	DTRACE_SMB2_START(op__Create, smb_request_t *, sr); /* arg.open */
+
+	/*
+	 * Process the incoming create contexts (already decoded),
+	 * that need action before the open, starting with the
+	 * Durable Handle ones, which may override others.
+	 */
 
-		if (cctx.cc_in_flags & CCTX_ALLOCATION_SIZE) {
-			cce = &cctx.cc_in_alloc_size;
-			rc = smb_mbc_decodef(&cce->cce_mbc, "q", &op->dsize);
-			if (rc) {
-				status = NT_STATUS_INVALID_PARAMETER;
-				goto errout;
-			}
-		}
+	/*
+	 * Validate the requested oplock level.
+	 * Convert the SMB2 oplock level into SMB1 form.
+	 */
+	switch (op->op_oplock_level) {
+	case SMB2_OPLOCK_LEVEL_NONE:
+		op->op_oplock_level = SMB_OPLOCK_NONE;
+		break;
+	case SMB2_OPLOCK_LEVEL_II:
+		op->op_oplock_level = SMB_OPLOCK_LEVEL_II;
+		break;
+	case SMB2_OPLOCK_LEVEL_EXCLUSIVE:
+		op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE;
+		break;
+	case SMB2_OPLOCK_LEVEL_BATCH:
+		op->op_oplock_level = SMB_OPLOCK_BATCH;
+		break;
+	case SMB2_OPLOCK_LEVEL_LEASE:	/* not yet */
+	default:
+		/* Unknown SMB2 oplock level. */
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto cmd_done;
+	}
+	op->op_oplock_levelII = B_TRUE;
 
-		/*
-		 * Support for opening "Previous Versions".
-		 * [MS-SMB2] 2.2.13.2.7  Data is an NT time.
-		 */
-		if (cctx.cc_in_flags & CCTX_TIMEWARP_TOKEN) {
-			uint64_t timewarp;
-			cce = &cctx.cc_in_time_warp;
-			status = smb_mbc_decodef(&cce->cce_mbc,
-			    "q", &timewarp);
-			if (status)
-				goto errout;
-			smb_time_nt_to_unix(timewarp, &op->timewarp);
-			op->create_timewarp = B_TRUE;
-		}
+	/*
+	 * Only disk trees get oplocks or leases.
+	 */
+	if ((sr->tid_tree->t_res_type & STYPE_MASK) != STYPE_DISKTREE) {
+		op->op_oplock_level = SMB2_OPLOCK_LEVEL_NONE;
+		cctx.cc_in_flags &= ~CCTX_REQUEST_LEASE;
+	}
+
+	if (cctx.cc_in_flags & CCTX_EA_BUFFER) {
+		status = NT_STATUS_EAS_NOT_SUPPORTED;
+		goto cmd_done;
+	}
+
+	/*
+	 * ImpersonationLevel (spec. says validate + ignore)
+	 * SmbCreateFlags (spec. says ignore)
+	 */
+
+	if ((op->create_options & FILE_DELETE_ON_CLOSE) &&
+	    !(op->desired_access & DELETE)) {
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto cmd_done;
+	}
+
+	if (op->dattr & FILE_FLAG_WRITE_THROUGH)
+		op->create_options |= FILE_WRITE_THROUGH;
+	if (op->dattr & FILE_FLAG_DELETE_ON_CLOSE)
+		op->create_options |= FILE_DELETE_ON_CLOSE;
+	if (op->dattr & FILE_FLAG_BACKUP_SEMANTICS)
+		op->create_options |= FILE_OPEN_FOR_BACKUP_INTENT;
+	if (op->create_options & FILE_OPEN_FOR_BACKUP_INTENT)
+		sr->user_cr = smb_user_getprivcred(sr->uid_user);
+	if (op->create_disposition > FILE_MAXIMUM_DISPOSITION) {
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto cmd_done;
 	}
 
 	/*
 	 * The real open call.   Note: this gets attributes into
 	 * op->fqi.fq_fattr (SMB_AT_ALL).  We need those below.
+	 * When of != NULL, goto errout closes it.
 	 */
 	status = smb_common_open(sr);
 	if (status != NT_STATUS_SUCCESS)
-		goto errout;
-	attr = &op->fqi.fq_fattr;
+		goto cmd_done;
+	of = sr->fid_ofile;
+
+	/*
+	 * NB: after the above smb_common_open() success,
+	 * we have a handle allocated (sr->fid_ofile).
+	 * If we don't return success, we must close it.
+	 *
+	 * Using sr->smb_fid as the file handle for now,
+	 * though it could later be something larger,
+	 * (16 bytes) similar to an NFSv4 open handle.
+	 */
+	smb2fid.persistent = 0;
+	smb2fid.temporal = sr->smb_fid;
+
+	switch (sr->tid_tree->t_res_type & STYPE_MASK) {
+	case STYPE_DISKTREE:
+	case STYPE_PRINTQ:
+		if (op->create_options & FILE_DELETE_ON_CLOSE)
+			smb_ofile_set_delete_on_close(of);
+		break;
+	}
 
 	/*
-	 * Convert the negotiate Oplock level back into
+	 * Process any outgoing create contexts that need work
+	 * after the open succeeds.  Encode happens later.
+	 */
+	if (cctx.cc_in_flags & CCTX_QUERY_MAX_ACCESS) {
+		op->maximum_access = 0;
+		if (of->f_node != NULL) {
+			smb_fsop_eaccess(sr, of->f_cr, of->f_node,
+			    &op->maximum_access);
+		}
+		op->maximum_access |= of->f_granted_access;
+		cctx.cc_out_flags |= CCTX_QUERY_MAX_ACCESS;
+	}
+
+	if ((cctx.cc_in_flags & CCTX_QUERY_ON_DISK_ID) != 0 &&
+	    of->f_node != NULL) {
+		op->op_fsid = SMB_NODE_FSID(of->f_node);
+		cctx.cc_out_flags |= CCTX_QUERY_ON_DISK_ID;
+	}
+
+	if ((cctx.cc_in_flags & CCTX_AAPL_EXT) != 0) {
+		cce = &cctx.cc_out_aapl;
+		/*
+		 * smb2_aapl_crctx has a variable response depending on
+		 * what the incoming context looks like, so it does all
+		 * the work of building cc_out_aapl, including setting
+		 * cce_len, cce_mbc.max_bytes, and smb_mbc_encode.
+		 * If we see errors getting this, simply omit it from
+		 * the collection of returned create contexts.
+		 */
+		status = smb2_aapl_crctx(sr,
+		    &cctx.cc_in_aapl.cce_mbc, &cce->cce_mbc);
+		if (status == 0) {
+			cce->cce_len = cce->cce_mbc.chain_offset;
+			cctx.cc_out_flags |= CCTX_AAPL_EXT;
+		}
+		status = 0;
+	}
+
+	/*
+	 * This marks the end of the "body" section and the
+	 * beginning of the "encode" section.  Any errors
+	 * encoding the response should use: goto errout
+	 */
+cmd_done:
+	/* Want status visible in the done probe. */
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Create, smb_request_t *, sr);
+	if (status != NT_STATUS_SUCCESS)
+		goto errout;
+
+	/*
+	 * Encode all the create contexts to return.
+	 */
+	if (cctx.cc_out_flags) {
+		sr->raw_data.max_bytes = smb2_max_trans;
+		status = smb2_encode_create_ctx(sr, &cctx);
+		if (status)
+			goto errout;
+	}
+
+	/*
+	 * Convert the negotiated Oplock level back into
 	 * SMB2 encoding form.
 	 */
 	switch (op->op_oplock_level) {
@@ -299,99 +386,9 @@
 	}
 
 	/*
-	 * NB: after the above smb_common_open() success,
-	 * we have a handle allocated (sr->fid_ofile).
-	 * If we don't return success, we must close it.
-	 *
-	 * Using sr->smb_fid as the file handle for now,
-	 * though it could later be something larger,
-	 * (16 bytes) similar to an NFSv4 open handle.
-	 */
-	of = sr->fid_ofile;
-	smb2fid.persistent = 0;
-	smb2fid.temporal = sr->smb_fid;
-
-	switch (sr->tid_tree->t_res_type & STYPE_MASK) {
-	case STYPE_DISKTREE:
-	case STYPE_PRINTQ:
-		if (op->create_options & FILE_DELETE_ON_CLOSE)
-			smb_ofile_set_delete_on_close(of);
-		break;
-	}
-
-	/*
-	 * Build the Create Context to return; first the
-	 * per-element parts, then the aggregated buffer.
-	 *
-	 * No response for these:
-	 *	CCTX_EA_BUFFER
-	 *	CCTX_SD_BUFFER
-	 *	CCTX_ALLOCATION_SIZE
-	 *	CCTX_TIMEWARP_TOKEN
-	 *
-	 * We don't handle these yet.
-	 *	CCTX_DH_REQUEST
-	 *	CCTX_DH_RECONNECT
-	 *	CCTX_REQUEST_LEASE
+	 * Encode the SMB2 Create reply
 	 */
-	if (cctx.cc_in_flags & CCTX_QUERY_MAX_ACCESS) {
-		cce = &cctx.cc_out_max_access;
-		uint32_t MaxAccess = 0;
-		if (of->f_node != NULL) {
-			smb_fsop_eaccess(sr, of->f_cr, of->f_node, &MaxAccess);
-		}
-		MaxAccess |= of->f_granted_access;
-		cce->cce_len = 8;
-		cce->cce_mbc.max_bytes = 8;
-		(void) smb_mbc_encodef(&cce->cce_mbc,
-		    "ll", 0, MaxAccess);
-		cctx.cc_out_flags |= CCTX_QUERY_MAX_ACCESS;
-	}
-	if ((cctx.cc_in_flags & CCTX_QUERY_ON_DISK_ID) != 0 &&
-	    of->f_node != NULL) {
-		cce = &cctx.cc_out_file_id;
-		fsid_t fsid;
-
-		fsid = SMB_NODE_FSID(of->f_node);
-
-		cce->cce_len = 32;
-		cce->cce_mbc.max_bytes = 32;
-		(void) smb_mbc_encodef(
-		    &cce->cce_mbc, "qll.15.",
-		    op->fileid,		/* q */
-		    fsid.val[0],	/* l */
-		    fsid.val[1]);	/* l */
-		/* reserved (16 bytes)  .15. */
-		cctx.cc_out_flags |= CCTX_QUERY_ON_DISK_ID;
-	}
-	if ((cctx.cc_in_flags & CCTX_AAPL_EXT) != 0) {
-		cce = &cctx.cc_out_aapl;
-		/*
-		 * smb2_aapl_crctx has a variable response depending on
-		 * what the incoming context looks like, so it does all
-		 * the work of building cc_out_aapl, including setting
-		 * cce_len, cce_mbc.max_bytes, and smb_mbc_encode.
-		 * If we see errors getting this, simply omit it from
-		 * the collection of returned create contexts.
-		 */
-		status = smb2_aapl_crctx(sr,
-		    &cctx.cc_in_aapl.cce_mbc, &cce->cce_mbc);
-		if (status == 0) {
-			cce->cce_len = cce->cce_mbc.chain_offset;
-			cctx.cc_out_flags |= CCTX_AAPL_EXT;
-		}
-		status = 0;
-	}
-	if (cctx.cc_out_flags) {
-		sr->raw_data.max_bytes = smb2_max_trans;
-		status = smb2_encode_create_ctx(&sr->raw_data, &cctx);
-		if (status)
-			goto errout;
-	}
-
-	/*
-	 * SMB2 Create reply
-	 */
+	attr = &op->fqi.fq_fattr;
 	rc = smb_mbc_encodef(
 	    &sr->reply,
 	    "wb.lTTTTqqllqqll",
@@ -436,25 +433,33 @@
 	} else {
 		(void) smb_mbc_encodef(&sr->reply, ".");
 	}
-	return (SDRC_SUCCESS);
 
-errout:
-	if (of != NULL)
-		smb_ofile_close(of, 0);
+	if (status != 0) {
+	errout:
+		if (of != NULL)
+			smb_ofile_close(of, 0);
+		smb2sr_put_error(sr, status);
+	}
+	if (op->sd != NULL) {
+		smb_sd_term(op->sd);
+		kmem_free(op->sd, sizeof (*op->sd));
+	}
 	if (cctx.cc_out_flags)
 		smb2_free_create_ctx(&cctx);
-	smb2sr_put_error(sr, status);
+
 	return (SDRC_SUCCESS);
 }
 
 /*
  * Decode an SMB2 Create Context buffer into our internal form.
- * No policy decisions about what's supported here, just decode.
+ * Avoid policy decisions about what's supported here, just decode.
  */
 static uint32_t
-smb2_decode_create_ctx(mbuf_chain_t *in_mbc, smb2_create_ctx_t *cc)
+smb2_decode_create_ctx(smb_request_t *sr, smb2_create_ctx_t *cc)
 {
+	smb_arg_open_t *op = &sr->arg.open;
 	smb2_create_ctx_elem_t *cce;
+	mbuf_chain_t *in_mbc = &cc->cc_in_mbc;
 	mbuf_chain_t name_mbc;
 	union {
 		uint32_t i;
@@ -469,6 +474,11 @@
 	int top_offset;
 	int rc;
 
+	/*
+	 * Any break from the loop below before we've decoded
+	 * the entire create context means it was malformatted,
+	 * so we should return INVALID_PARAMETER.
+	 */
 	status = NT_STATUS_INVALID_PARAMETER;
 	for (;;) {
 		cce = NULL;
@@ -559,18 +569,53 @@
 			break;
 		}
 
-		if (cce != NULL && data_len != 0) {
-			if ((data_off & 7) != 0)
-				break;
-			if ((top_offset + data_off) < in_mbc->chain_offset)
-				break;
-			rc = MBC_SHADOW_CHAIN(&cce->cce_mbc, in_mbc,
-			    top_offset + data_off, data_len);
-			if (rc)
-				break;
-			cce->cce_len = data_len;
+		if (cce == NULL || data_len == 0)
+			goto next_cc;
+
+		if ((data_off & 7) != 0)
+			break;
+		if ((top_offset + data_off) < in_mbc->chain_offset)
+			break;
+		rc = MBC_SHADOW_CHAIN(&cce->cce_mbc, in_mbc,
+		    top_offset + data_off, data_len);
+		if (rc)
+			break;
+		cce->cce_len = data_len;
+
+		/*
+		 * Additonal decoding for some create contexts.
+		 */
+		switch (cc_name.i) {
+			uint64_t nttime;
+
+		case SMB2_CREATE_SD_BUFFER:		/* ("SecD") */
+			op->sd = kmem_alloc(sizeof (smb_sd_t), KM_SLEEP);
+			if (smb_decode_sd(&cce->cce_mbc, op->sd) != 0)
+				goto errout;
+			break;
+
+		case SMB2_CREATE_ALLOCATION_SIZE:	/* ("AISi") */
+			rc = smb_mbc_decodef(&cce->cce_mbc, "q", &op->dsize);
+			if (rc != 0)
+				goto errout;
+			break;
+
+		case SMB2_CREATE_TIMEWARP_TOKEN:	/* ("TWrp") */
+			/*
+			 * Support for opening "Previous Versions".
+			 * [MS-SMB2] 2.2.13.2.7  Data is an NT time.
+			 */
+			rc = smb_mbc_decodef(&cce->cce_mbc,
+			    "q", &nttime);
+			if (rc != 0)
+				goto errout;
+			smb_time_nt_to_unix(nttime, &op->timewarp);
+			op->create_timewarp = B_TRUE;
+			break;
+
 		}
 
+	next_cc:
 		if (next_off == 0) {
 			/* Normal loop termination */
 			status = 0;
@@ -586,22 +631,41 @@
 		in_mbc->chain_offset = top_offset + next_off;
 	}
 
+errout:
 	return (status);
 }
 
 /*
  * Encode an SMB2 Create Context buffer from our internal form.
+ *
+ * Build the Create Context to return; first the
+ * per-element parts, then the aggregated buffer.
+ *
+ * No response for these:
+ *	CCTX_EA_BUFFER
+ *	CCTX_SD_BUFFER
+ *	CCTX_ALLOCATION_SIZE
+ *	CCTX_TIMEWARP_TOKEN
+ *
+ * Remember to add code sections to smb2_free_create_ctx()
+ * for each section here that encodes a context element.
  */
-/* ARGSUSED */
 static uint32_t
-smb2_encode_create_ctx(mbuf_chain_t *mbc, smb2_create_ctx_t *cc)
+smb2_encode_create_ctx(smb_request_t *sr, smb2_create_ctx_t *cc)
 {
+	smb_arg_open_t *op = &sr->arg.open;
 	smb2_create_ctx_elem_t *cce;
+	mbuf_chain_t *mbc = &sr->raw_data;
 	int last_top = -1;
 	int rc;
 
 	if (cc->cc_out_flags & CCTX_QUERY_MAX_ACCESS) {
 		cce = &cc->cc_out_max_access;
+
+		cce->cce_mbc.max_bytes = cce->cce_len = 8;
+		(void) smb_mbc_encodef(&cce->cce_mbc,
+		    "ll", 0, op->maximum_access);
+
 		last_top = mbc->chain_offset;
 		rc = smb2_encode_create_ctx_elem(mbc, cce,
 		    SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQ);
@@ -613,6 +677,15 @@
 
 	if (cc->cc_out_flags & CCTX_QUERY_ON_DISK_ID) {
 		cce = &cc->cc_out_file_id;
+
+		cce->cce_mbc.max_bytes = cce->cce_len = 32;
+		(void) smb_mbc_encodef(
+		    &cce->cce_mbc, "qll.15.",
+		    op->fileid,			/* q */
+		    op->op_fsid.val[0],		/* l */
+		    op->op_fsid.val[1]);	/* l */
+		    /* reserved (16 bytes)	.15. */
+
 		last_top = mbc->chain_offset;
 		rc = smb2_encode_create_ctx_elem(mbc, cce,
 		    SMB2_CREATE_QUERY_ON_DISK_ID);
@@ -624,6 +697,8 @@
 
 	if (cc->cc_out_flags & CCTX_AAPL_EXT) {
 		cce = &cc->cc_out_aapl;
+		/* cc_out_aapl already encoded */
+
 		last_top = mbc->chain_offset;
 		rc = smb2_encode_create_ctx_elem(mbc, cce,
 		    SMB2_CREATE_CTX_AAPL);
@@ -641,7 +716,7 @@
 
 static int
 smb2_encode_create_ctx_elem(mbuf_chain_t *out_mbc,
-	smb2_create_ctx_elem_t *cce, uint32_t id)
+    smb2_create_ctx_elem_t *cce, uint32_t id)
 {
 	union {
 		uint32_t i;
@@ -658,7 +733,7 @@
 	 * layout the data part as [name, payload] and
 	 * name is a fixed length, so this easy.
 	 * The final layout looks like this:
-	 * 	a: this header (16 bytes)
+	 *	a: this header (16 bytes)
 	 *	b: the name (4 bytes, 4 pad)
 	 *	c: the payload (variable)
 	 *
@@ -671,7 +746,7 @@
 	    4,		/* NameLength	w */
 	    0,		/* Reserved	w */
 	    24,		/* DataOffset	w */
-	    cce->cce_len);	/*	l */
+	    cce->cce_len); /* DataLen	l */
 	if (rc)
 		return (rc);
 
--- a/usr/src/uts/common/fs/smbsrv/smb2_dispatch.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_dispatch.c	Wed Nov 27 23:58:32 2013 -0500
@@ -755,10 +755,17 @@
 		cmn_err(CE_NOTE, "handler for %u returned 0x%x",
 		    sr->smb2_cmd_code, rc);
 #endif
-		/* FALLTHROUGH */
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
+		break;
 	case SDRC_ERROR:
+		/*
+		 * Many command handlers return SDRC_ERROR for any
+		 * problems decoding the request, and don't bother
+		 * setting smb2_status.  For those cases, the best
+		 * status return would be "invalid parameter".
+		 */
 		if (sr->smb2_status == 0)
-			sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
+			sr->smb2_status = NT_STATUS_INVALID_PARAMETER;
 		break;
 	case SDRC_DROP_VC:
 		disconnect = B_TRUE;
--- a/usr/src/uts/common/fs/smbsrv/smb2_echo.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_echo.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -38,6 +38,9 @@
 	if (StructSize != 4)
 		return (SDRC_ERROR);
 
+	DTRACE_SMB2_START(op__Echo, smb_request_t *, sr);
+	DTRACE_SMB2_DONE(op__Echo, smb_request_t *, sr);
+
 	/*
 	 * SMB2 Echo reply
 	 */
--- a/usr/src/uts/common/fs/smbsrv/smb2_flush.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_flush.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  * Copyright 2016 Syneto S.R.L. All rights reserved.
  */
 
@@ -32,7 +32,7 @@
 	int rc = 0;
 
 	/*
-	 * SMB2 Flush request
+	 * Decode SMB2 Flush request
 	 */
 	rc = smb_mbc_decodef(
 	    &sr->smb_data, "wwlqq",
@@ -41,19 +41,26 @@
 	    &reserved2,			/* l */
 	    &smb2fid.persistent,	/* q */
 	    &smb2fid.temporal);		/* q */
-	if (rc)
-		return (SDRC_ERROR);
-	if (StructSize != 24)
+	if (rc || StructSize != 24)
 		return (SDRC_ERROR);
 
+	/*
+	 * Want FID lookup before the start probe.
+	 */
 	status = smb2sr_lookup_fid(sr, &smb2fid);
+	DTRACE_SMB2_START(op__Flush, smb_request_t *, sr);
+
+	if (status == 0)
+		smb_ofile_flush(sr, sr->fid_ofile);
+
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Flush, smb_request_t *, sr);
+
 	if (status) {
 		smb2sr_put_error(sr, status);
 		return (SDRC_SUCCESS);
 	}
 
-	smb_ofile_flush(sr, sr->fid_ofile);
-
 	/*
 	 * SMB2 Flush reply
 	 */
--- a/usr/src/uts/common/fs/smbsrv/smb2_ioctl.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_ioctl.c	Wed Nov 27 23:58:32 2013 -0500
@@ -56,14 +56,15 @@
 	uint32_t MaxInputResp;
 	uint32_t OutputOffset;
 	uint32_t Flags;
-	uint32_t status;
+	uint32_t status = 0;
 	uint16_t StructSize;
 	int rc = 0;
 
+	/* Todo: put fsctl in sr->arg.ioctl (visible in dtrace probes) */
 	bzero(&in_mbc, sizeof (in_mbc));
 
 	/*
-	 * SMB2 Ioctl request
+	 * Decode SMB2 Ioctl request
 	 */
 	rc = smb_mbc_decodef(
 	    &sr->smb_data, "w..lqqlllllll4.",
@@ -83,10 +84,69 @@
 	if (rc || StructSize != 57)
 		return (SDRC_ERROR);
 
+	/*
+	 * If there's an input buffer, setup a shadow.
+	 */
+	if (fsctl.InputCount) {
+		if (InputOffset < (SMB2_HDR_SIZE + 56))
+			return (SDRC_ERROR);
+		if (fsctl.InputCount > smb2_max_trans)
+			return (SDRC_ERROR);
+		rc = MBC_SHADOW_CHAIN(&in_mbc, &sr->smb_data,
+		    sr->smb2_cmd_hdr + InputOffset, fsctl.InputCount);
+		if (rc) {
+			return (SDRC_ERROR);
+		}
+	}
+	fsctl.in_mbc = &in_mbc;
+
+	/*
+	 * If output is possible, setup the output mbuf_chain
+	 */
+	if (fsctl.MaxOutputResp > smb2_max_trans)
+		fsctl.MaxOutputResp = smb2_max_trans;
+	sr->raw_data.max_bytes = fsctl.MaxOutputResp;
+	fsctl.out_mbc = &sr->raw_data;
+
+	/*
+	 * [MS-SMB2] 3.3.5.15
+	 *
+	 * If the Flags field of the request is not SMB2_0_IOCTL_IS_FSCTL
+	 * the server MUST fail the request with STATUS_NOT_SUPPORTED.
+	 *
+	 * If the CtlCode is any of (... see switch below...) and the
+	 * value of FileId in the SMB2 Header of the request is not
+	 * 0xFFFFFFFFFFFFFFFF, then the server MUST fail the request
+	 * with STATUS_INVALID_PARAMETER.  (Otherwise lookup the FID.)
+	 */
 	if (Flags != SMB2_0_IOCTL_IS_FSCTL) {
 		status = NT_STATUS_NOT_SUPPORTED;
+	} else switch (fsctl.CtlCode) {
+	case FSCTL_DFS_GET_REFERRALS:
+	case FSCTL_DFS_GET_REFERRALS_EX:
+	case FSCTL_QUERY_NETWORK_INTERFACE_INFO:
+	case FSCTL_VALIDATE_NEGOTIATE_INFO:
+	case FSCTL_PIPE_WAIT:
+		if (smb2fid.temporal != ~0LL ||
+		    smb2fid.persistent != ~0LL) {
+			status = NT_STATUS_INVALID_PARAMETER;
+		}
+		break;
+	default:
+		status = smb2sr_lookup_fid(sr, &smb2fid);
+		if (status != 0) {
+			status = NT_STATUS_FILE_CLOSED;
+		}
+		break;
+	}
+
+	/*
+	 * Keep FID lookup before the start probe.
+	 */
+	DTRACE_SMB2_START(op__Ioctl, smb_request_t *, sr);
+
+	if (status)
 		goto errout;
-	}
 
 	for (te = smb2_ioc_tbl; te->te_code; te++) {
 		if (te->te_code == fsctl.CtlCode)
@@ -111,22 +171,6 @@
 	}
 
 	/*
-	 * Note: some ioctl commands don't need a FID.
-	 */
-	if (te->te_flags & ITF_NO_FID) {
-		if (smb2fid.temporal != ~0LL) {
-			status = NT_STATUS_INVALID_PARAMETER;
-			goto errout;
-		}
-	} else {
-		status = smb2sr_lookup_fid(sr, &smb2fid);
-		if (status) {
-			status = NT_STATUS_FILE_CLOSED;
-			goto errout;
-		}
-	}
-
-	/*
 	 * Note: some ioctls require a "disk" fid.
 	 */
 	if (te->te_flags & ITF_DISK_FID) {
@@ -138,38 +182,20 @@
 	}
 
 	/*
-	 * If there's an input buffer, setup a shadow.
-	 */
-	if (fsctl.InputCount) {
-		if (InputOffset < (SMB2_HDR_SIZE + 56)) {
-			status = NT_STATUS_INVALID_PARAMETER;
-			goto errout;
-		}
-		rc = MBC_SHADOW_CHAIN(&in_mbc, &sr->smb_data,
-		    sr->smb2_cmd_hdr + InputOffset, fsctl.InputCount);
-		if (rc) {
-			status = NT_STATUS_INVALID_PARAMETER;
-			goto errout;
-		}
-	}
-	fsctl.in_mbc = &in_mbc;
-
-	/*
-	 * If output is possible, setup the output mbuf_chain
-	 */
-	if (fsctl.MaxOutputResp > smb2_max_trans)
-		fsctl.MaxOutputResp = smb2_max_trans;
-	sr->raw_data.max_bytes = fsctl.MaxOutputResp;
-	fsctl.out_mbc = &sr->raw_data;
-
-	/*
 	 * Dispatch to the handler for CtlCode
 	 */
 	status = (te->te_func)(sr, &fsctl);
+
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Ioctl, smb_request_t *, sr);
+
 	if (status != 0) {
-		sr->smb2_status = status;
-		if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_ERROR)
-			goto errout;
+		if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_ERROR) {
+			/* no error data */
+			smb2sr_put_error(sr, status);
+			return (SDRC_SUCCESS);
+		}
 		/* Warnings like NT_STATUS_BUFFER_OVERFLOW are OK. */
 	}
 
@@ -180,7 +206,7 @@
 	OutputOffset = (fsctl.OutputCount) ? InputOffset : 0;
 
 	/*
-	 * SMB2 Ioctl reply
+	 * Encode SMB2 Ioctl reply
 	 */
 	StructSize = 49;
 	rc = smb_mbc_encodef(
@@ -198,10 +224,9 @@
 	    /* reserved2		  4. */
 	    fsctl.OutputCount,		/* # */
 	    &sr->raw_data);		/* C */
-	return ((rc) ? SDRC_ERROR : SDRC_SUCCESS);
+	if (rc)
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
 
-errout:
-	smb2sr_put_error(sr, status);
 	return (SDRC_SUCCESS);
 }
 
--- a/usr/src/uts/common/fs/smbsrv/smb2_lock.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_lock.c	Wed Nov 27 23:58:32 2013 -0500
@@ -49,7 +49,7 @@
 	int rc;
 
 	/*
-	 * SMB2 Lock request
+	 * Decode SMB2 Lock request
 	 */
 	rc = smb_mbc_decodef(
 	    &sr->smb_data, "wwlqq",
@@ -61,9 +61,14 @@
 	if (rc || StructSize != 48)
 		return (SDRC_ERROR);
 
+	/*
+	 * Want FID lookup before the start probe.
+	 */
 	status = smb2sr_lookup_fid(sr, &smb2fid);
+	DTRACE_SMB2_START(op__Lock, smb_request_t *, sr);
+
 	if (status)
-		goto errout;
+		goto errout; /* Bad FID */
 	if (sr->fid_ofile->f_node == NULL || LockCount == 0) {
 		status = NT_STATUS_INVALID_PARAMETER;
 		goto errout;
@@ -107,21 +112,26 @@
 	} else {
 		status = smb2_locks(sr);
 	}
-	if (status)
-		goto errout;
+
+errout:
+	sr->smb2_status = status;
+	if (status != NT_STATUS_PENDING) {
+		DTRACE_SMB2_DONE(op__Lock, smb_request_t *, sr);
+	}
+
+	if (status) {
+		smb2sr_put_error(sr, status);
+		return (SDRC_SUCCESS);
+	}
 
 	/*
-	 * SMB2 Lock reply (sync)
+	 * Encode SMB2 Lock reply (sync)
 	 */
 	(void) smb_mbc_encodef(
 	    &sr->reply, "w..",
 	    4); /* StructSize	w */
 	    /* reserved		.. */
 	return (SDRC_SUCCESS);
-
-errout:
-	smb2sr_put_error(sr, status);
-	return (SDRC_SUCCESS);
 }
 
 /*
@@ -264,8 +274,15 @@
 
 	status = smb_lock_range(sr, lk->Offset, lk->Length, pid,
 	    ltype, timeout);
-	if (status != 0)
-		goto errout;
+
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Lock, smb_request_t *, sr);
+
+	if (status != 0) {
+		smb2sr_put_error(sr, status);
+		return (SDRC_SUCCESS);
+	}
 
 	/*
 	 * SMB2 Lock reply (async)
@@ -275,8 +292,4 @@
 	    4); /* StructSize	w */
 	    /* reserved		.. */
 	return (SDRC_SUCCESS);
-
-errout:
-	smb2sr_put_error(sr, status);
-	return (SDRC_SUCCESS);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb2_logoff.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_logoff.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -40,8 +40,13 @@
 
 	if (sr->uid_user == NULL)
 		return (SDRC_ERROR);
+
+	DTRACE_SMB2_START(op__Logoff, smb_request_t *, sr);
+
 	smb_user_logoff(sr->uid_user);
 
+	DTRACE_SMB2_DONE(op__Logoff, smb_request_t *, sr);
+
 	/*
 	 * SMB2 Logoff reply
 	 */
--- a/usr/src/uts/common/fs/smbsrv/smb2_negotiate.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_negotiate.c	Wed Nov 27 23:58:32 2013 -0500
@@ -159,9 +159,14 @@
 	sr->smb2_cmd_code = SMB2_NEGOTIATE;
 
 	rc = smb2_negotiate_common(sr, smb2_version);
+	smb2_send_reply(sr);
 	if (rc != 0)
 		return (SDRC_DROP_VC);
 
+	/*
+	 * We sent the reply, so tell the SMB1 dispatch
+	 * it should NOT (also) send a reply.
+	 */
 	return (SDRC_NO_REPLY);
 }
 
@@ -178,6 +183,9 @@
  * result of bypassing the normal dispatch mechanism.
  *
  * The caller always frees this request.
+ *
+ * Return value is 0 for success, and anything else will
+ * terminate the reader thread (drop the connection).
  */
 int
 smb2_newrq_negotiate(smb_request_t *sr)
@@ -196,7 +204,7 @@
 
 	if ((sr->smb2_cmd_code != SMB2_NEGOTIATE) ||
 	    (sr->smb2_next_command != 0))
-		return (SDRC_DROP_VC);
+		return (-1);
 
 	/*
 	 * Decode SMB2 Negotiate (fixed-size part)
@@ -213,7 +221,7 @@
 	if (rc != 0)
 		return (rc);
 	if (struct_size != 36 || version_cnt > 8)
-		return (SDRC_DROP_VC);
+		return (-1);
 
 	/*
 	 * Decode SMB2 Negotiate (variable part)
@@ -221,7 +229,9 @@
 	rc = smb_mbc_decodef(&sr->command,
 	    "#w", version_cnt, cl_versions);
 	if (rc != 0)
-		return (SDRC_DROP_VC);
+		return (rc);
+
+	DTRACE_SMB2_START(op__Negotiate, smb_request_t *, sr);
 
 	/*
 	 * The client offers an array of protocol versions it
@@ -242,16 +252,23 @@
 	s->newrq_func = smb2sr_newrq;
 
 	rc = smb2_negotiate_common(sr, best_version);
-	if (rc != 0)
-		return (SDRC_DROP_VC);
+
+	/* sr->smb2_status was set */
+	DTRACE_SMB2_DONE(op__Negotiate, smb_request_t *, sr);
 
-	return (0);
+	smb2_send_reply(sr);
+
+	return (rc);
 }
 
 /*
  * Common parts of SMB2 Negotiate, used for both the
  * SMB1-to-SMB2 style, and straight SMB2 style.
- * Do negotiation decisions, encode, send the reply.
+ * Do negotiation decisions and encode the reply.
+ * The caller does the network send.
+ *
+ * Return value is 0 for success, and anything else will
+ * terminate the reader thread (drop the connection).
  */
 static int
 smb2_negotiate_common(smb_request_t *sr, uint16_t version)
@@ -304,7 +321,7 @@
 	(void) smb2_encode_header(sr, B_FALSE);
 	if (sr->smb2_status != 0) {
 		smb2sr_put_error(sr, sr->smb2_status);
-		smb2_send_reply(sr);
+		/* smb2_send_reply(sr); in caller */
 		return (-1); /* will drop */
 	}
 
@@ -337,7 +354,7 @@
 	    sr->sr_cfg->skc_negtok_len,	/* # */
 	    sr->sr_cfg->skc_negtok);	/* c */
 
-	smb2_send_reply(sr);
+	/* smb2_send_reply(sr); in caller */
 
 	(void) ksocket_setsockopt(s->sock, SOL_SOCKET,
 	    SO_SNDBUF, (const void *)&smb2_tcp_bufsize,
--- a/usr/src/uts/common/fs/smbsrv/smb2_oplock.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_oplock.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -48,6 +48,7 @@
 		return (SDRC_ERROR);
 
 	status = smb2sr_lookup_fid(sr, &smb2fid);
+	DTRACE_SMB2_START(op__OplockBreak, smb_request_t *, sr);
 	if (status)
 		goto errout;
 	if ((node = sr->fid_ofile->f_node) == NULL) {
@@ -81,6 +82,14 @@
 
 	smb_oplock_ack(node, sr->fid_ofile, brk);
 
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__OplockBreak, smb_request_t *, sr);
+	if (status) {
+		smb2sr_put_error(sr, status);
+		return (SDRC_SUCCESS);
+	}
+
 	/*
 	 * Generate SMB2 Oplock Break response
 	 * [MS-SMB2] 2.2.25
@@ -94,10 +103,6 @@
 	    smb2fid.persistent,		/* q */
 	    smb2fid.temporal);		/* q */
 	return (SDRC_SUCCESS);
-
-errout:
-	smb2sr_put_error(sr, status);
-	return (SDRC_SUCCESS);
 }
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb2_query_dir.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_query_dir.c	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,7 @@
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -112,9 +112,12 @@
 		return (SDRC_ERROR);
 
 	status = smb2sr_lookup_fid(sr, &smb2fid);
+	of = sr->fid_ofile;
+
+	DTRACE_SMB2_START(op__QueryDirectory, smb_request_t *, sr);
+
 	if (status)
 		goto errout;
-	of = sr->fid_ofile;
 
 	/*
 	 * If there's an input buffer (search pattern), decode it.
@@ -250,24 +253,28 @@
 
 	of->f_seek_pos = od->d_offset;
 
-	if (status == NT_STATUS_NO_MORE_FILES) {
-		if (args.fa_fflags & SMB2_QDIR_FLAG_SINGLE) {
-			status = NT_STATUS_NO_SUCH_FILE;
-			goto errout;
-		}
-		/*
-		 * This is not an error, but a warning that can be
-		 * used to tell the client that this data return
-		 * is the last of the enumeration.  Returning this
-		 * warning now (with the data) saves the client a
-		 * round trip that would otherwise be needed to
-		 * find out it's at the end.
-		 */
-		sr->smb2_status = status;
-		status = 0;
+	if ((args.fa_fflags & SMB2_QDIR_FLAG_SINGLE) &&
+	    status == NT_STATUS_NO_MORE_FILES) {
+		status = NT_STATUS_NO_SUCH_FILE;
 	}
-	if (status)
-		goto errout;
+
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__QueryDirectory, smb_request_t *, sr);
+
+	/*
+	 * Note: NT_STATUS_NO_MORE_FILES is a warning
+	 * used to tell the client that this data return
+	 * is the last of the enumeration.  Returning this
+	 * warning now (with the data) saves the client a
+	 * round trip that would otherwise be needed to
+	 * find out it's at the end.
+	 */
+	if (status != 0 &&
+	    status != NT_STATUS_NO_MORE_FILES) {
+		smb2sr_put_error(sr, status);
+		return (SDRC_SUCCESS);
+	}
 
 	/*
 	 * SMB2 Query Directory reply
@@ -283,12 +290,10 @@
 	    &sr->raw_data);	/* C */
 	if (DataLen == 0)
 		(void) smb_mbc_encodef(&sr->reply, ".");
-	if (rc == 0)
-		return (SDRC_SUCCESS);
-	status = NT_STATUS_UNSUCCESSFUL;
 
-errout:
-	smb2sr_put_error(sr, status);
+	if (rc)
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
+
 	return (SDRC_SUCCESS);
 }
 
--- a/usr/src/uts/common/fs/smbsrv/smb2_query_info.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_query_info.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -32,10 +32,9 @@
 	smb2fid_t smb2fid;
 	uint16_t DataOff;
 	uint32_t status;
-	smb_sdrc_t sdrc = SDRC_SUCCESS;
 	int rc = 0;
 
-	qi = kmem_zalloc(sizeof (*qi), KM_SLEEP);
+	qi = smb_srm_zalloc(sr, sizeof (*qi));
 
 	/*
 	 * SMB2 Query Info request
@@ -53,19 +52,8 @@
 	    &qi->qi_Flags,		/* l */
 	    &smb2fid.persistent,	/* q */
 	    &smb2fid.temporal);		/* q */
-	if (rc || StructSize != 41) {
-		sdrc = SDRC_ERROR;
-		goto out;
-	}
-
-	status = smb2sr_lookup_fid(sr, &smb2fid);
-	if (status) {
-		smb2sr_put_error(sr, status);
-		goto out;
-	}
-
-	if (oBufLength > smb2_max_trans)
-		oBufLength = smb2_max_trans;
+	if (rc || StructSize != 41)
+		return (SDRC_ERROR);
 
 	/*
 	 * If there's an input buffer, setup a shadow.
@@ -74,13 +62,20 @@
 		rc = MBC_SHADOW_CHAIN(&qi->in_data, &sr->smb_data,
 		    sr->smb2_cmd_hdr + iBufOffset, iBufLength);
 		if (rc) {
-			smb2sr_put_error(sr, NT_STATUS_INVALID_PARAMETER);
-			goto out;
+			return (SDRC_ERROR);
 		}
 	}
 
+	if (oBufLength > smb2_max_trans)
+		oBufLength = smb2_max_trans;
 	sr->raw_data.max_bytes = oBufLength;
 
+	status = smb2sr_lookup_fid(sr, &smb2fid);
+	DTRACE_SMB2_START(op__QueryInfo, smb_request_t *, sr);
+
+	if (status)
+		goto errout;
+
 	switch (qi->qi_InfoType) {
 	case SMB2_0_INFO_FILE:
 		status = smb2_qinfo_file(sr, qi);
@@ -99,6 +94,10 @@
 		break;
 	}
 
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__QueryInfo, smb_request_t *, sr);
+
 	switch (status) {
 
 	case 0: /* success */
@@ -106,7 +105,6 @@
 
 	case NT_STATUS_BUFFER_OVERFLOW:
 		/* Not really an error, per se.  Advisory. */
-		sr->smb2_status = status;
 		break;
 
 	case NT_STATUS_BUFFER_TOO_SMALL:
@@ -119,11 +117,11 @@
 		 * that returns one of these errors.
 		 */
 		smb2sr_put_error_data(sr, status, &sr->raw_data);
-		goto out;
+		return (SDRC_SUCCESS);
 
 	default:
 		smb2sr_put_error(sr, status);
-		goto out;
+		return (SDRC_SUCCESS);
 	}
 
 	/*
@@ -138,10 +136,7 @@
 	    oBufLength,			/* l */
 	    &sr->raw_data);		/* C */
 	if (rc)
-		sdrc = SDRC_ERROR;
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
 
-out:
-	kmem_free(qi, sizeof (*qi));
-
-	return (sdrc);
+	return (SDRC_SUCCESS);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb2_read.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_read.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -23,6 +23,7 @@
 smb_sdrc_t
 smb2_read(smb_request_t *sr)
 {
+	smb_rw_param_t *param = NULL;
 	smb_ofile_t *of = NULL;
 	smb_vdb_t *vdb = NULL;
 	struct mbuf *m = NULL;
@@ -63,22 +64,35 @@
 	if (StructSize != 49)
 		return (SDRC_ERROR);
 
+	/*
+	 * Setup an smb_rw_param_t which contains the VDB we need.
+	 * This is automatically free'd.
+	 */
+	param = smb_srm_zalloc(sr, sizeof (*param));
+	param->rw_offset = Offset;
+	param->rw_count = Length;
+	/* Note that the dtrace provider uses sr->arg.rw */
+	sr->arg.rw = param;
+
+	/*
+	 * Want FID lookup before the start probe.
+	 */
 	status = smb2sr_lookup_fid(sr, &smb2fid);
-	if (status) {
-		smb2sr_put_error(sr, status);
-		return (SDRC_SUCCESS);
-	}
 	of = sr->fid_ofile;
 
+	DTRACE_SMB2_START(op__Read, smb_request_t *, sr); /* arg.rw */
+
+	if (status)
+		goto errout; /* Bad FID */
+
 	if (Length > smb2_max_rwsize) {
-		smb2sr_put_error(sr, NT_STATUS_INVALID_PARAMETER);
-		return (SDRC_SUCCESS);
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto errout;
 	}
 	if (MinCount > Length)
 		MinCount = Length;
 
-	/* This is automatically free'd. */
-	vdb = smb_srm_zalloc(sr, sizeof (*vdb));
+	vdb = &param->rw_vdb;
 	vdb->vdb_tag = 0;
 	vdb->vdb_uio.uio_iov = &vdb->vdb_iovec[0];
 	vdb->vdb_uio.uio_iovcnt = MAX_IOVEC;
@@ -111,6 +125,7 @@
 		rc = EACCES;
 		break;
 	}
+	status = smb_errno2status(rc);
 
 	/* How much data we moved. */
 	XferCount = Length - vdb->vdb_uio.uio_resid;
@@ -124,8 +139,11 @@
 	 * the returned data so that if m was allocated,
 	 * it will be free'd via sr->raw_data cleanup.
 	 */
-	if (rc) {
-		smb2sr_put_errno(sr, rc);
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Read, smb_request_t *, sr); /* arg.rw */
+	if (status) {
+		smb2sr_put_error(sr, status);
 		return (SDRC_SUCCESS);
 	}
 
@@ -142,8 +160,10 @@
 	    0, /* DataRemaining */	/* l */
 	    0, /* reserved */		/* l */
 	    &sr->raw_data);		/* C */
-	if (rc)
+	if (rc) {
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
 		return (SDRC_ERROR);
+	}
 
 	mutex_enter(&of->f_mutex);
 	of->f_seek_pos = Offset + XferCount;
--- a/usr/src/uts/common/fs/smbsrv/smb2_session_setup.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_session_setup.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -81,6 +81,12 @@
 		return (SDRC_ERROR);
 
 	/*
+	 * Decoded everything.  Dtrace probe,
+	 * then no more early returns.
+	 */
+	DTRACE_SMB2_START(op__SessionSetup, smb_request_t *, sr);
+
+	/*
 	 * The real auth. work happens in here.
 	 */
 	status = smb_authenticate_ext(sr);
@@ -114,6 +120,9 @@
 		break;
 	}
 
+	/* sr->smb2_status set above */
+	DTRACE_SMB2_DONE(op__SessionSetup, smb_request_t *, sr);
+
 	/*
 	 * SMB2 Session Setup reply
 	 */
@@ -128,7 +137,7 @@
 	    SecBufLength,		/* # */
 	    sinfo->ssi_osecblob);	/* c */
 	if (rc)
-		return (SDRC_ERROR);
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
 
 	return (SDRC_SUCCESS);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb2_set_info.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_set_info.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -32,13 +32,12 @@
 	smb2fid_t smb2fid;
 	uint32_t status;
 	uint8_t InfoType, InfoClass;
-	smb_sdrc_t sdrc = SDRC_SUCCESS;
 	int rc = 0;
 
 	bzero(&sinfo, sizeof (sinfo));
 
 	/*
-	 * SMB2 Set Info request
+	 * Decode SMB2 Set Info request
 	 */
 	rc = smb_mbc_decodef(
 	    &sr->smb_data, "wbblw..lqq",
@@ -51,22 +50,8 @@
 	    &AddlInfo,			/* l */
 	    &smb2fid.persistent,	/* q */
 	    &smb2fid.temporal);		/* q */
-	if (rc || StructSize != 33) {
-		sdrc = SDRC_ERROR;
-		return (sdrc);
-	}
-
-	if (iBufLength > smb2_max_trans) {
-		status = NT_STATUS_INVALID_PARAMETER;
-		goto errout;
-	}
-
-	status = smb2sr_lookup_fid(sr, &smb2fid);
-	if (status)
-		goto errout;
-
-	sinfo.si_node = sr->fid_ofile->f_node;
-	sr->user_cr = sr->fid_ofile->f_cr;
+	if (rc || StructSize != 33)
+		return (SDRC_ERROR);
 
 	/*
 	 * If there's an input buffer, setup a shadow.
@@ -75,14 +60,27 @@
 		rc = MBC_SHADOW_CHAIN(&sinfo.si_data, &sr->smb_data,
 		    sr->smb2_cmd_hdr + iBufOffset, iBufLength);
 		if (rc) {
-			status = NT_STATUS_INVALID_PARAMETER;
-			goto errout;
+			return (SDRC_ERROR);
 		}
 	}
 
 	/* No output data. */
 	sr->raw_data.max_bytes = 0;
 
+	status = smb2sr_lookup_fid(sr, &smb2fid);
+	DTRACE_SMB2_START(op__SetInfo, smb_request_t *, sr);
+
+	if (status)
+		goto errout;
+
+	if (iBufLength > smb2_max_trans) {
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto errout;
+	}
+
+	sinfo.si_node = sr->fid_ofile->f_node;
+	sr->user_cr = sr->fid_ofile->f_cr;
+
 	switch (InfoType) {
 	case SMB2_0_INFO_FILE:
 		status = smb2_setinfo_file(sr, &sinfo, InfoClass);
@@ -101,20 +99,21 @@
 		break;
 	}
 
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__SetInfo, smb_request_t *, sr);
+
 	if (status) {
-	errout:
 		smb2sr_put_error(sr, status);
-		return (sdrc);
+		return (SDRC_SUCCESS);
 	}
 
 	/*
 	 * SMB2 Query Info reply
 	 */
-	rc = smb_mbc_encodef(
+	(void) smb_mbc_encodef(
 	    &sr->reply, "w..",
 	    2);	/* StructSize */	/* w */
-	if (rc)
-		sdrc = SDRC_ERROR;
 
-	return (sdrc);
+	return (SDRC_SUCCESS);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -66,7 +66,13 @@
 	if (rc)
 		return (SDRC_ERROR);
 
+	DTRACE_SMB2_START(op__TreeConnect, smb_request_t *, sr);
+
 	status = smb_tree_connect(sr);
+
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__TreeConnect, smb_request_t *, sr);
+
 	if (status) {
 		(void) smb2sr_put_error(sr, status);
 		return (SDRC_SUCCESS);
@@ -98,7 +104,7 @@
 	/*
 	 * SMB2 Tree Connect reply
 	 */
-	rc = smb_mbc_encodef(
+	(void) smb_mbc_encodef(
 	    &sr->reply,
 	    "wb.lll",
 	    16,	/* StructSize */	/* w */
@@ -106,8 +112,6 @@
 	    ShareFlags,			/* l */
 	    Capabilities,		/* l */
 	    tree->t_access);		/* l */
-	if (rc)
-		return (SDRC_ERROR);
 
 	return (SDRC_SUCCESS);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb2_tree_disconn.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_tree_disconn.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -38,12 +38,15 @@
 	if (StructSize != 4)
 		return (SDRC_ERROR);
 
-	if (sr->uid_user == NULL || sr->tid_tree == NULL)
-		return (SDRC_ERROR);
+	/* Dispatch makes sure we have uid_user, tid_tree */
+
+	DTRACE_SMB2_START(op__TreeDisconnect, smb_request_t *, sr);
 
 	smb_tree_disconnect(sr->tid_tree, B_TRUE);
 	smb_session_cancel_requests(sr->session, sr->tid_tree, sr);
 
+	DTRACE_SMB2_DONE(op__TreeDisconnect, smb_request_t *, sr);
+
 	/*
 	 * SMB2 Tree Disconnect reply
 	 */
--- a/usr/src/uts/common/fs/smbsrv/smb2_write.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb2_write.c	Wed Nov 27 23:58:32 2013 -0500
@@ -10,7 +10,7 @@
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -23,6 +23,7 @@
 smb_sdrc_t
 smb2_write(smb_request_t *sr)
 {
+	smb_rw_param_t *param = NULL;
 	smb_ofile_t *of = NULL;
 	smb_vdb_t *vdb = NULL;
 	uint16_t StructSize;
@@ -42,7 +43,7 @@
 	int rc = 0;
 
 	/*
-	 * SMB2 Write request
+	 * Decode SMB2 Write request
 	 */
 	rc = smb_mbc_decodef(
 	    &sr->smb_data,
@@ -63,43 +64,52 @@
 	if (StructSize != 49)
 		return (SDRC_ERROR);
 
-	status = smb2sr_lookup_fid(sr, &smb2fid);
-	if (status) {
-		smb2sr_put_error(sr, status);
-		return (SDRC_SUCCESS);
-	}
-	of = sr->fid_ofile;
-
-	if (Length > smb2_max_rwsize) {
-		smb2sr_put_error(sr, NT_STATUS_INVALID_PARAMETER);
-		return (SDRC_SUCCESS);
-	}
+	/*
+	 * Setup an smb_rw_param_t which contains the VDB we need.
+	 * This is automatically free'd.
+	 */
+	param = smb_srm_zalloc(sr, sizeof (*param));
+	param->rw_offset = Offset;
+	param->rw_count = Length;
+	/* Note that the dtrace provider uses sr->arg.rw */
+	sr->arg.rw = param;
 
 	/*
 	 * Skip any padding before the write data.
 	 */
 	data_chain_off = sr->smb2_cmd_hdr + DataOff;
 	skip = data_chain_off - sr->smb_data.chain_offset;
-	if (skip < 0) {
-		smb2sr_put_error(sr, NT_STATUS_INVALID_PARAMETER);
-		return (SDRC_SUCCESS);
-	}
-	if (skip > 0) {
+	if (skip < 0)
+		return (SDRC_ERROR);
+	if (skip > 0)
 		(void) smb_mbc_decodef(&sr->smb_data, "#.", skip);
-	}
 
-	/* This is automatically free'd. */
-	vdb = smb_srm_zalloc(sr, sizeof (*vdb));
+	/*
+	 * Decode the write data (payload)
+	 */
+	if (Length > smb2_max_rwsize)
+		return (SDRC_ERROR);
+	vdb = &param->rw_vdb;
 	rc = smb_mbc_decodef(&sr->smb_data, "#B", Length, vdb);
-	if (rc != 0 || vdb->vdb_len != Length) {
-		smb2sr_put_error(sr, NT_STATUS_INVALID_PARAMETER);
-		return (SDRC_SUCCESS);
-	}
+	if (rc != 0 || vdb->vdb_len != Length)
+		return (SDRC_ERROR);
 	vdb->vdb_uio.uio_loffset = (offset_t)Offset;
 
+	/*
+	 * Want FID lookup before the start probe.
+	 */
+	status = smb2sr_lookup_fid(sr, &smb2fid);
+	of = sr->fid_ofile;
+
+	DTRACE_SMB2_START(op__Write, smb_request_t *, sr); /* arg.rw */
+
+	if (status)
+		goto errout; /* Bad FID */
+
+
 	XferCount = 0;
 	if (Length == 0)
-		goto doreply;
+		goto errout;
 
 	switch (of->f_tree->t_res_type & STYPE_MASK) {
 	case STYPE_DISKTREE:
@@ -136,16 +146,20 @@
 		rc = EACCES;
 		break;
 	}
+	status = smb_errno2status(rc);
 
-	if (rc) {
-		smb2sr_put_errno(sr, rc);
+errout:
+	sr->smb2_status = status;
+	DTRACE_SMB2_DONE(op__Write, smb_request_t *, sr); /* arg.rw */
+
+	if (status) {
+		smb2sr_put_error(sr, status);
 		return (SDRC_SUCCESS);
 	}
 
 	/*
-	 * SMB2 Write reply
+	 * Encode SMB2 Write reply
 	 */
-doreply:
 	DataOff = SMB2_HDR_SIZE + 16;
 	rc = smb_mbc_encodef(
 	    &sr->reply, "wwlll",
@@ -154,8 +168,10 @@
 	    XferCount,			/* l */
 	    0, /* DataRemaining */	/* l */
 	    0); /* Channel Info */	/* l */
-	if (rc)
+	if (rc) {
+		sr->smb2_status = NT_STATUS_INTERNAL_ERROR;
 		return (SDRC_ERROR);
+	}
 
 	mutex_enter(&of->f_mutex);
 	of->f_seek_pos = Offset + XferCount;
--- a/usr/src/uts/common/fs/smbsrv/smb_close.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_close.c	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,7 @@
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -45,14 +45,14 @@
 
 	rc = smbsr_decode_vwv(sr, "wl", &sr->smb_fid, &sr->arg.timestamp);
 
-	DTRACE_SMB_1(op__Close__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Close, smb_request_t *, sr);
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
 
 void
 smb_post_close(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Close__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Close, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -86,14 +86,14 @@
 
 	rc = smbsr_decode_vwv(sr, "wl", &sr->smb_fid, &sr->arg.timestamp);
 
-	DTRACE_SMB_1(op__CloseAndTreeDisconnect__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__CloseAndTreeDisconnect, smb_request_t *, sr);
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
 
 void
 smb_post_close_and_tree_disconnect(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__CloseAndTreeDisconnect__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__CloseAndTreeDisconnect, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_common_transact.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_transact.c	Wed Nov 27 23:58:32 2013 -0500
@@ -55,14 +55,14 @@
 smb_sdrc_t
 smb_pre_transaction(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Transaction__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Transaction, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_transaction(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Transaction__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Transaction, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -156,14 +156,14 @@
 smb_sdrc_t
 smb_pre_transaction_secondary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__TransactionSecondary__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__TransactionSecondary, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_transaction_secondary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__TransactionSecondary__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__TransactionSecondary, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -254,14 +254,14 @@
 smb_sdrc_t
 smb_pre_ioctl(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Ioctl__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Ioctl, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_ioctl(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Ioctl__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Ioctl, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -285,14 +285,14 @@
 smb_sdrc_t
 smb_pre_transaction2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Transaction2__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Transaction2, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_transaction2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Transaction2__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Transaction2, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -368,14 +368,14 @@
 smb_sdrc_t
 smb_pre_transaction2_secondary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Transaction2Secondary__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Transaction2Secondary, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_transaction2_secondary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Transaction2Secondary__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Transaction2Secondary, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -558,14 +558,14 @@
 smb_sdrc_t
 smb_pre_nt_transact(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtTransact__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__NtTransact, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_nt_transact(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtTransact__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__NtTransact, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -644,14 +644,14 @@
 smb_sdrc_t
 smb_pre_nt_transact_secondary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtTransactSecondary__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__NtTransactSecondary, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_nt_transact_secondary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtTransactSecondary__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__NtTransactSecondary, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_create.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_create.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -47,8 +47,7 @@
 	op->create_disposition = FILE_OVERWRITE_IF;
 	op->create_options = FILE_NON_DIRECTORY_FILE;
 
-	DTRACE_SMB_2(op__Create__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__Create, smb_request_t *, sr); /* arg.open */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -56,7 +55,7 @@
 void
 smb_post_create(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Create__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Create, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -89,8 +88,7 @@
 
 	op->create_disposition = FILE_CREATE;
 
-	DTRACE_SMB_2(op__CreateNew__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__CreateNew, smb_request_t *, sr); /* arg.open */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -98,7 +96,7 @@
 void
 smb_post_create_new(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__CreateNew__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__CreateNew, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -132,8 +130,7 @@
 
 	op->create_disposition = FILE_CREATE;
 
-	DTRACE_SMB_2(op__CreateTemporary__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__CreateTemporary, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -141,7 +138,7 @@
 void
 smb_post_create_temporary(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__CreateTemporary__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__CreateTemporary, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_delete.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_delete.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
  */
 
 #include <sys/sunddi.h>
@@ -104,7 +104,7 @@
 	if ((rc = smbsr_decode_vwv(sr, "w", &fqi->fq_sattr)) == 0)
 		rc = smbsr_decode_data(sr, "%S", sr, &fqi->fq_path.pn_path);
 
-	DTRACE_SMB_2(op__Delete__start, smb_request_t *, sr, smb_fqi_t *, fqi);
+	DTRACE_SMB_START(op__Delete, smb_request_t *, sr); /* arg.dirop */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -112,7 +112,7 @@
 void
 smb_post_delete(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Delete__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Delete, smb_request_t *, sr);
 }
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_directory.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_directory.c	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,7 @@
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -59,8 +59,7 @@
 	rc = smbsr_decode_data(sr, "%S", sr,
 	    &sr->arg.dirop.fqi.fq_path.pn_path);
 
-	DTRACE_SMB_2(op__CreateDirectory__start, smb_request_t *, sr,
-	    struct dirop *, &sr->arg.dirop);
+	DTRACE_SMB_START(op__CreateDirectory, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -68,7 +67,7 @@
 void
 smb_post_create_directory(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__CreateDirectory__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__CreateDirectory, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -206,8 +205,7 @@
 	rc = smbsr_decode_data(sr, "%S", sr,
 	    &sr->arg.dirop.fqi.fq_path.pn_path);
 
-	DTRACE_SMB_2(op__DeleteDirectory__start, smb_request_t *, sr,
-	    struct dirop *, &sr->arg.dirop);
+	DTRACE_SMB_START(op__DeleteDirectory, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -215,7 +213,7 @@
 void
 smb_post_delete_directory(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__DeleteDirectory__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__DeleteDirectory, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -361,8 +359,7 @@
 	rc = smbsr_decode_data(sr, "%S", sr,
 	    &sr->arg.dirop.fqi.fq_path.pn_path);
 
-	DTRACE_SMB_2(op__CheckDirectory__start, smb_request_t *, sr,
-	    struct dirop *, &sr->arg.dirop);
+	DTRACE_SMB_START(op__CheckDirectory, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -370,7 +367,7 @@
 void
 smb_post_check_directory(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__CheckDirectory__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__CheckDirectory, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_dispatch.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_dispatch.c	Wed Nov 27 23:58:32 2013 -0500
@@ -195,10 +195,12 @@
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x17, 0 },		/* 0x17 023 */
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x18, 0 },		/* 0x18 024 */
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x19, 0 },		/* 0x19 025 */
-	{ "SmbReadRaw", SMB_SDT_OPS(invalid), 0x1A, 0 },	/* 0x1A 026 */
+	{ "SmbReadRaw", SMB_SDT_OPS(read_raw),			/* 0x1A 026 */
+	    0x1A, LANMAN1_0 },
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x1B, 0 },		/* 0x1B 027 */
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x1C, 0 },		/* 0x1C 028 */
-	{ "SmbWriteRaw", SMB_SDT_OPS(invalid), 0x1D, 0 },	/* 0x1D 029 */
+	{ "SmbWriteRaw", SMB_SDT_OPS(write_raw),		/* 0x1D 029 */
+	    0x1D, LANMAN1_0 },
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x1E, 0 },		/* 0x1E 030 */
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x1F, 0 },		/* 0x1F 031 */
 	{ "Invalid", SMB_SDT_OPS(invalid), 0x20, 0 },		/* 0x20 032 */
@@ -834,9 +836,9 @@
 	sr->sr_time_start = gethrtime();
 	if ((sdrc = (*sdd->sdt_pre_op)(sr)) == SDRC_SUCCESS)
 		sdrc = (*sdd->sdt_function)(sr);
+	(*sdd->sdt_post_op)(sr);
 
 	if (sdrc != SDRC_SR_KEPT) {
-		(*sdd->sdt_post_op)(sr);
 		smbsr_cleanup(sr);
 	}
 
@@ -1229,14 +1231,14 @@
 smb_sdrc_t
 smb_pre_invalid(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Invalid__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Invalid, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_invalid(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Invalid__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Invalid, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_echo.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_echo.c	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,7 @@
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -39,14 +39,14 @@
 smb_sdrc_t
 smb_pre_echo(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Echo__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Echo, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_echo(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Echo__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Echo, smb_request_t *, sr);
 }
 
 static unsigned short smb_max_echo = 10;
--- a/usr/src/uts/common/fs/smbsrv/smb_find.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_find.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -203,14 +203,14 @@
 smb_sdrc_t
 smb_pre_search(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Search__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Search, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_search(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Search__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Search, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -394,14 +394,14 @@
 smb_sdrc_t
 smb_pre_find(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Find__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Find, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_find(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Find__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Find, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -547,14 +547,14 @@
 smb_sdrc_t
 smb_pre_find_close(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__FindClose__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__FindClose, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_find_close(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__FindClose__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__FindClose, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -613,14 +613,14 @@
 smb_sdrc_t
 smb_pre_find_unique(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__FindUnique__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__FindUnique, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_find_unique(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__FindUnique__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__FindUnique, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_flush.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_flush.c	Wed Nov 27 23:58:32 2013 -0500
@@ -23,6 +23,7 @@
  * Use is subject to license terms.
  *
  * Copyright 2016 Syneto S.R.L. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -60,7 +61,7 @@
 
 	rc = smbsr_decode_vwv(sr, "w", &sr->smb_fid);
 
-	DTRACE_SMB_1(op__Flush__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Flush, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -68,7 +69,7 @@
 void
 smb_post_flush(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Flush__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Flush, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_fsinfo.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_fsinfo.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -54,14 +54,14 @@
 smb_sdrc_t
 smb_pre_query_information_disk(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__QueryInformationDisk__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__QueryInformationDisk, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_query_information_disk(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__QueryInformationDisk__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__QueryInformationDisk, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_lock_byte_range.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_lock_byte_range.c	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,7 @@
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 /*
  * SMB: lock_byte_range
@@ -64,14 +64,14 @@
 smb_sdrc_t
 smb_pre_lock_byte_range(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__LockByteRange__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__LockByteRange, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_lock_byte_range(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__LockByteRange__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__LockByteRange, smb_request_t *, sr);
 }
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -221,14 +221,14 @@
 smb_sdrc_t
 smb_pre_locking_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__LockingX__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__LockingX, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_locking_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__LockingX__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__LockingX, smb_request_t *, sr);
 }
 
 struct lreq {
--- a/usr/src/uts/common/fs/smbsrv/smb_logoff_andx.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_logoff_andx.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,6 +21,8 @@
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -63,14 +65,14 @@
 smb_sdrc_t
 smb_pre_logoff_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__LogoffX__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__LogoffX, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_logoff_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__LogoffX__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__LogoffX, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_negotiate.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_negotiate.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -280,6 +280,9 @@
  * result of bypassing the normal dispatch mechanism.
  *
  * The caller always frees this request.
+ *
+ * Return value is 0 for success, and anything else will
+ * terminate the reader thread (drop the connection).
  */
 int
 smb1_newrq_negotiate(smb_request_t *sr)
@@ -382,8 +385,7 @@
 		}
 	}
 
-	DTRACE_SMB_2(op__Negotiate__start, smb_request_t *, sr,
-	    smb_arg_negotiate_t, negprot);
+	DTRACE_SMB_START(op__Negotiate, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -393,8 +395,7 @@
 {
 	smb_arg_negotiate_t	*negprot = sr->sr_negprot;
 
-	DTRACE_SMB_2(op__Negotiate__done, smb_request_t *, sr,
-	    smb_arg_negotiate_t, negprot);
+	DTRACE_SMB_DONE(op__Negotiate, smb_request_t *, sr);
 
 	bzero(negprot, sizeof (smb_arg_negotiate_t));
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_cancel.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_cancel.c	Wed Nov 27 23:58:32 2013 -0500
@@ -48,14 +48,14 @@
 smb_sdrc_t
 smb_pre_nt_cancel(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtCancel__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__NtCancel, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_nt_cancel(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtCancel__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__NtCancel, smb_request_t *, sr);
 }
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -212,8 +212,7 @@
 			op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE;
 	}
 
-	DTRACE_SMB_2(op__NtCreateX__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__NtCreateX, smb_request_t *, sr); /* arg.open */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -221,7 +220,7 @@
 void
 smb_post_nt_create_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtCreateX__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__NtCreateX, smb_request_t *, sr);
 
 	if (sr->arg.open.dir != NULL) {
 		smb_ofile_release(sr->arg.open.dir);
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_create.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_create.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -115,8 +115,7 @@
 		op->sd = NULL;
 	}
 
-	DTRACE_SMB_2(op__NtTransactCreate__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__NtTransactCreate, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -125,9 +124,9 @@
 smb_post_nt_transact_create(smb_request_t *sr, smb_xa_t *xa)
 {
 	smb_sd_t *sd = sr->arg.open.sd;
+	_NOTE(ARGUNUSED(xa))
 
-	DTRACE_SMB_2(op__NtTransactCreate__done, smb_request_t *, sr,
-	    smb_xa_t *, xa);
+	DTRACE_SMB_DONE(op__NtTransactCreate, smb_request_t *, sr);
 
 	if (sd) {
 		smb_sd_term(sd);
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_notify_change.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_notify_change.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -226,6 +226,13 @@
 	    &xa->rep_data_mb);
 
 sendit:
+	/*
+	 * When smb_nt_transact_notify_change returned SDRC_SR_KEPT
+	 * the dispatcher skipped the "done" probe, so do it now.
+	 * Note: Don't use this probe in response time statistics.
+	 */
+	DTRACE_SMB_DONE(op__NtTransact, smb_request_t *, sr);
+
 	sds = &sr->sr_server->sv_disp_stats1[sr->smb_com];
 	atomic_add_64(&sds->sdt_txb, (int64_t)sr->reply.chain_offset);
 
--- a/usr/src/uts/common/fs/smbsrv/smb_open_andx.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_open_andx.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -227,8 +227,7 @@
 	if (rc == 0)
 		rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path);
 
-	DTRACE_SMB_2(op__Open__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__Open, smb_request_t *, sr); /* arg.open */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -236,7 +235,7 @@
 void
 smb_post_open(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Open__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Open, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -367,8 +366,7 @@
 		op->create_disposition = smb_ofun_to_crdisposition(op->ofun);
 	}
 
-	DTRACE_SMB_2(op__OpenX__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__OpenX, smb_request_t *, sr); /* arg.open */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -376,7 +374,7 @@
 void
 smb_post_open_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__OpenX__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__OpenX, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_print.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_print.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -78,8 +78,7 @@
 
 	op->create_disposition = FILE_OVERWRITE_IF;
 	op->create_options = FILE_NON_DIRECTORY_FILE;
-	DTRACE_SMB_2(op__OpenPrintFile__start, smb_request_t *, sr,
-	    struct open_param *, op);
+	DTRACE_SMB_START(op__OpenPrintFile, smb_request_t *, sr); /* arg.open */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -87,7 +86,7 @@
 void
 smb_post_open_print_file(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__OpenPrintFile__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__OpenPrintFile, smb_request_t *, sr);
 }
 
 /*
@@ -158,14 +157,14 @@
 
 	rc = smbsr_decode_vwv(sr, "w", &sr->smb_fid);
 
-	DTRACE_SMB_1(op__ClosePrintFile__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__ClosePrintFile, smb_request_t *, sr);
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
 
 void
 smb_post_close_print_file(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__ClosePrintFile__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__ClosePrintFile, smb_request_t *, sr);
 }
 
 /*
@@ -209,14 +208,14 @@
 smb_sdrc_t
 smb_pre_get_print_queue(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__GetPrintQueue__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__GetPrintQueue, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_get_print_queue(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__GetPrintQueue__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__GetPrintQueue, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -255,14 +254,14 @@
 
 	rc = smbsr_decode_vwv(sr, "w", &sr->smb_fid);
 
-	DTRACE_SMB_1(op__WritePrintFile__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__WritePrintFile, smb_request_t *, sr);
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
 
 void
 smb_post_write_print_file(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__WritePrintFile__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__WritePrintFile, smb_request_t *, sr);
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_process_exit.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_process_exit.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,6 +21,8 @@
 /*
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -56,14 +58,14 @@
 smb_sdrc_t
 smb_pre_process_exit(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__ProcessExit__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__ProcessExit, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_process_exit(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__ProcessExit__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__ProcessExit, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_query_fileinfo.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_query_fileinfo.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -149,8 +149,7 @@
 
 	rc = smbsr_decode_data(sr, "%S", sr, &fqi->fq_path.pn_path);
 
-	DTRACE_SMB_2(op__QueryInformation__start, smb_request_t *, sr,
-	    smb_fqi_t *, fqi);
+	DTRACE_SMB_START(op__QueryInformation, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -158,7 +157,7 @@
 void
 smb_post_query_information(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__QueryInformation__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__QueryInformation, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -187,7 +186,7 @@
 	int rc;
 	rc = smbsr_decode_vwv(sr, "w", &sr->smb_fid);
 
-	DTRACE_SMB_1(op__QueryInformation2__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__QueryInformation2, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -195,7 +194,7 @@
 void
 smb_post_query_information2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__QueryInformation2__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__QueryInformation2, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_read.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_read.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -73,8 +73,7 @@
 	param->rw_count = (uint32_t)count;
 	param->rw_mincnt = 0;
 
-	DTRACE_SMB_2(op__Read__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__Read, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -82,8 +81,7 @@
 void
 smb_post_read(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__Read__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__Read, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
@@ -159,8 +157,7 @@
 	param->rw_count = (uint32_t)count;
 	param->rw_mincnt = 0;
 
-	DTRACE_SMB_2(op__LockAndRead__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__LockAndRead, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -168,8 +165,7 @@
 void
 smb_post_lock_and_read(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__LockAndRead__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__LockAndRead, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
@@ -223,6 +219,35 @@
 }
 
 /*
+ * The SMB_COM_READ_RAW protocol was a negotiated option introduced in
+ * SMB Core Plus to maximize performance when reading a large block
+ * of data from a server.  It's obsolete and no longer supported.
+ *
+ * We keep a handler for it so the dtrace provider can see if
+ * the client tried to use this command.
+ */
+smb_sdrc_t
+smb_pre_read_raw(smb_request_t *sr)
+{
+	DTRACE_SMB_START(op__ReadRaw, smb_request_t *, sr);
+	return (SDRC_SUCCESS);
+}
+
+void
+smb_post_read_raw(smb_request_t *sr)
+{
+	DTRACE_SMB_DONE(op__ReadRaw, smb_request_t *, sr);
+}
+
+smb_sdrc_t
+smb_com_read_raw(smb_request_t *sr)
+{
+	smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, ERRDOS,
+	    ERROR_NOT_SUPPORTED);
+	return (SDRC_ERROR);
+}
+
+/*
  * Read bytes from a file (SMB Core).  This request was extended in
  * LM 0.12 to support 64-bit offsets, indicated by sending a wct of
  * 12 and including additional offset information.
@@ -272,8 +297,7 @@
 
 	param->rw_mincnt = 0;
 
-	DTRACE_SMB_2(op__ReadX__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__ReadX, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -281,8 +305,7 @@
 void
 smb_post_read_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__ReadX__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__ReadX, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_rename.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_rename.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <sys/synch.h>
@@ -72,8 +72,7 @@
 		dst_fqi->fq_sattr = 0;
 	}
 
-	DTRACE_SMB_2(op__Rename__start, smb_request_t *, sr,
-	    struct dirop *, &sr->arg.dirop);
+	DTRACE_SMB_START(op__Rename, smb_request_t *, sr); /* arg.dirop */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -81,7 +80,7 @@
 void
 smb_post_rename(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Rename__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Rename, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -146,8 +145,7 @@
 		dst_fqi->fq_sattr = 0;
 	}
 
-	DTRACE_SMB_2(op__NtRename__start, smb_request_t *, sr,
-	    struct dirop *, &sr->arg.dirop);
+	DTRACE_SMB_START(op__NtRename, smb_request_t *, sr); /* arg.dirop */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -155,7 +153,7 @@
 void
 smb_post_nt_rename(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__NtRename__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__NtRename, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_seek.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_seek.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,6 +21,8 @@
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -80,14 +82,14 @@
 smb_sdrc_t
 smb_pre_seek(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Seek__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__Seek, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_seek(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__Seek__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__Seek, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_session.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_session.c	Wed Nov 27 23:58:32 2013 -0500
@@ -676,6 +676,9 @@
  * the new request for the session taskq, or smb_request_free it
  * (in case we've decided to drop this connection).  In this
  * (special) new request handler, we always free the request.
+ *
+ * Return value is 0 for success, and anything else will
+ * terminate the reader thread (drop the connection).
  */
 static int
 smbsr_newrq_initial(smb_request_t *sr)
--- a/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <sys/types.h>
@@ -189,8 +189,7 @@
 		    sr->session->ip_addr_str);
 	}
 
-	DTRACE_SMB_2(op__SessionSetupX__start, smb_request_t *, sr,
-	    smb_arg_sessionsetup_t, sinfo);
+	DTRACE_SMB_START(op__SessionSetupX, smb_request_t *, sr);
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
 
@@ -199,8 +198,7 @@
 {
 	smb_arg_sessionsetup_t	*sinfo = sr->sr_ssetup;
 
-	DTRACE_SMB_2(op__SessionSetupX__done, smb_request_t *, sr,
-	    smb_arg_sessionsetup_t, sinfo);
+	DTRACE_SMB_DONE(op__SessionSetupX, smb_request_t *, sr);
 
 	if (sinfo->ssi_lmpwd != NULL)
 		bzero(sinfo->ssi_lmpwd, sinfo->ssi_lmpwlen);
--- a/usr/src/uts/common/fs/smbsrv/smb_set_fileinfo.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_set_fileinfo.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -127,14 +127,14 @@
 smb_sdrc_t
 smb_pre_set_information(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__SetInformation__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__SetInformation, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_set_information(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__SetInformation__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__SetInformation, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -167,14 +167,14 @@
 smb_sdrc_t
 smb_pre_set_information2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__SetInformation2__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__SetInformation2, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_set_information2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__SetInformation2__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__SetInformation2, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_trans2_find.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_trans2_find.c	Wed Nov 27 23:58:32 2013 -0500
@@ -22,7 +22,7 @@
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 
@@ -989,14 +989,14 @@
 smb_sdrc_t
 smb_pre_find_close2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__FindClose2__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__FindClose2, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_find_close2(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__FindClose2__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__FindClose2, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c	Wed Nov 27 23:58:32 2013 -0500
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
  */
 
 #include <smbsrv/smb_kproto.h>
@@ -100,8 +100,7 @@
 	tcon->flags = 0;
 	tcon->optional_support = 0;
 
-	DTRACE_SMB_2(op__TreeConnect__start, smb_request_t *, sr,
-	    smb_arg_tcon_t *, tcon);
+	DTRACE_SMB_START(op__TreeConnect, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -109,7 +108,7 @@
 void
 smb_post_tree_connect(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__TreeConnect__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__TreeConnect, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -291,8 +290,7 @@
 
 	tcon->optional_support = 0;
 
-	DTRACE_SMB_2(op__TreeConnectX__start, smb_request_t *, sr,
-	    smb_arg_tcon_t *, tcon);
+	DTRACE_SMB_START(op__TreeConnectX, smb_request_t *, sr);
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -300,7 +298,7 @@
 void
 smb_post_tree_connect_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__TreeConnectX__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__TreeConnectX, smb_request_t *, sr);
 }
 
 smb_sdrc_t
@@ -416,14 +414,14 @@
 	sr->uid_user = smb_session_lookup_uid(sr->session, sr->smb_uid);
 	sr->tid_tree = smb_session_lookup_tree(sr->session, sr->smb_tid);
 
-	DTRACE_SMB_1(op__TreeDisconnect__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__TreeDisconnect, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_tree_disconnect(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__TreeDisconnect__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__TreeDisconnect, smb_request_t *, sr);
 }
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -57,14 +57,14 @@
 smb_sdrc_t
 smb_pre_unlock_byte_range(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__UnlockByteRange__start, smb_request_t *, sr);
+	DTRACE_SMB_START(op__UnlockByteRange, smb_request_t *, sr);
 	return (SDRC_SUCCESS);
 }
 
 void
 smb_post_unlock_byte_range(smb_request_t *sr)
 {
-	DTRACE_SMB_1(op__UnlockByteRange__done, smb_request_t *, sr);
+	DTRACE_SMB_DONE(op__UnlockByteRange, smb_request_t *, sr);
 }
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_write.c	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/fs/smbsrv/smb_write.c	Wed Nov 27 23:58:32 2013 -0500
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <sys/sdt.h>
@@ -61,8 +61,7 @@
 	param->rw_offset = (uint64_t)off;
 	param->rw_vdb.vdb_uio.uio_loffset = (offset_t)param->rw_offset;
 
-	DTRACE_SMB_2(op__Write__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__Write, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -70,8 +69,7 @@
 void
 smb_post_write(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__Write__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__Write, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
@@ -151,8 +149,7 @@
 	param->rw_count = (uint32_t)count;
 	param->rw_offset = (uint64_t)off;
 
-	DTRACE_SMB_2(op__WriteAndClose__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__WriteAndClose, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -160,8 +157,7 @@
 void
 smb_post_write_and_close(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__WriteAndClose__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__WriteAndClose, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
@@ -249,8 +245,7 @@
 	param->rw_count = (uint32_t)count;
 	param->rw_offset = (uint64_t)off;
 
-	DTRACE_SMB_2(op__WriteAndUnlock__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__WriteAndUnlock, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -258,8 +253,7 @@
 void
 smb_post_write_and_unlock(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__WriteAndUnlock__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__WriteAndUnlock, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
@@ -325,6 +319,35 @@
 }
 
 /*
+ * The SMB_COM_WRITE_RAW protocol was a negotiated option introduced in
+ * SMB Core Plus to maximize performance when writing a large block
+ * of data to a server.  It's obsolete and no longer supported.
+ *
+ * We keep a handler for it so the dtrace provider can see if
+ * the client tried to use this command.
+ */
+smb_sdrc_t
+smb_pre_write_raw(smb_request_t *sr)
+{
+	DTRACE_SMB_START(op__WriteRaw, smb_request_t *, sr);
+	return (SDRC_SUCCESS);
+}
+
+void
+smb_post_write_raw(smb_request_t *sr)
+{
+	DTRACE_SMB_DONE(op__WriteRaw, smb_request_t *, sr);
+}
+
+smb_sdrc_t
+smb_com_write_raw(struct smb_request *sr)
+{
+	smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, ERRDOS,
+	    ERROR_NOT_SUPPORTED);
+	return (SDRC_ERROR);
+}
+
+/*
  * Write bytes to a file (SMB Core).  This request was extended in
  * LM 0.12 to support 64-bit offsets, indicated by sending a wct of
  * 14, instead of 12, and including additional offset information.
@@ -387,8 +410,7 @@
 	    (sr->smb_data.max_bytes > (sr->smb_data.chain_offset + 0xFFFF)))
 		param->rw_count |= ((uint32_t)datalen_high << 16);
 
-	DTRACE_SMB_2(op__WriteX__start, smb_request_t *, sr,
-	    smb_rw_param_t *, param);
+	DTRACE_SMB_START(op__WriteX, smb_request_t *, sr); /* arg.rw */
 
 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
 }
@@ -396,8 +418,7 @@
 void
 smb_post_write_andx(smb_request_t *sr)
 {
-	DTRACE_SMB_2(op__WriteX__done, smb_request_t *, sr,
-	    smb_rw_param_t *, sr->arg.rw);
+	DTRACE_SMB_DONE(op__WriteX, smb_request_t *, sr); /* arg.rw */
 
 	kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
 }
--- a/usr/src/uts/common/smbsrv/smb_kproto.h	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/smbsrv/smb_kproto.h	Wed Nov 27 23:58:32 2013 -0500
@@ -55,52 +55,6 @@
 #include <smbsrv/smb_ktypes.h>
 #include <smbsrv/smb_ioctl.h>
 
-/*
- * DTrace SDT probes have different signatures in userland than they do in
- * kernel.  If we're compiling for user mode (libfksmbsrv) define them as
- * either no-op (for the SMB dtrace provider) or libfksmbsrv functions for
- * the other SDT probe sites.
- */
-#ifndef	_KERNEL
-
-extern void smb_dtrace1(const char *f, const char *n,
-			const char *t1, long v1);
-extern void smb_dtrace2(const char *f, const char *n,
-			const char *t1, long v1,
-			const char *t2, long v2);
-extern void smb_dtrace3(const char *f, const char *n,
-			const char *t1, long v1,
-			const char *t2, long v2,
-			const char *t3, long v3);
-
-/*
- * These are for the SMB dtrace proivder, which for a user-mode build
- * are largely redundant with the fbt probes so make these no-ops.
- */
-#undef	DTRACE_SMB_1
-#define	DTRACE_SMB_1(n, a, b)			((void)b)
-#undef	DTRACE_SMB_2
-#define	DTRACE_SMB_2(n, a, b, c, d)		((void)b, (void)d)
-
-/*
- * These are for the other (specialized) dtrace SDT probes sprinkled
- * through the smbsrv code.  In libfksmbsrv map these to functions.
- */
-
-#undef	DTRACE_PROBE1
-#define	DTRACE_PROBE1(n, a, b) \
-	smb_dtrace1(__func__, #n, #a, (long)b)
-
-#undef	DTRACE_PROBE2
-#define	DTRACE_PROBE2(n, a, b, c, d) \
-	smb_dtrace2(__func__, #n, #a, (long)b, #c, (long)d)
-
-#undef	DTRACE_PROBE3
-#define	DTRACE_PROBE3(n, a, b, c, d, e, f) \
-	smb_dtrace3(__func__, #n, #a, (long)b, #c, (long)d, #e, (long)f)
-
-#endif	/* _KERNEL */
-
 extern	int smb_maxbufsize;
 extern	int smb_flush_required;
 extern	int smb_dirsymlink_enable;
@@ -109,7 +63,6 @@
 extern	int smb_oplock_min_timeout;
 extern	int smb_shortnames;
 extern	int smb_sign_debug;
-extern	int smb_raw_mode;
 extern	uint_t smb_audit_flags;
 extern	int smb_ssetup_threshold;
 extern	int smb_tcon_threshold;
@@ -794,9 +747,6 @@
 struct mbuf *smb_mbuf_allocate(struct uio *uio);
 void smb_mbuf_trim(struct mbuf *mhead, int nbytes);
 
-void smb_check_status(void);
-int smb_handle_write_raw(smb_session_t *session, smb_request_t *sr);
-
 int32_t smb_time_gmt_to_local(smb_request_t *, int32_t);
 int32_t smb_time_local_to_gmt(smb_request_t *, int32_t);
 int32_t	smb_time_dos_to_unix(int16_t, int16_t);
--- a/usr/src/uts/common/smbsrv/smb_ktypes.h	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/smbsrv/smb_ktypes.h	Wed Nov 27 23:58:32 2013 -0500
@@ -1489,6 +1489,7 @@
 	 */
 	uint64_t	dsize;	/* alloc size, actual size */
 	uint32_t	desired_access;
+	uint32_t	maximum_access;
 	uint32_t	share_access;
 	uint32_t	create_options;
 	uint32_t	create_disposition;
@@ -1499,9 +1500,11 @@
 	uint32_t	action_taken;
 	uint64_t	fileid;
 	uint32_t	rootdirfid;
+	fsid_t		op_fsid;
 	smb_ofile_t	*dir;
 	smb_opipe_t	*pipe;	/* for smb_opipe_open */
 	struct smb_sd	*sd;	/* for NTTransactCreate */
+	void		*create_ctx;
 	uint8_t		op_oplock_level;	/* requested/granted level */
 	boolean_t	op_oplock_levelII;	/* TRUE if levelII supported */
 } smb_arg_open_t;
--- a/usr/src/uts/common/sys/sdt.h	Tue Mar 19 14:28:28 2019 -0400
+++ b/usr/src/uts/common/sys/sdt.h	Wed Nov 27 23:58:32 2013 -0500
@@ -21,6 +21,7 @@
 /*
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #ifndef _SYS_SDT_H
@@ -244,11 +245,20 @@
 #define	DTRACE_NFSV4_3(name, type1, arg1, type2, arg2, type3, arg3) \
 	DTRACE_PROBE3(__nfsv4_##name, type1, arg1, type2, arg2, type3, arg3);
 
-#define	DTRACE_SMB_1(name, type1, arg1) \
-	DTRACE_PROBE1(__smb_##name, type1, arg1);
+/*
+ * The SMB probes are done a little differently from the other probes
+ * in this file for the benefit of the libfksmbsrv USDT provider.
+ * See: lib/smbsrv/libfksmbsrv/common/sys/sdt.h
+ */
+#define	DTRACE_SMB_START(name, type1, arg1) \
+	DTRACE_PROBE1(__smb_##name##__start, type1, arg1);
+#define	DTRACE_SMB_DONE(name, type1, arg1) \
+	DTRACE_PROBE1(__smb_##name##__done, type1, arg1);
 
-#define	DTRACE_SMB_2(name, type1, arg1, type2, arg2) \
-	DTRACE_PROBE2(__smb_##name, type1, arg1, type2, arg2);
+#define	DTRACE_SMB2_START(name, type1, arg1) \
+	DTRACE_PROBE1(__smb2_##name##__start, type1, arg1);
+#define	DTRACE_SMB2_DONE(name, type1, arg1) \
+	DTRACE_PROBE1(__smb2_##name##__done, type1, arg1);
 
 #define	DTRACE_IP(name)						\
 	DTRACE_PROBE(__ip_##name);