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