ixgbe: Initialize q_vector cpu and affinity masks correctly
[linux-2.6/cjktty.git] / fs / cifs / transport.c
blob76d974c952fe93126a31d437dc0e362ffef6087c
1 /*
2 * fs/cifs/transport.c
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.
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.
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.
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
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"
40 void
41 cifs_wake_up_task(struct mid_q_entry *mid)
43 wake_up_process(mid->callback_data);
46 struct mid_q_entry *
47 AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
49 struct mid_q_entry *temp;
51 if (server == NULL) {
52 cERROR(1, "Null TCP session in AllocMidQEntry");
53 return NULL;
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 = smb_buffer->Mid; /* always LE */
62 temp->pid = current->pid;
63 temp->command = cpu_to_le16(smb_buffer->Command);
64 cFYI(1, "For smb_command %d", 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;
71 * The default is for the mid to be synchronous, so the
72 * default callback just wakes up the current task.
74 temp->callback = cifs_wake_up_task;
75 temp->callback_data = current;
78 atomic_inc(&midCount);
79 temp->mid_state = MID_REQUEST_ALLOCATED;
80 return temp;
83 void
84 DeleteMidQEntry(struct mid_q_entry *midEntry)
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 printk(KERN_DEBUG " CIFS slow rsp: cmd %d mid %llu",
103 midEntry->command, midEntry->mid);
104 printk(" A: 0x%lx S: 0x%lx R: 0x%lx\n",
105 now - midEntry->when_alloc,
106 now - midEntry->when_sent,
107 now - midEntry->when_received);
110 #endif
111 mempool_free(midEntry, cifs_mid_poolp);
114 void
115 cifs_delete_mid(struct mid_q_entry *mid)
117 spin_lock(&GlobalMid_Lock);
118 list_del(&mid->qhead);
119 spin_unlock(&GlobalMid_Lock);
121 DeleteMidQEntry(mid);
125 * smb_send_kvec - send an array of kvecs to the server
126 * @server: Server to send the data to
127 * @iov: Pointer to array of kvecs
128 * @n_vec: length of kvec array
129 * @sent: amount of data sent on socket is stored here
131 * Our basic "send data to server" function. Should be called with srv_mutex
132 * held. The caller is responsible for handling the results.
134 static int
135 smb_send_kvec(struct TCP_Server_Info *server, struct kvec *iov, size_t n_vec,
136 size_t *sent)
138 int rc = 0;
139 int i = 0;
140 struct msghdr smb_msg;
141 unsigned int remaining;
142 size_t first_vec = 0;
143 struct socket *ssocket = server->ssocket;
145 *sent = 0;
147 if (ssocket == NULL)
148 return -ENOTSOCK; /* BB eventually add reconnect code here */
150 smb_msg.msg_name = (struct sockaddr *) &server->dstaddr;
151 smb_msg.msg_namelen = sizeof(struct sockaddr);
152 smb_msg.msg_control = NULL;
153 smb_msg.msg_controllen = 0;
154 if (server->noblocksnd)
155 smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
156 else
157 smb_msg.msg_flags = MSG_NOSIGNAL;
159 remaining = 0;
160 for (i = 0; i < n_vec; i++)
161 remaining += iov[i].iov_len;
163 i = 0;
164 while (remaining) {
166 * If blocking send, we try 3 times, since each can block
167 * for 5 seconds. For nonblocking we have to try more
168 * but wait increasing amounts of time allowing time for
169 * socket to clear. The overall time we wait in either
170 * case to send on the socket is about 15 seconds.
171 * Similarly we wait for 15 seconds for a response from
172 * the server in SendReceive[2] for the server to send
173 * a response back for most types of requests (except
174 * SMB Write past end of file which can be slow, and
175 * blocking lock operations). NFS waits slightly longer
176 * than CIFS, but this can make it take longer for
177 * nonresponsive servers to be detected and 15 seconds
178 * is more than enough time for modern networks to
179 * send a packet. In most cases if we fail to send
180 * after the retries we will kill the socket and
181 * reconnect which may clear the network problem.
183 rc = kernel_sendmsg(ssocket, &smb_msg, &iov[first_vec],
184 n_vec - first_vec, remaining);
185 if (rc == -ENOSPC || rc == -EAGAIN) {
187 * Catch if a low level driver returns -ENOSPC. This
188 * WARN_ON will be removed by 3.10 if no one reports
189 * seeing this.
191 WARN_ON_ONCE(rc == -ENOSPC);
192 i++;
193 if (i >= 14 || (!server->noblocksnd && (i > 2))) {
194 cERROR(1, "sends on sock %p stuck for 15 "
195 "seconds", ssocket);
196 rc = -EAGAIN;
197 break;
199 msleep(1 << i);
200 continue;
203 if (rc < 0)
204 break;
206 /* send was at least partially successful */
207 *sent += rc;
209 if (rc == remaining) {
210 remaining = 0;
211 break;
214 if (rc > remaining) {
215 cERROR(1, "sent %d requested %d", rc, remaining);
216 break;
219 if (rc == 0) {
220 /* should never happen, letting socket clear before
221 retrying is our only obvious option here */
222 cERROR(1, "tcp sent no data");
223 msleep(500);
224 continue;
227 remaining -= rc;
229 /* the line below resets i */
230 for (i = first_vec; i < n_vec; i++) {
231 if (iov[i].iov_len) {
232 if (rc > iov[i].iov_len) {
233 rc -= iov[i].iov_len;
234 iov[i].iov_len = 0;
235 } else {
236 iov[i].iov_base += rc;
237 iov[i].iov_len -= rc;
238 first_vec = i;
239 break;
244 i = 0; /* in case we get ENOSPC on the next send */
245 rc = 0;
247 return rc;
251 * rqst_page_to_kvec - Turn a slot in the smb_rqst page array into a kvec
252 * @rqst: pointer to smb_rqst
253 * @idx: index into the array of the page
254 * @iov: pointer to struct kvec that will hold the result
256 * Helper function to convert a slot in the rqst->rq_pages array into a kvec.
257 * The page will be kmapped and the address placed into iov_base. The length
258 * will then be adjusted according to the ptailoff.
260 void
261 cifs_rqst_page_to_kvec(struct smb_rqst *rqst, unsigned int idx,
262 struct kvec *iov)
265 * FIXME: We could avoid this kmap altogether if we used
266 * kernel_sendpage instead of kernel_sendmsg. That will only
267 * work if signing is disabled though as sendpage inlines the
268 * page directly into the fraglist. If userspace modifies the
269 * page after we calculate the signature, then the server will
270 * reject it and may break the connection. kernel_sendmsg does
271 * an extra copy of the data and avoids that issue.
273 iov->iov_base = kmap(rqst->rq_pages[idx]);
275 /* if last page, don't send beyond this offset into page */
276 if (idx == (rqst->rq_npages - 1))
277 iov->iov_len = rqst->rq_tailsz;
278 else
279 iov->iov_len = rqst->rq_pagesz;
282 static int
283 smb_send_rqst(struct TCP_Server_Info *server, struct smb_rqst *rqst)
285 int rc;
286 struct kvec *iov = rqst->rq_iov;
287 int n_vec = rqst->rq_nvec;
288 unsigned int smb_buf_length = get_rfc1002_length(iov[0].iov_base);
289 unsigned int i;
290 size_t total_len = 0, sent;
291 struct socket *ssocket = server->ssocket;
292 int val = 1;
294 cFYI(1, "Sending smb: smb_len=%u", smb_buf_length);
295 dump_smb(iov[0].iov_base, iov[0].iov_len);
297 /* cork the socket */
298 kernel_setsockopt(ssocket, SOL_TCP, TCP_CORK,
299 (char *)&val, sizeof(val));
301 rc = smb_send_kvec(server, iov, n_vec, &sent);
302 if (rc < 0)
303 goto uncork;
305 total_len += sent;
307 /* now walk the page array and send each page in it */
308 for (i = 0; i < rqst->rq_npages; i++) {
309 struct kvec p_iov;
311 cifs_rqst_page_to_kvec(rqst, i, &p_iov);
312 rc = smb_send_kvec(server, &p_iov, 1, &sent);
313 kunmap(rqst->rq_pages[i]);
314 if (rc < 0)
315 break;
317 total_len += sent;
320 uncork:
321 /* uncork it */
322 val = 0;
323 kernel_setsockopt(ssocket, SOL_TCP, TCP_CORK,
324 (char *)&val, sizeof(val));
326 if ((total_len > 0) && (total_len != smb_buf_length + 4)) {
327 cFYI(1, "partial send (wanted=%u sent=%zu): terminating "
328 "session", smb_buf_length + 4, total_len);
330 * If we have only sent part of an SMB then the next SMB could
331 * be taken as the remainder of this one. We need to kill the
332 * socket so the server throws away the partial SMB
334 server->tcpStatus = CifsNeedReconnect;
337 if (rc < 0 && rc != -EINTR)
338 cERROR(1, "Error %d sending data on socket to server", rc);
339 else
340 rc = 0;
342 return rc;
345 static int
346 smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
348 struct smb_rqst rqst = { .rq_iov = iov,
349 .rq_nvec = n_vec };
351 return smb_send_rqst(server, &rqst);
355 smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
356 unsigned int smb_buf_length)
358 struct kvec iov;
360 iov.iov_base = smb_buffer;
361 iov.iov_len = smb_buf_length + 4;
363 return smb_sendv(server, &iov, 1);
366 static int
367 wait_for_free_credits(struct TCP_Server_Info *server, const int timeout,
368 int *credits)
370 int rc;
372 spin_lock(&server->req_lock);
373 if (timeout == CIFS_ASYNC_OP) {
374 /* oplock breaks must not be held up */
375 server->in_flight++;
376 *credits -= 1;
377 spin_unlock(&server->req_lock);
378 return 0;
381 while (1) {
382 if (*credits <= 0) {
383 spin_unlock(&server->req_lock);
384 cifs_num_waiters_inc(server);
385 rc = wait_event_killable(server->request_q,
386 has_credits(server, credits));
387 cifs_num_waiters_dec(server);
388 if (rc)
389 return rc;
390 spin_lock(&server->req_lock);
391 } else {
392 if (server->tcpStatus == CifsExiting) {
393 spin_unlock(&server->req_lock);
394 return -ENOENT;
398 * Can not count locking commands against total
399 * as they are allowed to block on server.
402 /* update # of requests on the wire to server */
403 if (timeout != CIFS_BLOCKING_OP) {
404 *credits -= 1;
405 server->in_flight++;
407 spin_unlock(&server->req_lock);
408 break;
411 return 0;
414 static int
415 wait_for_free_request(struct TCP_Server_Info *server, const int timeout,
416 const int optype)
418 return wait_for_free_credits(server, timeout,
419 server->ops->get_credits_field(server, optype));
422 static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
423 struct mid_q_entry **ppmidQ)
425 if (ses->server->tcpStatus == CifsExiting) {
426 return -ENOENT;
429 if (ses->server->tcpStatus == CifsNeedReconnect) {
430 cFYI(1, "tcp session dead - return to caller to retry");
431 return -EAGAIN;
434 if (ses->status != CifsGood) {
435 /* check if SMB session is bad because we are setting it up */
436 if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) &&
437 (in_buf->Command != SMB_COM_NEGOTIATE))
438 return -EAGAIN;
439 /* else ok - we are setting up session */
441 *ppmidQ = AllocMidQEntry(in_buf, ses->server);
442 if (*ppmidQ == NULL)
443 return -ENOMEM;
444 spin_lock(&GlobalMid_Lock);
445 list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q);
446 spin_unlock(&GlobalMid_Lock);
447 return 0;
450 static int
451 wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
453 int error;
455 error = wait_event_freezekillable(server->response_q,
456 midQ->mid_state != MID_REQUEST_SUBMITTED);
457 if (error < 0)
458 return -ERESTARTSYS;
460 return 0;
463 struct mid_q_entry *
464 cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
466 int rc;
467 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
468 struct mid_q_entry *mid;
470 /* enable signing if server requires it */
471 if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
472 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
474 mid = AllocMidQEntry(hdr, server);
475 if (mid == NULL)
476 return ERR_PTR(-ENOMEM);
478 rc = cifs_sign_rqst(rqst, server, &mid->sequence_number);
479 if (rc) {
480 DeleteMidQEntry(mid);
481 return ERR_PTR(rc);
484 return mid;
488 * Send a SMB request and set the callback function in the mid to handle
489 * the result. Caller is responsible for dealing with timeouts.
492 cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst,
493 mid_receive_t *receive, mid_callback_t *callback,
494 void *cbdata, const int flags)
496 int rc, timeout, optype;
497 struct mid_q_entry *mid;
499 timeout = flags & CIFS_TIMEOUT_MASK;
500 optype = flags & CIFS_OP_MASK;
502 rc = wait_for_free_request(server, timeout, optype);
503 if (rc)
504 return rc;
506 mutex_lock(&server->srv_mutex);
507 mid = server->ops->setup_async_request(server, rqst);
508 if (IS_ERR(mid)) {
509 mutex_unlock(&server->srv_mutex);
510 add_credits(server, 1, optype);
511 wake_up(&server->request_q);
512 return PTR_ERR(mid);
515 mid->receive = receive;
516 mid->callback = callback;
517 mid->callback_data = cbdata;
518 mid->mid_state = MID_REQUEST_SUBMITTED;
520 /* put it on the pending_mid_q */
521 spin_lock(&GlobalMid_Lock);
522 list_add_tail(&mid->qhead, &server->pending_mid_q);
523 spin_unlock(&GlobalMid_Lock);
526 cifs_in_send_inc(server);
527 rc = smb_send_rqst(server, rqst);
528 cifs_in_send_dec(server);
529 cifs_save_when_sent(mid);
530 mutex_unlock(&server->srv_mutex);
532 if (rc == 0)
533 return 0;
535 cifs_delete_mid(mid);
536 add_credits(server, 1, optype);
537 wake_up(&server->request_q);
538 return rc;
543 * Send an SMB Request. No response info (other than return code)
544 * needs to be parsed.
546 * flags indicate the type of request buffer and how long to wait
547 * and whether to log NT STATUS code (error) before mapping it to POSIX error
551 SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
552 char *in_buf, int flags)
554 int rc;
555 struct kvec iov[1];
556 int resp_buf_type;
558 iov[0].iov_base = in_buf;
559 iov[0].iov_len = get_rfc1002_length(in_buf) + 4;
560 flags |= CIFS_NO_RESP;
561 rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags);
562 cFYI(DBG2, "SendRcvNoRsp flags %d rc %d", flags, rc);
564 return rc;
567 static int
568 cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
570 int rc = 0;
572 cFYI(1, "%s: cmd=%d mid=%llu state=%d", __func__,
573 le16_to_cpu(mid->command), mid->mid, mid->mid_state);
575 spin_lock(&GlobalMid_Lock);
576 switch (mid->mid_state) {
577 case MID_RESPONSE_RECEIVED:
578 spin_unlock(&GlobalMid_Lock);
579 return rc;
580 case MID_RETRY_NEEDED:
581 rc = -EAGAIN;
582 break;
583 case MID_RESPONSE_MALFORMED:
584 rc = -EIO;
585 break;
586 case MID_SHUTDOWN:
587 rc = -EHOSTDOWN;
588 break;
589 default:
590 list_del_init(&mid->qhead);
591 cERROR(1, "%s: invalid mid state mid=%llu state=%d", __func__,
592 mid->mid, mid->mid_state);
593 rc = -EIO;
595 spin_unlock(&GlobalMid_Lock);
597 DeleteMidQEntry(mid);
598 return rc;
601 static inline int
602 send_cancel(struct TCP_Server_Info *server, void *buf, struct mid_q_entry *mid)
604 return server->ops->send_cancel ?
605 server->ops->send_cancel(server, buf, mid) : 0;
609 cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
610 bool log_error)
612 unsigned int len = get_rfc1002_length(mid->resp_buf) + 4;
614 dump_smb(mid->resp_buf, min_t(u32, 92, len));
616 /* convert the length into a more usable form */
617 if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
618 struct kvec iov;
619 int rc = 0;
620 struct smb_rqst rqst = { .rq_iov = &iov,
621 .rq_nvec = 1 };
623 iov.iov_base = mid->resp_buf;
624 iov.iov_len = len;
625 /* FIXME: add code to kill session */
626 rc = cifs_verify_signature(&rqst, server,
627 mid->sequence_number + 1);
628 if (rc)
629 cERROR(1, "SMB signature verification returned error = "
630 "%d", rc);
633 /* BB special case reconnect tid and uid here? */
634 return map_smb_to_linux_error(mid->resp_buf, log_error);
637 struct mid_q_entry *
638 cifs_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst)
640 int rc;
641 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
642 struct mid_q_entry *mid;
644 rc = allocate_mid(ses, hdr, &mid);
645 if (rc)
646 return ERR_PTR(rc);
647 rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number);
648 if (rc) {
649 cifs_delete_mid(mid);
650 return ERR_PTR(rc);
652 return mid;
656 SendReceive2(const unsigned int xid, struct cifs_ses *ses,
657 struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
658 const int flags)
660 int rc = 0;
661 int timeout, optype;
662 struct mid_q_entry *midQ;
663 char *buf = iov[0].iov_base;
664 unsigned int credits = 1;
665 struct smb_rqst rqst = { .rq_iov = iov,
666 .rq_nvec = n_vec };
668 timeout = flags & CIFS_TIMEOUT_MASK;
669 optype = flags & CIFS_OP_MASK;
671 *resp_buf_type = CIFS_NO_BUFFER; /* no response buf yet */
673 if ((ses == NULL) || (ses->server == NULL)) {
674 cifs_small_buf_release(buf);
675 cERROR(1, "Null session");
676 return -EIO;
679 if (ses->server->tcpStatus == CifsExiting) {
680 cifs_small_buf_release(buf);
681 return -ENOENT;
685 * Ensure that we do not send more than 50 overlapping requests
686 * to the same server. We may make this configurable later or
687 * use ses->maxReq.
690 rc = wait_for_free_request(ses->server, timeout, optype);
691 if (rc) {
692 cifs_small_buf_release(buf);
693 return rc;
697 * Make sure that we sign in the same order that we send on this socket
698 * and avoid races inside tcp sendmsg code that could cause corruption
699 * of smb data.
702 mutex_lock(&ses->server->srv_mutex);
704 midQ = ses->server->ops->setup_request(ses, &rqst);
705 if (IS_ERR(midQ)) {
706 mutex_unlock(&ses->server->srv_mutex);
707 cifs_small_buf_release(buf);
708 /* Update # of requests on wire to server */
709 add_credits(ses->server, 1, optype);
710 return PTR_ERR(midQ);
713 midQ->mid_state = MID_REQUEST_SUBMITTED;
714 cifs_in_send_inc(ses->server);
715 rc = smb_sendv(ses->server, iov, n_vec);
716 cifs_in_send_dec(ses->server);
717 cifs_save_when_sent(midQ);
719 mutex_unlock(&ses->server->srv_mutex);
721 if (rc < 0) {
722 cifs_small_buf_release(buf);
723 goto out;
726 if (timeout == CIFS_ASYNC_OP) {
727 cifs_small_buf_release(buf);
728 goto out;
731 rc = wait_for_response(ses->server, midQ);
732 if (rc != 0) {
733 send_cancel(ses->server, buf, midQ);
734 spin_lock(&GlobalMid_Lock);
735 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
736 midQ->callback = DeleteMidQEntry;
737 spin_unlock(&GlobalMid_Lock);
738 cifs_small_buf_release(buf);
739 add_credits(ses->server, 1, optype);
740 return rc;
742 spin_unlock(&GlobalMid_Lock);
745 cifs_small_buf_release(buf);
747 rc = cifs_sync_mid_result(midQ, ses->server);
748 if (rc != 0) {
749 add_credits(ses->server, 1, optype);
750 return rc;
753 if (!midQ->resp_buf || midQ->mid_state != MID_RESPONSE_RECEIVED) {
754 rc = -EIO;
755 cFYI(1, "Bad MID state?");
756 goto out;
759 buf = (char *)midQ->resp_buf;
760 iov[0].iov_base = buf;
761 iov[0].iov_len = get_rfc1002_length(buf) + 4;
762 if (midQ->large_buf)
763 *resp_buf_type = CIFS_LARGE_BUFFER;
764 else
765 *resp_buf_type = CIFS_SMALL_BUFFER;
767 credits = ses->server->ops->get_credits(midQ);
769 rc = ses->server->ops->check_receive(midQ, ses->server,
770 flags & CIFS_LOG_ERROR);
772 /* mark it so buf will not be freed by cifs_delete_mid */
773 if ((flags & CIFS_NO_RESP) == 0)
774 midQ->resp_buf = NULL;
775 out:
776 cifs_delete_mid(midQ);
777 add_credits(ses->server, credits, optype);
779 return rc;
783 SendReceive(const unsigned int xid, struct cifs_ses *ses,
784 struct smb_hdr *in_buf, struct smb_hdr *out_buf,
785 int *pbytes_returned, const int timeout)
787 int rc = 0;
788 struct mid_q_entry *midQ;
790 if (ses == NULL) {
791 cERROR(1, "Null smb session");
792 return -EIO;
794 if (ses->server == NULL) {
795 cERROR(1, "Null tcp session");
796 return -EIO;
799 if (ses->server->tcpStatus == CifsExiting)
800 return -ENOENT;
802 /* Ensure that we do not send more than 50 overlapping requests
803 to the same server. We may make this configurable later or
804 use ses->maxReq */
806 if (be32_to_cpu(in_buf->smb_buf_length) > CIFSMaxBufSize +
807 MAX_CIFS_HDR_SIZE - 4) {
808 cERROR(1, "Illegal length, greater than maximum frame, %d",
809 be32_to_cpu(in_buf->smb_buf_length));
810 return -EIO;
813 rc = wait_for_free_request(ses->server, timeout, 0);
814 if (rc)
815 return rc;
817 /* make sure that we sign in the same order that we send on this socket
818 and avoid races inside tcp sendmsg code that could cause corruption
819 of smb data */
821 mutex_lock(&ses->server->srv_mutex);
823 rc = allocate_mid(ses, in_buf, &midQ);
824 if (rc) {
825 mutex_unlock(&ses->server->srv_mutex);
826 /* Update # of requests on wire to server */
827 add_credits(ses->server, 1, 0);
828 return rc;
831 rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number);
832 if (rc) {
833 mutex_unlock(&ses->server->srv_mutex);
834 goto out;
837 midQ->mid_state = MID_REQUEST_SUBMITTED;
839 cifs_in_send_inc(ses->server);
840 rc = smb_send(ses->server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
841 cifs_in_send_dec(ses->server);
842 cifs_save_when_sent(midQ);
843 mutex_unlock(&ses->server->srv_mutex);
845 if (rc < 0)
846 goto out;
848 if (timeout == CIFS_ASYNC_OP)
849 goto out;
851 rc = wait_for_response(ses->server, midQ);
852 if (rc != 0) {
853 send_cancel(ses->server, in_buf, midQ);
854 spin_lock(&GlobalMid_Lock);
855 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
856 /* no longer considered to be "in-flight" */
857 midQ->callback = DeleteMidQEntry;
858 spin_unlock(&GlobalMid_Lock);
859 add_credits(ses->server, 1, 0);
860 return rc;
862 spin_unlock(&GlobalMid_Lock);
865 rc = cifs_sync_mid_result(midQ, ses->server);
866 if (rc != 0) {
867 add_credits(ses->server, 1, 0);
868 return rc;
871 if (!midQ->resp_buf || !out_buf ||
872 midQ->mid_state != MID_RESPONSE_RECEIVED) {
873 rc = -EIO;
874 cERROR(1, "Bad MID state?");
875 goto out;
878 *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
879 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
880 rc = cifs_check_receive(midQ, ses->server, 0);
881 out:
882 cifs_delete_mid(midQ);
883 add_credits(ses->server, 1, 0);
885 return rc;
888 /* We send a LOCKINGX_CANCEL_LOCK to cause the Windows
889 blocking lock to return. */
891 static int
892 send_lock_cancel(const unsigned int xid, struct cifs_tcon *tcon,
893 struct smb_hdr *in_buf,
894 struct smb_hdr *out_buf)
896 int bytes_returned;
897 struct cifs_ses *ses = tcon->ses;
898 LOCK_REQ *pSMB = (LOCK_REQ *)in_buf;
900 /* We just modify the current in_buf to change
901 the type of lock from LOCKING_ANDX_SHARED_LOCK
902 or LOCKING_ANDX_EXCLUSIVE_LOCK to
903 LOCKING_ANDX_CANCEL_LOCK. */
905 pSMB->LockType = LOCKING_ANDX_CANCEL_LOCK|LOCKING_ANDX_LARGE_FILES;
906 pSMB->Timeout = 0;
907 pSMB->hdr.Mid = get_next_mid(ses->server);
909 return SendReceive(xid, ses, in_buf, out_buf,
910 &bytes_returned, 0);
914 SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
915 struct smb_hdr *in_buf, struct smb_hdr *out_buf,
916 int *pbytes_returned)
918 int rc = 0;
919 int rstart = 0;
920 struct mid_q_entry *midQ;
921 struct cifs_ses *ses;
923 if (tcon == NULL || tcon->ses == NULL) {
924 cERROR(1, "Null smb session");
925 return -EIO;
927 ses = tcon->ses;
929 if (ses->server == NULL) {
930 cERROR(1, "Null tcp session");
931 return -EIO;
934 if (ses->server->tcpStatus == CifsExiting)
935 return -ENOENT;
937 /* Ensure that we do not send more than 50 overlapping requests
938 to the same server. We may make this configurable later or
939 use ses->maxReq */
941 if (be32_to_cpu(in_buf->smb_buf_length) > CIFSMaxBufSize +
942 MAX_CIFS_HDR_SIZE - 4) {
943 cERROR(1, "Illegal length, greater than maximum frame, %d",
944 be32_to_cpu(in_buf->smb_buf_length));
945 return -EIO;
948 rc = wait_for_free_request(ses->server, CIFS_BLOCKING_OP, 0);
949 if (rc)
950 return rc;
952 /* make sure that we sign in the same order that we send on this socket
953 and avoid races inside tcp sendmsg code that could cause corruption
954 of smb data */
956 mutex_lock(&ses->server->srv_mutex);
958 rc = allocate_mid(ses, in_buf, &midQ);
959 if (rc) {
960 mutex_unlock(&ses->server->srv_mutex);
961 return rc;
964 rc = cifs_sign_smb(in_buf, ses->server, &midQ->sequence_number);
965 if (rc) {
966 cifs_delete_mid(midQ);
967 mutex_unlock(&ses->server->srv_mutex);
968 return rc;
971 midQ->mid_state = MID_REQUEST_SUBMITTED;
972 cifs_in_send_inc(ses->server);
973 rc = smb_send(ses->server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
974 cifs_in_send_dec(ses->server);
975 cifs_save_when_sent(midQ);
976 mutex_unlock(&ses->server->srv_mutex);
978 if (rc < 0) {
979 cifs_delete_mid(midQ);
980 return rc;
983 /* Wait for a reply - allow signals to interrupt. */
984 rc = wait_event_interruptible(ses->server->response_q,
985 (!(midQ->mid_state == MID_REQUEST_SUBMITTED)) ||
986 ((ses->server->tcpStatus != CifsGood) &&
987 (ses->server->tcpStatus != CifsNew)));
989 /* Were we interrupted by a signal ? */
990 if ((rc == -ERESTARTSYS) &&
991 (midQ->mid_state == MID_REQUEST_SUBMITTED) &&
992 ((ses->server->tcpStatus == CifsGood) ||
993 (ses->server->tcpStatus == CifsNew))) {
995 if (in_buf->Command == SMB_COM_TRANSACTION2) {
996 /* POSIX lock. We send a NT_CANCEL SMB to cause the
997 blocking lock to return. */
998 rc = send_cancel(ses->server, in_buf, midQ);
999 if (rc) {
1000 cifs_delete_mid(midQ);
1001 return rc;
1003 } else {
1004 /* Windows lock. We send a LOCKINGX_CANCEL_LOCK
1005 to cause the blocking lock to return. */
1007 rc = send_lock_cancel(xid, tcon, in_buf, out_buf);
1009 /* If we get -ENOLCK back the lock may have
1010 already been removed. Don't exit in this case. */
1011 if (rc && rc != -ENOLCK) {
1012 cifs_delete_mid(midQ);
1013 return rc;
1017 rc = wait_for_response(ses->server, midQ);
1018 if (rc) {
1019 send_cancel(ses->server, in_buf, midQ);
1020 spin_lock(&GlobalMid_Lock);
1021 if (midQ->mid_state == MID_REQUEST_SUBMITTED) {
1022 /* no longer considered to be "in-flight" */
1023 midQ->callback = DeleteMidQEntry;
1024 spin_unlock(&GlobalMid_Lock);
1025 return rc;
1027 spin_unlock(&GlobalMid_Lock);
1030 /* We got the response - restart system call. */
1031 rstart = 1;
1034 rc = cifs_sync_mid_result(midQ, ses->server);
1035 if (rc != 0)
1036 return rc;
1038 /* rcvd frame is ok */
1039 if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_RECEIVED) {
1040 rc = -EIO;
1041 cERROR(1, "Bad MID state?");
1042 goto out;
1045 *pbytes_returned = get_rfc1002_length(midQ->resp_buf);
1046 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4);
1047 rc = cifs_check_receive(midQ, ses->server, 0);
1048 out:
1049 cifs_delete_mid(midQ);
1050 if (rstart && rc == -EACCES)
1051 return -ERESTARTSYS;
1052 return rc;