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
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  
    | 
      ↓ 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.
  34   35   *
  35   36   * Since Offset is a 32 bit quantity, this request is inappropriate for
  36   37   * general locking within a very large file.
  37   38   *
  38   39   * Client Request                     Description
  39   40   * ================================== =================================
  40   41   *
  41   42   * UCHAR WordCount;                   Count of parameter words = 5
  42   43   * USHORT Fid;                        File handle
  43   44   * ULONG Count;                       Count of bytes to unlock
  44   45   * ULONG Offset;                      Offset from start of file
  45   46   * USHORT ByteCount;                  Count of data bytes = 0
  46   47   *
  47   48   * Server Response                    Description
  48   49   * ================================== =================================
  
    | 
      ↓ 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