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>
NEX-6041 Should pass the smbtorture lock tests
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c
          +++ new/usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
       24 + * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  24   25   */
  25   26  
  26   27  /*
  27   28   * SMB: unlock_byte_range
  28   29   *
  29   30   * This message is sent to unlock the given byte range.  Offset, Count, and
  30   31   * Pid must be identical to that specified in a prior successful lock.  If
  31   32   *
  32   33   * an unlock references an address range that is not locked, no error is
  33   34   * generated.
↓ open down ↓ 15 lines elided ↑ open up ↑
  49   50   *
  50   51   * UCHAR WordCount;                   Count of parameter words = 0
  51   52   * USHORT ByteCount;                  Count of data bytes = 0
  52   53   */
  53   54  
  54   55  #include <smbsrv/smb_kproto.h>
  55   56  
  56   57  smb_sdrc_t
  57   58  smb_pre_unlock_byte_range(smb_request_t *sr)
  58   59  {
  59      -        DTRACE_SMB_1(op__UnlockByteRange__start, smb_request_t *, sr);
       60 +        DTRACE_SMB_START(op__UnlockByteRange, smb_request_t *, sr);
  60   61          return (SDRC_SUCCESS);
  61   62  }
  62   63  
  63   64  void
  64   65  smb_post_unlock_byte_range(smb_request_t *sr)
  65   66  {
  66      -        DTRACE_SMB_1(op__UnlockByteRange__done, smb_request_t *, sr);
       67 +        DTRACE_SMB_DONE(op__UnlockByteRange, smb_request_t *, sr);
  67   68  }
  68   69  
  69   70  smb_sdrc_t
  70   71  smb_com_unlock_byte_range(smb_request_t *sr)
  71   72  {
  72   73          uint32_t        Length;
  73   74          uint32_t        Offset;
       75 +        uint32_t        lk_pid;
  74   76          DWORD           result;
  75   77  
  76   78          if (smbsr_decode_vwv(sr, "wll", &sr->smb_fid, &Length, &Offset) != 0)
  77   79                  return (SDRC_ERROR);
  78   80  
  79   81          smbsr_lookup_file(sr);
  80   82          if (sr->fid_ofile == NULL) {
  81   83                  smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
  82   84                  return (SDRC_ERROR);
  83   85          }
  84   86  
  85      -        result = smb_unlock_range(sr, sr->fid_ofile->f_node,
  86      -            (u_offset_t)Offset, (uint64_t)Length);
       87 +        /* Note: SMB1 locking uses 16-bit PIDs. */
       88 +        lk_pid = sr->smb_pid & 0xFFFF;
       89 +
       90 +        result = smb_unlock_range(sr, (uint64_t)Offset, (uint64_t)Length,
       91 +            lk_pid);
  87   92          if (result != NT_STATUS_SUCCESS) {
  88   93                  smbsr_error(sr, NT_STATUS_RANGE_NOT_LOCKED,
  89   94                      ERRDOS, ERROR_NOT_LOCKED);
  90   95                  return (SDRC_ERROR);
  91   96          }
  92   97  
  93   98          if (smbsr_encode_empty_result(sr))
  94   99                  return (SDRC_ERROR);
  95  100  
  96  101          return (SDRC_SUCCESS);
  97  102  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX