Print this page
NEX-5665 SMB2 oplock leases
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-5665 SMB2 oplock leases
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-1643 dtrace provider for smbsrv
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-5311 SMB1 Create_Temp should return an untagged ASCII string
Reviewed by: Gordon Ross <gwr@nexenta.com>
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)
        
@@ -18,11 +18,11 @@
  *
  * CDDL HEADER END
  */
 /*
  * 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>
 
 #define SMB_CREATE_NAMEBUF_SZ   16
@@ -45,20 +45,19 @@
                 rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path);
 
         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);
 }
 
 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
 smb_com_create(smb_request_t *sr)
 {
@@ -87,20 +86,19 @@
         if (rc == 0)
                 rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path);
 
         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);
 }
 
 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
 smb_com_create_new(smb_request_t *sr)
 {
@@ -130,20 +128,19 @@
         if (rc == 0)
                 rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path);
 
         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);
 }
 
 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
 smb_com_create_temporary(smb_request_t *sr)
 {
@@ -163,11 +160,11 @@
         op->fqi.fq_path.pn_path = buf;
 
         if (smb_common_create(sr) != NT_STATUS_SUCCESS)
                 return (SDRC_ERROR);
 
-        if (smbsr_encode_result(sr, 1, VAR_BCC, "bww%S", 1, sr->smb_fid,
+        if (smbsr_encode_result(sr, 1, VAR_BCC, "bww%s", 1, sr->smb_fid,
             VAR_BCC, sr, name))
                 return (SDRC_ERROR);
 
         return (SDRC_SUCCESS);
 }
@@ -197,13 +194,16 @@
                 else
                         op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE;
         } else {
                 op->op_oplock_level = SMB_OPLOCK_NONE;
         }
-        op->op_oplock_levelII = B_FALSE;
 
         status = smb_common_open(sr);
+        if (status == 0 && op->op_oplock_level != SMB_OPLOCK_NONE) {
+                /* Oplock req. in op->op_oplock_level etc. */
+                smb1_oplock_acquire(sr, B_FALSE);
+        }
 
         if (op->op_oplock_level == SMB_OPLOCK_NONE) {
                 sr->smb_flg &=
                     ~(SMB_FLAGS_OPLOCK | SMB_FLAGS_OPLOCK_NOTIFY_ANY);
         }