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>
        
@@ -19,10 +19,12 @@
  * CDDL HEADER END
  */
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  */
 /*
  * SMB: lock_byte_range
  *
  * The lock record message is sent to lock the given byte range.  More than
@@ -60,25 +62,29 @@
 #include <smbsrv/smb_kproto.h>
 
 smb_sdrc_t
 smb_pre_lock_byte_range(smb_request_t *sr)
 {
-        DTRACE_SMB_1(op__LockByteRange__start, smb_request_t *, sr);
+        DTRACE_SMB_START(op__LockByteRange, smb_request_t *, sr);
         return (SDRC_SUCCESS);
 }
 
 void
 smb_post_lock_byte_range(smb_request_t *sr)
 {
-        DTRACE_SMB_1(op__LockByteRange__done, smb_request_t *, sr);
+        DTRACE_SMB_DONE(op__LockByteRange, smb_request_t *, sr);
 }
 
+/*
+ * Legacy SMB command; takes an exclusive byte-range lock
+ */
 smb_sdrc_t
 smb_com_lock_byte_range(struct smb_request *sr)
 {
         uint32_t        count;
         uint32_t        off;
+        uint32_t        lk_pid;
         DWORD           result;
         int             rc;
 
         if (smbsr_decode_vwv(sr, "wll", &sr->smb_fid, &count, &off) != 0)
                 return (SDRC_ERROR);
@@ -88,18 +94,15 @@
                 smbsr_error(sr, NT_STATUS_INVALID_HANDLE,
                     ERRDOS, ERRbadfid);
                 return (SDRC_ERROR);
         }
 
-        /*
-         * The last parameter is lock type. This is dependent on
-         * lock flag (3rd parameter). Since the lock flag is
-         * set to be exclusive, lock type is passed as
-         * normal lock (write lock).
-         */
-        result = smb_lock_range(sr, (u_offset_t)off, (uint64_t)count,  0,
-            SMB_LOCK_TYPE_READWRITE);
+        /* Note: SMB1 locking uses 16-bit PIDs. */
+        lk_pid = sr->smb_pid & 0xFFFF;
+
+        result = smb_lock_range(sr, (u_offset_t)off, (uint64_t)count,
+            lk_pid, SMB_LOCK_TYPE_READWRITE, 0);
         if (result != NT_STATUS_SUCCESS) {
                 smb_lock_range_error(sr, result);
                 return (SDRC_ERROR);
         }