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_QUERY_INFO
  */
@@ -30,14 +30,13 @@
         uint16_t iBufOffset;
         uint32_t iBufLength;
         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
          */
         rc = smb_mbc_decodef(
@@ -51,38 +50,34 @@
             &iBufLength,                /* l */
             &qi->qi_AddlInfo,           /* l */
             &qi->qi_Flags,              /* l */
             &smb2fid.persistent,        /* q */
             &smb2fid.temporal);         /* q */
-        if (rc || StructSize != 41) {
-                sdrc = SDRC_ERROR;
-                goto out;
-        }
+        if (rc || StructSize != 41)
+                return (SDRC_ERROR);
 
-        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 there's an input buffer, setup a shadow.
          */
         if (iBufLength) {
                 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);
                 break;
         case SMB2_0_INFO_FILESYSTEM:
@@ -97,18 +92,21 @@
         default:
                 status = NT_STATUS_INVALID_PARAMETER;
                 break;
         }
 
+errout:
+        sr->smb2_status = status;
+        DTRACE_SMB2_DONE(op__QueryInfo, smb_request_t *, sr);
+
         switch (status) {
 
         case 0: /* success */
                 break;
 
         case NT_STATUS_BUFFER_OVERFLOW:
                 /* Not really an error, per se.  Advisory. */
-                sr->smb2_status = status;
                 break;
 
         case NT_STATUS_BUFFER_TOO_SMALL:
         case NT_STATUS_INFO_LENGTH_MISMATCH:
                 /*
@@ -117,15 +115,15 @@
                  * required to successfully query the data.
                  * That error data is built by the functions
                  * 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);
         }
 
         /*
          * SMB2 Query Info reply
          */
@@ -136,12 +134,9 @@
             9,  /* StructSize */        /* w */
             DataOff,                    /* w */
             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);
 }