Print this page
NEX-1643 dtrace provider for smbsrv
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
SMB-122 smbd core dumps in smbd_dc_update / smb_log
SMB-117 Win7 fails to open security properties
SMB-11 SMB2 message parse & dispatch
SMB-12 SMB2 Negotiate Protocol
SMB-13 SMB2 Session Setup
SMB-14 SMB2 Logoff
SMB-15 SMB2 Tree Connect
SMB-16 SMB2 Tree Disconnect
SMB-17 SMB2 Create
SMB-18 SMB2 Close
SMB-19 SMB2 Flush
SMB-20 SMB2 Read
SMB-21 SMB2 Write
SMB-22 SMB2 Lock/Unlock
SMB-23 SMB2 Ioctl
SMB-24 SMB2 Cancel
SMB-25 SMB2 Echo
SMB-26 SMB2 Query Dir
SMB-27 SMB2 Change Notify
SMB-28 SMB2 Query Info
SMB-29 SMB2 Set Info
SMB-30 SMB2 Oplocks
SMB-53 SMB2 Create Context options
(SMB2 code review cleanup 1, 2, 3)

@@ -8,11 +8,11 @@
  * source.  A copy of the CDDL is also available via the Internet at
  * http://www.illumos.org/license/CDDL.
  */
 
 /*
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
  * Dispatch function for SMB2_SET_INFO
  */

@@ -30,17 +30,16 @@
         uint32_t iBufLength;
         uint32_t AddlInfo;
         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",
             &StructSize,                /* w */
             &InfoType,                  /* b */

@@ -49,42 +48,41 @@
             &iBufOffset,                /* w */
             /* reserved                   .. */
             &AddlInfo,                  /* l */
             &smb2fid.persistent,        /* q */
             &smb2fid.temporal);         /* q */
-        if (rc || StructSize != 33) {
-                sdrc = SDRC_ERROR;
-                return (sdrc);
-        }
+        if (rc || StructSize != 33)
+                return (SDRC_ERROR);
 
-        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 there's an input buffer, setup a shadow.
          */
         if (iBufLength) {
                 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);
                 break;
         case SMB2_0_INFO_FILESYSTEM:

@@ -99,22 +97,23 @@
         default:
                 status = NT_STATUS_INVALID_PARAMETER;
                 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);
 }