Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
transport.c
Go to the documentation of this file.
1 /*
2  * fs/cifs/transport.c
3  *
4  * Copyright (C) International Business Machines Corp., 2002,2008
5  * Author(s): Steve French ([email protected])
6  * Jeremy Allison ([email protected]) 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
42 {
44 }
45 
46 struct mid_q_entry *
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  cERROR(1, "Null TCP session in AllocMidQEntry");
53  return NULL;
54  }
55 
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;
69 
70  /*
71  * The default is for the mid to be synchronous, so the
72  * default callback just wakes up the current task.
73  */
75  temp->callback_data = current;
76  }
77 
80  return temp;
81 }
82 
83 void
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;
92  if (midEntry->large_buf)
93  cifs_buf_release(midEntry->resp_buf);
94  else
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);
108  }
109  }
110 #endif
111  mempool_free(midEntry, cifs_mid_poolp);
112 }
113 
114 void
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  * @iov: Pointer to array of kvecs
128  * @n_vec: length of kvec array
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 kvec *iov, size_t n_vec,
136  size_t *sent)
137 {
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;
144 
145  *sent = 0;
146 
147  if (ssocket == NULL)
148  return -ENOTSOCK; /* BB eventually add reconnect code here */
149 
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;
158 
159  remaining = 0;
160  for (i = 0; i < n_vec; i++)
161  remaining += iov[i].iov_len;
162 
163  i = 0;
164  while (remaining) {
165  /*
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.
182  */
183  rc = kernel_sendmsg(ssocket, &smb_msg, &iov[first_vec],
184  n_vec - first_vec, remaining);
185  if (rc == -ENOSPC || rc == -EAGAIN) {
186  /*
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.
190  */
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;
198  }
199  msleep(1 << i);
200  continue;
201  }
202 
203  if (rc < 0)
204  break;
205 
206  /* send was at least partially successful */
207  *sent += rc;
208 
209  if (rc == remaining) {
210  remaining = 0;
211  break;
212  }
213 
214  if (rc > remaining) {
215  cERROR(1, "sent %d requested %d", rc, remaining);
216  break;
217  }
218 
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;
225  }
226 
227  remaining -= rc;
228 
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;
240  }
241  }
242  }
243 
244  i = 0; /* in case we get ENOSPC on the next send */
245  rc = 0;
246  }
247  return rc;
248 }
249 
260 void
261 cifs_rqst_page_to_kvec(struct smb_rqst *rqst, unsigned int idx,
262  struct kvec *iov)
263 {
264  /*
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.
272  */
273  iov->iov_base = kmap(rqst->rq_pages[idx]);
274 
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;
280 }
281 
282 static int
283 smb_send_rqst(struct TCP_Server_Info *server, struct smb_rqst *rqst)
284 {
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;
293 
294  cFYI(1, "Sending smb: smb_len=%u", smb_buf_length);
295  dump_smb(iov[0].iov_base, iov[0].iov_len);
296 
297  /* cork the socket */
299  (char *)&val, sizeof(val));
300 
301  rc = smb_send_kvec(server, iov, n_vec, &sent);
302  if (rc < 0)
303  goto uncork;
304 
305  total_len += sent;
306 
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;
310 
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;
316 
317  total_len += sent;
318  }
319 
320 uncork:
321  /* uncork it */
322  val = 0;
324  (char *)&val, sizeof(val));
325 
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);
329  /*
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
333  */
334  server->tcpStatus = CifsNeedReconnect;
335  }
336 
337  if (rc < 0 && rc != -EINTR)
338  cERROR(1, "Error %d sending data on socket to server", rc);
339  else
340  rc = 0;
341 
342  return rc;
343 }
344 
345 static int
346 smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
347 {
348  struct smb_rqst rqst = { .rq_iov = iov,
349  .rq_nvec = n_vec };
350 
351  return smb_send_rqst(server, &rqst);
352 }
353 
354 int
355 smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
356  unsigned int smb_buf_length)
357 {
358  struct kvec iov;
359 
360  iov.iov_base = smb_buffer;
361  iov.iov_len = smb_buf_length + 4;
362 
363  return smb_sendv(server, &iov, 1);
364 }
365 
366 static int
367 wait_for_free_credits(struct TCP_Server_Info *server, const int timeout,
368  int *credits)
369 {
370  int rc;
371 
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;
379  }
380 
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;
395  }
396 
397  /*
398  * Can not count locking commands against total
399  * as they are allowed to block on server.
400  */
401 
402  /* update # of requests on the wire to server */
403  if (timeout != CIFS_BLOCKING_OP) {
404  *credits -= 1;
405  server->in_flight++;
406  }
407  spin_unlock(&server->req_lock);
408  break;
409  }
410  }
411  return 0;
412 }
413 
414 static int
415 wait_for_free_request(struct TCP_Server_Info *server, const int timeout,
416  const int optype)
417 {
418  return wait_for_free_credits(server, timeout,
419  server->ops->get_credits_field(server, optype));
420 }
421 
422 static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
423  struct mid_q_entry **ppmidQ)
424 {
425  if (ses->server->tcpStatus == CifsExiting) {
426  return -ENOENT;
427  }
428 
429  if (ses->server->tcpStatus == CifsNeedReconnect) {
430  cFYI(1, "tcp session dead - return to caller to retry");
431  return -EAGAIN;
432  }
433 
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 */
440  }
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;
448 }
449 
450 static int
451 wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
452 {
453  int error;
454 
455  error = wait_event_freezekillable(server->response_q,
457  if (error < 0)
458  return -ERESTARTSYS;
459 
460  return 0;
461 }
462 
463 struct mid_q_entry *
464 cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
465 {
466  int rc;
467  struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
468  struct mid_q_entry *mid;
469 
470  /* enable signing if server requires it */
473 
474  mid = AllocMidQEntry(hdr, server);
475  if (mid == NULL)
476  return ERR_PTR(-ENOMEM);
477 
478  rc = cifs_sign_rqst(rqst, server, &mid->sequence_number);
479  if (rc) {
481  return ERR_PTR(rc);
482  }
483 
484  return mid;
485 }
486 
487 /*
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.
490  */
491 int
492 cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst,
494  void *cbdata, const int flags)
495 {
496  int rc, timeout, optype;
497  struct mid_q_entry *mid;
498 
499  timeout = flags & CIFS_TIMEOUT_MASK;
500  optype = flags & CIFS_OP_MASK;
501 
502  rc = wait_for_free_request(server, timeout, optype);
503  if (rc)
504  return rc;
505 
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);
513  }
514 
515  mid->receive = receive;
516  mid->callback = callback;
517  mid->callback_data = cbdata;
519 
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);
524 
525 
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);
531 
532  if (rc == 0)
533  return 0;
534 
535  cifs_delete_mid(mid);
536  add_credits(server, 1, optype);
537  wake_up(&server->request_q);
538  return rc;
539 }
540 
541 /*
542  *
543  * Send an SMB Request. No response info (other than return code)
544  * needs to be parsed.
545  *
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
548  *
549  */
550 int
551 SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
552  char *in_buf, int flags)
553 {
554  int rc;
555  struct kvec iov[1];
556  int resp_buf_type;
557 
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);
563 
564  return rc;
565 }
566 
567 static int
568 cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
569 {
570  int rc = 0;
571 
572  cFYI(1, "%s: cmd=%d mid=%llu state=%d", __func__,
573  le16_to_cpu(mid->command), mid->mid, mid->mid_state);
574 
575  spin_lock(&GlobalMid_Lock);
576  switch (mid->mid_state) {
578  spin_unlock(&GlobalMid_Lock);
579  return rc;
580  case MID_RETRY_NEEDED:
581  rc = -EAGAIN;
582  break;
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;
594  }
595  spin_unlock(&GlobalMid_Lock);
596 
597  DeleteMidQEntry(mid);
598  return rc;
599 }
600 
601 static inline int
602 send_cancel(struct TCP_Server_Info *server, void *buf, struct mid_q_entry *mid)
603 {
604  return server->ops->send_cancel ?
605  server->ops->send_cancel(server, buf, mid) : 0;
606 }
607 
608 int
609 cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
610  bool log_error)
611 {
612  unsigned int len = get_rfc1002_length(mid->resp_buf) + 4;
613 
614  dump_smb(mid->resp_buf, min_t(u32, 92, len));
615 
616  /* convert the length into a more usable form */
618  struct kvec iov;
619  int rc = 0;
620  struct smb_rqst rqst = { .rq_iov = &iov,
621  .rq_nvec = 1 };
622 
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);
631  }
632 
633  /* BB special case reconnect tid and uid here? */
634  return map_smb_to_linux_error(mid->resp_buf, log_error);
635 }
636 
637 struct mid_q_entry *
638 cifs_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst)
639 {
640  int rc;
641  struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
642  struct mid_q_entry *mid;
643 
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);
651  }
652  return mid;
653 }
654 
655 int
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)
659 {
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 };
667 
668  timeout = flags & CIFS_TIMEOUT_MASK;
669  optype = flags & CIFS_OP_MASK;
670 
671  *resp_buf_type = CIFS_NO_BUFFER; /* no response buf yet */
672 
673  if ((ses == NULL) || (ses->server == NULL)) {
675  cERROR(1, "Null session");
676  return -EIO;
677  }
678 
679  if (ses->server->tcpStatus == CifsExiting) {
681  return -ENOENT;
682  }
683 
684  /*
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.
688  */
689 
690  rc = wait_for_free_request(ses->server, timeout, optype);
691  if (rc) {
693  return rc;
694  }
695 
696  /*
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.
700  */
701 
702  mutex_lock(&ses->server->srv_mutex);
703 
704  midQ = ses->server->ops->setup_request(ses, &rqst);
705  if (IS_ERR(midQ)) {
706  mutex_unlock(&ses->server->srv_mutex);
708  /* Update # of requests on wire to server */
709  add_credits(ses->server, 1, optype);
710  return PTR_ERR(midQ);
711  }
712 
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);
718 
719  mutex_unlock(&ses->server->srv_mutex);
720 
721  if (rc < 0) {
723  goto out;
724  }
725 
726  if (timeout == CIFS_ASYNC_OP) {
728  goto out;
729  }
730 
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);
739  add_credits(ses->server, 1, optype);
740  return rc;
741  }
742  spin_unlock(&GlobalMid_Lock);
743  }
744 
746 
747  rc = cifs_sync_mid_result(midQ, ses->server);
748  if (rc != 0) {
749  add_credits(ses->server, 1, optype);
750  return rc;
751  }
752 
753  if (!midQ->resp_buf || midQ->mid_state != MID_RESPONSE_RECEIVED) {
754  rc = -EIO;
755  cFYI(1, "Bad MID state?");
756  goto out;
757  }
758 
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;
766 
767  credits = ses->server->ops->get_credits(midQ);
768 
769  rc = ses->server->ops->check_receive(midQ, ses->server,
770  flags & CIFS_LOG_ERROR);
771 
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);
778 
779  return rc;
780 }
781 
782 int
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)
786 {
787  int rc = 0;
788  struct mid_q_entry *midQ;
789 
790  if (ses == NULL) {
791  cERROR(1, "Null smb session");
792  return -EIO;
793  }
794  if (ses->server == NULL) {
795  cERROR(1, "Null tcp session");
796  return -EIO;
797  }
798 
799  if (ses->server->tcpStatus == CifsExiting)
800  return -ENOENT;
801 
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 */
805 
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;
811  }
812 
813  rc = wait_for_free_request(ses->server, timeout, 0);
814  if (rc)
815  return rc;
816 
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 */
820 
821  mutex_lock(&ses->server->srv_mutex);
822 
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;
829  }
830 
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;
835  }
836 
838 
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);
844 
845  if (rc < 0)
846  goto out;
847 
848  if (timeout == CIFS_ASYNC_OP)
849  goto out;
850 
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;
861  }
862  spin_unlock(&GlobalMid_Lock);
863  }
864 
865  rc = cifs_sync_mid_result(midQ, ses->server);
866  if (rc != 0) {
867  add_credits(ses->server, 1, 0);
868  return rc;
869  }
870 
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;
876  }
877 
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);
884 
885  return rc;
886 }
887 
888 /* We send a LOCKINGX_CANCEL_LOCK to cause the Windows
889  blocking lock to return. */
890 
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)
895 {
896  int bytes_returned;
897  struct cifs_ses *ses = tcon->ses;
898  LOCK_REQ *pSMB = (LOCK_REQ *)in_buf;
899 
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. */
904 
906  pSMB->Timeout = 0;
907  pSMB->hdr.Mid = get_next_mid(ses->server);
908 
909  return SendReceive(xid, ses, in_buf, out_buf,
910  &bytes_returned, 0);
911 }
912 
913 int
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)
917 {
918  int rc = 0;
919  int rstart = 0;
920  struct mid_q_entry *midQ;
921  struct cifs_ses *ses;
922 
923  if (tcon == NULL || tcon->ses == NULL) {
924  cERROR(1, "Null smb session");
925  return -EIO;
926  }
927  ses = tcon->ses;
928 
929  if (ses->server == NULL) {
930  cERROR(1, "Null tcp session");
931  return -EIO;
932  }
933 
934  if (ses->server->tcpStatus == CifsExiting)
935  return -ENOENT;
936 
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 */
940 
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;
946  }
947 
948  rc = wait_for_free_request(ses->server, CIFS_BLOCKING_OP, 0);
949  if (rc)
950  return rc;
951 
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 */
955 
956  mutex_lock(&ses->server->srv_mutex);
957 
958  rc = allocate_mid(ses, in_buf, &midQ);
959  if (rc) {
960  mutex_unlock(&ses->server->srv_mutex);
961  return rc;
962  }
963 
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;
969  }
970 
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);
977 
978  if (rc < 0) {
979  cifs_delete_mid(midQ);
980  return rc;
981  }
982 
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)));
988 
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))) {
994 
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;
1002  }
1003  } else {
1004  /* Windows lock. We send a LOCKINGX_CANCEL_LOCK
1005  to cause the blocking lock to return. */
1006 
1007  rc = send_lock_cancel(xid, tcon, in_buf, out_buf);
1008 
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;
1014  }
1015  }
1016 
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;
1026  }
1027  spin_unlock(&GlobalMid_Lock);
1028  }
1029 
1030  /* We got the response - restart system call. */
1031  rstart = 1;
1032  }
1033 
1034  rc = cifs_sync_mid_result(midQ, ses->server);
1035  if (rc != 0)
1036  return rc;
1037 
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;
1043  }
1044 
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;
1053 }