]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - fs/cifs/transport.c
cifs: Make big endian multiplex ID sequences monotonic on the wire
[mirror_ubuntu-bionic-kernel.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>
97bc00b3 31#include <linux/highmem.h>
1da177e4
LT
32#include <asm/uaccess.h>
33#include <asm/processor.h>
34#include <linux/mempool.h>
35#include "cifspdu.h"
36#include "cifsglob.h"
37#include "cifsproto.h"
38#include "cifs_debug.h"
50c2f753 39
2dc7e1c0
PS
40void
41cifs_wake_up_task(struct mid_q_entry *mid)
2b84a36c
JL
42{
43 wake_up_process(mid->callback_data);
44}
45
a6827c18 46struct mid_q_entry *
24b9b06b 47AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
1da177e4
LT
48{
49 struct mid_q_entry *temp;
50
24b9b06b 51 if (server == NULL) {
f96637be 52 cifs_dbg(VFS, "Null TCP session in AllocMidQEntry\n");
1da177e4
LT
53 return NULL;
54 }
50c2f753 55
232087cb 56 temp = mempool_alloc(cifs_mid_poolp, GFP_NOFS);
1da177e4
LT
57 if (temp == NULL)
58 return temp;
59 else {
26f57364 60 memset(temp, 0, sizeof(struct mid_q_entry));
3d378d3f 61 temp->mid = get_mid(smb_buffer);
1da177e4 62 temp->pid = current->pid;
7c9421e1 63 temp->command = cpu_to_le16(smb_buffer->Command);
f96637be 64 cifs_dbg(FYI, "For smb_command %d\n", smb_buffer->Command);
1047abc1
SF
65 /* do_gettimeofday(&temp->when_sent);*/ /* easier to use jiffies */
66 /* when mid allocated can be before when sent */
67 temp->when_alloc = jiffies;
2dc7e1c0 68 temp->server = server;
2b84a36c
JL
69
70 /*
71 * The default is for the mid to be synchronous, so the
72 * default callback just wakes up the current task.
73 */
2dc7e1c0 74 temp->callback = cifs_wake_up_task;
2b84a36c 75 temp->callback_data = current;
1da177e4
LT
76 }
77
1da177e4 78 atomic_inc(&midCount);
7c9421e1 79 temp->mid_state = MID_REQUEST_ALLOCATED;
1da177e4
LT
80 return temp;
81}
82
766fdbb5 83void
1da177e4
LT
84DeleteMidQEntry(struct mid_q_entry *midEntry)
85{
1047abc1 86#ifdef CONFIG_CIFS_STATS2
2dc7e1c0 87 __le16 command = midEntry->server->vals->lock_cmd;
1047abc1
SF
88 unsigned long now;
89#endif
7c9421e1 90 midEntry->mid_state = MID_FREE;
8097531a 91 atomic_dec(&midCount);
7c9421e1 92 if (midEntry->large_buf)
b8643e1b
SF
93 cifs_buf_release(midEntry->resp_buf);
94 else
95 cifs_small_buf_release(midEntry->resp_buf);
1047abc1
SF
96#ifdef CONFIG_CIFS_STATS2
97 now = jiffies;
98 /* commands taking longer than one second are indications that
99 something is wrong, unless it is quite a slow link or server */
79a58d1f 100 if ((now - midEntry->when_alloc) > HZ) {
2dc7e1c0 101 if ((cifsFYI & CIFS_TIMER) && (midEntry->command != command)) {
7c9421e1 102 printk(KERN_DEBUG " CIFS slow rsp: cmd %d mid %llu",
1047abc1
SF
103 midEntry->command, midEntry->mid);
104 printk(" A: 0x%lx S: 0x%lx R: 0x%lx\n",
105 now - midEntry->when_alloc,
106 now - midEntry->when_sent,
107 now - midEntry->when_received);
108 }
109 }
110#endif
1da177e4
LT
111 mempool_free(midEntry, cifs_mid_poolp);
112}
113
3c1bf7e4
PS
114void
115cifs_delete_mid(struct mid_q_entry *mid)
ddc8cf8f
JL
116{
117 spin_lock(&GlobalMid_Lock);
118 list_del(&mid->qhead);
119 spin_unlock(&GlobalMid_Lock);
120
121 DeleteMidQEntry(mid);
122}
123
6f49f46b
JL
124/*
125 * smb_send_kvec - send an array of kvecs to the server
126 * @server: Server to send the data to
127 * @iov: Pointer to array of kvecs
128 * @n_vec: length of kvec array
129 * @sent: amount of data sent on socket is stored here
130 *
131 * Our basic "send data to server" function. Should be called with srv_mutex
132 * held. The caller is responsible for handling the results.
133 */
d6e04ae6 134static int
6f49f46b
JL
135smb_send_kvec(struct TCP_Server_Info *server, struct kvec *iov, size_t n_vec,
136 size_t *sent)
1da177e4
LT
137{
138 int rc = 0;
139 int i = 0;
140 struct msghdr smb_msg;
6f49f46b
JL
141 unsigned int remaining;
142 size_t first_vec = 0;
edf1ae40 143 struct socket *ssocket = server->ssocket;
50c2f753 144
6f49f46b
JL
145 *sent = 0;
146
a9f1b85e 147 smb_msg.msg_name = (struct sockaddr *) &server->dstaddr;
26f57364 148 smb_msg.msg_namelen = sizeof(struct sockaddr);
1da177e4
LT
149 smb_msg.msg_control = NULL;
150 smb_msg.msg_controllen = 0;
0496e02d 151 if (server->noblocksnd)
edf1ae40
SF
152 smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
153 else
154 smb_msg.msg_flags = MSG_NOSIGNAL;
1da177e4 155
6f49f46b 156 remaining = 0;
3e84469d 157 for (i = 0; i < n_vec; i++)
6f49f46b 158 remaining += iov[i].iov_len;
1da177e4 159
17680356 160 i = 0;
6f49f46b
JL
161 while (remaining) {
162 /*
163 * If blocking send, we try 3 times, since each can block
164 * for 5 seconds. For nonblocking we have to try more
165 * but wait increasing amounts of time allowing time for
166 * socket to clear. The overall time we wait in either
167 * case to send on the socket is about 15 seconds.
168 * Similarly we wait for 15 seconds for a response from
169 * the server in SendReceive[2] for the server to send
170 * a response back for most types of requests (except
171 * SMB Write past end of file which can be slow, and
172 * blocking lock operations). NFS waits slightly longer
173 * than CIFS, but this can make it take longer for
174 * nonresponsive servers to be detected and 15 seconds
175 * is more than enough time for modern networks to
176 * send a packet. In most cases if we fail to send
177 * after the retries we will kill the socket and
178 * reconnect which may clear the network problem.
179 */
3e84469d 180 rc = kernel_sendmsg(ssocket, &smb_msg, &iov[first_vec],
6f49f46b 181 n_vec - first_vec, remaining);
ce6c44e4 182 if (rc == -EAGAIN) {
1da177e4 183 i++;
6f49f46b 184 if (i >= 14 || (!server->noblocksnd && (i > 2))) {
f96637be
JP
185 cifs_dbg(VFS, "sends on sock %p stuck for 15 seconds\n",
186 ssocket);
1da177e4
LT
187 rc = -EAGAIN;
188 break;
189 }
68058e75 190 msleep(1 << i);
1da177e4
LT
191 continue;
192 }
6f49f46b 193
79a58d1f 194 if (rc < 0)
1da177e4 195 break;
3e84469d 196
6f49f46b
JL
197 /* send was at least partially successful */
198 *sent += rc;
199
200 if (rc == remaining) {
201 remaining = 0;
61de800d 202 break;
6f49f46b
JL
203 }
204
205 if (rc > remaining) {
f96637be 206 cifs_dbg(VFS, "sent %d requested %d\n", rc, remaining);
3e84469d
SF
207 break;
208 }
6f49f46b 209
79a58d1f 210 if (rc == 0) {
3e84469d
SF
211 /* should never happen, letting socket clear before
212 retrying is our only obvious option here */
f96637be 213 cifs_dbg(VFS, "tcp sent no data\n");
3e84469d
SF
214 msleep(500);
215 continue;
d6e04ae6 216 }
6f49f46b
JL
217
218 remaining -= rc;
219
68058e75 220 /* the line below resets i */
3e84469d
SF
221 for (i = first_vec; i < n_vec; i++) {
222 if (iov[i].iov_len) {
223 if (rc > iov[i].iov_len) {
224 rc -= iov[i].iov_len;
225 iov[i].iov_len = 0;
226 } else {
227 iov[i].iov_base += rc;
228 iov[i].iov_len -= rc;
229 first_vec = i;
230 break;
231 }
232 }
d6e04ae6 233 }
6f49f46b 234
5e1253b5 235 i = 0; /* in case we get ENOSPC on the next send */
6f49f46b 236 rc = 0;
1da177e4 237 }
6f49f46b
JL
238 return rc;
239}
240
97bc00b3
JL
241/**
242 * rqst_page_to_kvec - Turn a slot in the smb_rqst page array into a kvec
243 * @rqst: pointer to smb_rqst
244 * @idx: index into the array of the page
245 * @iov: pointer to struct kvec that will hold the result
246 *
247 * Helper function to convert a slot in the rqst->rq_pages array into a kvec.
248 * The page will be kmapped and the address placed into iov_base. The length
249 * will then be adjusted according to the ptailoff.
250 */
fb308a6f 251void
97bc00b3
JL
252cifs_rqst_page_to_kvec(struct smb_rqst *rqst, unsigned int idx,
253 struct kvec *iov)
254{
255 /*
256 * FIXME: We could avoid this kmap altogether if we used
257 * kernel_sendpage instead of kernel_sendmsg. That will only
258 * work if signing is disabled though as sendpage inlines the
259 * page directly into the fraglist. If userspace modifies the
260 * page after we calculate the signature, then the server will
261 * reject it and may break the connection. kernel_sendmsg does
262 * an extra copy of the data and avoids that issue.
263 */
264 iov->iov_base = kmap(rqst->rq_pages[idx]);
265
266 /* if last page, don't send beyond this offset into page */
267 if (idx == (rqst->rq_npages - 1))
268 iov->iov_len = rqst->rq_tailsz;
269 else
270 iov->iov_len = rqst->rq_pagesz;
271}
272
6f49f46b
JL
273static int
274smb_send_rqst(struct TCP_Server_Info *server, struct smb_rqst *rqst)
275{
276 int rc;
277 struct kvec *iov = rqst->rq_iov;
278 int n_vec = rqst->rq_nvec;
279 unsigned int smb_buf_length = get_rfc1002_length(iov[0].iov_base);
97bc00b3
JL
280 unsigned int i;
281 size_t total_len = 0, sent;
b8eed283
JL
282 struct socket *ssocket = server->ssocket;
283 int val = 1;
6f49f46b 284
ea702b80
JL
285 if (ssocket == NULL)
286 return -ENOTSOCK;
287
f96637be 288 cifs_dbg(FYI, "Sending smb: smb_len=%u\n", smb_buf_length);
6f49f46b
JL
289 dump_smb(iov[0].iov_base, iov[0].iov_len);
290
b8eed283
JL
291 /* cork the socket */
292 kernel_setsockopt(ssocket, SOL_TCP, TCP_CORK,
293 (char *)&val, sizeof(val));
294
97bc00b3
JL
295 rc = smb_send_kvec(server, iov, n_vec, &sent);
296 if (rc < 0)
297 goto uncork;
298
299 total_len += sent;
300
301 /* now walk the page array and send each page in it */
302 for (i = 0; i < rqst->rq_npages; i++) {
303 struct kvec p_iov;
304
305 cifs_rqst_page_to_kvec(rqst, i, &p_iov);
306 rc = smb_send_kvec(server, &p_iov, 1, &sent);
307 kunmap(rqst->rq_pages[i]);
308 if (rc < 0)
309 break;
310
311 total_len += sent;
312 }
1da177e4 313
97bc00b3 314uncork:
b8eed283
JL
315 /* uncork it */
316 val = 0;
317 kernel_setsockopt(ssocket, SOL_TCP, TCP_CORK,
318 (char *)&val, sizeof(val));
319
edf1ae40 320 if ((total_len > 0) && (total_len != smb_buf_length + 4)) {
f96637be
JP
321 cifs_dbg(FYI, "partial send (wanted=%u sent=%zu): terminating session\n",
322 smb_buf_length + 4, total_len);
6f49f46b
JL
323 /*
324 * If we have only sent part of an SMB then the next SMB could
325 * be taken as the remainder of this one. We need to kill the
326 * socket so the server throws away the partial SMB
327 */
edf1ae40
SF
328 server->tcpStatus = CifsNeedReconnect;
329 }
330
d804d41d 331 if (rc < 0 && rc != -EINTR)
f96637be
JP
332 cifs_dbg(VFS, "Error %d sending data on socket to server\n",
333 rc);
d804d41d 334 else
1da177e4 335 rc = 0;
1da177e4
LT
336
337 return rc;
338}
339
6f49f46b
JL
340static int
341smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
342{
343 struct smb_rqst rqst = { .rq_iov = iov,
344 .rq_nvec = n_vec };
345
346 return smb_send_rqst(server, &rqst);
347}
348
0496e02d
JL
349int
350smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
351 unsigned int smb_buf_length)
352{
353 struct kvec iov;
354
355 iov.iov_base = smb_buffer;
356 iov.iov_len = smb_buf_length + 4;
357
358 return smb_sendv(server, &iov, 1);
359}
360
fc40f9cf 361static int
a891f0f8 362wait_for_free_credits(struct TCP_Server_Info *server, const int timeout,
bc205ed1 363 int *credits)
1da177e4 364{
5bc59498
PS
365 int rc;
366
fc40f9cf 367 spin_lock(&server->req_lock);
a891f0f8 368 if (timeout == CIFS_ASYNC_OP) {
1da177e4 369 /* oplock breaks must not be held up */
fc40f9cf 370 server->in_flight++;
bc205ed1 371 *credits -= 1;
fc40f9cf 372 spin_unlock(&server->req_lock);
27a97a61
VL
373 return 0;
374 }
375
27a97a61 376 while (1) {
bc205ed1 377 if (*credits <= 0) {
fc40f9cf 378 spin_unlock(&server->req_lock);
789e6661 379 cifs_num_waiters_inc(server);
5bc59498 380 rc = wait_event_killable(server->request_q,
bc205ed1 381 has_credits(server, credits));
789e6661 382 cifs_num_waiters_dec(server);
5bc59498
PS
383 if (rc)
384 return rc;
fc40f9cf 385 spin_lock(&server->req_lock);
27a97a61 386 } else {
c5797a94 387 if (server->tcpStatus == CifsExiting) {
fc40f9cf 388 spin_unlock(&server->req_lock);
27a97a61 389 return -ENOENT;
1da177e4 390 }
27a97a61 391
2d86dbc9
PS
392 /*
393 * Can not count locking commands against total
394 * as they are allowed to block on server.
395 */
27a97a61
VL
396
397 /* update # of requests on the wire to server */
a891f0f8 398 if (timeout != CIFS_BLOCKING_OP) {
bc205ed1 399 *credits -= 1;
fc40f9cf 400 server->in_flight++;
2d86dbc9 401 }
fc40f9cf 402 spin_unlock(&server->req_lock);
27a97a61 403 break;
1da177e4
LT
404 }
405 }
7ee1af76
JA
406 return 0;
407}
1da177e4 408
bc205ed1 409static int
a891f0f8
PS
410wait_for_free_request(struct TCP_Server_Info *server, const int timeout,
411 const int optype)
bc205ed1 412{
eb4c7df6
SP
413 int *val;
414
415 val = server->ops->get_credits_field(server, optype);
416 /* Since an echo is already inflight, no need to wait to send another */
417 if (*val <= 0 && optype == CIFS_ECHO_OP)
418 return -EAGAIN;
419 return wait_for_free_credits(server, timeout, val);
bc205ed1
PS
420}
421
96daf2b0 422static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
7ee1af76
JA
423 struct mid_q_entry **ppmidQ)
424{
1da177e4 425 if (ses->server->tcpStatus == CifsExiting) {
7ee1af76 426 return -ENOENT;
8fbbd365
VL
427 }
428
429 if (ses->server->tcpStatus == CifsNeedReconnect) {
f96637be 430 cifs_dbg(FYI, "tcp session dead - return to caller to retry\n");
7ee1af76 431 return -EAGAIN;
8fbbd365
VL
432 }
433
434 if (ses->status != CifsGood) {
1da177e4 435 /* check if SMB session is bad because we are setting it up */
79a58d1f 436 if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) &&
ad7a2926 437 (in_buf->Command != SMB_COM_NEGOTIATE))
7ee1af76 438 return -EAGAIN;
ad7a2926 439 /* else ok - we are setting up session */
1da177e4 440 }
24b9b06b 441 *ppmidQ = AllocMidQEntry(in_buf, ses->server);
26f57364 442 if (*ppmidQ == NULL)
7ee1af76 443 return -ENOMEM;
ddc8cf8f
JL
444 spin_lock(&GlobalMid_Lock);
445 list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q);
446 spin_unlock(&GlobalMid_Lock);
7ee1af76
JA
447 return 0;
448}
449
0ade640e
JL
450static int
451wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
7ee1af76 452{
0ade640e 453 int error;
7ee1af76 454
5853cc2a 455 error = wait_event_freezekillable_unsafe(server->response_q,
7c9421e1 456 midQ->mid_state != MID_REQUEST_SUBMITTED);
0ade640e
JL
457 if (error < 0)
458 return -ERESTARTSYS;
7ee1af76 459
0ade640e 460 return 0;
7ee1af76
JA
461}
462
fec344e3
JL
463struct mid_q_entry *
464cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
792af7b0
PS
465{
466 int rc;
fec344e3 467 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
792af7b0
PS
468 struct mid_q_entry *mid;
469
470 /* enable signing if server requires it */
38d77c50 471 if (server->sign)
792af7b0
PS
472 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
473
474 mid = AllocMidQEntry(hdr, server);
475 if (mid == NULL)
fec344e3 476 return ERR_PTR(-ENOMEM);
792af7b0 477
fec344e3 478 rc = cifs_sign_rqst(rqst, server, &mid->sequence_number);
ffc61ccb
SP
479 if (rc) {
480 DeleteMidQEntry(mid);
fec344e3 481 return ERR_PTR(rc);
ffc61ccb
SP
482 }
483
fec344e3 484 return mid;
792af7b0 485}
133672ef 486
a6827c18
JL
487/*
488 * Send a SMB request and set the callback function in the mid to handle
489 * the result. Caller is responsible for dealing with timeouts.
490 */
491int
fec344e3
JL
492cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst,
493 mid_receive_t *receive, mid_callback_t *callback,
494 void *cbdata, const int flags)
a6827c18 495{
a891f0f8 496 int rc, timeout, optype;
a6827c18
JL
497 struct mid_q_entry *mid;
498
a891f0f8
PS
499 timeout = flags & CIFS_TIMEOUT_MASK;
500 optype = flags & CIFS_OP_MASK;
501
502 rc = wait_for_free_request(server, timeout, optype);
a6827c18
JL
503 if (rc)
504 return rc;
505
506 mutex_lock(&server->srv_mutex);
fec344e3
JL
507 mid = server->ops->setup_async_request(server, rqst);
508 if (IS_ERR(mid)) {
a6827c18 509 mutex_unlock(&server->srv_mutex);
a891f0f8 510 add_credits(server, 1, optype);
0193e072 511 wake_up(&server->request_q);
fec344e3 512 return PTR_ERR(mid);
a6827c18
JL
513 }
514
44d22d84 515 mid->receive = receive;
a6827c18
JL
516 mid->callback = callback;
517 mid->callback_data = cbdata;
7c9421e1 518 mid->mid_state = MID_REQUEST_SUBMITTED;
789e6661 519
ffc61ccb
SP
520 /* put it on the pending_mid_q */
521 spin_lock(&GlobalMid_Lock);
522 list_add_tail(&mid->qhead, &server->pending_mid_q);
523 spin_unlock(&GlobalMid_Lock);
524
525
789e6661 526 cifs_in_send_inc(server);
fec344e3 527 rc = smb_send_rqst(server, rqst);
789e6661
SF
528 cifs_in_send_dec(server);
529 cifs_save_when_sent(mid);
ad313cb8
JL
530
531 if (rc < 0)
532 server->sequence_number -= 2;
a6827c18 533 mutex_unlock(&server->srv_mutex);
789e6661 534
ffc61ccb
SP
535 if (rc == 0)
536 return 0;
a6827c18 537
3c1bf7e4 538 cifs_delete_mid(mid);
a891f0f8 539 add_credits(server, 1, optype);
a6827c18
JL
540 wake_up(&server->request_q);
541 return rc;
542}
543
133672ef
SF
544/*
545 *
546 * Send an SMB Request. No response info (other than return code)
547 * needs to be parsed.
548 *
549 * flags indicate the type of request buffer and how long to wait
550 * and whether to log NT STATUS code (error) before mapping it to POSIX error
551 *
552 */
553int
96daf2b0 554SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
792af7b0 555 char *in_buf, int flags)
133672ef
SF
556{
557 int rc;
558 struct kvec iov[1];
559 int resp_buf_type;
560
792af7b0
PS
561 iov[0].iov_base = in_buf;
562 iov[0].iov_len = get_rfc1002_length(in_buf) + 4;
133672ef
SF
563 flags |= CIFS_NO_RESP;
564 rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags);
f96637be 565 cifs_dbg(NOISY, "SendRcvNoRsp flags %d rc %d\n", flags, rc);
90c81e0b 566
133672ef
SF
567 return rc;
568}
569
053d5034 570static int
3c1105df 571cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
053d5034
JL
572{
573 int rc = 0;
574
f96637be
JP
575 cifs_dbg(FYI, "%s: cmd=%d mid=%llu state=%d\n",
576 __func__, le16_to_cpu(mid->command), mid->mid, mid->mid_state);
053d5034 577
74dd92a8 578 spin_lock(&GlobalMid_Lock);
7c9421e1 579 switch (mid->mid_state) {
74dd92a8 580 case MID_RESPONSE_RECEIVED:
053d5034
JL
581 spin_unlock(&GlobalMid_Lock);
582 return rc;
74dd92a8
JL
583 case MID_RETRY_NEEDED:
584 rc = -EAGAIN;
585 break;
71823baf
JL
586 case MID_RESPONSE_MALFORMED:
587 rc = -EIO;
588 break;
3c1105df
JL
589 case MID_SHUTDOWN:
590 rc = -EHOSTDOWN;
591 break;
74dd92a8 592 default:
3c1105df 593 list_del_init(&mid->qhead);
f96637be
JP
594 cifs_dbg(VFS, "%s: invalid mid state mid=%llu state=%d\n",
595 __func__, mid->mid, mid->mid_state);
74dd92a8 596 rc = -EIO;
053d5034
JL
597 }
598 spin_unlock(&GlobalMid_Lock);
599
2b84a36c 600 DeleteMidQEntry(mid);
053d5034
JL
601 return rc;
602}
603
121b046a
JL
604static inline int
605send_cancel(struct TCP_Server_Info *server, void *buf, struct mid_q_entry *mid)
76dcc26f 606{
121b046a
JL
607 return server->ops->send_cancel ?
608 server->ops->send_cancel(server, buf, mid) : 0;
76dcc26f
JL
609}
610
2c8f981d
JL
611int
612cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
613 bool log_error)
614{
792af7b0 615 unsigned int len = get_rfc1002_length(mid->resp_buf) + 4;
826a95e4
JL
616
617 dump_smb(mid->resp_buf, min_t(u32, 92, len));
2c8f981d
JL
618
619 /* convert the length into a more usable form */
38d77c50 620 if (server->sign) {
826a95e4 621 struct kvec iov;
985e4ff0 622 int rc = 0;
bf5ea0e2
JL
623 struct smb_rqst rqst = { .rq_iov = &iov,
624 .rq_nvec = 1 };
826a95e4
JL
625
626 iov.iov_base = mid->resp_buf;
627 iov.iov_len = len;
2c8f981d 628 /* FIXME: add code to kill session */
bf5ea0e2 629 rc = cifs_verify_signature(&rqst, server,
0124cc45 630 mid->sequence_number);
985e4ff0 631 if (rc)
f96637be
JP
632 cifs_dbg(VFS, "SMB signature verification returned error = %d\n",
633 rc);
2c8f981d
JL
634 }
635
636 /* BB special case reconnect tid and uid here? */
637 return map_smb_to_linux_error(mid->resp_buf, log_error);
638}
639
fec344e3
JL
640struct mid_q_entry *
641cifs_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst)
792af7b0
PS
642{
643 int rc;
fec344e3 644 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
792af7b0
PS
645 struct mid_q_entry *mid;
646
647 rc = allocate_mid(ses, hdr, &mid);
648 if (rc)
fec344e3
JL
649 return ERR_PTR(rc);
650 rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number);
651 if (rc) {
3c1bf7e4 652 cifs_delete_mid(mid);
fec344e3
JL
653 return ERR_PTR(rc);
654 }
655 return mid;
792af7b0
PS
656}
657
7ee1af76 658int
96daf2b0 659SendReceive2(const unsigned int xid, struct cifs_ses *ses,
a891f0f8 660 struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
133672ef 661 const int flags)
7ee1af76
JA
662{
663 int rc = 0;
a891f0f8 664 int timeout, optype;
7ee1af76 665 struct mid_q_entry *midQ;
792af7b0 666 char *buf = iov[0].iov_base;
a891f0f8 667 unsigned int credits = 1;
fec344e3
JL
668 struct smb_rqst rqst = { .rq_iov = iov,
669 .rq_nvec = n_vec };
50c2f753 670
a891f0f8
PS
671 timeout = flags & CIFS_TIMEOUT_MASK;
672 optype = flags & CIFS_OP_MASK;
133672ef 673
a891f0f8 674 *resp_buf_type = CIFS_NO_BUFFER; /* no response buf yet */
7ee1af76
JA
675
676 if ((ses == NULL) || (ses->server == NULL)) {
792af7b0 677 cifs_small_buf_release(buf);
f96637be 678 cifs_dbg(VFS, "Null session\n");
7ee1af76
JA
679 return -EIO;
680 }
681
79a58d1f 682 if (ses->server->tcpStatus == CifsExiting) {
792af7b0 683 cifs_small_buf_release(buf);
7ee1af76
JA
684 return -ENOENT;
685 }
686
792af7b0
PS
687 /*
688 * Ensure that we do not send more than 50 overlapping requests
689 * to the same server. We may make this configurable later or
690 * use ses->maxReq.
691 */
7ee1af76 692
a891f0f8 693 rc = wait_for_free_request(ses->server, timeout, optype);
7ee1af76 694 if (rc) {
792af7b0 695 cifs_small_buf_release(buf);
7ee1af76
JA
696 return rc;
697 }
698
792af7b0
PS
699 /*
700 * Make sure that we sign in the same order that we send on this socket
701 * and avoid races inside tcp sendmsg code that could cause corruption
702 * of smb data.
703 */
7ee1af76 704
72ca545b 705 mutex_lock(&ses->server->srv_mutex);
7ee1af76 706
fec344e3
JL
707 midQ = ses->server->ops->setup_request(ses, &rqst);
708 if (IS_ERR(midQ)) {
72ca545b 709 mutex_unlock(&ses->server->srv_mutex);
792af7b0 710 cifs_small_buf_release(buf);
7ee1af76 711 /* Update # of requests on wire to server */
a891f0f8 712 add_credits(ses->server, 1, optype);
fec344e3 713 return PTR_ERR(midQ);
1da177e4 714 }
1da177e4 715
7c9421e1 716 midQ->mid_state = MID_REQUEST_SUBMITTED;
789e6661 717 cifs_in_send_inc(ses->server);
0496e02d 718 rc = smb_sendv(ses->server, iov, n_vec);
789e6661
SF
719 cifs_in_send_dec(ses->server);
720 cifs_save_when_sent(midQ);
7ee1af76 721
ad313cb8
JL
722 if (rc < 0)
723 ses->server->sequence_number -= 2;
72ca545b 724 mutex_unlock(&ses->server->srv_mutex);
7ee1af76 725
2db7c581 726 if (rc < 0) {
792af7b0 727 cifs_small_buf_release(buf);
7ee1af76 728 goto out;
2db7c581 729 }
4b8f930f 730
a891f0f8 731 if (timeout == CIFS_ASYNC_OP) {
792af7b0 732 cifs_small_buf_release(buf);
133672ef 733 goto out;
2db7c581 734 }
d6e04ae6 735
0ade640e 736 rc = wait_for_response(ses->server, midQ);
1be912dd 737 if (rc != 0) {
121b046a 738 send_cancel(ses->server, buf, midQ);
1be912dd 739 spin_lock(&GlobalMid_Lock);
7c9421e1 740 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1be912dd
JL
741 midQ->callback = DeleteMidQEntry;
742 spin_unlock(&GlobalMid_Lock);
792af7b0 743 cifs_small_buf_release(buf);
a891f0f8 744 add_credits(ses->server, 1, optype);
1be912dd
JL
745 return rc;
746 }
747 spin_unlock(&GlobalMid_Lock);
748 }
d6e04ae6 749
792af7b0 750 cifs_small_buf_release(buf);
2db7c581 751
3c1105df 752 rc = cifs_sync_mid_result(midQ, ses->server);
053d5034 753 if (rc != 0) {
a891f0f8 754 add_credits(ses->server, 1, optype);
d6e04ae6
SF
755 return rc;
756 }
50c2f753 757
7c9421e1 758 if (!midQ->resp_buf || midQ->mid_state != MID_RESPONSE_RECEIVED) {
d6e04ae6 759 rc = -EIO;
f96637be 760 cifs_dbg(FYI, "Bad MID state?\n");
2b2bdfba
SF
761 goto out;
762 }
763
792af7b0
PS
764 buf = (char *)midQ->resp_buf;
765 iov[0].iov_base = buf;
766 iov[0].iov_len = get_rfc1002_length(buf) + 4;
7c9421e1 767 if (midQ->large_buf)
a891f0f8 768 *resp_buf_type = CIFS_LARGE_BUFFER;
2c8f981d 769 else
a891f0f8
PS
770 *resp_buf_type = CIFS_SMALL_BUFFER;
771
772 credits = ses->server->ops->get_credits(midQ);
2b2bdfba 773
082d0642
PS
774 rc = ses->server->ops->check_receive(midQ, ses->server,
775 flags & CIFS_LOG_ERROR);
1da177e4 776
3c1bf7e4 777 /* mark it so buf will not be freed by cifs_delete_mid */
2c8f981d
JL
778 if ((flags & CIFS_NO_RESP) == 0)
779 midQ->resp_buf = NULL;
7ee1af76 780out:
3c1bf7e4 781 cifs_delete_mid(midQ);
a891f0f8 782 add_credits(ses->server, credits, optype);
1da177e4 783
d6e04ae6
SF
784 return rc;
785}
1da177e4
LT
786
787int
96daf2b0 788SendReceive(const unsigned int xid, struct cifs_ses *ses,
1da177e4 789 struct smb_hdr *in_buf, struct smb_hdr *out_buf,
a891f0f8 790 int *pbytes_returned, const int timeout)
1da177e4
LT
791{
792 int rc = 0;
1da177e4
LT
793 struct mid_q_entry *midQ;
794
795 if (ses == NULL) {
f96637be 796 cifs_dbg(VFS, "Null smb session\n");
1da177e4
LT
797 return -EIO;
798 }
79a58d1f 799 if (ses->server == NULL) {
f96637be 800 cifs_dbg(VFS, "Null tcp session\n");
1da177e4
LT
801 return -EIO;
802 }
803
79a58d1f 804 if (ses->server->tcpStatus == CifsExiting)
31ca3bc3
SF
805 return -ENOENT;
806
79a58d1f 807 /* Ensure that we do not send more than 50 overlapping requests
1da177e4
LT
808 to the same server. We may make this configurable later or
809 use ses->maxReq */
1da177e4 810
be8e3b00
SF
811 if (be32_to_cpu(in_buf->smb_buf_length) > CIFSMaxBufSize +
812 MAX_CIFS_HDR_SIZE - 4) {
f96637be
JP
813 cifs_dbg(VFS, "Illegal length, greater than maximum frame, %d\n",
814 be32_to_cpu(in_buf->smb_buf_length));
6d9c6d54
VL
815 return -EIO;
816 }
817
a891f0f8 818 rc = wait_for_free_request(ses->server, timeout, 0);
7ee1af76
JA
819 if (rc)
820 return rc;
821
79a58d1f 822 /* make sure that we sign in the same order that we send on this socket
1da177e4
LT
823 and avoid races inside tcp sendmsg code that could cause corruption
824 of smb data */
825
72ca545b 826 mutex_lock(&ses->server->srv_mutex);
1da177e4 827
7ee1af76
JA
828 rc = allocate_mid(ses, in_buf, &midQ);
829 if (rc) {
72ca545b 830 mutex_unlock(&ses->server->srv_mutex);
7ee1af76 831 /* Update # of requests on wire to server */
a891f0f8 832 add_credits(ses->server, 1, 0);
7ee1af76 833 return rc;
1da177e4
LT
834 }
835
ad009ac9 836 rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number);
829049cb
VL
837 if (rc) {
838 mutex_unlock(&ses->server->srv_mutex);
839 goto out;
840 }
1da177e4 841
7c9421e1 842 midQ->mid_state = MID_REQUEST_SUBMITTED;
789e6661
SF
843
844 cifs_in_send_inc(ses->server);
be8e3b00 845 rc = smb_send(ses->server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
789e6661
SF
846 cifs_in_send_dec(ses->server);
847 cifs_save_when_sent(midQ);
ad313cb8
JL
848
849 if (rc < 0)
850 ses->server->sequence_number -= 2;
851
72ca545b 852 mutex_unlock(&ses->server->srv_mutex);
7ee1af76 853
79a58d1f 854 if (rc < 0)
7ee1af76
JA
855 goto out;
856
a891f0f8 857 if (timeout == CIFS_ASYNC_OP)
7ee1af76 858 goto out;
1da177e4 859
0ade640e 860 rc = wait_for_response(ses->server, midQ);
1be912dd 861 if (rc != 0) {
121b046a 862 send_cancel(ses->server, in_buf, midQ);
1be912dd 863 spin_lock(&GlobalMid_Lock);
7c9421e1 864 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1be912dd
JL
865 /* no longer considered to be "in-flight" */
866 midQ->callback = DeleteMidQEntry;
867 spin_unlock(&GlobalMid_Lock);
a891f0f8 868 add_credits(ses->server, 1, 0);
1be912dd
JL
869 return rc;
870 }
871 spin_unlock(&GlobalMid_Lock);
872 }
1da177e4 873
3c1105df 874 rc = cifs_sync_mid_result(midQ, ses->server);
053d5034 875 if (rc != 0) {
a891f0f8 876 add_credits(ses->server, 1, 0);
1da177e4
LT
877 return rc;
878 }
50c2f753 879
2c8f981d 880 if (!midQ->resp_buf || !out_buf ||
7c9421e1 881 midQ->mid_state != MID_RESPONSE_RECEIVED) {
2b2bdfba 882 rc = -EIO;
f96637be 883 cifs_dbg(VFS, "Bad MID state?\n");
2c8f981d 884 goto out;
1da177e4 885 }
7ee1af76 886
d4e4854f 887 *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
2c8f981d
JL
888 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
889 rc = cifs_check_receive(midQ, ses->server, 0);
7ee1af76 890out:
3c1bf7e4 891 cifs_delete_mid(midQ);
a891f0f8 892 add_credits(ses->server, 1, 0);
1da177e4 893
7ee1af76
JA
894 return rc;
895}
1da177e4 896
7ee1af76
JA
897/* We send a LOCKINGX_CANCEL_LOCK to cause the Windows
898 blocking lock to return. */
899
900static int
96daf2b0 901send_lock_cancel(const unsigned int xid, struct cifs_tcon *tcon,
7ee1af76
JA
902 struct smb_hdr *in_buf,
903 struct smb_hdr *out_buf)
904{
905 int bytes_returned;
96daf2b0 906 struct cifs_ses *ses = tcon->ses;
7ee1af76
JA
907 LOCK_REQ *pSMB = (LOCK_REQ *)in_buf;
908
909 /* We just modify the current in_buf to change
910 the type of lock from LOCKING_ANDX_SHARED_LOCK
911 or LOCKING_ANDX_EXCLUSIVE_LOCK to
912 LOCKING_ANDX_CANCEL_LOCK. */
913
914 pSMB->LockType = LOCKING_ANDX_CANCEL_LOCK|LOCKING_ANDX_LARGE_FILES;
915 pSMB->Timeout = 0;
88257360 916 pSMB->hdr.Mid = get_next_mid(ses->server);
7ee1af76
JA
917
918 return SendReceive(xid, ses, in_buf, out_buf,
7749981e 919 &bytes_returned, 0);
7ee1af76
JA
920}
921
922int
96daf2b0 923SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
7ee1af76
JA
924 struct smb_hdr *in_buf, struct smb_hdr *out_buf,
925 int *pbytes_returned)
926{
927 int rc = 0;
928 int rstart = 0;
7ee1af76 929 struct mid_q_entry *midQ;
96daf2b0 930 struct cifs_ses *ses;
7ee1af76
JA
931
932 if (tcon == NULL || tcon->ses == NULL) {
f96637be 933 cifs_dbg(VFS, "Null smb session\n");
7ee1af76
JA
934 return -EIO;
935 }
936 ses = tcon->ses;
937
79a58d1f 938 if (ses->server == NULL) {
f96637be 939 cifs_dbg(VFS, "Null tcp session\n");
7ee1af76
JA
940 return -EIO;
941 }
942
79a58d1f 943 if (ses->server->tcpStatus == CifsExiting)
7ee1af76
JA
944 return -ENOENT;
945
79a58d1f 946 /* Ensure that we do not send more than 50 overlapping requests
7ee1af76
JA
947 to the same server. We may make this configurable later or
948 use ses->maxReq */
949
be8e3b00
SF
950 if (be32_to_cpu(in_buf->smb_buf_length) > CIFSMaxBufSize +
951 MAX_CIFS_HDR_SIZE - 4) {
f96637be
JP
952 cifs_dbg(VFS, "Illegal length, greater than maximum frame, %d\n",
953 be32_to_cpu(in_buf->smb_buf_length));
6d9c6d54
VL
954 return -EIO;
955 }
956
a891f0f8 957 rc = wait_for_free_request(ses->server, CIFS_BLOCKING_OP, 0);
7ee1af76
JA
958 if (rc)
959 return rc;
960
79a58d1f 961 /* make sure that we sign in the same order that we send on this socket
7ee1af76
JA
962 and avoid races inside tcp sendmsg code that could cause corruption
963 of smb data */
964
72ca545b 965 mutex_lock(&ses->server->srv_mutex);
7ee1af76
JA
966
967 rc = allocate_mid(ses, in_buf, &midQ);
968 if (rc) {
72ca545b 969 mutex_unlock(&ses->server->srv_mutex);
7ee1af76
JA
970 return rc;
971 }
972
7ee1af76 973 rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number);
829049cb 974 if (rc) {
3c1bf7e4 975 cifs_delete_mid(midQ);
829049cb
VL
976 mutex_unlock(&ses->server->srv_mutex);
977 return rc;
978 }
1da177e4 979
7c9421e1 980 midQ->mid_state = MID_REQUEST_SUBMITTED;
789e6661 981 cifs_in_send_inc(ses->server);
be8e3b00 982 rc = smb_send(ses->server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
789e6661
SF
983 cifs_in_send_dec(ses->server);
984 cifs_save_when_sent(midQ);
ad313cb8
JL
985
986 if (rc < 0)
987 ses->server->sequence_number -= 2;
988
72ca545b 989 mutex_unlock(&ses->server->srv_mutex);
7ee1af76 990
79a58d1f 991 if (rc < 0) {
3c1bf7e4 992 cifs_delete_mid(midQ);
7ee1af76
JA
993 return rc;
994 }
995
996 /* Wait for a reply - allow signals to interrupt. */
997 rc = wait_event_interruptible(ses->server->response_q,
7c9421e1 998 (!(midQ->mid_state == MID_REQUEST_SUBMITTED)) ||
7ee1af76
JA
999 ((ses->server->tcpStatus != CifsGood) &&
1000 (ses->server->tcpStatus != CifsNew)));
1001
1002 /* Were we interrupted by a signal ? */
1003 if ((rc == -ERESTARTSYS) &&
7c9421e1 1004 (midQ->mid_state == MID_REQUEST_SUBMITTED) &&
7ee1af76
JA
1005 ((ses->server->tcpStatus == CifsGood) ||
1006 (ses->server->tcpStatus == CifsNew))) {
1007
1008 if (in_buf->Command == SMB_COM_TRANSACTION2) {
1009 /* POSIX lock. We send a NT_CANCEL SMB to cause the
1010 blocking lock to return. */
121b046a 1011 rc = send_cancel(ses->server, in_buf, midQ);
7ee1af76 1012 if (rc) {
3c1bf7e4 1013 cifs_delete_mid(midQ);
7ee1af76
JA
1014 return rc;
1015 }
1016 } else {
1017 /* Windows lock. We send a LOCKINGX_CANCEL_LOCK
1018 to cause the blocking lock to return. */
1019
1020 rc = send_lock_cancel(xid, tcon, in_buf, out_buf);
1021
1022 /* If we get -ENOLCK back the lock may have
1023 already been removed. Don't exit in this case. */
1024 if (rc && rc != -ENOLCK) {
3c1bf7e4 1025 cifs_delete_mid(midQ);
7ee1af76
JA
1026 return rc;
1027 }
1028 }
1029
1be912dd
JL
1030 rc = wait_for_response(ses->server, midQ);
1031 if (rc) {
121b046a 1032 send_cancel(ses->server, in_buf, midQ);
1be912dd 1033 spin_lock(&GlobalMid_Lock);
7c9421e1 1034 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1be912dd
JL
1035 /* no longer considered to be "in-flight" */
1036 midQ->callback = DeleteMidQEntry;
1037 spin_unlock(&GlobalMid_Lock);
1038 return rc;
1039 }
1040 spin_unlock(&GlobalMid_Lock);
7ee1af76 1041 }
1be912dd
JL
1042
1043 /* We got the response - restart system call. */
1044 rstart = 1;
7ee1af76
JA
1045 }
1046
3c1105df 1047 rc = cifs_sync_mid_result(midQ, ses->server);
053d5034 1048 if (rc != 0)
7ee1af76 1049 return rc;
50c2f753 1050
17c8bfed 1051 /* rcvd frame is ok */
7c9421e1 1052 if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_RECEIVED) {
698e96a8 1053 rc = -EIO;
f96637be 1054 cifs_dbg(VFS, "Bad MID state?\n");
698e96a8
VL
1055 goto out;
1056 }
1da177e4 1057
d4e4854f 1058 *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
2c8f981d
JL
1059 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
1060 rc = cifs_check_receive(midQ, ses->server, 0);
17c8bfed 1061out:
3c1bf7e4 1062 cifs_delete_mid(midQ);
7ee1af76
JA
1063 if (rstart && rc == -EACCES)
1064 return -ERESTARTSYS;
1da177e4
LT
1065 return rc;
1066}