Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)
NEX-1643 dtrace provider for smbsrv
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-5844 want SMB2 ioctl FSCTL_SRV_COPYCHUNK
NEX-6124 smb_fsop_read/write should allow file != sr->fid_ofile
NEX-6125 smbtorture invalid response with smb2.ioctl
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-4083 Upstream changes from illumos 5917 and 5995
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-2188 Browsing top level share produces RPC error 1728
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)
SMB-48 Panic with smbtorture raw.scan-eamax (fix dtrace probes)
SMB-39 Use AF_UNIX pipes for RPC
SMB-65 SMB server in non-global zones (data structure changes)
Many things move to the smb_server_t object, and
many functions gain an sv arg (which server).
SMB-48 Panic with smbtorture raw.scan-eamax
re #11215 rb3676 sesctl to SGI JBOD hangs in biowait() with a command stuck in mptsas driver
re #10734 NT Trans. Notify returning too quickly
        
*** 19,38 ****
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <smbsrv/smb_kproto.h>
  #include <smbsrv/smb_fsops.h>
  #include <smbsrv/smb_share.h>
  #include <smbsrv/string.h>
  #include <smbsrv/nmpipes.h>
  #include <smbsrv/mailslot.h>
! #include <smbsrv/winioctl.h>
  
  /*
   * count of bytes in server response packet
   * except parameters and data. Note that setup
   * word count is zero.
--- 19,38 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <smbsrv/smb_kproto.h>
  #include <smbsrv/smb_fsops.h>
  #include <smbsrv/smb_share.h>
  #include <smbsrv/string.h>
  #include <smbsrv/nmpipes.h>
  #include <smbsrv/mailslot.h>
! #include <smb/winioctl.h>
  
  /*
   * count of bytes in server response packet
   * except parameters and data. Note that setup
   * word count is zero.
*** 53,70 ****
  static smb_sdrc_t smb_trans2_dispatch(smb_request_t *, smb_xa_t *);
  
  smb_sdrc_t
  smb_pre_transaction(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__Transaction__start, 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);
  }
  
  smb_sdrc_t
  smb_com_transaction(smb_request_t *sr)
  {
--- 53,70 ----
  static smb_sdrc_t smb_trans2_dispatch(smb_request_t *, smb_xa_t *);
  
  smb_sdrc_t
  smb_pre_transaction(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_DONE(op__Transaction, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_transaction(smb_request_t *sr)
  {
*** 154,171 ****
  }
  
  smb_sdrc_t
  smb_pre_transaction_secondary(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__TransactionSecondary__start, 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);
  }
  
  smb_sdrc_t
  smb_com_transaction_secondary(smb_request_t *sr)
  {
--- 154,171 ----
  }
  
  smb_sdrc_t
  smb_pre_transaction_secondary(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_DONE(op__TransactionSecondary, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_transaction_secondary(smb_request_t *sr)
  {
*** 252,269 ****
  }
  
  smb_sdrc_t
  smb_pre_ioctl(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__Ioctl__start, 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);
  }
  
  smb_sdrc_t
  smb_com_ioctl(smb_request_t *sr)
  {
--- 252,269 ----
  }
  
  smb_sdrc_t
  smb_pre_ioctl(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_DONE(op__Ioctl, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_ioctl(smb_request_t *sr)
  {
*** 283,300 ****
  }
  
  smb_sdrc_t
  smb_pre_transaction2(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__Transaction2__start, 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);
  }
  
  smb_sdrc_t
  smb_com_transaction2(struct smb_request *sr)
  {
--- 283,300 ----
  }
  
  smb_sdrc_t
  smb_pre_transaction2(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_DONE(op__Transaction2, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_transaction2(struct smb_request *sr)
  {
*** 366,383 ****
  }
  
  smb_sdrc_t
  smb_pre_transaction2_secondary(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__Transaction2Secondary__start, 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);
  }
  
  smb_sdrc_t
  smb_com_transaction2_secondary(smb_request_t *sr)
  {
--- 366,383 ----
  }
  
  smb_sdrc_t
  smb_pre_transaction2_secondary(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_DONE(op__Transaction2Secondary, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_transaction2_secondary(smb_request_t *sr)
  {
*** 556,573 ****
  }
  
  smb_sdrc_t
  smb_pre_nt_transact(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__NtTransact__start, 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);
  }
  
  smb_sdrc_t
  smb_com_nt_transact(struct smb_request *sr)
  {
--- 556,573 ----
  }
  
  smb_sdrc_t
  smb_pre_nt_transact(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_DONE(op__NtTransact, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_nt_transact(struct smb_request *sr)
  {
*** 642,659 ****
  }
  
  smb_sdrc_t
  smb_pre_nt_transact_secondary(smb_request_t *sr)
  {
!         DTRACE_SMB_1(op__NtTransactSecondary__start, 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);
  }
  
  smb_sdrc_t
  smb_com_nt_transact_secondary(struct smb_request *sr)
  {
--- 642,659 ----
  }
  
  smb_sdrc_t
  smb_pre_nt_transact_secondary(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_DONE(op__NtTransactSecondary, smb_request_t *, sr);
  }
  
  smb_sdrc_t
  smb_com_nt_transact_secondary(struct smb_request *sr)
  {
*** 1430,1440 ****
          fsctl.OutputCount = 0; /* minimum to read from the pipe */
          fsctl.MaxOutputResp = xa->smb_mdrcnt;   /* max to read */
          fsctl.in_mbc = &xa->req_data_mb; /* write from here */
          fsctl.out_mbc = &xa->rep_data_mb; /* read into here */
  
!         status = smb_opipe_fsctl(sr, &fsctl);
          if (status) {
                  smbsr_status(sr, status, 0, 0);
                  if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_ERROR)
                          return (SDRC_ERROR);
                  /* Warnings like NT_STATUS_BUFFER_OVERFLOW are OK */
--- 1430,1440 ----
          fsctl.OutputCount = 0; /* minimum to read from the pipe */
          fsctl.MaxOutputResp = xa->smb_mdrcnt;   /* max to read */
          fsctl.in_mbc = &xa->req_data_mb; /* write from here */
          fsctl.out_mbc = &xa->rep_data_mb; /* read into here */
  
!         status = smb_opipe_transceive(sr, &fsctl);
          if (status) {
                  smbsr_status(sr, status, 0, 0);
                  if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_ERROR)
                          return (SDRC_ERROR);
                  /* Warnings like NT_STATUS_BUFFER_OVERFLOW are OK */
*** 1761,1771 ****
          {
                  data_pad = (param_off + n_param) & 1; /* Pad to short */
                  /* Param off from hdr start */
                  data_off = param_off + n_param + data_pad;
                  fmt = "bww2.wwwwwwb.Cw#.C#.C";
!                 nt_unknown_secret = data_pad;
          }
  
          total_bytes = param_pad + n_param + data_pad + n_data;
  
          rc = smbsr_encode_result(sr, 10+n_setup, total_bytes,
--- 1761,1771 ----
          {
                  data_pad = (param_off + n_param) & 1; /* Pad to short */
                  /* Param off from hdr start */
                  data_off = param_off + n_param + data_pad;
                  fmt = "bww2.wwwwwwb.Cw#.C#.C";
!                 nt_unknown_secret = (uint16_t)data_pad;
          }
  
          total_bytes = param_pad + n_param + data_pad + n_data;
  
          rc = smbsr_encode_result(sr, 10+n_setup, total_bytes,