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