Lines Matching +full:layers +full:- +full:configurable
1 // SPDX-License-Identifier: LGPL-2.1
39 if (mid->mid_state == MID_RESPONSE_RECEIVED) in cifs_wake_up_task()
40 mid->mid_state = MID_RESPONSE_READY; in cifs_wake_up_task()
41 wake_up_process(mid->callback_data); in cifs_wake_up_task()
56 kref_init(&temp->refcount); in alloc_mid()
57 temp->mid = get_mid(smb_buffer); in alloc_mid()
58 temp->pid = current->pid; in alloc_mid()
59 temp->command = cpu_to_le16(smb_buffer->Command); in alloc_mid()
60 cifs_dbg(FYI, "For smb_command %d\n", smb_buffer->Command); in alloc_mid()
63 temp->when_alloc = jiffies; in alloc_mid()
64 temp->server = server; in alloc_mid()
71 temp->creator = current; in alloc_mid()
72 temp->callback = cifs_wake_up_task; in alloc_mid()
73 temp->callback_data = current; in alloc_mid()
76 temp->mid_state = MID_REQUEST_ALLOCATED; in alloc_mid()
85 __le16 command = midEntry->server->vals->lock_cmd; in __release_mid()
86 __u16 smb_cmd = le16_to_cpu(midEntry->command); in __release_mid()
90 struct TCP_Server_Info *server = midEntry->server; in __release_mid()
92 if (midEntry->resp_buf && (midEntry->mid_flags & MID_WAIT_CANCELLED) && in __release_mid()
93 (midEntry->mid_state == MID_RESPONSE_RECEIVED || in __release_mid()
94 midEntry->mid_state == MID_RESPONSE_READY) && in __release_mid()
95 server->ops->handle_cancelled_mid) in __release_mid()
96 server->ops->handle_cancelled_mid(midEntry, server); in __release_mid()
98 midEntry->mid_state = MID_FREE; in __release_mid()
100 if (midEntry->large_buf) in __release_mid()
101 cifs_buf_release(midEntry->resp_buf); in __release_mid()
103 cifs_small_buf_release(midEntry->resp_buf); in __release_mid()
106 if (now < midEntry->when_alloc) in __release_mid()
108 roundtrip_time = now - midEntry->when_alloc; in __release_mid()
111 if (atomic_read(&server->num_cmds[smb_cmd]) == 0) { in __release_mid()
112 server->slowest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
113 server->fastest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
115 if (server->slowest_cmd[smb_cmd] < roundtrip_time) in __release_mid()
116 server->slowest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
117 else if (server->fastest_cmd[smb_cmd] > roundtrip_time) in __release_mid()
118 server->fastest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
120 cifs_stats_inc(&server->num_cmds[smb_cmd]); in __release_mid()
121 server->time_per_cmd[smb_cmd] += roundtrip_time; in __release_mid()
129 * since only affects debug counters - so leaving the calc as simple in __release_mid()
134 time_after(now, midEntry->when_alloc + (slow_rsp_threshold * HZ)) && in __release_mid()
135 (midEntry->command != command)) { in __release_mid()
141 cifs_stats_inc(&server->smb2slowcmd[smb_cmd]); in __release_mid()
143 trace_smb3_slow_rsp(smb_cmd, midEntry->mid, midEntry->pid, in __release_mid()
144 midEntry->when_sent, midEntry->when_received); in __release_mid()
147 midEntry->command, midEntry->mid); in __release_mid()
149 now - midEntry->when_alloc, in __release_mid()
150 now - midEntry->when_sent, in __release_mid()
151 now - midEntry->when_received); in __release_mid()
155 put_task_struct(midEntry->creator); in __release_mid()
163 spin_lock(&mid->server->mid_lock); in delete_mid()
164 if (!(mid->mid_flags & MID_DELETED)) { in delete_mid()
165 list_del_init(&mid->qhead); in delete_mid()
166 mid->mid_flags |= MID_DELETED; in delete_mid()
168 spin_unlock(&mid->server->mid_lock); in delete_mid()
174 * smb_send_kvec - send an array of kvecs to the server
188 struct socket *ssocket = server->ssocket; in smb_send_kvec()
192 if (server->noblocksnd) in smb_send_kvec()
193 smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; in smb_send_kvec()
195 smb_msg->msg_flags = MSG_NOSIGNAL; in smb_send_kvec()
217 if (rc == -EAGAIN) { in smb_send_kvec()
220 (!server->noblocksnd && (retries > 2))) { in smb_send_kvec()
223 return -EAGAIN; in smb_send_kvec()
255 if (!is_smb1(server) && rqst->rq_nvec >= 2 && in smb_rqst_len()
256 rqst->rq_iov[0].iov_len == 4) { in smb_rqst_len()
257 iov = &rqst->rq_iov[1]; in smb_rqst_len()
258 nvec = rqst->rq_nvec - 1; in smb_rqst_len()
260 iov = rqst->rq_iov; in smb_rqst_len()
261 nvec = rqst->rq_nvec; in smb_rqst_len()
268 buflen += iov_iter_count(&rqst->rq_iter); in smb_rqst_len()
283 struct socket *ssocket = server->ssocket; in __smb_send_rqst()
289 /* return -EAGAIN when connecting or reconnecting */ in __smb_send_rqst()
290 rc = -EAGAIN; in __smb_send_rqst()
291 if (server->smbd_conn) in __smb_send_rqst()
296 rc = -EAGAIN; in __smb_send_rqst()
300 rc = -ERESTARTSYS; in __smb_send_rqst()
308 tcp_sock_set_cork(ssocket->sk, true); in __smb_send_rqst()
385 rc = -ERESTARTSYS; in __smb_send_rqst()
389 tcp_sock_set_cork(ssocket->sk, false); in __smb_send_rqst()
400 trace_smb3_partial_send_reconnect(server->CurrentMid, in __smb_send_rqst()
401 server->conn_id, server->hostname); in __smb_send_rqst()
405 * there's hardly any use for the layers above to know the in __smb_send_rqst()
409 if (rc < 0 && rc != -EINTR && rc != -EAGAIN) { in __smb_send_rqst()
412 rc = -ECONNABORTED; in __smb_send_rqst()
439 if (WARN_ON_ONCE(num_rqst > MAX_COMPOUND - 1)) in smb_send_rqst()
440 return -EIO; in smb_send_rqst()
442 if (!server->ops->init_transform_rq) { in smb_send_rqst()
444 return -EIO; in smb_send_rqst()
450 rc = server->ops->init_transform_rq(server, num_rqst + 1, in smb_send_rqst()
495 credits = server->ops->get_credits_field(server, optype); in wait_for_free_credits()
498 return -EAGAIN; in wait_for_free_credits()
500 spin_lock(&server->req_lock); in wait_for_free_credits()
503 server->in_flight++; in wait_for_free_credits()
504 if (server->in_flight > server->max_in_flight) in wait_for_free_credits()
505 server->max_in_flight = server->in_flight; in wait_for_free_credits()
506 *credits -= 1; in wait_for_free_credits()
507 *instance = server->reconnect_instance; in wait_for_free_credits()
509 in_flight = server->in_flight; in wait_for_free_credits()
510 spin_unlock(&server->req_lock); in wait_for_free_credits()
512 trace_smb3_nblk_credits(server->CurrentMid, in wait_for_free_credits()
513 server->conn_id, server->hostname, scredits, -1, in_flight); in wait_for_free_credits()
521 spin_unlock(&server->req_lock); in wait_for_free_credits()
523 spin_lock(&server->srv_lock); in wait_for_free_credits()
524 if (server->tcpStatus == CifsExiting) { in wait_for_free_credits()
525 spin_unlock(&server->srv_lock); in wait_for_free_credits()
526 return -ENOENT; in wait_for_free_credits()
528 spin_unlock(&server->srv_lock); in wait_for_free_credits()
530 spin_lock(&server->req_lock); in wait_for_free_credits()
533 spin_unlock(&server->req_lock); in wait_for_free_credits()
536 rc = wait_event_killable_timeout(server->request_q, in wait_for_free_credits()
540 spin_lock(&server->req_lock); in wait_for_free_credits()
542 in_flight = server->in_flight; in wait_for_free_credits()
543 spin_unlock(&server->req_lock); in wait_for_free_credits()
545 trace_smb3_credit_timeout(server->CurrentMid, in wait_for_free_credits()
546 server->conn_id, server->hostname, scredits, in wait_for_free_credits()
550 return -EBUSY; in wait_for_free_credits()
552 if (rc == -ERESTARTSYS) in wait_for_free_credits()
553 return -ERESTARTSYS; in wait_for_free_credits()
554 spin_lock(&server->req_lock); in wait_for_free_credits()
560 * starved for credits by single-credit requests. in wait_for_free_credits()
570 server->in_flight > 2 * MAX_COMPOUND && in wait_for_free_credits()
572 spin_unlock(&server->req_lock); in wait_for_free_credits()
576 server->request_q, in wait_for_free_credits()
582 spin_lock(&server->req_lock); in wait_for_free_credits()
584 in_flight = server->in_flight; in wait_for_free_credits()
585 spin_unlock(&server->req_lock); in wait_for_free_credits()
588 server->CurrentMid, in wait_for_free_credits()
589 server->conn_id, server->hostname, in wait_for_free_credits()
593 return -EBUSY; in wait_for_free_credits()
595 if (rc == -ERESTARTSYS) in wait_for_free_credits()
596 return -ERESTARTSYS; in wait_for_free_credits()
597 spin_lock(&server->req_lock); in wait_for_free_credits()
608 *credits -= num_credits; in wait_for_free_credits()
609 server->in_flight += num_credits; in wait_for_free_credits()
610 if (server->in_flight > server->max_in_flight) in wait_for_free_credits()
611 server->max_in_flight = server->in_flight; in wait_for_free_credits()
612 *instance = server->reconnect_instance; in wait_for_free_credits()
615 in_flight = server->in_flight; in wait_for_free_credits()
616 spin_unlock(&server->req_lock); in wait_for_free_credits()
618 trace_smb3_waitff_credits(server->CurrentMid, in wait_for_free_credits()
619 server->conn_id, server->hostname, scredits, in wait_for_free_credits()
620 -(num_credits), in_flight); in wait_for_free_credits()
633 return wait_for_free_credits(server, 1, -1, flags, in wait_for_free_request()
644 credits = server->ops->get_credits_field(server, flags & CIFS_OP_MASK); in wait_for_compound_request()
646 spin_lock(&server->req_lock); in wait_for_compound_request()
648 in_flight = server->in_flight; in wait_for_compound_request()
667 if (server->in_flight == 0) { in wait_for_compound_request()
668 spin_unlock(&server->req_lock); in wait_for_compound_request()
669 trace_smb3_insufficient_credits(server->CurrentMid, in wait_for_compound_request()
670 server->conn_id, server->hostname, scredits, in wait_for_compound_request()
674 return -EDEADLK; in wait_for_compound_request()
677 spin_unlock(&server->req_lock); in wait_for_compound_request()
688 credits->value = 0; in cifs_wait_mtu_credits()
689 credits->instance = server->reconnect_instance; in cifs_wait_mtu_credits()
696 spin_lock(&ses->ses_lock); in allocate_mid()
697 if (ses->ses_status == SES_NEW) { in allocate_mid()
698 if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) && in allocate_mid()
699 (in_buf->Command != SMB_COM_NEGOTIATE)) { in allocate_mid()
700 spin_unlock(&ses->ses_lock); in allocate_mid()
701 return -EAGAIN; in allocate_mid()
703 /* else ok - we are setting up session */ in allocate_mid()
706 if (ses->ses_status == SES_EXITING) { in allocate_mid()
708 if (in_buf->Command != SMB_COM_LOGOFF_ANDX) { in allocate_mid()
709 spin_unlock(&ses->ses_lock); in allocate_mid()
710 return -EAGAIN; in allocate_mid()
712 /* else ok - we are shutting down session */ in allocate_mid()
714 spin_unlock(&ses->ses_lock); in allocate_mid()
716 *ppmidQ = alloc_mid(in_buf, ses->server); in allocate_mid()
718 return -ENOMEM; in allocate_mid()
719 spin_lock(&ses->server->mid_lock); in allocate_mid()
720 list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q); in allocate_mid()
721 spin_unlock(&ses->server->mid_lock); in allocate_mid()
730 error = wait_event_state(server->response_q, in wait_for_response()
731 midQ->mid_state != MID_REQUEST_SUBMITTED && in wait_for_response()
732 midQ->mid_state != MID_RESPONSE_RECEIVED, in wait_for_response()
735 return -ERESTARTSYS; in wait_for_response()
744 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; in cifs_setup_async_request()
747 if (rqst->rq_iov[0].iov_len != 4 || in cifs_setup_async_request()
748 rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base) in cifs_setup_async_request()
749 return ERR_PTR(-EIO); in cifs_setup_async_request()
752 if (server->sign) in cifs_setup_async_request()
753 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in cifs_setup_async_request()
757 return ERR_PTR(-ENOMEM); in cifs_setup_async_request()
759 rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); in cifs_setup_async_request()
793 instance = exist_credits->instance; in cifs_call_async()
800 * return -EAGAIN in such cases to let callers handle it. in cifs_call_async()
802 if (instance != server->reconnect_instance) { in cifs_call_async()
805 return -EAGAIN; in cifs_call_async()
808 mid = server->ops->setup_async_request(server, rqst); in cifs_call_async()
815 mid->receive = receive; in cifs_call_async()
816 mid->callback = callback; in cifs_call_async()
817 mid->callback_data = cbdata; in cifs_call_async()
818 mid->handle = handle; in cifs_call_async()
819 mid->mid_state = MID_REQUEST_SUBMITTED; in cifs_call_async()
822 spin_lock(&server->mid_lock); in cifs_call_async()
823 list_add_tail(&mid->qhead, &server->pending_mid_q); in cifs_call_async()
824 spin_unlock(&server->mid_lock); in cifs_call_async()
834 revert_current_mid(server, mid->credits); in cifs_call_async()
835 server->sequence_number -= 2; in cifs_call_async()
881 __func__, le16_to_cpu(mid->command), mid->mid, mid->mid_state); in cifs_sync_mid_result()
883 spin_lock(&server->mid_lock); in cifs_sync_mid_result()
884 switch (mid->mid_state) { in cifs_sync_mid_result()
886 spin_unlock(&server->mid_lock); in cifs_sync_mid_result()
889 rc = -EAGAIN; in cifs_sync_mid_result()
892 rc = -EIO; in cifs_sync_mid_result()
895 rc = -EHOSTDOWN; in cifs_sync_mid_result()
898 if (!(mid->mid_flags & MID_DELETED)) { in cifs_sync_mid_result()
899 list_del_init(&mid->qhead); in cifs_sync_mid_result()
900 mid->mid_flags |= MID_DELETED; in cifs_sync_mid_result()
902 spin_unlock(&server->mid_lock); in cifs_sync_mid_result()
904 __func__, mid->mid, mid->mid_state); in cifs_sync_mid_result()
905 rc = -EIO; in cifs_sync_mid_result()
908 spin_unlock(&server->mid_lock); in cifs_sync_mid_result()
919 return server->ops->send_cancel ? in send_cancel()
920 server->ops->send_cancel(server, rqst, mid) : 0; in send_cancel()
927 unsigned int len = get_rfc1002_length(mid->resp_buf) + 4; in cifs_check_receive()
929 dump_smb(mid->resp_buf, min_t(u32, 92, len)); in cifs_check_receive()
932 if (server->sign) { in cifs_check_receive()
938 iov[0].iov_base = mid->resp_buf; in cifs_check_receive()
940 iov[1].iov_base = (char *)mid->resp_buf + 4; in cifs_check_receive()
941 iov[1].iov_len = len - 4; in cifs_check_receive()
944 mid->sequence_number); in cifs_check_receive()
959 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; in cifs_setup_request()
962 if (rqst->rq_iov[0].iov_len != 4 || in cifs_setup_request()
963 rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base) in cifs_setup_request()
964 return ERR_PTR(-EIO); in cifs_setup_request()
969 rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number); in cifs_setup_request()
980 struct TCP_Server_Info *server = mid->server; in cifs_compound_callback()
982 .value = server->ops->get_credits(mid), in cifs_compound_callback()
983 .instance = server->reconnect_instance, in cifs_compound_callback()
986 add_credits(server, &credits, mid->optype); in cifs_compound_callback()
988 if (mid->mid_state == MID_RESPONSE_RECEIVED) in cifs_compound_callback()
989 mid->mid_state = MID_RESPONSE_READY; in cifs_compound_callback()
1023 spin_lock(&ses->chan_lock); in cifs_pick_channel()
1024 for (i = 0; i < ses->chan_count; i++) { in cifs_pick_channel()
1025 server = ses->chans[i].server; in cifs_pick_channel()
1026 if (!server || server->terminate) in cifs_pick_channel()
1034 * server->in_flight. But it shouldn't matter much here if we in cifs_pick_channel()
1040 if (server->in_flight < min_in_flight) { in cifs_pick_channel()
1041 min_in_flight = server->in_flight; in cifs_pick_channel()
1044 if (server->in_flight > max_in_flight) in cifs_pick_channel()
1045 max_in_flight = server->in_flight; in cifs_pick_channel()
1048 /* if all channels are equally loaded, fall back to round-robin */ in cifs_pick_channel()
1050 index = (uint)atomic_inc_return(&ses->chan_seq); in cifs_pick_channel()
1051 index %= ses->chan_count; in cifs_pick_channel()
1054 server = ses->chans[index].server; in cifs_pick_channel()
1055 spin_unlock(&ses->chan_lock); in cifs_pick_channel()
1080 if (!ses || !ses->server || !server) { in compound_send_recv()
1082 return -EIO; in compound_send_recv()
1085 spin_lock(&server->srv_lock); in compound_send_recv()
1086 if (server->tcpStatus == CifsExiting) { in compound_send_recv()
1087 spin_unlock(&server->srv_lock); in compound_send_recv()
1088 return -ENOENT; in compound_send_recv()
1090 spin_unlock(&server->srv_lock); in compound_send_recv()
1122 * we obtained credits and return -EAGAIN in such cases to let callers in compound_send_recv()
1125 if (instance != server->reconnect_instance) { in compound_send_recv()
1129 return -EAGAIN; in compound_send_recv()
1133 midQ[i] = server->ops->setup_request(ses, server, &rqst[i]); in compound_send_recv()
1146 midQ[i]->mid_state = MID_REQUEST_SUBMITTED; in compound_send_recv()
1147 midQ[i]->optype = optype; in compound_send_recv()
1153 if (i < num_rqst - 1) in compound_send_recv()
1154 midQ[i]->callback = cifs_compound_callback; in compound_send_recv()
1156 midQ[i]->callback = cifs_compound_last_callback; in compound_send_recv()
1165 server->sequence_number -= 2; in compound_send_recv()
1172 * will not receive a response to - return credits back in compound_send_recv()
1181 * At this point the request is passed to the network stack - we assume in compound_send_recv()
1191 spin_lock(&ses->ses_lock); in compound_send_recv()
1192 if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) { in compound_send_recv()
1193 spin_unlock(&ses->ses_lock); in compound_send_recv()
1199 spin_lock(&ses->ses_lock); in compound_send_recv()
1201 spin_unlock(&ses->ses_lock); in compound_send_recv()
1211 midQ[i]->mid, le16_to_cpu(midQ[i]->command)); in compound_send_recv()
1213 spin_lock(&server->mid_lock); in compound_send_recv()
1214 midQ[i]->mid_flags |= MID_WAIT_CANCELLED; in compound_send_recv()
1215 if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED || in compound_send_recv()
1216 midQ[i]->mid_state == MID_RESPONSE_RECEIVED) { in compound_send_recv()
1217 midQ[i]->callback = cifs_cancelled_callback; in compound_send_recv()
1221 spin_unlock(&server->mid_lock); in compound_send_recv()
1236 if (!midQ[i]->resp_buf || in compound_send_recv()
1237 midQ[i]->mid_state != MID_RESPONSE_READY) { in compound_send_recv()
1238 rc = -EIO; in compound_send_recv()
1243 buf = (char *)midQ[i]->resp_buf; in compound_send_recv()
1245 resp_iov[i].iov_len = midQ[i]->resp_buf_size + in compound_send_recv()
1248 if (midQ[i]->large_buf) in compound_send_recv()
1253 rc = server->ops->check_receive(midQ[i], server, in compound_send_recv()
1258 midQ[i]->resp_buf = NULL; in compound_send_recv()
1265 spin_lock(&ses->ses_lock); in compound_send_recv()
1266 if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) { in compound_send_recv()
1271 spin_unlock(&ses->ses_lock); in compound_send_recv()
1275 spin_lock(&ses->ses_lock); in compound_send_recv()
1277 spin_unlock(&ses->ses_lock); in compound_send_recv()
1319 return -ENOMEM; in SendReceive2()
1330 new_iov[1].iov_len -= 4; in SendReceive2()
1336 rc = cifs_send_recv(xid, ses, ses->server, in SendReceive2()
1350 unsigned int len = be32_to_cpu(in_buf->smb_buf_length); in SendReceive()
1358 return -EIO; in SendReceive()
1360 server = ses->server; in SendReceive()
1363 return -EIO; in SendReceive()
1366 spin_lock(&server->srv_lock); in SendReceive()
1367 if (server->tcpStatus == CifsExiting) { in SendReceive()
1368 spin_unlock(&server->srv_lock); in SendReceive()
1369 return -ENOENT; in SendReceive()
1371 spin_unlock(&server->srv_lock); in SendReceive()
1374 to the same server. We may make this configurable later or in SendReceive()
1375 use ses->maxReq */ in SendReceive()
1377 if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { in SendReceive()
1380 return -EIO; in SendReceive()
1401 rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number); in SendReceive()
1407 midQ->mid_state = MID_REQUEST_SUBMITTED; in SendReceive()
1413 server->sequence_number -= 2; in SendReceive()
1423 spin_lock(&server->mid_lock); in SendReceive()
1424 if (midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceive()
1425 midQ->mid_state == MID_RESPONSE_RECEIVED) { in SendReceive()
1426 /* no longer considered to be "in-flight" */ in SendReceive()
1427 midQ->callback = release_mid; in SendReceive()
1428 spin_unlock(&server->mid_lock); in SendReceive()
1432 spin_unlock(&server->mid_lock); in SendReceive()
1441 if (!midQ->resp_buf || !out_buf || in SendReceive()
1442 midQ->mid_state != MID_RESPONSE_READY) { in SendReceive()
1443 rc = -EIO; in SendReceive()
1448 *pbytes_returned = get_rfc1002_length(midQ->resp_buf); in SendReceive()
1449 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4); in SendReceive()
1467 struct cifs_ses *ses = tcon->ses; in send_lock_cancel()
1475 pSMB->LockType = LOCKING_ANDX_CANCEL_LOCK|LOCKING_ANDX_LARGE_FILES; in send_lock_cancel()
1476 pSMB->Timeout = 0; in send_lock_cancel()
1477 pSMB->hdr.Mid = get_next_mid(ses->server); in send_lock_cancel()
1492 unsigned int len = be32_to_cpu(in_buf->smb_buf_length); in SendReceiveBlockingLock()
1498 if (tcon == NULL || tcon->ses == NULL) { in SendReceiveBlockingLock()
1500 return -EIO; in SendReceiveBlockingLock()
1502 ses = tcon->ses; in SendReceiveBlockingLock()
1503 server = ses->server; in SendReceiveBlockingLock()
1507 return -EIO; in SendReceiveBlockingLock()
1510 spin_lock(&server->srv_lock); in SendReceiveBlockingLock()
1511 if (server->tcpStatus == CifsExiting) { in SendReceiveBlockingLock()
1512 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1513 return -ENOENT; in SendReceiveBlockingLock()
1515 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1518 to the same server. We may make this configurable later or in SendReceiveBlockingLock()
1519 use ses->maxReq */ in SendReceiveBlockingLock()
1521 if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { in SendReceiveBlockingLock()
1524 return -EIO; in SendReceiveBlockingLock()
1543 rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number); in SendReceiveBlockingLock()
1550 midQ->mid_state = MID_REQUEST_SUBMITTED; in SendReceiveBlockingLock()
1555 server->sequence_number -= 2; in SendReceiveBlockingLock()
1564 /* Wait for a reply - allow signals to interrupt. */ in SendReceiveBlockingLock()
1565 rc = wait_event_interruptible(server->response_q, in SendReceiveBlockingLock()
1566 (!(midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceiveBlockingLock()
1567 midQ->mid_state == MID_RESPONSE_RECEIVED)) || in SendReceiveBlockingLock()
1568 ((server->tcpStatus != CifsGood) && in SendReceiveBlockingLock()
1569 (server->tcpStatus != CifsNew))); in SendReceiveBlockingLock()
1572 spin_lock(&server->srv_lock); in SendReceiveBlockingLock()
1573 if ((rc == -ERESTARTSYS) && in SendReceiveBlockingLock()
1574 (midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceiveBlockingLock()
1575 midQ->mid_state == MID_RESPONSE_RECEIVED) && in SendReceiveBlockingLock()
1576 ((server->tcpStatus == CifsGood) || in SendReceiveBlockingLock()
1577 (server->tcpStatus == CifsNew))) { in SendReceiveBlockingLock()
1578 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1580 if (in_buf->Command == SMB_COM_TRANSACTION2) { in SendReceiveBlockingLock()
1594 /* If we get -ENOLCK back the lock may have in SendReceiveBlockingLock()
1596 if (rc && rc != -ENOLCK) { in SendReceiveBlockingLock()
1605 spin_lock(&server->mid_lock); in SendReceiveBlockingLock()
1606 if (midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceiveBlockingLock()
1607 midQ->mid_state == MID_RESPONSE_RECEIVED) { in SendReceiveBlockingLock()
1608 /* no longer considered to be "in-flight" */ in SendReceiveBlockingLock()
1609 midQ->callback = release_mid; in SendReceiveBlockingLock()
1610 spin_unlock(&server->mid_lock); in SendReceiveBlockingLock()
1613 spin_unlock(&server->mid_lock); in SendReceiveBlockingLock()
1616 /* We got the response - restart system call. */ in SendReceiveBlockingLock()
1618 spin_lock(&server->srv_lock); in SendReceiveBlockingLock()
1620 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1627 if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_READY) { in SendReceiveBlockingLock()
1628 rc = -EIO; in SendReceiveBlockingLock()
1633 *pbytes_returned = get_rfc1002_length(midQ->resp_buf); in SendReceiveBlockingLock()
1634 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4); in SendReceiveBlockingLock()
1638 if (rstart && rc == -EACCES) in SendReceiveBlockingLock()
1639 return -ERESTARTSYS; in SendReceiveBlockingLock()
1650 unsigned int rfclen = server->pdu_size; in cifs_discard_remaining_data()
1651 size_t remaining = rfclen + HEADER_PREAMBLE_SIZE(server) - in cifs_discard_remaining_data()
1652 server->total_read; in cifs_discard_remaining_data()
1662 server->total_read += length; in cifs_discard_remaining_data()
1663 remaining -= length; in cifs_discard_remaining_data()
1677 mid->resp_buf = server->smallbuf; in __cifs_readv_discard()
1678 server->smallbuf = NULL; in __cifs_readv_discard()
1685 struct cifs_io_subrequest *rdata = mid->callback_data; in cifs_readv_discard()
1687 return __cifs_readv_discard(server, mid, rdata->result); in cifs_readv_discard()
1695 struct cifs_io_subrequest *rdata = mid->callback_data; in cifs_readv_receive()
1696 char *buf = server->smallbuf; in cifs_readv_receive()
1697 unsigned int buflen = server->pdu_size + HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1701 __func__, mid->mid, rdata->subreq.start, rdata->subreq.len); in cifs_readv_receive()
1708 len = min_t(unsigned int, buflen, server->vals->read_rsp_size) - in cifs_readv_receive()
1712 buf + HEADER_SIZE(server) - 1, len); in cifs_readv_receive()
1715 server->total_read += length; in cifs_readv_receive()
1717 if (server->ops->is_session_expired && in cifs_readv_receive()
1718 server->ops->is_session_expired(buf)) { in cifs_readv_receive()
1720 return -1; in cifs_readv_receive()
1723 if (server->ops->is_status_pending && in cifs_readv_receive()
1724 server->ops->is_status_pending(buf, server)) { in cifs_readv_receive()
1726 return -1; in cifs_readv_receive()
1730 rdata->iov[0].iov_base = buf; in cifs_readv_receive()
1731 rdata->iov[0].iov_len = HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1732 rdata->iov[1].iov_base = buf + HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1733 rdata->iov[1].iov_len = in cifs_readv_receive()
1734 server->total_read - HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1736 rdata->iov[0].iov_base, rdata->iov[0].iov_len); in cifs_readv_receive()
1738 rdata->iov[1].iov_base, rdata->iov[1].iov_len); in cifs_readv_receive()
1741 rdata->result = server->ops->map_error(buf, false); in cifs_readv_receive()
1742 if (rdata->result != 0) { in cifs_readv_receive()
1744 __func__, rdata->result); in cifs_readv_receive()
1750 if (server->total_read < server->vals->read_rsp_size) { in cifs_readv_receive()
1752 __func__, server->total_read, in cifs_readv_receive()
1753 server->vals->read_rsp_size); in cifs_readv_receive()
1754 rdata->result = -EIO; in cifs_readv_receive()
1758 data_offset = server->ops->read_data_offset(buf) + in cifs_readv_receive()
1760 if (data_offset < server->total_read) { in cifs_readv_receive()
1768 data_offset = server->total_read; in cifs_readv_receive()
1773 rdata->result = -EIO; in cifs_readv_receive()
1778 __func__, server->total_read, data_offset); in cifs_readv_receive()
1780 len = data_offset - server->total_read; in cifs_readv_receive()
1784 buf + server->total_read, len); in cifs_readv_receive()
1787 server->total_read += length; in cifs_readv_receive()
1792 use_rdma_mr = rdata->mr; in cifs_readv_receive()
1794 data_len = server->ops->read_data_length(buf, use_rdma_mr); in cifs_readv_receive()
1796 /* data_len is corrupt -- discard frame */ in cifs_readv_receive()
1797 rdata->result = -EIO; in cifs_readv_receive()
1802 if (rdata->mr) in cifs_readv_receive()
1806 length = cifs_read_iter_from_socket(server, &rdata->subreq.io_iter, in cifs_readv_receive()
1809 rdata->got_bytes += length; in cifs_readv_receive()
1810 server->total_read += length; in cifs_readv_receive()
1813 server->total_read, buflen, data_len); in cifs_readv_receive()
1816 if (server->total_read < buflen) in cifs_readv_receive()
1820 mid->resp_buf = server->smallbuf; in cifs_readv_receive()
1821 server->smallbuf = NULL; in cifs_readv_receive()