Print this page
NEX-17289 Minimal SMB 3.0.2 support
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@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-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-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-6041 Should pass the smbtorture lock tests
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
NEX-3662 Backport illumos 1501: taskq_create_proc ... TQ_DYNAMIC puts tasks in p0 (take 2)
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Marcel Telka <marcel.telka@nexenta.com>
NEX-3576 RPC error when displaying open files via Windows MMC
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
NEX-2188 Browsing top level share produces RPC error 1728
SMB-69 read-raw, write-raw are dead code
SMB-39 Use AF_UNIX pipes for RPC
        
*** 18,28 ****
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <smbsrv/smb_kproto.h>
  #include <smbsrv/smb_fsops.h>
  
--- 18,28 ----
   *
   * 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>
  
*** 71,91 ****
  
          param->rw_offset = (uint64_t)off_low;
          param->rw_count = (uint32_t)count;
          param->rw_mincnt = 0;
  
!         DTRACE_SMB_2(op__Read__start, smb_request_t *, sr,
!             smb_rw_param_t *, param);
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  void
  smb_post_read(smb_request_t *sr)
  {
!         DTRACE_SMB_2(op__Read__done, smb_request_t *, sr,
!             smb_rw_param_t *, sr->arg.rw);
  
          kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
  }
  
  smb_sdrc_t
--- 71,89 ----
  
          param->rw_offset = (uint64_t)off_low;
          param->rw_count = (uint32_t)count;
          param->rw_mincnt = 0;
  
!         DTRACE_SMB_START(op__Read, smb_request_t *, sr); /* arg.rw */
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  void
  smb_post_read(smb_request_t *sr)
  {
!         DTRACE_SMB_DONE(op__Read, smb_request_t *, sr); /* arg.rw */
  
          kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
  }
  
  smb_sdrc_t
*** 157,186 ****
  
          param->rw_offset = (uint64_t)off_low;
          param->rw_count = (uint32_t)count;
          param->rw_mincnt = 0;
  
!         DTRACE_SMB_2(op__LockAndRead__start, smb_request_t *, sr,
!             smb_rw_param_t *, param);
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  void
  smb_post_lock_and_read(smb_request_t *sr)
  {
!         DTRACE_SMB_2(op__LockAndRead__done, smb_request_t *, sr,
!             smb_rw_param_t *, sr->arg.rw);
  
          kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
  }
  
  smb_sdrc_t
  smb_com_lock_and_read(smb_request_t *sr)
  {
          smb_rw_param_t *param = sr->arg.rw;
          DWORD status;
          uint16_t count;
          int rc;
  
          if (STYPE_ISDSK(sr->tid_tree->t_res_type) == 0) {
                  smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, ERRnoaccess);
--- 155,183 ----
  
          param->rw_offset = (uint64_t)off_low;
          param->rw_count = (uint32_t)count;
          param->rw_mincnt = 0;
  
!         DTRACE_SMB_START(op__LockAndRead, smb_request_t *, sr); /* arg.rw */
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  void
  smb_post_lock_and_read(smb_request_t *sr)
  {
!         DTRACE_SMB_DONE(op__LockAndRead, smb_request_t *, sr); /* arg.rw */
  
          kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
  }
  
  smb_sdrc_t
  smb_com_lock_and_read(smb_request_t *sr)
  {
          smb_rw_param_t *param = sr->arg.rw;
          DWORD status;
+         uint32_t lk_pid;
          uint16_t count;
          int rc;
  
          if (STYPE_ISDSK(sr->tid_tree->t_res_type) == 0) {
                  smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, ERRnoaccess);
*** 193,204 ****
                  return (SDRC_ERROR);
          }
  
          sr->user_cr = smb_ofile_getcred(sr->fid_ofile);
  
          status = smb_lock_range(sr, param->rw_offset, (uint64_t)param->rw_count,
!             0, SMB_LOCK_TYPE_READWRITE);
  
          if (status != NT_STATUS_SUCCESS) {
                  smb_lock_range_error(sr, status);
                  return (SDRC_ERROR);
          }
--- 190,204 ----
                  return (SDRC_ERROR);
          }
  
          sr->user_cr = smb_ofile_getcred(sr->fid_ofile);
  
+         /* Note: SMB1 locking uses 16-bit PIDs. */
+         lk_pid = sr->smb_pid & 0xFFFF;
+ 
          status = smb_lock_range(sr, param->rw_offset, (uint64_t)param->rw_count,
!             lk_pid, SMB_LOCK_TYPE_READWRITE, 0);
  
          if (status != NT_STATUS_SUCCESS) {
                  smb_lock_range_error(sr, status);
                  return (SDRC_ERROR);
          }
*** 217,226 ****
--- 217,255 ----
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  /*
+  * The SMB_COM_READ_RAW protocol was a negotiated option introduced in
+  * SMB Core Plus to maximize performance when reading a large block
+  * of data from a server.  It's obsolete and no longer supported.
+  *
+  * We keep a handler for it so the dtrace provider can see if
+  * the client tried to use this command.
+  */
+ smb_sdrc_t
+ smb_pre_read_raw(smb_request_t *sr)
+ {
+         DTRACE_SMB_START(op__ReadRaw, smb_request_t *, sr);
+         return (SDRC_SUCCESS);
+ }
+ 
+ void
+ smb_post_read_raw(smb_request_t *sr)
+ {
+         DTRACE_SMB_DONE(op__ReadRaw, smb_request_t *, sr);
+ }
+ 
+ smb_sdrc_t
+ smb_com_read_raw(smb_request_t *sr)
+ {
+         smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, ERRDOS,
+             ERROR_NOT_SUPPORTED);
+         return (SDRC_ERROR);
+ }
+ 
+ /*
   * Read bytes from a file (SMB Core).  This request was extended in
   * LM 0.12 to support 64-bit offsets, indicated by sending a wct of
   * 12 and including additional offset information.
   *
   * MS-SMB 3.3.5.7 update to LM 0.12 4.2.4:
*** 266,286 ****
                  param->rw_count = (uint32_t)maxcnt_low;
          }
  
          param->rw_mincnt = 0;
  
!         DTRACE_SMB_2(op__ReadX__start, smb_request_t *, sr,
!             smb_rw_param_t *, param);
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  void
  smb_post_read_andx(smb_request_t *sr)
  {
!         DTRACE_SMB_2(op__ReadX__done, smb_request_t *, sr,
!             smb_rw_param_t *, sr->arg.rw);
  
          kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
  }
  
  smb_sdrc_t
--- 295,313 ----
                  param->rw_count = (uint32_t)maxcnt_low;
          }
  
          param->rw_mincnt = 0;
  
!         DTRACE_SMB_START(op__ReadX, smb_request_t *, sr); /* arg.rw */
  
          return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
  }
  
  void
  smb_post_read_andx(smb_request_t *sr)
  {
!         DTRACE_SMB_DONE(op__ReadX, smb_request_t *, sr); /* arg.rw */
  
          kmem_free(sr->arg.rw, sizeof (smb_rw_param_t));
  }
  
  smb_sdrc_t
*** 356,370 ****
   * Common function for reading files or IPC/MSRPC named pipes.  All
   * protocol read functions should lookup the fid before calling this
   * function.  We can't move the fid lookup here because lock-and-read
   * requires the fid to do locking before attempting the read.
   *
!  * Reading from a file should break oplocks on the file to LEVEL_II.
!  * A call to smb_oplock_break(SMB_OPLOCK_BREAK_TO_LEVEL_II) is not
!  * required as it is a no-op. If there's anything greater than a
!  * LEVEL_II oplock on the file, the oplock MUST be owned by the ofile
!  * on which the read is occuring and therefore would not be broken.
   *
   * Returns errno values.
   */
  int
  smb_common_read(smb_request_t *sr, smb_rw_param_t *param)
--- 383,394 ----
   * Common function for reading files or IPC/MSRPC named pipes.  All
   * protocol read functions should lookup the fid before calling this
   * function.  We can't move the fid lookup here because lock-and-read
   * requires the fid to do locking before attempting the read.
   *
!  * Reading from a file does not break oplocks because any need for
!  * breaking before read is handled in open.
   *
   * Returns errno values.
   */
  int
  smb_common_read(smb_request_t *sr, smb_rw_param_t *param)
*** 411,421 ****
                  }
  
                  sr->raw_data.max_bytes = vdb->vdb_uio.uio_resid;
                  top = smb_mbuf_allocate(&vdb->vdb_uio);
  
!                 rc = smb_fsop_read(sr, sr->user_cr, node, &vdb->vdb_uio);
  
                  sr->raw_data.max_bytes -= vdb->vdb_uio.uio_resid;
                  smb_mbuf_trim(top, sr->raw_data.max_bytes);
                  MBC_ATTACH_MBUF(&sr->raw_data, top);
                  break;
--- 435,446 ----
                  }
  
                  sr->raw_data.max_bytes = vdb->vdb_uio.uio_resid;
                  top = smb_mbuf_allocate(&vdb->vdb_uio);
  
!                 rc = smb_fsop_read(sr, sr->user_cr, node, ofile,
!                     &vdb->vdb_uio, 0);
  
                  sr->raw_data.max_bytes -= vdb->vdb_uio.uio_resid;
                  smb_mbuf_trim(top, sr->raw_data.max_bytes);
                  MBC_ATTACH_MBUF(&sr->raw_data, top);
                  break;