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