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 */
21da6c28aaSamw /*
227f667e74Sjose borrego * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23da6c28aaSamw * Use is subject to license terms.
245677e049SGordon Ross *
255677e049SGordon Ross * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
26da6c28aaSamw */
27da6c28aaSamw
28da6c28aaSamw /*
29da6c28aaSamw * SMB: nt_cancel
30da6c28aaSamw *
31da6c28aaSamw * This SMB allows a client to cancel a request currently pending at the
32da6c28aaSamw * server.
33da6c28aaSamw *
34da6c28aaSamw * Client Request Description
35da6c28aaSamw * ================================== =================================
36da6c28aaSamw *
37da6c28aaSamw * UCHAR WordCount; No words are sent (== 0)
38da6c28aaSamw * USHORT ByteCount; No bytes (==0)
39da6c28aaSamw *
40da6c28aaSamw * The Sid, Uid, Pid, Tid, and Mid fields of the SMB are used to locate an
41da6c28aaSamw * pending server request from this session. If a pending request is
42da6c28aaSamw * found, it is "hurried along" which may result in success or failure of
43da6c28aaSamw * the original request. No other response is generated for this SMB.
44da6c28aaSamw */
45da6c28aaSamw
46bbf6f00cSJordan Brown #include <smbsrv/smb_kproto.h>
47da6c28aaSamw
487b59d02dSjb smb_sdrc_t
smb_pre_nt_cancel(smb_request_t * sr)49faa1795aSjb smb_pre_nt_cancel(smb_request_t *sr)
50faa1795aSjb {
51*93bc28dbSGordon Ross DTRACE_SMB_START(op__NtCancel, smb_request_t *, sr);
52faa1795aSjb return (SDRC_SUCCESS);
53faa1795aSjb }
54faa1795aSjb
55faa1795aSjb void
smb_post_nt_cancel(smb_request_t * sr)56faa1795aSjb smb_post_nt_cancel(smb_request_t *sr)
57faa1795aSjb {
58*93bc28dbSGordon Ross DTRACE_SMB_DONE(op__NtCancel, smb_request_t *, sr);
59faa1795aSjb }
60faa1795aSjb
615677e049SGordon Ross /*
625677e049SGordon Ross * Dispatch handler for SMB_COM_NT_CANCEL.
635677e049SGordon Ross * Note that Cancel does NOT get a response.
645677e049SGordon Ross *
655677e049SGordon Ross * SMB NT Cancel has an inherent race with the request being
665677e049SGordon Ross * cancelled. See comments at smb_request_cancel().
675677e049SGordon Ross */
68faa1795aSjb smb_sdrc_t
smb_com_nt_cancel(smb_request_t * sr)69faa1795aSjb smb_com_nt_cancel(smb_request_t *sr)
70da6c28aaSamw {
71da6c28aaSamw struct smb_request *req;
72da6c28aaSamw struct smb_session *session;
735677e049SGordon Ross int cnt = 0;
74da6c28aaSamw
75da6c28aaSamw session = sr->session;
76da6c28aaSamw
77da6c28aaSamw smb_slist_enter(&session->s_req_list);
78da6c28aaSamw req = smb_slist_head(&session->s_req_list);
79da6c28aaSamw while (req) {
80da6c28aaSamw ASSERT(req->sr_magic == SMB_REQ_MAGIC);
81da6c28aaSamw if ((req != sr) &&
82da6c28aaSamw (req->smb_uid == sr->smb_uid) &&
83da6c28aaSamw (req->smb_pid == sr->smb_pid) &&
84da6c28aaSamw (req->smb_tid == sr->smb_tid) &&
85da6c28aaSamw (req->smb_mid == sr->smb_mid)) {
86da6c28aaSamw smb_request_cancel(req);
875677e049SGordon Ross cnt++;
88da6c28aaSamw }
89da6c28aaSamw req = smb_slist_next(&session->s_req_list, req);
90da6c28aaSamw }
915677e049SGordon Ross if (cnt != 1) {
925677e049SGordon Ross DTRACE_PROBE2(smb__ntcancel__error,
935677e049SGordon Ross uint16_t, sr->smb_mid, int, cnt);
945677e049SGordon Ross }
95da6c28aaSamw smb_slist_exit(&session->s_req_list);
96da6c28aaSamw
97da6c28aaSamw return (SDRC_NO_REPLY);
98da6c28aaSamw }
995677e049SGordon Ross
1005677e049SGordon Ross /*
1015677e049SGordon Ross * This handles an SMB_COM_NT_CANCEL request when seen in the reader.
1025677e049SGordon Ross * (See smb1sr_newrq) Handle this immediately, rather than
1035677e049SGordon Ross * going through the normal taskq dispatch mechanism.
1045677e049SGordon Ross * Note that Cancel does NOT get a response.
1055677e049SGordon Ross */
1065677e049SGordon Ross int
smb1sr_newrq_cancel(smb_request_t * sr)1075677e049SGordon Ross smb1sr_newrq_cancel(smb_request_t *sr)
1085677e049SGordon Ross {
1095677e049SGordon Ross (void) smb_pre_nt_cancel(sr);
1105677e049SGordon Ross (void) smb_com_nt_cancel(sr);
1115677e049SGordon Ross smb_post_nt_cancel(sr);
1125677e049SGordon Ross return (0);
1135677e049SGordon Ross }
114