1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21148c5f43SAlan Wright 
22da6c28aaSamw /*
23148c5f43SAlan Wright  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24*93bc28dbSGordon Ross  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
25da6c28aaSamw  */
26da6c28aaSamw 
27da6c28aaSamw /*
28da6c28aaSamw  * SMB: unlock_byte_range
29da6c28aaSamw  *
30da6c28aaSamw  * This message is sent to unlock the given byte range.  Offset, Count, and
31da6c28aaSamw  * Pid must be identical to that specified in a prior successful lock.  If
32da6c28aaSamw  *
33da6c28aaSamw  * an unlock references an address range that is not locked, no error is
34da6c28aaSamw  * generated.
35da6c28aaSamw  *
36da6c28aaSamw  * Since Offset is a 32 bit quantity, this request is inappropriate for
37da6c28aaSamw  * general locking within a very large file.
38da6c28aaSamw  *
39da6c28aaSamw  * Client Request                     Description
40da6c28aaSamw  * ================================== =================================
41da6c28aaSamw  *
42da6c28aaSamw  * UCHAR WordCount;                   Count of parameter words = 5
43da6c28aaSamw  * USHORT Fid;                        File handle
44da6c28aaSamw  * ULONG Count;                       Count of bytes to unlock
45da6c28aaSamw  * ULONG Offset;                      Offset from start of file
46da6c28aaSamw  * USHORT ByteCount;                  Count of data bytes = 0
47da6c28aaSamw  *
48da6c28aaSamw  * Server Response                    Description
49da6c28aaSamw  * ================================== =================================
50da6c28aaSamw  *
51da6c28aaSamw  * UCHAR WordCount;                   Count of parameter words = 0
52da6c28aaSamw  * USHORT ByteCount;                  Count of data bytes = 0
53da6c28aaSamw  */
54da6c28aaSamw 
55bbf6f00cSJordan Brown #include <smbsrv/smb_kproto.h>
56da6c28aaSamw 
577b59d02dSjb smb_sdrc_t
smb_pre_unlock_byte_range(smb_request_t * sr)58faa1795aSjb smb_pre_unlock_byte_range(smb_request_t *sr)
59faa1795aSjb {
60*93bc28dbSGordon Ross 	DTRACE_SMB_START(op__UnlockByteRange, smb_request_t *, sr);
61faa1795aSjb 	return (SDRC_SUCCESS);
62faa1795aSjb }
63faa1795aSjb 
64faa1795aSjb void
smb_post_unlock_byte_range(smb_request_t * sr)65faa1795aSjb smb_post_unlock_byte_range(smb_request_t *sr)
66faa1795aSjb {
67*93bc28dbSGordon Ross 	DTRACE_SMB_DONE(op__UnlockByteRange, smb_request_t *, sr);
68faa1795aSjb }
69faa1795aSjb 
70faa1795aSjb smb_sdrc_t
smb_com_unlock_byte_range(smb_request_t * sr)71faa1795aSjb smb_com_unlock_byte_range(smb_request_t *sr)
72da6c28aaSamw {
73da6c28aaSamw 	uint32_t	Length;
74da6c28aaSamw 	uint32_t	Offset;
750897f7fbSGordon Ross 	uint32_t	lk_pid;
76da6c28aaSamw 	DWORD		result;
77da6c28aaSamw 
787b59d02dSjb 	if (smbsr_decode_vwv(sr, "wll", &sr->smb_fid, &Length, &Offset) != 0)
79faa1795aSjb 		return (SDRC_ERROR);
80da6c28aaSamw 
812c2961f8Sjose borrego 	smbsr_lookup_file(sr);
82da6c28aaSamw 	if (sr->fid_ofile == NULL) {
83dc20a302Sas 		smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
84faa1795aSjb 		return (SDRC_ERROR);
85da6c28aaSamw 	}
86da6c28aaSamw 
870897f7fbSGordon Ross 	/* Note: SMB1 locking uses 16-bit PIDs. */
880897f7fbSGordon Ross 	lk_pid = sr->smb_pid & 0xFFFF;
890897f7fbSGordon Ross 
900897f7fbSGordon Ross 	result = smb_unlock_range(sr, (uint64_t)Offset, (uint64_t)Length,
910897f7fbSGordon Ross 	    lk_pid);
92da6c28aaSamw 	if (result != NT_STATUS_SUCCESS) {
93dc20a302Sas 		smbsr_error(sr, NT_STATUS_RANGE_NOT_LOCKED,
94148c5f43SAlan Wright 		    ERRDOS, ERROR_NOT_LOCKED);
95faa1795aSjb 		return (SDRC_ERROR);
96da6c28aaSamw 	}
97da6c28aaSamw 
987b59d02dSjb 	if (smbsr_encode_empty_result(sr))
99faa1795aSjb 		return (SDRC_ERROR);
100da6c28aaSamw 
101faa1795aSjb 	return (SDRC_SUCCESS);
102da6c28aaSamw }
103