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,28 ****
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <smbsrv/smb_kproto.h>
  
  #define SMB_CREATE_NAMEBUF_SZ   16
--- 18,28 ----
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <smbsrv/smb_kproto.h>
  
  #define SMB_CREATE_NAMEBUF_SZ   16
*** 45,64 ****
                  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);
  
          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);
  }
  
  smb_sdrc_t
  smb_com_create(smb_request_t *sr)
  {
--- 45,63 ----
                  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_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_DONE(op__Create, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_create(smb_request_t *sr)
  {
*** 87,106 ****
          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);
  
          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);
  }
  
  smb_sdrc_t
  smb_com_create_new(smb_request_t *sr)
  {
--- 86,104 ----
          if (rc == 0)
                  rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path);
  
          op->create_disposition = FILE_CREATE;
  
!         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_DONE(op__CreateNew, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_create_new(smb_request_t *sr)
  {
*** 130,149 ****
          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);
  
          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);
  }
  
  smb_sdrc_t
  smb_com_create_temporary(smb_request_t *sr)
  {
--- 128,146 ----
          if (rc == 0)
                  rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path);
  
          op->create_disposition = FILE_CREATE;
  
!         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_DONE(op__CreateTemporary, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_create_temporary(smb_request_t *sr)
  {
*** 163,173 ****
          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,
              VAR_BCC, sr, name))
                  return (SDRC_ERROR);
  
          return (SDRC_SUCCESS);
  }
--- 160,170 ----
          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,
              VAR_BCC, sr, name))
                  return (SDRC_ERROR);
  
          return (SDRC_SUCCESS);
  }
*** 197,209 ****
                  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 (op->op_oplock_level == SMB_OPLOCK_NONE) {
                  sr->smb_flg &=
                      ~(SMB_FLAGS_OPLOCK | SMB_FLAGS_OPLOCK_NOTIFY_ANY);
          }
--- 194,209 ----
                  else
                          op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE;
          } else {
                  op->op_oplock_level = SMB_OPLOCK_NONE;
          }
  
          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);
          }