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 		cifs_signal_cifsd_for_reconnect(server, false);
434 		trace_smb3_partial_send_reconnect(server->CurrentMid,
435 						  server->conn_id, server->hostname);
436 	}
437 smbd_done:
438 	if (rc < 0 && rc != -EINTR)
439 		cifs_server_dbg(VFS, "Error %d sending data on socket to server\n",
440 			 rc);
441 	else if (rc > 0)
442 		rc = 0;
443 
444 	return rc;
445 }
446 
447 static int
smb_send_rqst(struct TCP_Server_Info * server,int num_rqst,struct smb_rqst * rqst,int flags)448 smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
449 	      struct smb_rqst *rqst, int flags)
450 {
451 	struct kvec iov;
452 	struct smb2_transform_hdr *tr_hdr;
453 	struct smb_rqst cur_rqst[MAX_COMPOUND];
454 	int rc;
455 
456 	if (!(flags & CIFS_TRANSFORM_REQ))
457 		return __smb_send_rqst(server, num_rqst, rqst);
458 
459 	if (num_rqst > MAX_COMPOUND - 1)
460 		return -ENOMEM;
461 
462 	if (!server->ops->init_transform_rq) {
463 		cifs_server_dbg(VFS, "Encryption requested but transform callback is missing\n");
464 		return -EIO;
465 	}
466 
467 	tr_hdr = kzalloc(sizeof(*tr_hdr), GFP_NOFS);
468 	if (!tr_hdr)
469 		return -ENOMEM;
470 
471 	memset(&cur_rqst[0], 0, sizeof(cur_rqst));
472 	memset(&iov, 0, sizeof(iov));
473 
474 	iov.iov_base = tr_hdr;
475 	iov.iov_len = sizeof(*tr_hdr);
476 	cur_rqst[0].rq_iov = &iov;
477 	cur_rqst[0].rq_nvec = 1;
478 
479 	rc = server->ops->init_transform_rq(server, num_rqst + 1,
480 					    &cur_rqst[0], rqst);
481 	if (rc)
482 		goto out;
483 
484 	rc = __smb_send_rqst(server, num_rqst + 1, &cur_rqst[0]);
485 	smb3_free_compound_rqst(num_rqst, &cur_rqst[1]);
486 out:
487 	kfree(tr_hdr);
488 	return rc;
489 }
490 
491 int
smb_send(struct TCP_Server_Info * server,struct smb_hdr * smb_buffer,unsigned int smb_buf_length)492 smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
493 	 unsigned int smb_buf_length)
494 {
495 	struct kvec iov[2];
496 	struct smb_rqst rqst = { .rq_iov = iov,
497 				 .rq_nvec = 2 };
498 
499 	iov[0].iov_base = smb_buffer;
500 	iov[0].iov_len = 4;
501 	iov[1].iov_base = (char *)smb_buffer + 4;
502 	iov[1].iov_len = smb_buf_length;
503 
504 	return __smb_send_rqst(server, 1, &rqst);
505 }
506 
507 static int
wait_for_free_credits(struct TCP_Server_Info * server,const int num_credits,const int timeout,const int flags,unsigned int * instance)508 wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
509 		      const int timeout, const int flags,
510 		      unsigned int *instance)
511 {
512 	long rc;
513 	int *credits;
514 	int optype;
515 	long int t;
516 	int scredits, in_flight;
517 
518 	if (timeout < 0)
519 		t = MAX_JIFFY_OFFSET;
520 	else
521 		t = msecs_to_jiffies(timeout);
522 
523 	optype = flags & CIFS_OP_MASK;
524 
525 	*instance = 0;
526 
527 	credits = server->ops->get_credits_field(server, optype);
528 	/* Since an echo is already inflight, no need to wait to send another */
529 	if (*credits <= 0 && optype == CIFS_ECHO_OP)
530 		return -EAGAIN;
531 
532 	spin_lock(&server->req_lock);
533 	if ((flags & CIFS_TIMEOUT_MASK) == CIFS_NON_BLOCKING) {
534 		/* oplock breaks must not be held up */
535 		server->in_flight++;
536 		if (server->in_flight > server->max_in_flight)
537 			server->max_in_flight = server->in_flight;
538 		*credits -= 1;
539 		*instance = server->reconnect_instance;
540 		scredits = *credits;
541 		in_flight = server->in_flight;
542 		spin_unlock(&server->req_lock);
543 
544 		trace_smb3_nblk_credits(server->CurrentMid,
545 				server->conn_id, server->hostname, scredits, -1, in_flight);
546 		cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
547 				__func__, 1, scredits);
548 
549 		return 0;
550 	}
551 
552 	while (1) {
553 		if (*credits < num_credits) {
554 			scredits = *credits;
555 			spin_unlock(&server->req_lock);
556 
557 			cifs_num_waiters_inc(server);
558 			rc = wait_event_killable_timeout(server->request_q,
559 				has_credits(server, credits, num_credits), t);
560 			cifs_num_waiters_dec(server);
561 			if (!rc) {
562 				spin_lock(&server->req_lock);
563 				scredits = *credits;
564 				in_flight = server->in_flight;
565 				spin_unlock(&server->req_lock);
566 
567 				trace_smb3_credit_timeout(server->CurrentMid,
568 						server->conn_id, server->hostname, scredits,
569 						num_credits, in_flight);
570 				cifs_server_dbg(VFS, "wait timed out after %d ms\n",
571 						timeout);
572 				return -EBUSY;
573 			}
574 			if (rc == -ERESTARTSYS)
575 				return -ERESTARTSYS;
576 			spin_lock(&server->req_lock);
577 		} else {
578 			spin_unlock(&server->req_lock);
579 
580 			spin_lock(&cifs_tcp_ses_lock);
581 			if (server->tcpStatus == CifsExiting) {
582 				spin_unlock(&cifs_tcp_ses_lock);
583 				return -ENOENT;
584 			}
585 			spin_unlock(&cifs_tcp_ses_lock);
586 
587 			/*
588 			 * For normal commands, reserve the last MAX_COMPOUND
589 			 * credits to compound requests.
590 			 * Otherwise these compounds could be permanently
591 			 * starved for credits by single-credit requests.
592 			 *
593 			 * To prevent spinning CPU, block this thread until
594 			 * there are >MAX_COMPOUND credits available.
595 			 * But only do this is we already have a lot of
596 			 * credits in flight to avoid triggering this check
597 			 * for servers that are slow to hand out credits on
598 			 * new sessions.
599 			 */
600 			spin_lock(&server->req_lock);
601 			if (!optype && num_credits == 1 &&
602 			    server->in_flight > 2 * MAX_COMPOUND &&
603 			    *credits <= MAX_COMPOUND) {
604 				spin_unlock(&server->req_lock);
605 
606 				cifs_num_waiters_inc(server);
607 				rc = wait_event_killable_timeout(
608 					server->request_q,
609 					has_credits(server, credits,
610 						    MAX_COMPOUND + 1),
611 					t);
612 				cifs_num_waiters_dec(server);
613 				if (!rc) {
614 					spin_lock(&server->req_lock);
615 					scredits = *credits;
616 					in_flight = server->in_flight;
617 					spin_unlock(&server->req_lock);
618 
619 					trace_smb3_credit_timeout(
620 							server->CurrentMid,
621 							server->conn_id, server->hostname,
622 							scredits, num_credits, in_flight);
623 					cifs_server_dbg(VFS, "wait timed out after %d ms\n",
624 							timeout);
625 					return -EBUSY;
626 				}
627 				if (rc == -ERESTARTSYS)
628 					return -ERESTARTSYS;
629 				spin_lock(&server->req_lock);
630 				continue;
631 			}
632 
633 			/*
634 			 * Can not count locking commands against total
635 			 * as they are allowed to block on server.
636 			 */
637 
638 			/* update # of requests on the wire to server */
639 			if ((flags & CIFS_TIMEOUT_MASK) != CIFS_BLOCKING_OP) {
640 				*credits -= num_credits;
641 				server->in_flight += num_credits;
642 				if (server->in_flight > server->max_in_flight)
643 					server->max_in_flight = server->in_flight;
644 				*instance = server->reconnect_instance;
645 			}
646 			scredits = *credits;
647 			in_flight = server->in_flight;
648 			spin_unlock(&server->req_lock);
649 
650 			trace_smb3_waitff_credits(server->CurrentMid,
651 					server->conn_id, server->hostname, scredits,
652 					-(num_credits), in_flight);
653 			cifs_dbg(FYI, "%s: remove %u credits total=%d\n",
654 					__func__, num_credits, scredits);
655 			break;
656 		}
657 	}
658 	return 0;
659 }
660 
661 static int
wait_for_free_request(struct TCP_Server_Info * server,const int flags,unsigned int * instance)662 wait_for_free_request(struct TCP_Server_Info *server, const int flags,
663 		      unsigned int *instance)
664 {
665 	return wait_for_free_credits(server, 1, -1, flags,
666 				     instance);
667 }
668 
669 static int
wait_for_compound_request(struct TCP_Server_Info * server,int num,const int flags,unsigned int * instance)670 wait_for_compound_request(struct TCP_Server_Info *server, int num,
671 			  const int flags, unsigned int *instance)
672 {
673 	int *credits;
674 	int scredits, in_flight;
675 
676 	credits = server->ops->get_credits_field(server, flags & CIFS_OP_MASK);
677 
678 	spin_lock(&server->req_lock);
679 	scredits = *credits;
680 	in_flight = server->in_flight;
681 
682 	if (*credits < num) {
683 		/*
684 		 * If the server is tight on resources or just gives us less
685 		 * credits for other reasons (e.g. requests are coming out of
686 		 * order and the server delays granting more credits until it
687 		 * processes a missing mid) and we exhausted most available
688 		 * credits there may be situations when we try to send
689 		 * a compound request but we don't have enough credits. At this
690 		 * point the client needs to decide if it should wait for
691 		 * additional credits or fail the request. If at least one
692 		 * request is in flight there is a high probability that the
693 		 * server will return enough credits to satisfy this compound
694 		 * request.
695 		 *
696 		 * Return immediately if no requests in flight since we will be
697 		 * stuck on waiting for credits.
698 		 */
699 		if (server->in_flight == 0) {
700 			spin_unlock(&server->req_lock);
701 			trace_smb3_insufficient_credits(server->CurrentMid,
702 					server->conn_id, server->hostname, scredits,
703 					num, in_flight);
704 			cifs_dbg(FYI, "%s: %d requests in flight, needed %d total=%d\n",
705 					__func__, in_flight, num, scredits);
706 			return -EDEADLK;
707 		}
708 	}
709 	spin_unlock(&server->req_lock);
710 
711 	return wait_for_free_credits(server, num, 60000, flags,
712 				     instance);
713 }
714 
715 int
cifs_wait_mtu_credits(struct TCP_Server_Info * server,unsigned int size,unsigned int * num,struct cifs_credits * credits)716 cifs_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
717 		      unsigned int *num, struct cifs_credits *credits)
718 {
719 	*num = size;
720 	credits->value = 0;
721 	credits->instance = server->reconnect_instance;
722 	return 0;
723 }
724 
allocate_mid(struct cifs_ses * ses,struct smb_hdr * in_buf,struct mid_q_entry ** ppmidQ)725 static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
726 			struct mid_q_entry **ppmidQ)
727 {
728 	spin_lock(&cifs_tcp_ses_lock);
729 	if (ses->ses_status == SES_NEW) {
730 		if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) &&
731 			(in_buf->Command != SMB_COM_NEGOTIATE)) {
732 			spin_unlock(&cifs_tcp_ses_lock);
733 			return -EAGAIN;
734 		}
735 		/* else ok - we are setting up session */
736 	}
737 
738 	if (ses->ses_status == SES_EXITING) {
739 		/* check if SMB session is bad because we are setting it up */
740 		if (in_buf->Command != SMB_COM_LOGOFF_ANDX) {
741 			spin_unlock(&cifs_tcp_ses_lock);
742 			return -EAGAIN;
743 		}
744 		/* else ok - we are shutting down session */
745 	}
746 	spin_unlock(&cifs_tcp_ses_lock);
747 
748 	*ppmidQ = AllocMidQEntry(in_buf, ses->server);
749 	if (*ppmidQ == NULL)
750 		return -ENOMEM;
751 	spin_lock(&GlobalMid_Lock);
752 	list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q);
753 	spin_unlock(&GlobalMid_Lock);
754 	return 0;
755 }
756 
757 static int
wait_for_response(struct TCP_Server_Info * server,struct mid_q_entry * midQ)758 wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
759 {
760 	int error;
761 
762 	error = wait_event_freezekillable_unsafe(server->response_q,
763 				    midQ->mid_state != MID_REQUEST_SUBMITTED);
764 	if (error < 0)
765 		return -ERESTARTSYS;
766 
767 	return 0;
768 }
769 
770 struct mid_q_entry *
cifs_setup_async_request(struct TCP_Server_Info * server,struct smb_rqst * rqst)771 cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
772 {
773 	int rc;
774 	struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
775 	struct mid_q_entry *mid;
776 
777 	if (rqst->rq_iov[0].iov_len != 4 ||
778 	    rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base)
779 		return ERR_PTR(-EIO);
780 
781 	/* enable signing if server requires it */
782 	if (server->sign)
783 		hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
784 
785 	mid = AllocMidQEntry(hdr, server);
786 	if (mid == NULL)
787 		return ERR_PTR(-ENOMEM);
788 
789 	rc = cifs_sign_rqst(rqst, server, &mid->sequence_number);
790 	if (rc) {
791 		DeleteMidQEntry(mid);
792 		return ERR_PTR(rc);
793 	}
794 
795 	return mid;
796 }
797 
798 /*
799  * Send a SMB request and set the callback function in the mid to handle
800  * the result. Caller is responsible for dealing with timeouts.
801  */
802 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)803 cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst,
804 		mid_receive_t *receive, mid_callback_t *callback,
805 		mid_handle_t *handle, void *cbdata, const int flags,
806 		const struct cifs_credits *exist_credits)
807 {
808 	int rc;
809 	struct mid_q_entry *mid;
810 	struct cifs_credits credits = { .value = 0, .instance = 0 };
811 	unsigned int instance;
812 	int optype;
813 
814 	optype = flags & CIFS_OP_MASK;
815 
816 	if ((flags & CIFS_HAS_CREDITS) == 0) {
817 		rc = wait_for_free_request(server, flags, &instance);
818 		if (rc)
819 			return rc;
820 		credits.value = 1;
821 		credits.instance = instance;
822 	} else
823 		instance = exist_credits->instance;
824 
825 	cifs_server_lock(server);
826 
827 	/*
828 	 * We can't use credits obtained from the previous session to send this
829 	 * request. Check if there were reconnects after we obtained credits and
830 	 * return -EAGAIN in such cases to let callers handle it.
831 	 */
832 	if (instance != server->reconnect_instance) {
833 		cifs_server_unlock(server);
834 		add_credits_and_wake_if(server, &credits, optype);
835 		return -EAGAIN;
836 	}
837 
838 	mid = server->ops->setup_async_request(server, rqst);
839 	if (IS_ERR(mid)) {
840 		cifs_server_unlock(server);
841 		add_credits_and_wake_if(server, &credits, optype);
842 		return PTR_ERR(mid);
843 	}
844 
845 	mid->receive = receive;
846 	mid->callback = callback;
847 	mid->callback_data = cbdata;
848 	mid->handle = handle;
849 	mid->mid_state = MID_REQUEST_SUBMITTED;
850 
851 	/* put it on the pending_mid_q */
852 	spin_lock(&GlobalMid_Lock);
853 	list_add_tail(&mid->qhead, &server->pending_mid_q);
854 	spin_unlock(&GlobalMid_Lock);
855 
856 	/*
857 	 * Need to store the time in mid before calling I/O. For call_async,
858 	 * I/O response may come back and free the mid entry on another thread.
859 	 */
860 	cifs_save_when_sent(mid);
861 	cifs_in_send_inc(server);
862 	rc = smb_send_rqst(server, 1, rqst, flags);
863 	cifs_in_send_dec(server);
864 
865 	if (rc < 0) {
866 		revert_current_mid(server, mid->credits);
867 		server->sequence_number -= 2;
868 		cifs_delete_mid(mid);
869 	}
870 
871 	cifs_server_unlock(server);
872 
873 	if (rc == 0)
874 		return 0;
875 
876 	add_credits_and_wake_if(server, &credits, optype);
877 	return rc;
878 }
879 
880 /*
881  *
882  * Send an SMB Request.  No response info (other than return code)
883  * needs to be parsed.
884  *
885  * flags indicate the type of request buffer and how long to wait
886  * and whether to log NT STATUS code (error) before mapping it to POSIX error
887  *
888  */
889 int
SendReceiveNoRsp(const unsigned int xid,struct cifs_ses * ses,char * in_buf,int flags)890 SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
891 		 char *in_buf, int flags)
892 {
893 	int rc;
894 	struct kvec iov[1];
895 	struct kvec rsp_iov;
896 	int resp_buf_type;
897 
898 	iov[0].iov_base = in_buf;
899 	iov[0].iov_len = get_rfc1002_length(in_buf) + 4;
900 	flags |= CIFS_NO_RSP_BUF;
901 	rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags, &rsp_iov);
902 	cifs_dbg(NOISY, "SendRcvNoRsp flags %d rc %d\n", flags, rc);
903 
904 	return rc;
905 }
906 
907 static int
cifs_sync_mid_result(struct mid_q_entry * mid,struct TCP_Server_Info * server)908 cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
909 {
910 	int rc = 0;
911 
912 	cifs_dbg(FYI, "%s: cmd=%d mid=%llu state=%d\n",
913 		 __func__, le16_to_cpu(mid->command), mid->mid, mid->mid_state);
914 
915 	spin_lock(&GlobalMid_Lock);
916 	switch (mid->mid_state) {
917 	case MID_RESPONSE_RECEIVED:
918 		spin_unlock(&GlobalMid_Lock);
919 		return rc;
920 	case MID_RETRY_NEEDED:
921 		rc = -EAGAIN;
922 		break;
923 	case MID_RESPONSE_MALFORMED:
924 		rc = -EIO;
925 		break;
926 	case MID_SHUTDOWN:
927 		rc = -EHOSTDOWN;
928 		break;
929 	default:
930 		if (!(mid->mid_flags & MID_DELETED)) {
931 			list_del_init(&mid->qhead);
932 			mid->mid_flags |= MID_DELETED;
933 		}
934 		cifs_server_dbg(VFS, "%s: invalid mid state mid=%llu state=%d\n",
935 			 __func__, mid->mid, mid->mid_state);
936 		rc = -EIO;
937 	}
938 	spin_unlock(&GlobalMid_Lock);
939 
940 	DeleteMidQEntry(mid);
941 	return rc;
942 }
943 
944 static inline int
send_cancel(struct TCP_Server_Info * server,struct smb_rqst * rqst,struct mid_q_entry * mid)945 send_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
946 	    struct mid_q_entry *mid)
947 {
948 	return server->ops->send_cancel ?
949 				server->ops->send_cancel(server, rqst, mid) : 0;
950 }
951 
952 int
cifs_check_receive(struct mid_q_entry * mid,struct TCP_Server_Info * server,bool log_error)953 cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
954 		   bool log_error)
955 {
956 	unsigned int len = get_rfc1002_length(mid->resp_buf) + 4;
957 
958 	dump_smb(mid->resp_buf, min_t(u32, 92, len));
959 
960 	/* convert the length into a more usable form */
961 	if (server->sign) {
962 		struct kvec iov[2];
963 		int rc = 0;
964 		struct smb_rqst rqst = { .rq_iov = iov,
965 					 .rq_nvec = 2 };
966 
967 		iov[0].iov_base = mid->resp_buf;
968 		iov[0].iov_len = 4;
969 		iov[1].iov_base = (char *)mid->resp_buf + 4;
970 		iov[1].iov_len = len - 4;
971 		/* FIXME: add code to kill session */
972 		rc = cifs_verify_signature(&rqst, server,
973 					   mid->sequence_number);
974 		if (rc)
975 			cifs_server_dbg(VFS, "SMB signature verification returned error = %d\n",
976 				 rc);
977 	}
978 
979 	/* BB special case reconnect tid and uid here? */
980 	return map_and_check_smb_error(mid, log_error);
981 }
982 
983 struct mid_q_entry *
cifs_setup_request(struct cifs_ses * ses,struct TCP_Server_Info * ignored,struct smb_rqst * rqst)984 cifs_setup_request(struct cifs_ses *ses, struct TCP_Server_Info *ignored,
985 		   struct smb_rqst *rqst)
986 {
987 	int rc;
988 	struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
989 	struct mid_q_entry *mid;
990 
991 	if (rqst->rq_iov[0].iov_len != 4 ||
992 	    rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base)
993 		return ERR_PTR(-EIO);
994 
995 	rc = allocate_mid(ses, hdr, &mid);
996 	if (rc)
997 		return ERR_PTR(rc);
998 	rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number);
999 	if (rc) {
1000 		cifs_delete_mid(mid);
1001 		return ERR_PTR(rc);
1002 	}
1003 	return mid;
1004 }
1005 
1006 static void
cifs_compound_callback(struct mid_q_entry * mid)1007 cifs_compound_callback(struct mid_q_entry *mid)
1008 {
1009 	struct TCP_Server_Info *server = mid->server;
1010 	struct cifs_credits credits;
1011 
1012 	credits.value = server->ops->get_credits(mid);
1013 	credits.instance = server->reconnect_instance;
1014 
1015 	add_credits(server, &credits, mid->optype);
1016 }
1017 
1018 static void
cifs_compound_last_callback(struct mid_q_entry * mid)1019 cifs_compound_last_callback(struct mid_q_entry *mid)
1020 {
1021 	cifs_compound_callback(mid);
1022 	cifs_wake_up_task(mid);
1023 }
1024 
1025 static void
cifs_cancelled_callback(struct mid_q_entry * mid)1026 cifs_cancelled_callback(struct mid_q_entry *mid)
1027 {
1028 	cifs_compound_callback(mid);
1029 	DeleteMidQEntry(mid);
1030 }
1031 
1032 /*
1033  * Return a channel (master if none) of @ses that can be used to send
1034  * regular requests.
1035  *
1036  * If we are currently binding a new channel (negprot/sess.setup),
1037  * return the new incomplete channel.
1038  */
cifs_pick_channel(struct cifs_ses * ses)1039 struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses)
1040 {
1041 	uint index = 0;
1042 
1043 	if (!ses)
1044 		return NULL;
1045 
1046 	/* round robin */
1047 	index = (uint)atomic_inc_return(&ses->chan_seq);
1048 
1049 	spin_lock(&ses->chan_lock);
1050 	index %= ses->chan_count;
1051 	spin_unlock(&ses->chan_lock);
1052 
1053 	return ses->chans[index].server;
1054 }
1055 
1056 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)1057 compound_send_recv(const unsigned int xid, struct cifs_ses *ses,
1058 		   struct TCP_Server_Info *server,
1059 		   const int flags, const int num_rqst, struct smb_rqst *rqst,
1060 		   int *resp_buf_type, struct kvec *resp_iov)
1061 {
1062 	int i, j, optype, rc = 0;
1063 	struct mid_q_entry *midQ[MAX_COMPOUND];
1064 	bool cancelled_mid[MAX_COMPOUND] = {false};
1065 	struct cifs_credits credits[MAX_COMPOUND] = {
1066 		{ .value = 0, .instance = 0 }
1067 	};
1068 	unsigned int instance;
1069 	char *buf;
1070 
1071 	optype = flags & CIFS_OP_MASK;
1072 
1073 	for (i = 0; i < num_rqst; i++)
1074 		resp_buf_type[i] = CIFS_NO_BUFFER;  /* no response buf yet */
1075 
1076 	if (!ses || !ses->server || !server) {
1077 		cifs_dbg(VFS, "Null session\n");
1078 		return -EIO;
1079 	}
1080 
1081 	spin_lock(&cifs_tcp_ses_lock);
1082 	if (server->tcpStatus == CifsExiting) {
1083 		spin_unlock(&cifs_tcp_ses_lock);
1084 		return -ENOENT;
1085 	}
1086 	spin_unlock(&cifs_tcp_ses_lock);
1087 
1088 	/*
1089 	 * Wait for all the requests to become available.
1090 	 * This approach still leaves the possibility to be stuck waiting for
1091 	 * credits if the server doesn't grant credits to the outstanding
1092 	 * requests and if the client is completely idle, not generating any
1093 	 * other requests.
1094 	 * This can be handled by the eventual session reconnect.
1095 	 */
1096 	rc = wait_for_compound_request(server, num_rqst, flags,
1097 				       &instance);
1098 	if (rc)
1099 		return rc;
1100 
1101 	for (i = 0; i < num_rqst; i++) {
1102 		credits[i].value = 1;
1103 		credits[i].instance = instance;
1104 	}
1105 
1106 	/*
1107 	 * Make sure that we sign in the same order that we send on this socket
1108 	 * and avoid races inside tcp sendmsg code that could cause corruption
1109 	 * of smb data.
1110 	 */
1111 
1112 	cifs_server_lock(server);
1113 
1114 	/*
1115 	 * All the parts of the compound chain belong obtained credits from the
1116 	 * same session. We can not use credits obtained from the previous
1117 	 * session to send this request. Check if there were reconnects after
1118 	 * we obtained credits and return -EAGAIN in such cases to let callers
1119 	 * handle it.
1120 	 */
1121 	if (instance != server->reconnect_instance) {
1122 		cifs_server_unlock(server);
1123 		for (j = 0; j < num_rqst; j++)
1124 			add_credits(server, &credits[j], optype);
1125 		return -EAGAIN;
1126 	}
1127 
1128 	for (i = 0; i < num_rqst; i++) {
1129 		midQ[i] = server->ops->setup_request(ses, server, &rqst[i]);
1130 		if (IS_ERR(midQ[i])) {
1131 			revert_current_mid(server, i);
1132 			for (j = 0; j < i; j++)
1133 				cifs_delete_mid(midQ[j]);
1134 			cifs_server_unlock(server);
1135 
1136 			/* Update # of requests on wire to server */
1137 			for (j = 0; j < num_rqst; j++)
1138 				add_credits(server, &credits[j], optype);
1139 			return PTR_ERR(midQ[i]);
1140 		}
1141 
1142 		midQ[i]->mid_state = MID_REQUEST_SUBMITTED;
1143 		midQ[i]->optype = optype;
1144 		/*
1145 		 * Invoke callback for every part of the compound chain
1146 		 * to calculate credits properly. Wake up this thread only when
1147 		 * the last element is received.
1148 		 */
1149 		if (i < num_rqst - 1)
1150 			midQ[i]->callback = cifs_compound_callback;
1151 		else
1152 			midQ[i]->callback = cifs_compound_last_callback;
1153 	}
1154 	cifs_in_send_inc(server);
1155 	rc = smb_send_rqst(server, num_rqst, rqst, flags);
1156 	cifs_in_send_dec(server);
1157 
1158 	for (i = 0; i < num_rqst; i++)
1159 		cifs_save_when_sent(midQ[i]);
1160 
1161 	if (rc < 0) {
1162 		revert_current_mid(server, num_rqst);
1163 		server->sequence_number -= 2;
1164 	}
1165 
1166 	cifs_server_unlock(server);
1167 
1168 	/*
1169 	 * If sending failed for some reason or it is an oplock break that we
1170 	 * will not receive a response to - return credits back
1171 	 */
1172 	if (rc < 0 || (flags & CIFS_NO_SRV_RSP)) {
1173 		for (i = 0; i < num_rqst; i++)
1174 			add_credits(server, &credits[i], optype);
1175 		goto out;
1176 	}
1177 
1178 	/*
1179 	 * At this point the request is passed to the network stack - we assume
1180 	 * that any credits taken from the server structure on the client have
1181 	 * been spent and we can't return them back. Once we receive responses
1182 	 * we will collect credits granted by the server in the mid callbacks
1183 	 * and add those credits to the server structure.
1184 	 */
1185 
1186 	/*
1187 	 * Compounding is never used during session establish.
1188 	 */
1189 	spin_lock(&cifs_tcp_ses_lock);
1190 	if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
1191 		spin_unlock(&cifs_tcp_ses_lock);
1192 
1193 		cifs_server_lock(server);
1194 		smb311_update_preauth_hash(ses, server, rqst[0].rq_iov, rqst[0].rq_nvec);
1195 		cifs_server_unlock(server);
1196 
1197 		spin_lock(&cifs_tcp_ses_lock);
1198 	}
1199 	spin_unlock(&cifs_tcp_ses_lock);
1200 
1201 	for (i = 0; i < num_rqst; i++) {
1202 		rc = wait_for_response(server, midQ[i]);
1203 		if (rc != 0)
1204 			break;
1205 	}
1206 	if (rc != 0) {
1207 		for (; i < num_rqst; i++) {
1208 			cifs_server_dbg(FYI, "Cancelling wait for mid %llu cmd: %d\n",
1209 				 midQ[i]->mid, le16_to_cpu(midQ[i]->command));
1210 			send_cancel(server, &rqst[i], midQ[i]);
1211 			spin_lock(&GlobalMid_Lock);
1212 			midQ[i]->mid_flags |= MID_WAIT_CANCELLED;
1213 			if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED) {
1214 				midQ[i]->callback = cifs_cancelled_callback;
1215 				cancelled_mid[i] = true;
1216 				credits[i].value = 0;
1217 			}
1218 			spin_unlock(&GlobalMid_Lock);
1219 		}
1220 	}
1221 
1222 	for (i = 0; i < num_rqst; i++) {
1223 		if (rc < 0)
1224 			goto out;
1225 
1226 		rc = cifs_sync_mid_result(midQ[i], server);
1227 		if (rc != 0) {
1228 			/* mark this mid as cancelled to not free it below */
1229 			cancelled_mid[i] = true;
1230 			goto out;
1231 		}
1232 
1233 		if (!midQ[i]->resp_buf ||
1234 		    midQ[i]->mid_state != MID_RESPONSE_RECEIVED) {
1235 			rc = -EIO;
1236 			cifs_dbg(FYI, "Bad MID state?\n");
1237 			goto out;
1238 		}
1239 
1240 		buf = (char *)midQ[i]->resp_buf;
1241 		resp_iov[i].iov_base = buf;
1242 		resp_iov[i].iov_len = midQ[i]->resp_buf_size +
1243 			server->vals->header_preamble_size;
1244 
1245 		if (midQ[i]->large_buf)
1246 			resp_buf_type[i] = CIFS_LARGE_BUFFER;
1247 		else
1248 			resp_buf_type[i] = CIFS_SMALL_BUFFER;
1249 
1250 		rc = server->ops->check_receive(midQ[i], server,
1251 						     flags & CIFS_LOG_ERROR);
1252 
1253 		/* mark it so buf will not be freed by cifs_delete_mid */
1254 		if ((flags & CIFS_NO_RSP_BUF) == 0)
1255 			midQ[i]->resp_buf = NULL;
1256 
1257 	}
1258 
1259 	/*
1260 	 * Compounding is never used during session establish.
1261 	 */
1262 	spin_lock(&cifs_tcp_ses_lock);
1263 	if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) {
1264 		struct kvec iov = {
1265 			.iov_base = resp_iov[0].iov_base,
1266 			.iov_len = resp_iov[0].iov_len
1267 		};
1268 		spin_unlock(&cifs_tcp_ses_lock);
1269 		cifs_server_lock(server);
1270 		smb311_update_preauth_hash(ses, server, &iov, 1);
1271 		cifs_server_unlock(server);
1272 		spin_lock(&cifs_tcp_ses_lock);
1273 	}
1274 	spin_unlock(&cifs_tcp_ses_lock);
1275 
1276 out:
1277 	/*
1278 	 * This will dequeue all mids. After this it is important that the
1279 	 * demultiplex_thread will not process any of these mids any futher.
1280 	 * This is prevented above by using a noop callback that will not
1281 	 * wake this thread except for the very last PDU.
1282 	 */
1283 	for (i = 0; i < num_rqst; i++) {
1284 		if (!cancelled_mid[i])
1285 			cifs_delete_mid(midQ[i]);
1286 	}
1287 
1288 	return rc;
1289 }
1290 
1291 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)1292 cifs_send_recv(const unsigned int xid, struct cifs_ses *ses,
1293 	       struct TCP_Server_Info *server,
1294 	       struct smb_rqst *rqst, int *resp_buf_type, const int flags,
1295 	       struct kvec *resp_iov)
1296 {
1297 	return compound_send_recv(xid, ses, server, flags, 1,
1298 				  rqst, resp_buf_type, resp_iov);
1299 }
1300 
1301 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)1302 SendReceive2(const unsigned int xid, struct cifs_ses *ses,
1303 	     struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
1304 	     const int flags, struct kvec *resp_iov)
1305 {
1306 	struct smb_rqst rqst;
1307 	struct kvec s_iov[CIFS_MAX_IOV_SIZE], *new_iov;
1308 	int rc;
1309 
1310 	if (n_vec + 1 > CIFS_MAX_IOV_SIZE) {
1311 		new_iov = kmalloc_array(n_vec + 1, sizeof(struct kvec),
1312 					GFP_KERNEL);
1313 		if (!new_iov) {
1314 			/* otherwise cifs_send_recv below sets resp_buf_type */
1315 			*resp_buf_type = CIFS_NO_BUFFER;
1316 			return -ENOMEM;
1317 		}
1318 	} else
1319 		new_iov = s_iov;
1320 
1321 	/* 1st iov is a RFC1001 length followed by the rest of the packet */
1322 	memcpy(new_iov + 1, iov, (sizeof(struct kvec) * n_vec));
1323 
1324 	new_iov[0].iov_base = new_iov[1].iov_base;
1325 	new_iov[0].iov_len = 4;
1326 	new_iov[1].iov_base += 4;
1327 	new_iov[1].iov_len -= 4;
1328 
1329 	memset(&rqst, 0, sizeof(struct smb_rqst));
1330 	rqst.rq_iov = new_iov;
1331 	rqst.rq_nvec = n_vec + 1;
1332 
1333 	rc = cifs_send_recv(xid, ses, ses->server,
1334 			    &rqst, resp_buf_type, flags, resp_iov);
1335 	if (n_vec + 1 > CIFS_MAX_IOV_SIZE)
1336 		kfree(new_iov);
1337 	return rc;
1338 }
1339 
1340 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)1341 SendReceive(const unsigned int xid, struct cifs_ses *ses,
1342 	    struct smb_hdr *in_buf, struct smb_hdr *out_buf,
1343 	    int *pbytes_returned, const int flags)
1344 {
1345 	int rc = 0;
1346 	struct mid_q_entry *midQ;
1347 	unsigned int len = be32_to_cpu(in_buf->smb_buf_length);
1348 	struct kvec iov = { .iov_base = in_buf, .iov_len = len };
1349 	struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
1350 	struct cifs_credits credits = { .value = 1, .instance = 0 };
1351 	struct TCP_Server_Info *server;
1352 
1353 	if (ses == NULL) {
1354 		cifs_dbg(VFS, "Null smb session\n");
1355 		return -EIO;
1356 	}
1357 	server = ses->server;
1358 	if (server == NULL) {
1359 		cifs_dbg(VFS, "Null tcp session\n");
1360 		return -EIO;
1361 	}
1362 
1363 	spin_lock(&cifs_tcp_ses_lock);
1364 	if (server->tcpStatus == CifsExiting) {
1365 		spin_unlock(&cifs_tcp_ses_lock);
1366 		return -ENOENT;
1367 	}
1368 	spin_unlock(&cifs_tcp_ses_lock);
1369 
1370 	/* Ensure that we do not send more than 50 overlapping requests
1371 	   to the same server. We may make this configurable later or
1372 	   use ses->maxReq */
1373 
1374 	if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
1375 		cifs_server_dbg(VFS, "Invalid length, greater than maximum frame, %d\n",
1376 				len);
1377 		return -EIO;
1378 	}
1379 
1380 	rc = wait_for_free_request(server, flags, &credits.instance);
1381 	if (rc)
1382 		return rc;
1383 
1384 	/* make sure that we sign in the same order that we send on this socket
1385 	   and avoid races inside tcp sendmsg code that could cause corruption
1386 	   of smb data */
1387 
1388 	cifs_server_lock(server);
1389 
1390 	rc = allocate_mid(ses, in_buf, &midQ);
1391 	if (rc) {
1392 		cifs_server_unlock(server);
1393 		/* Update # of requests on wire to server */
1394 		add_credits(server, &credits, 0);
1395 		return rc;
1396 	}
1397 
1398 	rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number);
1399 	if (rc) {
1400 		cifs_server_unlock(server);
1401 		goto out;
1402 	}
1403 
1404 	midQ->mid_state = MID_REQUEST_SUBMITTED;
1405 
1406 	cifs_in_send_inc(server);
1407 	rc = smb_send(server, in_buf, len);
1408 	cifs_in_send_dec(server);
1409 	cifs_save_when_sent(midQ);
1410 
1411 	if (rc < 0)
1412 		server->sequence_number -= 2;
1413 
1414 	cifs_server_unlock(server);
1415 
1416 	if (rc < 0)
1417 		goto out;
1418 
1419 	rc = wait_for_response(server, midQ);
1420 	if (rc != 0) {
1421 		send_cancel(server, &rqst, midQ);
1422 		spin_lock(&GlobalMid_Lock);
1423 		if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1424 			/* no longer considered to be "in-flight" */
1425 			midQ->callback = DeleteMidQEntry;
1426 			spin_unlock(&GlobalMid_Lock);
1427 			add_credits(server, &credits, 0);
1428 			return rc;
1429 		}
1430 		spin_unlock(&GlobalMid_Lock);
1431 	}
1432 
1433 	rc = cifs_sync_mid_result(midQ, server);
1434 	if (rc != 0) {
1435 		add_credits(server, &credits, 0);
1436 		return rc;
1437 	}
1438 
1439 	if (!midQ->resp_buf || !out_buf ||
1440 	    midQ->mid_state != MID_RESPONSE_RECEIVED) {
1441 		rc = -EIO;
1442 		cifs_server_dbg(VFS, "Bad MID state?\n");
1443 		goto out;
1444 	}
1445 
1446 	*pbytes_returned = get_rfc1002_length(midQ->resp_buf);
1447 	memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
1448 	rc = cifs_check_receive(midQ, server, 0);
1449 out:
1450 	cifs_delete_mid(midQ);
1451 	add_credits(server, &credits, 0);
1452 
1453 	return rc;
1454 }
1455 
1456 /* We send a LOCKINGX_CANCEL_LOCK to cause the Windows
1457    blocking lock to return. */
1458 
1459 static int
send_lock_cancel(const unsigned int xid,struct cifs_tcon * tcon,struct smb_hdr * in_buf,struct smb_hdr * out_buf)1460 send_lock_cancel(const unsigned int xid, struct cifs_tcon *tcon,
1461 			struct smb_hdr *in_buf,
1462 			struct smb_hdr *out_buf)
1463 {
1464 	int bytes_returned;
1465 	struct cifs_ses *ses = tcon->ses;
1466 	LOCK_REQ *pSMB = (LOCK_REQ *)in_buf;
1467 
1468 	/* We just modify the current in_buf to change
1469 	   the type of lock from LOCKING_ANDX_SHARED_LOCK
1470 	   or LOCKING_ANDX_EXCLUSIVE_LOCK to
1471 	   LOCKING_ANDX_CANCEL_LOCK. */
1472 
1473 	pSMB->LockType = LOCKING_ANDX_CANCEL_LOCK|LOCKING_ANDX_LARGE_FILES;
1474 	pSMB->Timeout = 0;
1475 	pSMB->hdr.Mid = get_next_mid(ses->server);
1476 
1477 	return SendReceive(xid, ses, in_buf, out_buf,
1478 			&bytes_returned, 0);
1479 }
1480 
1481 int
SendReceiveBlockingLock(const unsigned int xid,struct cifs_tcon * tcon,struct smb_hdr * in_buf,struct smb_hdr * out_buf,int * pbytes_returned)1482 SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
1483 	    struct smb_hdr *in_buf, struct smb_hdr *out_buf,
1484 	    int *pbytes_returned)
1485 {
1486 	int rc = 0;
1487 	int rstart = 0;
1488 	struct mid_q_entry *midQ;
1489 	struct cifs_ses *ses;
1490 	unsigned int len = be32_to_cpu(in_buf->smb_buf_length);
1491 	struct kvec iov = { .iov_base = in_buf, .iov_len = len };
1492 	struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
1493 	unsigned int instance;
1494 	struct TCP_Server_Info *server;
1495 
1496 	if (tcon == NULL || tcon->ses == NULL) {
1497 		cifs_dbg(VFS, "Null smb session\n");
1498 		return -EIO;
1499 	}
1500 	ses = tcon->ses;
1501 	server = ses->server;
1502 
1503 	if (server == NULL) {
1504 		cifs_dbg(VFS, "Null tcp session\n");
1505 		return -EIO;
1506 	}
1507 
1508 	spin_lock(&cifs_tcp_ses_lock);
1509 	if (server->tcpStatus == CifsExiting) {
1510 		spin_unlock(&cifs_tcp_ses_lock);
1511 		return -ENOENT;
1512 	}
1513 	spin_unlock(&cifs_tcp_ses_lock);
1514 
1515 	/* Ensure that we do not send more than 50 overlapping requests
1516 	   to the same server. We may make this configurable later or
1517 	   use ses->maxReq */
1518 
1519 	if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
1520 		cifs_tcon_dbg(VFS, "Invalid length, greater than maximum frame, %d\n",
1521 			      len);
1522 		return -EIO;
1523 	}
1524 
1525 	rc = wait_for_free_request(server, CIFS_BLOCKING_OP, &instance);
1526 	if (rc)
1527 		return rc;
1528 
1529 	/* make sure that we sign in the same order that we send on this socket
1530 	   and avoid races inside tcp sendmsg code that could cause corruption
1531 	   of smb data */
1532 
1533 	cifs_server_lock(server);
1534 
1535 	rc = allocate_mid(ses, in_buf, &midQ);
1536 	if (rc) {
1537 		cifs_server_unlock(server);
1538 		return rc;
1539 	}
1540 
1541 	rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number);
1542 	if (rc) {
1543 		cifs_delete_mid(midQ);
1544 		cifs_server_unlock(server);
1545 		return rc;
1546 	}
1547 
1548 	midQ->mid_state = MID_REQUEST_SUBMITTED;
1549 	cifs_in_send_inc(server);
1550 	rc = smb_send(server, in_buf, len);
1551 	cifs_in_send_dec(server);
1552 	cifs_save_when_sent(midQ);
1553 
1554 	if (rc < 0)
1555 		server->sequence_number -= 2;
1556 
1557 	cifs_server_unlock(server);
1558 
1559 	if (rc < 0) {
1560 		cifs_delete_mid(midQ);
1561 		return rc;
1562 	}
1563 
1564 	/* Wait for a reply - allow signals to interrupt. */
1565 	rc = wait_event_interruptible(server->response_q,
1566 		(!(midQ->mid_state == MID_REQUEST_SUBMITTED)) ||
1567 		((server->tcpStatus != CifsGood) &&
1568 		 (server->tcpStatus != CifsNew)));
1569 
1570 	/* Were we interrupted by a signal ? */
1571 	spin_lock(&cifs_tcp_ses_lock);
1572 	if ((rc == -ERESTARTSYS) &&
1573 		(midQ->mid_state == MID_REQUEST_SUBMITTED) &&
1574 		((server->tcpStatus == CifsGood) ||
1575 		 (server->tcpStatus == CifsNew))) {
1576 		spin_unlock(&cifs_tcp_ses_lock);
1577 
1578 		if (in_buf->Command == SMB_COM_TRANSACTION2) {
1579 			/* POSIX lock. We send a NT_CANCEL SMB to cause the
1580 			   blocking lock to return. */
1581 			rc = send_cancel(server, &rqst, midQ);
1582 			if (rc) {
1583 				cifs_delete_mid(midQ);
1584 				return rc;
1585 			}
1586 		} else {
1587 			/* Windows lock. We send a LOCKINGX_CANCEL_LOCK
1588 			   to cause the blocking lock to return. */
1589 
1590 			rc = send_lock_cancel(xid, tcon, in_buf, out_buf);
1591 
1592 			/* If we get -ENOLCK back the lock may have
1593 			   already been removed. Don't exit in this case. */
1594 			if (rc && rc != -ENOLCK) {
1595 				cifs_delete_mid(midQ);
1596 				return rc;
1597 			}
1598 		}
1599 
1600 		rc = wait_for_response(server, midQ);
1601 		if (rc) {
1602 			send_cancel(server, &rqst, midQ);
1603 			spin_lock(&GlobalMid_Lock);
1604 			if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1605 				/* no longer considered to be "in-flight" */
1606 				midQ->callback = DeleteMidQEntry;
1607 				spin_unlock(&GlobalMid_Lock);
1608 				return rc;
1609 			}
1610 			spin_unlock(&GlobalMid_Lock);
1611 		}
1612 
1613 		/* We got the response - restart system call. */
1614 		rstart = 1;
1615 		spin_lock(&cifs_tcp_ses_lock);
1616 	}
1617 	spin_unlock(&cifs_tcp_ses_lock);
1618 
1619 	rc = cifs_sync_mid_result(midQ, server);
1620 	if (rc != 0)
1621 		return rc;
1622 
1623 	/* rcvd frame is ok */
1624 	if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_RECEIVED) {
1625 		rc = -EIO;
1626 		cifs_tcon_dbg(VFS, "Bad MID state?\n");
1627 		goto out;
1628 	}
1629 
1630 	*pbytes_returned = get_rfc1002_length(midQ->resp_buf);
1631 	memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
1632 	rc = cifs_check_receive(midQ, server, 0);
1633 out:
1634 	cifs_delete_mid(midQ);
1635 	if (rstart && rc == -EACCES)
1636 		return -ERESTARTSYS;
1637 	return rc;
1638 }
1639