smb3: Add new parm "nodelete"
[linux-block.git] / fs / cifs / transport.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/transport.c
3 *
ad7a2926 4 * Copyright (C) International Business Machines Corp., 2002,2008
1da177e4 5 * Author(s): Steve French (sfrench@us.ibm.com)
14a441a2 6 * Jeremy Allison (jra@samba.org) 2006.
79a58d1f 7 *
1da177e4
LT
8 * This library is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser General Public License as published
10 * by the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
16 * the GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this library; if not, write to the Free Software
79a58d1f 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1da177e4
LT
21 */
22
23#include <linux/fs.h>
24#include <linux/list.h>
5a0e3ad6 25#include <linux/gfp.h>
1da177e4
LT
26#include <linux/wait.h>
27#include <linux/net.h>
28#include <linux/delay.h>
f06ac72e 29#include <linux/freezer.h>
b8eed283 30#include <linux/tcp.h>
2f8b5444 31#include <linux/bvec.h>
97bc00b3 32#include <linux/highmem.h>
7c0f6ba6 33#include <linux/uaccess.h>
1da177e4
LT
34#include <asm/processor.h>
35#include <linux/mempool.h>
14e25977 36#include <linux/sched/signal.h>
1da177e4
LT
37#include "cifspdu.h"
38#include "cifsglob.h"
39#include "cifsproto.h"
40#include "cifs_debug.h"
8bd68c6e 41#include "smb2proto.h"
9762c2d0 42#include "smbdirect.h"
50c2f753 43
3cecf486
RS
44/* Max number of iovectors we can use off the stack when sending requests. */
45#define CIFS_MAX_IOV_SIZE 8
46
2dc7e1c0
PS
47void
48cifs_wake_up_task(struct mid_q_entry *mid)
2b84a36c
JL
49{
50 wake_up_process(mid->callback_data);
51}
52
a6827c18 53struct mid_q_entry *
24b9b06b 54AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
1da177e4
LT
55{
56 struct mid_q_entry *temp;
57
24b9b06b 58 if (server == NULL) {
f96637be 59 cifs_dbg(VFS, "Null TCP session in AllocMidQEntry\n");
1da177e4
LT
60 return NULL;
61 }
50c2f753 62
232087cb 63 temp = mempool_alloc(cifs_mid_poolp, GFP_NOFS);
a6f74e80 64 memset(temp, 0, sizeof(struct mid_q_entry));
696e420b 65 kref_init(&temp->refcount);
a6f74e80
N
66 temp->mid = get_mid(smb_buffer);
67 temp->pid = current->pid;
68 temp->command = cpu_to_le16(smb_buffer->Command);
69 cifs_dbg(FYI, "For smb_command %d\n", smb_buffer->Command);
1047abc1 70 /* do_gettimeofday(&temp->when_sent);*/ /* easier to use jiffies */
a6f74e80
N
71 /* when mid allocated can be before when sent */
72 temp->when_alloc = jiffies;
73 temp->server = server;
2b84a36c 74
a6f74e80
N
75 /*
76 * The default is for the mid to be synchronous, so the
77 * default callback just wakes up the current task.
78 */
f1f27ad7
VW
79 get_task_struct(current);
80 temp->creator = current;
a6f74e80
N
81 temp->callback = cifs_wake_up_task;
82 temp->callback_data = current;
1da177e4 83
1da177e4 84 atomic_inc(&midCount);
7c9421e1 85 temp->mid_state = MID_REQUEST_ALLOCATED;
1da177e4
LT
86 return temp;
87}
88
696e420b
LP
89static void _cifs_mid_q_entry_release(struct kref *refcount)
90{
abe57073
PS
91 struct mid_q_entry *midEntry =
92 container_of(refcount, struct mid_q_entry, refcount);
1047abc1 93#ifdef CONFIG_CIFS_STATS2
2dc7e1c0 94 __le16 command = midEntry->server->vals->lock_cmd;
433b8dd7 95 __u16 smb_cmd = le16_to_cpu(midEntry->command);
1047abc1 96 unsigned long now;
433b8dd7 97 unsigned long roundtrip_time;
1047abc1 98#endif
7b71843f
PS
99 struct TCP_Server_Info *server = midEntry->server;
100
101 if (midEntry->resp_buf && (midEntry->mid_flags & MID_WAIT_CANCELLED) &&
102 midEntry->mid_state == MID_RESPONSE_RECEIVED &&
103 server->ops->handle_cancelled_mid)
104 server->ops->handle_cancelled_mid(midEntry->resp_buf, server);
105
7c9421e1 106 midEntry->mid_state = MID_FREE;
8097531a 107 atomic_dec(&midCount);
7c9421e1 108 if (midEntry->large_buf)
b8643e1b
SF
109 cifs_buf_release(midEntry->resp_buf);
110 else
111 cifs_small_buf_release(midEntry->resp_buf);
1047abc1
SF
112#ifdef CONFIG_CIFS_STATS2
113 now = jiffies;
433b8dd7 114 if (now < midEntry->when_alloc)
afe6f653 115 cifs_server_dbg(VFS, "invalid mid allocation time\n");
433b8dd7
SF
116 roundtrip_time = now - midEntry->when_alloc;
117
118 if (smb_cmd < NUMBER_OF_SMB2_COMMANDS) {
119 if (atomic_read(&server->num_cmds[smb_cmd]) == 0) {
120 server->slowest_cmd[smb_cmd] = roundtrip_time;
121 server->fastest_cmd[smb_cmd] = roundtrip_time;
122 } else {
123 if (server->slowest_cmd[smb_cmd] < roundtrip_time)
124 server->slowest_cmd[smb_cmd] = roundtrip_time;
125 else if (server->fastest_cmd[smb_cmd] > roundtrip_time)
126 server->fastest_cmd[smb_cmd] = roundtrip_time;
127 }
128 cifs_stats_inc(&server->num_cmds[smb_cmd]);
129 server->time_per_cmd[smb_cmd] += roundtrip_time;
130 }
00778e22
SF
131 /*
132 * commands taking longer than one second (default) can be indications
133 * that something is wrong, unless it is quite a slow link or a very
134 * busy server. Note that this calc is unlikely or impossible to wrap
135 * as long as slow_rsp_threshold is not set way above recommended max
136 * value (32767 ie 9 hours) and is generally harmless even if wrong
137 * since only affects debug counters - so leaving the calc as simple
138 * comparison rather than doing multiple conversions and overflow
139 * checks
140 */
141 if ((slow_rsp_threshold != 0) &&
142 time_after(now, midEntry->when_alloc + (slow_rsp_threshold * HZ)) &&
020eec5f 143 (midEntry->command != command)) {
f5942db5
SF
144 /*
145 * smb2slowcmd[NUMBER_OF_SMB2_COMMANDS] counts by command
146 * NB: le16_to_cpu returns unsigned so can not be negative below
147 */
433b8dd7
SF
148 if (smb_cmd < NUMBER_OF_SMB2_COMMANDS)
149 cifs_stats_inc(&server->smb2slowcmd[smb_cmd]);
468d6779 150
433b8dd7 151 trace_smb3_slow_rsp(smb_cmd, midEntry->mid, midEntry->pid,
020eec5f
SF
152 midEntry->when_sent, midEntry->when_received);
153 if (cifsFYI & CIFS_TIMER) {
0b456f04 154 pr_debug(" CIFS slow rsp: cmd %d mid %llu",
1047abc1 155 midEntry->command, midEntry->mid);
f80eaedd 156 cifs_info(" A: 0x%lx S: 0x%lx R: 0x%lx\n",
1047abc1
SF
157 now - midEntry->when_alloc,
158 now - midEntry->when_sent,
159 now - midEntry->when_received);
160 }
161 }
162#endif
f1f27ad7 163 put_task_struct(midEntry->creator);
abe57073
PS
164
165 mempool_free(midEntry, cifs_mid_poolp);
166}
167
168void cifs_mid_q_entry_release(struct mid_q_entry *midEntry)
169{
170 spin_lock(&GlobalMid_Lock);
171 kref_put(&midEntry->refcount, _cifs_mid_q_entry_release);
172 spin_unlock(&GlobalMid_Lock);
173}
174
175void DeleteMidQEntry(struct mid_q_entry *midEntry)
176{
696e420b 177 cifs_mid_q_entry_release(midEntry);
1da177e4
LT
178}
179
3c1bf7e4
PS
180void
181cifs_delete_mid(struct mid_q_entry *mid)
ddc8cf8f
JL
182{
183 spin_lock(&GlobalMid_Lock);
abe57073
PS
184 if (!(mid->mid_flags & MID_DELETED)) {
185 list_del_init(&mid->qhead);
186 mid->mid_flags |= MID_DELETED;
187 }
ddc8cf8f
JL
188 spin_unlock(&GlobalMid_Lock);
189
190 DeleteMidQEntry(mid);
191}
192
6f49f46b
JL
193/*
194 * smb_send_kvec - send an array of kvecs to the server
195 * @server: Server to send the data to
3ab3f2a1 196 * @smb_msg: Message to send
6f49f46b
JL
197 * @sent: amount of data sent on socket is stored here
198 *
199 * Our basic "send data to server" function. Should be called with srv_mutex
200 * held. The caller is responsible for handling the results.
201 */
d6e04ae6 202static int
3ab3f2a1
AV
203smb_send_kvec(struct TCP_Server_Info *server, struct msghdr *smb_msg,
204 size_t *sent)
1da177e4
LT
205{
206 int rc = 0;
3ab3f2a1 207 int retries = 0;
edf1ae40 208 struct socket *ssocket = server->ssocket;
50c2f753 209
6f49f46b
JL
210 *sent = 0;
211
3ab3f2a1
AV
212 smb_msg->msg_name = (struct sockaddr *) &server->dstaddr;
213 smb_msg->msg_namelen = sizeof(struct sockaddr);
214 smb_msg->msg_control = NULL;
215 smb_msg->msg_controllen = 0;
0496e02d 216 if (server->noblocksnd)
3ab3f2a1 217 smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
edf1ae40 218 else
3ab3f2a1 219 smb_msg->msg_flags = MSG_NOSIGNAL;
1da177e4 220
3ab3f2a1 221 while (msg_data_left(smb_msg)) {
6f49f46b
JL
222 /*
223 * If blocking send, we try 3 times, since each can block
224 * for 5 seconds. For nonblocking we have to try more
225 * but wait increasing amounts of time allowing time for
226 * socket to clear. The overall time we wait in either
227 * case to send on the socket is about 15 seconds.
228 * Similarly we wait for 15 seconds for a response from
229 * the server in SendReceive[2] for the server to send
230 * a response back for most types of requests (except
231 * SMB Write past end of file which can be slow, and
232 * blocking lock operations). NFS waits slightly longer
233 * than CIFS, but this can make it take longer for
234 * nonresponsive servers to be detected and 15 seconds
235 * is more than enough time for modern networks to
236 * send a packet. In most cases if we fail to send
237 * after the retries we will kill the socket and
238 * reconnect which may clear the network problem.
239 */
3ab3f2a1 240 rc = sock_sendmsg(ssocket, smb_msg);
ce6c44e4 241 if (rc == -EAGAIN) {
3ab3f2a1
AV
242 retries++;
243 if (retries >= 14 ||
244 (!server->noblocksnd && (retries > 2))) {
afe6f653 245 cifs_server_dbg(VFS, "sends on sock %p stuck for 15 seconds\n",
f96637be 246 ssocket);
3ab3f2a1 247 return -EAGAIN;
1da177e4 248 }
3ab3f2a1 249 msleep(1 << retries);
1da177e4
LT
250 continue;
251 }
6f49f46b 252
79a58d1f 253 if (rc < 0)
3ab3f2a1 254 return rc;
6f49f46b 255
79a58d1f 256 if (rc == 0) {
3e84469d
SF
257 /* should never happen, letting socket clear before
258 retrying is our only obvious option here */
afe6f653 259 cifs_server_dbg(VFS, "tcp sent no data\n");
3e84469d
SF
260 msleep(500);
261 continue;
d6e04ae6 262 }
6f49f46b 263
3ab3f2a1
AV
264 /* send was at least partially successful */
265 *sent += rc;
266 retries = 0; /* in case we get ENOSPC on the next send */
1da177e4 267 }
3ab3f2a1 268 return 0;
97bc00b3
JL
269}
270
35e2cc1b 271unsigned long
81f39f95 272smb_rqst_len(struct TCP_Server_Info *server, struct smb_rqst *rqst)
a26054d1
JL
273{
274 unsigned int i;
35e2cc1b
PA
275 struct kvec *iov;
276 int nvec;
a26054d1
JL
277 unsigned long buflen = 0;
278
81f39f95
RS
279 if (server->vals->header_preamble_size == 0 &&
280 rqst->rq_nvec >= 2 && rqst->rq_iov[0].iov_len == 4) {
35e2cc1b
PA
281 iov = &rqst->rq_iov[1];
282 nvec = rqst->rq_nvec - 1;
283 } else {
284 iov = rqst->rq_iov;
285 nvec = rqst->rq_nvec;
286 }
287
a26054d1 288 /* total up iov array first */
35e2cc1b 289 for (i = 0; i < nvec; i++)
a26054d1
JL
290 buflen += iov[i].iov_len;
291
c06a0f2d
LL
292 /*
293 * Add in the page array if there is one. The caller needs to make
294 * sure rq_offset and rq_tailsz are set correctly. If a buffer of
295 * multiple pages ends at page boundary, rq_tailsz needs to be set to
296 * PAGE_SIZE.
297 */
a26054d1 298 if (rqst->rq_npages) {
c06a0f2d
LL
299 if (rqst->rq_npages == 1)
300 buflen += rqst->rq_tailsz;
301 else {
302 /*
303 * If there is more than one page, calculate the
304 * buffer length based on rq_offset and rq_tailsz
305 */
306 buflen += rqst->rq_pagesz * (rqst->rq_npages - 1) -
307 rqst->rq_offset;
308 buflen += rqst->rq_tailsz;
309 }
a26054d1
JL
310 }
311
312 return buflen;
313}
314
6f49f46b 315static int
07cd952f
RS
316__smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
317 struct smb_rqst *rqst)
6f49f46b 318{
07cd952f
RS
319 int rc = 0;
320 struct kvec *iov;
321 int n_vec;
322 unsigned int send_length = 0;
323 unsigned int i, j;
b30c74c7 324 sigset_t mask, oldmask;
3ab3f2a1 325 size_t total_len = 0, sent, size;
b8eed283 326 struct socket *ssocket = server->ssocket;
3ab3f2a1 327 struct msghdr smb_msg;
b8eed283 328 int val = 1;
c713c877
RS
329 __be32 rfc1002_marker;
330
4357d45f
LL
331 if (cifs_rdma_enabled(server)) {
332 /* return -EAGAIN when connecting or reconnecting */
333 rc = -EAGAIN;
334 if (server->smbd_conn)
335 rc = smbd_send(server, num_rqst, rqst);
9762c2d0
LL
336 goto smbd_done;
337 }
afc18a6f 338
ea702b80 339 if (ssocket == NULL)
afc18a6f 340 return -EAGAIN;
ea702b80 341
b30c74c7
PS
342 if (signal_pending(current)) {
343 cifs_dbg(FYI, "signal is pending before sending any data\n");
344 return -EINTR;
345 }
346
b8eed283
JL
347 /* cork the socket */
348 kernel_setsockopt(ssocket, SOL_TCP, TCP_CORK,
349 (char *)&val, sizeof(val));
350
07cd952f 351 for (j = 0; j < num_rqst; j++)
81f39f95 352 send_length += smb_rqst_len(server, &rqst[j]);
07cd952f
RS
353 rfc1002_marker = cpu_to_be32(send_length);
354
b30c74c7
PS
355 /*
356 * We should not allow signals to interrupt the network send because
357 * any partial send will cause session reconnects thus increasing
358 * latency of system calls and overload a server with unnecessary
359 * requests.
360 */
361
362 sigfillset(&mask);
363 sigprocmask(SIG_BLOCK, &mask, &oldmask);
364
c713c877
RS
365 /* Generate a rfc1002 marker for SMB2+ */
366 if (server->vals->header_preamble_size == 0) {
367 struct kvec hiov = {
368 .iov_base = &rfc1002_marker,
369 .iov_len = 4
370 };
aa563d7b 371 iov_iter_kvec(&smb_msg.msg_iter, WRITE, &hiov, 1, 4);
c713c877
RS
372 rc = smb_send_kvec(server, &smb_msg, &sent);
373 if (rc < 0)
b30c74c7 374 goto unmask;
c713c877
RS
375
376 total_len += sent;
377 send_length += 4;
378 }
379
662bf5bc
PA
380 cifs_dbg(FYI, "Sending smb: smb_len=%u\n", send_length);
381
07cd952f
RS
382 for (j = 0; j < num_rqst; j++) {
383 iov = rqst[j].rq_iov;
384 n_vec = rqst[j].rq_nvec;
3ab3f2a1 385
07cd952f 386 size = 0;
662bf5bc
PA
387 for (i = 0; i < n_vec; i++) {
388 dump_smb(iov[i].iov_base, iov[i].iov_len);
07cd952f 389 size += iov[i].iov_len;
662bf5bc 390 }
97bc00b3 391
aa563d7b 392 iov_iter_kvec(&smb_msg.msg_iter, WRITE, iov, n_vec, size);
97bc00b3 393
3ab3f2a1 394 rc = smb_send_kvec(server, &smb_msg, &sent);
97bc00b3 395 if (rc < 0)
b30c74c7 396 goto unmask;
97bc00b3
JL
397
398 total_len += sent;
07cd952f
RS
399
400 /* now walk the page array and send each page in it */
401 for (i = 0; i < rqst[j].rq_npages; i++) {
402 struct bio_vec bvec;
403
404 bvec.bv_page = rqst[j].rq_pages[i];
405 rqst_page_get_length(&rqst[j], i, &bvec.bv_len,
406 &bvec.bv_offset);
407
aa563d7b 408 iov_iter_bvec(&smb_msg.msg_iter, WRITE,
07cd952f
RS
409 &bvec, 1, bvec.bv_len);
410 rc = smb_send_kvec(server, &smb_msg, &sent);
411 if (rc < 0)
412 break;
413
414 total_len += sent;
415 }
97bc00b3 416 }
1da177e4 417
b30c74c7
PS
418unmask:
419 sigprocmask(SIG_SETMASK, &oldmask, NULL);
420
421 /*
422 * If signal is pending but we have already sent the whole packet to
423 * the server we need to return success status to allow a corresponding
424 * mid entry to be kept in the pending requests queue thus allowing
425 * to handle responses from the server by the client.
426 *
427 * If only part of the packet has been sent there is no need to hide
428 * interrupt because the session will be reconnected anyway, so there
429 * won't be any response from the server to handle.
430 */
431
432 if (signal_pending(current) && (total_len != send_length)) {
433 cifs_dbg(FYI, "signal is pending after attempt to send\n");
434 rc = -EINTR;
435 }
436
b8eed283
JL
437 /* uncork it */
438 val = 0;
439 kernel_setsockopt(ssocket, SOL_TCP, TCP_CORK,
440 (char *)&val, sizeof(val));
441
c713c877 442 if ((total_len > 0) && (total_len != send_length)) {
f96637be 443 cifs_dbg(FYI, "partial send (wanted=%u sent=%zu): terminating session\n",
c713c877 444 send_length, total_len);
6f49f46b
JL
445 /*
446 * If we have only sent part of an SMB then the next SMB could
447 * be taken as the remainder of this one. We need to kill the
448 * socket so the server throws away the partial SMB
449 */
edf1ae40 450 server->tcpStatus = CifsNeedReconnect;
bf1fdeb7
SF
451 trace_smb3_partial_send_reconnect(server->CurrentMid,
452 server->hostname);
edf1ae40 453 }
9762c2d0 454smbd_done:
d804d41d 455 if (rc < 0 && rc != -EINTR)
afe6f653 456 cifs_server_dbg(VFS, "Error %d sending data on socket to server\n",
f96637be 457 rc);
ee13919c 458 else if (rc > 0)
1da177e4 459 rc = 0;
1da177e4
LT
460
461 return rc;
462}
463
6f49f46b 464static int
1f3a8f5f
RS
465smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
466 struct smb_rqst *rqst, int flags)
6f49f46b 467{
b2c96de7 468 struct kvec iov;
3946d0d0 469 struct smb2_transform_hdr *tr_hdr;
b2c96de7 470 struct smb_rqst cur_rqst[MAX_COMPOUND];
7fb8986e
PS
471 int rc;
472
473 if (!(flags & CIFS_TRANSFORM_REQ))
1f3a8f5f
RS
474 return __smb_send_rqst(server, num_rqst, rqst);
475
476 if (num_rqst > MAX_COMPOUND - 1)
477 return -ENOMEM;
7fb8986e 478
b2c96de7 479 if (!server->ops->init_transform_rq) {
afe6f653
RS
480 cifs_server_dbg(VFS, "Encryption requested but transform "
481 "callback is missing\n");
7fb8986e
PS
482 return -EIO;
483 }
6f49f46b 484
3946d0d0
LL
485 tr_hdr = kmalloc(sizeof(*tr_hdr), GFP_NOFS);
486 if (!tr_hdr)
487 return -ENOMEM;
488
489 memset(&cur_rqst[0], 0, sizeof(cur_rqst));
490 memset(&iov, 0, sizeof(iov));
491 memset(tr_hdr, 0, sizeof(*tr_hdr));
492
493 iov.iov_base = tr_hdr;
494 iov.iov_len = sizeof(*tr_hdr);
495 cur_rqst[0].rq_iov = &iov;
496 cur_rqst[0].rq_nvec = 1;
497
1f3a8f5f
RS
498 rc = server->ops->init_transform_rq(server, num_rqst + 1,
499 &cur_rqst[0], rqst);
7fb8986e 500 if (rc)
3946d0d0 501 goto out;
7fb8986e 502
1f3a8f5f
RS
503 rc = __smb_send_rqst(server, num_rqst + 1, &cur_rqst[0]);
504 smb3_free_compound_rqst(num_rqst, &cur_rqst[1]);
3946d0d0
LL
505out:
506 kfree(tr_hdr);
7fb8986e 507 return rc;
6f49f46b
JL
508}
509
0496e02d
JL
510int
511smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
512 unsigned int smb_buf_length)
513{
738f9de5 514 struct kvec iov[2];
7fb8986e
PS
515 struct smb_rqst rqst = { .rq_iov = iov,
516 .rq_nvec = 2 };
0496e02d 517
738f9de5
PS
518 iov[0].iov_base = smb_buffer;
519 iov[0].iov_len = 4;
520 iov[1].iov_base = (char *)smb_buffer + 4;
521 iov[1].iov_len = smb_buf_length;
0496e02d 522
07cd952f 523 return __smb_send_rqst(server, 1, &rqst);
0496e02d
JL
524}
525
fc40f9cf 526static int
b227d215 527wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
2b53b929
RS
528 const int timeout, const int flags,
529 unsigned int *instance)
1da177e4 530{
5bc59498 531 int rc;
4230cff8
RS
532 int *credits;
533 int optype;
2b53b929
RS
534 long int t;
535
536 if (timeout < 0)
537 t = MAX_JIFFY_OFFSET;
538 else
539 t = msecs_to_jiffies(timeout);
4230cff8
RS
540
541 optype = flags & CIFS_OP_MASK;
5bc59498 542
34f4deb7
PS
543 *instance = 0;
544
4230cff8
RS
545 credits = server->ops->get_credits_field(server, optype);
546 /* Since an echo is already inflight, no need to wait to send another */
547 if (*credits <= 0 && optype == CIFS_ECHO_OP)
548 return -EAGAIN;
549
fc40f9cf 550 spin_lock(&server->req_lock);
392e1c5d 551 if ((flags & CIFS_TIMEOUT_MASK) == CIFS_NON_BLOCKING) {
1da177e4 552 /* oplock breaks must not be held up */
fc40f9cf 553 server->in_flight++;
1b63f184
SF
554 if (server->in_flight > server->max_in_flight)
555 server->max_in_flight = server->in_flight;
bc205ed1 556 *credits -= 1;
34f4deb7 557 *instance = server->reconnect_instance;
fc40f9cf 558 spin_unlock(&server->req_lock);
27a97a61
VL
559 return 0;
560 }
561
27a97a61 562 while (1) {
b227d215 563 if (*credits < num_credits) {
fc40f9cf 564 spin_unlock(&server->req_lock);
789e6661 565 cifs_num_waiters_inc(server);
2b53b929
RS
566 rc = wait_event_killable_timeout(server->request_q,
567 has_credits(server, credits, num_credits), t);
789e6661 568 cifs_num_waiters_dec(server);
2b53b929 569 if (!rc) {
7937ca96
SF
570 trace_smb3_credit_timeout(server->CurrentMid,
571 server->hostname, num_credits);
afe6f653 572 cifs_server_dbg(VFS, "wait timed out after %d ms\n",
2b53b929
RS
573 timeout);
574 return -ENOTSUPP;
575 }
576 if (rc == -ERESTARTSYS)
577 return -ERESTARTSYS;
fc40f9cf 578 spin_lock(&server->req_lock);
27a97a61 579 } else {
c5797a94 580 if (server->tcpStatus == CifsExiting) {
fc40f9cf 581 spin_unlock(&server->req_lock);
27a97a61 582 return -ENOENT;
1da177e4 583 }
27a97a61 584
16b34aa4
RS
585 /*
586 * For normal commands, reserve the last MAX_COMPOUND
587 * credits to compound requests.
588 * Otherwise these compounds could be permanently
589 * starved for credits by single-credit requests.
590 *
591 * To prevent spinning CPU, block this thread until
592 * there are >MAX_COMPOUND credits available.
593 * But only do this is we already have a lot of
594 * credits in flight to avoid triggering this check
595 * for servers that are slow to hand out credits on
596 * new sessions.
597 */
598 if (!optype && num_credits == 1 &&
599 server->in_flight > 2 * MAX_COMPOUND &&
600 *credits <= MAX_COMPOUND) {
601 spin_unlock(&server->req_lock);
602 cifs_num_waiters_inc(server);
2b53b929
RS
603 rc = wait_event_killable_timeout(
604 server->request_q,
16b34aa4 605 has_credits(server, credits,
2b53b929
RS
606 MAX_COMPOUND + 1),
607 t);
16b34aa4 608 cifs_num_waiters_dec(server);
2b53b929 609 if (!rc) {
7937ca96
SF
610 trace_smb3_credit_timeout(
611 server->CurrentMid,
612 server->hostname, num_credits);
afe6f653 613 cifs_server_dbg(VFS, "wait timed out after %d ms\n",
2b53b929
RS
614 timeout);
615 return -ENOTSUPP;
616 }
617 if (rc == -ERESTARTSYS)
618 return -ERESTARTSYS;
16b34aa4
RS
619 spin_lock(&server->req_lock);
620 continue;
621 }
622
2d86dbc9
PS
623 /*
624 * Can not count locking commands against total
625 * as they are allowed to block on server.
626 */
27a97a61
VL
627
628 /* update # of requests on the wire to server */
4230cff8 629 if ((flags & CIFS_TIMEOUT_MASK) != CIFS_BLOCKING_OP) {
b227d215
RS
630 *credits -= num_credits;
631 server->in_flight += num_credits;
1b63f184
SF
632 if (server->in_flight > server->max_in_flight)
633 server->max_in_flight = server->in_flight;
34f4deb7 634 *instance = server->reconnect_instance;
2d86dbc9 635 }
fc40f9cf 636 spin_unlock(&server->req_lock);
27a97a61 637 break;
1da177e4
LT
638 }
639 }
7ee1af76
JA
640 return 0;
641}
1da177e4 642
bc205ed1 643static int
480b1cb9
RS
644wait_for_free_request(struct TCP_Server_Info *server, const int flags,
645 unsigned int *instance)
bc205ed1 646{
2b53b929
RS
647 return wait_for_free_credits(server, 1, -1, flags,
648 instance);
bc205ed1
PS
649}
650
257b7809
RS
651static int
652wait_for_compound_request(struct TCP_Server_Info *server, int num,
653 const int flags, unsigned int *instance)
654{
655 int *credits;
656
657 credits = server->ops->get_credits_field(server, flags & CIFS_OP_MASK);
658
659 spin_lock(&server->req_lock);
660 if (*credits < num) {
661 /*
662 * Return immediately if not too many requests in flight since
663 * we will likely be stuck on waiting for credits.
664 */
665 if (server->in_flight < num - *credits) {
666 spin_unlock(&server->req_lock);
667 return -ENOTSUPP;
668 }
669 }
670 spin_unlock(&server->req_lock);
671
672 return wait_for_free_credits(server, num, 60000, flags,
673 instance);
674}
675
cb7e9eab
PS
676int
677cifs_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
335b7b62 678 unsigned int *num, struct cifs_credits *credits)
cb7e9eab
PS
679{
680 *num = size;
335b7b62
PS
681 credits->value = 0;
682 credits->instance = server->reconnect_instance;
cb7e9eab
PS
683 return 0;
684}
685
96daf2b0 686static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
7ee1af76
JA
687 struct mid_q_entry **ppmidQ)
688{
1da177e4 689 if (ses->server->tcpStatus == CifsExiting) {
7ee1af76 690 return -ENOENT;
8fbbd365
VL
691 }
692
693 if (ses->server->tcpStatus == CifsNeedReconnect) {
f96637be 694 cifs_dbg(FYI, "tcp session dead - return to caller to retry\n");
7ee1af76 695 return -EAGAIN;
8fbbd365
VL
696 }
697
7f48558e 698 if (ses->status == CifsNew) {
79a58d1f 699 if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) &&
ad7a2926 700 (in_buf->Command != SMB_COM_NEGOTIATE))
7ee1af76 701 return -EAGAIN;
ad7a2926 702 /* else ok - we are setting up session */
1da177e4 703 }
7f48558e
SP
704
705 if (ses->status == CifsExiting) {
706 /* check if SMB session is bad because we are setting it up */
707 if (in_buf->Command != SMB_COM_LOGOFF_ANDX)
708 return -EAGAIN;
709 /* else ok - we are shutting down session */
710 }
711
24b9b06b 712 *ppmidQ = AllocMidQEntry(in_buf, ses->server);
26f57364 713 if (*ppmidQ == NULL)
7ee1af76 714 return -ENOMEM;
ddc8cf8f
JL
715 spin_lock(&GlobalMid_Lock);
716 list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q);
717 spin_unlock(&GlobalMid_Lock);
7ee1af76
JA
718 return 0;
719}
720
0ade640e
JL
721static int
722wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
7ee1af76 723{
0ade640e 724 int error;
7ee1af76 725
5853cc2a 726 error = wait_event_freezekillable_unsafe(server->response_q,
7c9421e1 727 midQ->mid_state != MID_REQUEST_SUBMITTED);
0ade640e
JL
728 if (error < 0)
729 return -ERESTARTSYS;
7ee1af76 730
0ade640e 731 return 0;
7ee1af76
JA
732}
733
fec344e3
JL
734struct mid_q_entry *
735cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
792af7b0
PS
736{
737 int rc;
fec344e3 738 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
792af7b0
PS
739 struct mid_q_entry *mid;
740
738f9de5
PS
741 if (rqst->rq_iov[0].iov_len != 4 ||
742 rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base)
743 return ERR_PTR(-EIO);
744
792af7b0 745 /* enable signing if server requires it */
38d77c50 746 if (server->sign)
792af7b0
PS
747 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
748
749 mid = AllocMidQEntry(hdr, server);
750 if (mid == NULL)
fec344e3 751 return ERR_PTR(-ENOMEM);
792af7b0 752
fec344e3 753 rc = cifs_sign_rqst(rqst, server, &mid->sequence_number);
ffc61ccb
SP
754 if (rc) {
755 DeleteMidQEntry(mid);
fec344e3 756 return ERR_PTR(rc);
ffc61ccb
SP
757 }
758
fec344e3 759 return mid;
792af7b0 760}
133672ef 761
a6827c18
JL
762/*
763 * Send a SMB request and set the callback function in the mid to handle
764 * the result. Caller is responsible for dealing with timeouts.
765 */
766int
fec344e3 767cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst,
9b7c18a2 768 mid_receive_t *receive, mid_callback_t *callback,
3349c3a7
PS
769 mid_handle_t *handle, void *cbdata, const int flags,
770 const struct cifs_credits *exist_credits)
a6827c18 771{
480b1cb9 772 int rc;
a6827c18 773 struct mid_q_entry *mid;
335b7b62 774 struct cifs_credits credits = { .value = 0, .instance = 0 };
34f4deb7 775 unsigned int instance;
480b1cb9 776 int optype;
a6827c18 777
a891f0f8
PS
778 optype = flags & CIFS_OP_MASK;
779
cb7e9eab 780 if ((flags & CIFS_HAS_CREDITS) == 0) {
480b1cb9 781 rc = wait_for_free_request(server, flags, &instance);
cb7e9eab
PS
782 if (rc)
783 return rc;
335b7b62 784 credits.value = 1;
34f4deb7 785 credits.instance = instance;
3349c3a7
PS
786 } else
787 instance = exist_credits->instance;
a6827c18
JL
788
789 mutex_lock(&server->srv_mutex);
3349c3a7
PS
790
791 /*
792 * We can't use credits obtained from the previous session to send this
793 * request. Check if there were reconnects after we obtained credits and
794 * return -EAGAIN in such cases to let callers handle it.
795 */
796 if (instance != server->reconnect_instance) {
797 mutex_unlock(&server->srv_mutex);
798 add_credits_and_wake_if(server, &credits, optype);
799 return -EAGAIN;
800 }
801
fec344e3
JL
802 mid = server->ops->setup_async_request(server, rqst);
803 if (IS_ERR(mid)) {
a6827c18 804 mutex_unlock(&server->srv_mutex);
335b7b62 805 add_credits_and_wake_if(server, &credits, optype);
fec344e3 806 return PTR_ERR(mid);
a6827c18
JL
807 }
808
44d22d84 809 mid->receive = receive;
a6827c18
JL
810 mid->callback = callback;
811 mid->callback_data = cbdata;
9b7c18a2 812 mid->handle = handle;
7c9421e1 813 mid->mid_state = MID_REQUEST_SUBMITTED;
789e6661 814
ffc61ccb
SP
815 /* put it on the pending_mid_q */
816 spin_lock(&GlobalMid_Lock);
817 list_add_tail(&mid->qhead, &server->pending_mid_q);
818 spin_unlock(&GlobalMid_Lock);
819
93d2cb6c
LL
820 /*
821 * Need to store the time in mid before calling I/O. For call_async,
822 * I/O response may come back and free the mid entry on another thread.
823 */
824 cifs_save_when_sent(mid);
789e6661 825 cifs_in_send_inc(server);
1f3a8f5f 826 rc = smb_send_rqst(server, 1, rqst, flags);
789e6661 827 cifs_in_send_dec(server);
ad313cb8 828
820962dc 829 if (rc < 0) {
c781af7e 830 revert_current_mid(server, mid->credits);
ad313cb8 831 server->sequence_number -= 2;
820962dc
RV
832 cifs_delete_mid(mid);
833 }
834
a6827c18 835 mutex_unlock(&server->srv_mutex);
789e6661 836
ffc61ccb
SP
837 if (rc == 0)
838 return 0;
a6827c18 839
335b7b62 840 add_credits_and_wake_if(server, &credits, optype);
a6827c18
JL
841 return rc;
842}
843
133672ef
SF
844/*
845 *
846 * Send an SMB Request. No response info (other than return code)
847 * needs to be parsed.
848 *
849 * flags indicate the type of request buffer and how long to wait
850 * and whether to log NT STATUS code (error) before mapping it to POSIX error
851 *
852 */
853int
96daf2b0 854SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
792af7b0 855 char *in_buf, int flags)
133672ef
SF
856{
857 int rc;
858 struct kvec iov[1];
da502f7d 859 struct kvec rsp_iov;
133672ef
SF
860 int resp_buf_type;
861
792af7b0
PS
862 iov[0].iov_base = in_buf;
863 iov[0].iov_len = get_rfc1002_length(in_buf) + 4;
392e1c5d 864 flags |= CIFS_NO_RSP_BUF;
da502f7d 865 rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags, &rsp_iov);
f96637be 866 cifs_dbg(NOISY, "SendRcvNoRsp flags %d rc %d\n", flags, rc);
90c81e0b 867
133672ef
SF
868 return rc;
869}
870
053d5034 871static int
3c1105df 872cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
053d5034
JL
873{
874 int rc = 0;
875
f96637be
JP
876 cifs_dbg(FYI, "%s: cmd=%d mid=%llu state=%d\n",
877 __func__, le16_to_cpu(mid->command), mid->mid, mid->mid_state);
053d5034 878
74dd92a8 879 spin_lock(&GlobalMid_Lock);
7c9421e1 880 switch (mid->mid_state) {
74dd92a8 881 case MID_RESPONSE_RECEIVED:
053d5034
JL
882 spin_unlock(&GlobalMid_Lock);
883 return rc;
74dd92a8
JL
884 case MID_RETRY_NEEDED:
885 rc = -EAGAIN;
886 break;
71823baf
JL
887 case MID_RESPONSE_MALFORMED:
888 rc = -EIO;
889 break;
3c1105df
JL
890 case MID_SHUTDOWN:
891 rc = -EHOSTDOWN;
892 break;
74dd92a8 893 default:
abe57073
PS
894 if (!(mid->mid_flags & MID_DELETED)) {
895 list_del_init(&mid->qhead);
896 mid->mid_flags |= MID_DELETED;
897 }
afe6f653 898 cifs_server_dbg(VFS, "%s: invalid mid state mid=%llu state=%d\n",
f96637be 899 __func__, mid->mid, mid->mid_state);
74dd92a8 900 rc = -EIO;
053d5034
JL
901 }
902 spin_unlock(&GlobalMid_Lock);
903
2b84a36c 904 DeleteMidQEntry(mid);
053d5034
JL
905 return rc;
906}
907
121b046a 908static inline int
fb2036d8
PS
909send_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
910 struct mid_q_entry *mid)
76dcc26f 911{
121b046a 912 return server->ops->send_cancel ?
fb2036d8 913 server->ops->send_cancel(server, rqst, mid) : 0;
76dcc26f
JL
914}
915
2c8f981d
JL
916int
917cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
918 bool log_error)
919{
792af7b0 920 unsigned int len = get_rfc1002_length(mid->resp_buf) + 4;
826a95e4
JL
921
922 dump_smb(mid->resp_buf, min_t(u32, 92, len));
2c8f981d
JL
923
924 /* convert the length into a more usable form */
38d77c50 925 if (server->sign) {
738f9de5 926 struct kvec iov[2];
985e4ff0 927 int rc = 0;
738f9de5
PS
928 struct smb_rqst rqst = { .rq_iov = iov,
929 .rq_nvec = 2 };
826a95e4 930
738f9de5
PS
931 iov[0].iov_base = mid->resp_buf;
932 iov[0].iov_len = 4;
933 iov[1].iov_base = (char *)mid->resp_buf + 4;
934 iov[1].iov_len = len - 4;
2c8f981d 935 /* FIXME: add code to kill session */
bf5ea0e2 936 rc = cifs_verify_signature(&rqst, server,
0124cc45 937 mid->sequence_number);
985e4ff0 938 if (rc)
afe6f653 939 cifs_server_dbg(VFS, "SMB signature verification returned error = %d\n",
f96637be 940 rc);
2c8f981d
JL
941 }
942
943 /* BB special case reconnect tid and uid here? */
944 return map_smb_to_linux_error(mid->resp_buf, log_error);
945}
946
fec344e3 947struct mid_q_entry *
f780bd3f
AA
948cifs_setup_request(struct cifs_ses *ses, struct TCP_Server_Info *ignored,
949 struct smb_rqst *rqst)
792af7b0
PS
950{
951 int rc;
fec344e3 952 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
792af7b0
PS
953 struct mid_q_entry *mid;
954
738f9de5
PS
955 if (rqst->rq_iov[0].iov_len != 4 ||
956 rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base)
957 return ERR_PTR(-EIO);
958
792af7b0
PS
959 rc = allocate_mid(ses, hdr, &mid);
960 if (rc)
fec344e3
JL
961 return ERR_PTR(rc);
962 rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number);
963 if (rc) {
3c1bf7e4 964 cifs_delete_mid(mid);
fec344e3
JL
965 return ERR_PTR(rc);
966 }
967 return mid;
792af7b0
PS
968}
969
4e34feb5 970static void
ee258d79 971cifs_compound_callback(struct mid_q_entry *mid)
8a26f0f7
PS
972{
973 struct TCP_Server_Info *server = mid->server;
34f4deb7
PS
974 struct cifs_credits credits;
975
976 credits.value = server->ops->get_credits(mid);
977 credits.instance = server->reconnect_instance;
8a26f0f7 978
34f4deb7 979 add_credits(server, &credits, mid->optype);
8a26f0f7
PS
980}
981
ee258d79
PS
982static void
983cifs_compound_last_callback(struct mid_q_entry *mid)
984{
985 cifs_compound_callback(mid);
986 cifs_wake_up_task(mid);
987}
988
989static void
990cifs_cancelled_callback(struct mid_q_entry *mid)
991{
992 cifs_compound_callback(mid);
993 DeleteMidQEntry(mid);
994}
995
b8f57ee8 996int
e0bba0b8
RS
997compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
998 const int flags, const int num_rqst, struct smb_rqst *rqst,
999 int *resp_buf_type, struct kvec *resp_iov)
7ee1af76 1000{
480b1cb9 1001 int i, j, optype, rc = 0;
e0bba0b8 1002 struct mid_q_entry *midQ[MAX_COMPOUND];
8544f4aa 1003 bool cancelled_mid[MAX_COMPOUND] = {false};
34f4deb7
PS
1004 struct cifs_credits credits[MAX_COMPOUND] = {
1005 { .value = 0, .instance = 0 }
1006 };
1007 unsigned int instance;
738f9de5 1008 char *buf;
3190b59a 1009 struct TCP_Server_Info *server;
50c2f753 1010
a891f0f8 1011 optype = flags & CIFS_OP_MASK;
133672ef 1012
e0bba0b8
RS
1013 for (i = 0; i < num_rqst; i++)
1014 resp_buf_type[i] = CIFS_NO_BUFFER; /* no response buf yet */
7ee1af76
JA
1015
1016 if ((ses == NULL) || (ses->server == NULL)) {
f96637be 1017 cifs_dbg(VFS, "Null session\n");
7ee1af76
JA
1018 return -EIO;
1019 }
1020
d70e9fa5
AA
1021 if (!ses->binding) {
1022 uint index = 0;
1023
1024 if (ses->chan_count > 1) {
1025 index = (uint)atomic_inc_return(&ses->chan_seq);
1026 index %= ses->chan_count;
1027 }
1028 server = ses->chans[index].server;
1029 } else {
1030 server = cifs_ses_server(ses);
1031 }
1032
3190b59a 1033 if (server->tcpStatus == CifsExiting)
7ee1af76 1034 return -ENOENT;
7ee1af76 1035
792af7b0 1036 /*
257b7809 1037 * Wait for all the requests to become available.
7091bcab
PS
1038 * This approach still leaves the possibility to be stuck waiting for
1039 * credits if the server doesn't grant credits to the outstanding
257b7809
RS
1040 * requests and if the client is completely idle, not generating any
1041 * other requests.
1042 * This can be handled by the eventual session reconnect.
792af7b0 1043 */
3190b59a 1044 rc = wait_for_compound_request(server, num_rqst, flags,
257b7809
RS
1045 &instance);
1046 if (rc)
1047 return rc;
97ea4998 1048
257b7809
RS
1049 for (i = 0; i < num_rqst; i++) {
1050 credits[i].value = 1;
1051 credits[i].instance = instance;
8544f4aa 1052 }
7ee1af76 1053
792af7b0
PS
1054 /*
1055 * Make sure that we sign in the same order that we send on this socket
1056 * and avoid races inside tcp sendmsg code that could cause corruption
1057 * of smb data.
1058 */
7ee1af76 1059
3190b59a 1060 mutex_lock(&server->srv_mutex);
7ee1af76 1061
97ea4998
PS
1062 /*
1063 * All the parts of the compound chain belong obtained credits from the
257b7809 1064 * same session. We can not use credits obtained from the previous
97ea4998
PS
1065 * session to send this request. Check if there were reconnects after
1066 * we obtained credits and return -EAGAIN in such cases to let callers
1067 * handle it.
1068 */
3190b59a
AA
1069 if (instance != server->reconnect_instance) {
1070 mutex_unlock(&server->srv_mutex);
97ea4998 1071 for (j = 0; j < num_rqst; j++)
3190b59a 1072 add_credits(server, &credits[j], optype);
97ea4998
PS
1073 return -EAGAIN;
1074 }
1075
e0bba0b8 1076 for (i = 0; i < num_rqst; i++) {
f780bd3f 1077 midQ[i] = server->ops->setup_request(ses, server, &rqst[i]);
e0bba0b8 1078 if (IS_ERR(midQ[i])) {
3190b59a 1079 revert_current_mid(server, i);
e0bba0b8
RS
1080 for (j = 0; j < i; j++)
1081 cifs_delete_mid(midQ[j]);
3190b59a 1082 mutex_unlock(&server->srv_mutex);
8544f4aa 1083
e0bba0b8 1084 /* Update # of requests on wire to server */
8544f4aa 1085 for (j = 0; j < num_rqst; j++)
3190b59a 1086 add_credits(server, &credits[j], optype);
e0bba0b8
RS
1087 return PTR_ERR(midQ[i]);
1088 }
1089
1090 midQ[i]->mid_state = MID_REQUEST_SUBMITTED;
8a26f0f7 1091 midQ[i]->optype = optype;
4e34feb5 1092 /*
ee258d79
PS
1093 * Invoke callback for every part of the compound chain
1094 * to calculate credits properly. Wake up this thread only when
1095 * the last element is received.
4e34feb5
RS
1096 */
1097 if (i < num_rqst - 1)
ee258d79
PS
1098 midQ[i]->callback = cifs_compound_callback;
1099 else
1100 midQ[i]->callback = cifs_compound_last_callback;
1da177e4 1101 }
3190b59a
AA
1102 cifs_in_send_inc(server);
1103 rc = smb_send_rqst(server, num_rqst, rqst, flags);
1104 cifs_in_send_dec(server);
e0bba0b8
RS
1105
1106 for (i = 0; i < num_rqst; i++)
1107 cifs_save_when_sent(midQ[i]);
7ee1af76 1108
c781af7e 1109 if (rc < 0) {
3190b59a
AA
1110 revert_current_mid(server, num_rqst);
1111 server->sequence_number -= 2;
c781af7e 1112 }
e0bba0b8 1113
3190b59a 1114 mutex_unlock(&server->srv_mutex);
7ee1af76 1115
d69cb728
RS
1116 /*
1117 * If sending failed for some reason or it is an oplock break that we
1118 * will not receive a response to - return credits back
1119 */
1120 if (rc < 0 || (flags & CIFS_NO_SRV_RSP)) {
ee258d79 1121 for (i = 0; i < num_rqst; i++)
3190b59a 1122 add_credits(server, &credits[i], optype);
cb5c2e63 1123 goto out;
ee258d79
PS
1124 }
1125
1126 /*
1127 * At this point the request is passed to the network stack - we assume
1128 * that any credits taken from the server structure on the client have
1129 * been spent and we can't return them back. Once we receive responses
1130 * we will collect credits granted by the server in the mid callbacks
1131 * and add those credits to the server structure.
1132 */
e0bba0b8 1133
cb5c2e63
RS
1134 /*
1135 * Compounding is never used during session establish.
1136 */
1137 if ((ses->status == CifsNew) || (optype & CIFS_NEG_OP))
1138 smb311_update_preauth_hash(ses, rqst[0].rq_iov,
1139 rqst[0].rq_nvec);
e0bba0b8 1140
cb5c2e63 1141 for (i = 0; i < num_rqst; i++) {
3190b59a 1142 rc = wait_for_response(server, midQ[i]);
8a26f0f7
PS
1143 if (rc != 0)
1144 break;
1145 }
1146 if (rc != 0) {
1147 for (; i < num_rqst; i++) {
afe6f653 1148 cifs_server_dbg(VFS, "Cancelling wait for mid %llu cmd: %d\n",
43de1db3 1149 midQ[i]->mid, le16_to_cpu(midQ[i]->command));
3190b59a 1150 send_cancel(server, &rqst[i], midQ[i]);
e0bba0b8 1151 spin_lock(&GlobalMid_Lock);
7b71843f 1152 midQ[i]->mid_flags |= MID_WAIT_CANCELLED;
e0bba0b8 1153 if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED) {
8a26f0f7 1154 midQ[i]->callback = cifs_cancelled_callback;
8544f4aa 1155 cancelled_mid[i] = true;
34f4deb7 1156 credits[i].value = 0;
e0bba0b8 1157 }
1be912dd 1158 spin_unlock(&GlobalMid_Lock);
e0bba0b8 1159 }
cb5c2e63
RS
1160 }
1161
cb5c2e63
RS
1162 for (i = 0; i < num_rqst; i++) {
1163 if (rc < 0)
1164 goto out;
e0bba0b8 1165
3190b59a 1166 rc = cifs_sync_mid_result(midQ[i], server);
e0bba0b8 1167 if (rc != 0) {
8544f4aa
PS
1168 /* mark this mid as cancelled to not free it below */
1169 cancelled_mid[i] = true;
1170 goto out;
1be912dd 1171 }
2b2bdfba 1172
e0bba0b8
RS
1173 if (!midQ[i]->resp_buf ||
1174 midQ[i]->mid_state != MID_RESPONSE_RECEIVED) {
1175 rc = -EIO;
1176 cifs_dbg(FYI, "Bad MID state?\n");
1177 goto out;
1178 }
a891f0f8 1179
e0bba0b8
RS
1180 buf = (char *)midQ[i]->resp_buf;
1181 resp_iov[i].iov_base = buf;
1182 resp_iov[i].iov_len = midQ[i]->resp_buf_size +
3190b59a 1183 server->vals->header_preamble_size;
e0bba0b8
RS
1184
1185 if (midQ[i]->large_buf)
1186 resp_buf_type[i] = CIFS_LARGE_BUFFER;
1187 else
1188 resp_buf_type[i] = CIFS_SMALL_BUFFER;
1189
3190b59a 1190 rc = server->ops->check_receive(midQ[i], server,
e0bba0b8 1191 flags & CIFS_LOG_ERROR);
1da177e4 1192
e0bba0b8 1193 /* mark it so buf will not be freed by cifs_delete_mid */
392e1c5d 1194 if ((flags & CIFS_NO_RSP_BUF) == 0)
e0bba0b8 1195 midQ[i]->resp_buf = NULL;
cb5c2e63 1196
e0bba0b8 1197 }
cb5c2e63
RS
1198
1199 /*
1200 * Compounding is never used during session establish.
1201 */
1202 if ((ses->status == CifsNew) || (optype & CIFS_NEG_OP)) {
1203 struct kvec iov = {
1204 .iov_base = resp_iov[0].iov_base,
1205 .iov_len = resp_iov[0].iov_len
1206 };
1207 smb311_update_preauth_hash(ses, &iov, 1);
1208 }
1209
7ee1af76 1210out:
4e34feb5
RS
1211 /*
1212 * This will dequeue all mids. After this it is important that the
1213 * demultiplex_thread will not process any of these mids any futher.
1214 * This is prevented above by using a noop callback that will not
1215 * wake this thread except for the very last PDU.
1216 */
8544f4aa
PS
1217 for (i = 0; i < num_rqst; i++) {
1218 if (!cancelled_mid[i])
1219 cifs_delete_mid(midQ[i]);
8544f4aa 1220 }
1da177e4 1221
d6e04ae6
SF
1222 return rc;
1223}
1da177e4 1224
e0bba0b8
RS
1225int
1226cifs_send_recv(const unsigned int xid, struct cifs_ses *ses,
1227 struct smb_rqst *rqst, int *resp_buf_type, const int flags,
1228 struct kvec *resp_iov)
1229{
1230 return compound_send_recv(xid, ses, flags, 1, rqst, resp_buf_type,
1231 resp_iov);
1232}
1233
738f9de5
PS
1234int
1235SendReceive2(const unsigned int xid, struct cifs_ses *ses,
1236 struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
1237 const int flags, struct kvec *resp_iov)
1238{
1239 struct smb_rqst rqst;
3cecf486 1240 struct kvec s_iov[CIFS_MAX_IOV_SIZE], *new_iov;
738f9de5
PS
1241 int rc;
1242
3cecf486 1243 if (n_vec + 1 > CIFS_MAX_IOV_SIZE) {
6da2ec56
KC
1244 new_iov = kmalloc_array(n_vec + 1, sizeof(struct kvec),
1245 GFP_KERNEL);
117e3b7f
SF
1246 if (!new_iov) {
1247 /* otherwise cifs_send_recv below sets resp_buf_type */
1248 *resp_buf_type = CIFS_NO_BUFFER;
3cecf486 1249 return -ENOMEM;
117e3b7f 1250 }
3cecf486
RS
1251 } else
1252 new_iov = s_iov;
738f9de5
PS
1253
1254 /* 1st iov is a RFC1001 length followed by the rest of the packet */
1255 memcpy(new_iov + 1, iov, (sizeof(struct kvec) * n_vec));
1256
1257 new_iov[0].iov_base = new_iov[1].iov_base;
1258 new_iov[0].iov_len = 4;
1259 new_iov[1].iov_base += 4;
1260 new_iov[1].iov_len -= 4;
1261
1262 memset(&rqst, 0, sizeof(struct smb_rqst));
1263 rqst.rq_iov = new_iov;
1264 rqst.rq_nvec = n_vec + 1;
1265
1266 rc = cifs_send_recv(xid, ses, &rqst, resp_buf_type, flags, resp_iov);
3cecf486
RS
1267 if (n_vec + 1 > CIFS_MAX_IOV_SIZE)
1268 kfree(new_iov);
738f9de5
PS
1269 return rc;
1270}
1271
1da177e4 1272int
96daf2b0 1273SendReceive(const unsigned int xid, struct cifs_ses *ses,
1da177e4 1274 struct smb_hdr *in_buf, struct smb_hdr *out_buf,
480b1cb9 1275 int *pbytes_returned, const int flags)
1da177e4
LT
1276{
1277 int rc = 0;
1da177e4 1278 struct mid_q_entry *midQ;
fb2036d8
PS
1279 unsigned int len = be32_to_cpu(in_buf->smb_buf_length);
1280 struct kvec iov = { .iov_base = in_buf, .iov_len = len };
1281 struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
34f4deb7 1282 struct cifs_credits credits = { .value = 1, .instance = 0 };
ac6ad7a8 1283 struct TCP_Server_Info *server;
1da177e4
LT
1284
1285 if (ses == NULL) {
f96637be 1286 cifs_dbg(VFS, "Null smb session\n");
1da177e4
LT
1287 return -EIO;
1288 }
ac6ad7a8 1289 server = ses->server;
afe6f653 1290 if (server == NULL) {
f96637be 1291 cifs_dbg(VFS, "Null tcp session\n");
1da177e4
LT
1292 return -EIO;
1293 }
1294
afe6f653 1295 if (server->tcpStatus == CifsExiting)
31ca3bc3
SF
1296 return -ENOENT;
1297
79a58d1f 1298 /* Ensure that we do not send more than 50 overlapping requests
1da177e4
LT
1299 to the same server. We may make this configurable later or
1300 use ses->maxReq */
1da177e4 1301
fb2036d8 1302 if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
afe6f653 1303 cifs_server_dbg(VFS, "Illegal length, greater than maximum frame, %d\n",
fb2036d8 1304 len);
6d9c6d54
VL
1305 return -EIO;
1306 }
1307
afe6f653 1308 rc = wait_for_free_request(server, flags, &credits.instance);
7ee1af76
JA
1309 if (rc)
1310 return rc;
1311
79a58d1f 1312 /* make sure that we sign in the same order that we send on this socket
1da177e4
LT
1313 and avoid races inside tcp sendmsg code that could cause corruption
1314 of smb data */
1315
afe6f653 1316 mutex_lock(&server->srv_mutex);
1da177e4 1317
7ee1af76
JA
1318 rc = allocate_mid(ses, in_buf, &midQ);
1319 if (rc) {
8bd3754c 1320 mutex_unlock(&server->srv_mutex);
7ee1af76 1321 /* Update # of requests on wire to server */
afe6f653 1322 add_credits(server, &credits, 0);
7ee1af76 1323 return rc;
1da177e4
LT
1324 }
1325
afe6f653 1326 rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number);
829049cb 1327 if (rc) {
afe6f653 1328 mutex_unlock(&server->srv_mutex);
829049cb
VL
1329 goto out;
1330 }
1da177e4 1331
7c9421e1 1332 midQ->mid_state = MID_REQUEST_SUBMITTED;
789e6661 1333
afe6f653
RS
1334 cifs_in_send_inc(server);
1335 rc = smb_send(server, in_buf, len);
1336 cifs_in_send_dec(server);
789e6661 1337 cifs_save_when_sent(midQ);
ad313cb8
JL
1338
1339 if (rc < 0)
afe6f653 1340 server->sequence_number -= 2;
ad313cb8 1341
afe6f653 1342 mutex_unlock(&server->srv_mutex);
7ee1af76 1343
79a58d1f 1344 if (rc < 0)
7ee1af76
JA
1345 goto out;
1346
afe6f653 1347 rc = wait_for_response(server, midQ);
1be912dd 1348 if (rc != 0) {
afe6f653 1349 send_cancel(server, &rqst, midQ);
1be912dd 1350 spin_lock(&GlobalMid_Lock);
7c9421e1 1351 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1be912dd
JL
1352 /* no longer considered to be "in-flight" */
1353 midQ->callback = DeleteMidQEntry;
1354 spin_unlock(&GlobalMid_Lock);
afe6f653 1355 add_credits(server, &credits, 0);
1be912dd
JL
1356 return rc;
1357 }
1358 spin_unlock(&GlobalMid_Lock);
1359 }
1da177e4 1360
afe6f653 1361 rc = cifs_sync_mid_result(midQ, server);
053d5034 1362 if (rc != 0) {
afe6f653 1363 add_credits(server, &credits, 0);
1da177e4
LT
1364 return rc;
1365 }
50c2f753 1366
2c8f981d 1367 if (!midQ->resp_buf || !out_buf ||
7c9421e1 1368 midQ->mid_state != MID_RESPONSE_RECEIVED) {
2b2bdfba 1369 rc = -EIO;
afe6f653 1370 cifs_server_dbg(VFS, "Bad MID state?\n");
2c8f981d 1371 goto out;
1da177e4 1372 }
7ee1af76 1373
d4e4854f 1374 *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
2c8f981d 1375 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
afe6f653 1376 rc = cifs_check_receive(midQ, server, 0);
7ee1af76 1377out:
3c1bf7e4 1378 cifs_delete_mid(midQ);
afe6f653 1379 add_credits(server, &credits, 0);
1da177e4 1380
7ee1af76
JA
1381 return rc;
1382}
1da177e4 1383
7ee1af76
JA
1384/* We send a LOCKINGX_CANCEL_LOCK to cause the Windows
1385 blocking lock to return. */
1386
1387static int
96daf2b0 1388send_lock_cancel(const unsigned int xid, struct cifs_tcon *tcon,
7ee1af76
JA
1389 struct smb_hdr *in_buf,
1390 struct smb_hdr *out_buf)
1391{
1392 int bytes_returned;
96daf2b0 1393 struct cifs_ses *ses = tcon->ses;
7ee1af76
JA
1394 LOCK_REQ *pSMB = (LOCK_REQ *)in_buf;
1395
1396 /* We just modify the current in_buf to change
1397 the type of lock from LOCKING_ANDX_SHARED_LOCK
1398 or LOCKING_ANDX_EXCLUSIVE_LOCK to
1399 LOCKING_ANDX_CANCEL_LOCK. */
1400
1401 pSMB->LockType = LOCKING_ANDX_CANCEL_LOCK|LOCKING_ANDX_LARGE_FILES;
1402 pSMB->Timeout = 0;
88257360 1403 pSMB->hdr.Mid = get_next_mid(ses->server);
7ee1af76
JA
1404
1405 return SendReceive(xid, ses, in_buf, out_buf,
7749981e 1406 &bytes_returned, 0);
7ee1af76
JA
1407}
1408
1409int
96daf2b0 1410SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
7ee1af76
JA
1411 struct smb_hdr *in_buf, struct smb_hdr *out_buf,
1412 int *pbytes_returned)
1413{
1414 int rc = 0;
1415 int rstart = 0;
7ee1af76 1416 struct mid_q_entry *midQ;
96daf2b0 1417 struct cifs_ses *ses;
fb2036d8
PS
1418 unsigned int len = be32_to_cpu(in_buf->smb_buf_length);
1419 struct kvec iov = { .iov_base = in_buf, .iov_len = len };
1420 struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
34f4deb7 1421 unsigned int instance;
afe6f653 1422 struct TCP_Server_Info *server;
7ee1af76
JA
1423
1424 if (tcon == NULL || tcon->ses == NULL) {
f96637be 1425 cifs_dbg(VFS, "Null smb session\n");
7ee1af76
JA
1426 return -EIO;
1427 }
1428 ses = tcon->ses;
afe6f653 1429 server = ses->server;
7ee1af76 1430
afe6f653 1431 if (server == NULL) {
f96637be 1432 cifs_dbg(VFS, "Null tcp session\n");
7ee1af76
JA
1433 return -EIO;
1434 }
1435
afe6f653 1436 if (server->tcpStatus == CifsExiting)
7ee1af76
JA
1437 return -ENOENT;
1438
79a58d1f 1439 /* Ensure that we do not send more than 50 overlapping requests
7ee1af76
JA
1440 to the same server. We may make this configurable later or
1441 use ses->maxReq */
1442
fb2036d8 1443 if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
3175eb9b 1444 cifs_tcon_dbg(VFS, "Illegal length, greater than maximum frame, %d\n",
fb2036d8 1445 len);
6d9c6d54
VL
1446 return -EIO;
1447 }
1448
afe6f653 1449 rc = wait_for_free_request(server, CIFS_BLOCKING_OP, &instance);
7ee1af76
JA
1450 if (rc)
1451 return rc;
1452
79a58d1f 1453 /* make sure that we sign in the same order that we send on this socket
7ee1af76
JA
1454 and avoid races inside tcp sendmsg code that could cause corruption
1455 of smb data */
1456
afe6f653 1457 mutex_lock(&server->srv_mutex);
7ee1af76
JA
1458
1459 rc = allocate_mid(ses, in_buf, &midQ);
1460 if (rc) {
afe6f653 1461 mutex_unlock(&server->srv_mutex);
7ee1af76
JA
1462 return rc;
1463 }
1464
afe6f653 1465 rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number);
829049cb 1466 if (rc) {
3c1bf7e4 1467 cifs_delete_mid(midQ);
afe6f653 1468 mutex_unlock(&server->srv_mutex);
829049cb
VL
1469 return rc;
1470 }
1da177e4 1471
7c9421e1 1472 midQ->mid_state = MID_REQUEST_SUBMITTED;
afe6f653
RS
1473 cifs_in_send_inc(server);
1474 rc = smb_send(server, in_buf, len);
1475 cifs_in_send_dec(server);
789e6661 1476 cifs_save_when_sent(midQ);
ad313cb8
JL
1477
1478 if (rc < 0)
afe6f653 1479 server->sequence_number -= 2;
ad313cb8 1480
afe6f653 1481 mutex_unlock(&server->srv_mutex);
7ee1af76 1482
79a58d1f 1483 if (rc < 0) {
3c1bf7e4 1484 cifs_delete_mid(midQ);
7ee1af76
JA
1485 return rc;
1486 }
1487
1488 /* Wait for a reply - allow signals to interrupt. */
afe6f653 1489 rc = wait_event_interruptible(server->response_q,
7c9421e1 1490 (!(midQ->mid_state == MID_REQUEST_SUBMITTED)) ||
afe6f653
RS
1491 ((server->tcpStatus != CifsGood) &&
1492 (server->tcpStatus != CifsNew)));
7ee1af76
JA
1493
1494 /* Were we interrupted by a signal ? */
1495 if ((rc == -ERESTARTSYS) &&
7c9421e1 1496 (midQ->mid_state == MID_REQUEST_SUBMITTED) &&
afe6f653
RS
1497 ((server->tcpStatus == CifsGood) ||
1498 (server->tcpStatus == CifsNew))) {
7ee1af76
JA
1499
1500 if (in_buf->Command == SMB_COM_TRANSACTION2) {
1501 /* POSIX lock. We send a NT_CANCEL SMB to cause the
1502 blocking lock to return. */
afe6f653 1503 rc = send_cancel(server, &rqst, midQ);
7ee1af76 1504 if (rc) {
3c1bf7e4 1505 cifs_delete_mid(midQ);
7ee1af76
JA
1506 return rc;
1507 }
1508 } else {
1509 /* Windows lock. We send a LOCKINGX_CANCEL_LOCK
1510 to cause the blocking lock to return. */
1511
1512 rc = send_lock_cancel(xid, tcon, in_buf, out_buf);
1513
1514 /* If we get -ENOLCK back the lock may have
1515 already been removed. Don't exit in this case. */
1516 if (rc && rc != -ENOLCK) {
3c1bf7e4 1517 cifs_delete_mid(midQ);
7ee1af76
JA
1518 return rc;
1519 }
1520 }
1521
afe6f653 1522 rc = wait_for_response(server, midQ);
1be912dd 1523 if (rc) {
afe6f653 1524 send_cancel(server, &rqst, midQ);
1be912dd 1525 spin_lock(&GlobalMid_Lock);
7c9421e1 1526 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1be912dd
JL
1527 /* no longer considered to be "in-flight" */
1528 midQ->callback = DeleteMidQEntry;
1529 spin_unlock(&GlobalMid_Lock);
1530 return rc;
1531 }
1532 spin_unlock(&GlobalMid_Lock);
7ee1af76 1533 }
1be912dd
JL
1534
1535 /* We got the response - restart system call. */
1536 rstart = 1;
7ee1af76
JA
1537 }
1538
afe6f653 1539 rc = cifs_sync_mid_result(midQ, server);
053d5034 1540 if (rc != 0)
7ee1af76 1541 return rc;
50c2f753 1542
17c8bfed 1543 /* rcvd frame is ok */
7c9421e1 1544 if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_RECEIVED) {
698e96a8 1545 rc = -EIO;
3175eb9b 1546 cifs_tcon_dbg(VFS, "Bad MID state?\n");
698e96a8
VL
1547 goto out;
1548 }
1da177e4 1549
d4e4854f 1550 *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
2c8f981d 1551 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
afe6f653 1552 rc = cifs_check_receive(midQ, server, 0);
17c8bfed 1553out:
3c1bf7e4 1554 cifs_delete_mid(midQ);
7ee1af76
JA
1555 if (rstart && rc == -EACCES)
1556 return -ERESTARTSYS;
1da177e4
LT
1557 return rc;
1558}