Lines Matching +full:layers +full:- +full:configurable
1 // SPDX-License-Identifier: LGPL-2.1
38 if (mid->mid_state == MID_RESPONSE_RECEIVED) in cifs_wake_up_task()
39 mid->mid_state = MID_RESPONSE_READY; in cifs_wake_up_task()
40 wake_up_process(mid->callback_data); in cifs_wake_up_task()
55 kref_init(&temp->refcount); in alloc_mid()
56 temp->mid = get_mid(smb_buffer); in alloc_mid()
57 temp->pid = current->pid; in alloc_mid()
58 temp->command = cpu_to_le16(smb_buffer->Command); in alloc_mid()
59 cifs_dbg(FYI, "For smb_command %d\n", smb_buffer->Command); in alloc_mid()
62 temp->when_alloc = jiffies; in alloc_mid()
63 temp->server = server; in alloc_mid()
70 temp->creator = current; in alloc_mid()
71 temp->callback = cifs_wake_up_task; in alloc_mid()
72 temp->callback_data = current; in alloc_mid()
75 temp->mid_state = MID_REQUEST_ALLOCATED; in alloc_mid()
84 __le16 command = midEntry->server->vals->lock_cmd; in __release_mid()
85 __u16 smb_cmd = le16_to_cpu(midEntry->command); in __release_mid()
89 struct TCP_Server_Info *server = midEntry->server; in __release_mid()
91 if (midEntry->resp_buf && (midEntry->mid_flags & MID_WAIT_CANCELLED) && in __release_mid()
92 (midEntry->mid_state == MID_RESPONSE_RECEIVED || in __release_mid()
93 midEntry->mid_state == MID_RESPONSE_READY) && in __release_mid()
94 server->ops->handle_cancelled_mid) in __release_mid()
95 server->ops->handle_cancelled_mid(midEntry, server); in __release_mid()
97 midEntry->mid_state = MID_FREE; in __release_mid()
99 if (midEntry->large_buf) in __release_mid()
100 cifs_buf_release(midEntry->resp_buf); in __release_mid()
102 cifs_small_buf_release(midEntry->resp_buf); in __release_mid()
105 if (now < midEntry->when_alloc) in __release_mid()
107 roundtrip_time = now - midEntry->when_alloc; in __release_mid()
110 if (atomic_read(&server->num_cmds[smb_cmd]) == 0) { in __release_mid()
111 server->slowest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
112 server->fastest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
114 if (server->slowest_cmd[smb_cmd] < roundtrip_time) in __release_mid()
115 server->slowest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
116 else if (server->fastest_cmd[smb_cmd] > roundtrip_time) in __release_mid()
117 server->fastest_cmd[smb_cmd] = roundtrip_time; in __release_mid()
119 cifs_stats_inc(&server->num_cmds[smb_cmd]); in __release_mid()
120 server->time_per_cmd[smb_cmd] += roundtrip_time; in __release_mid()
128 * since only affects debug counters - so leaving the calc as simple in __release_mid()
133 time_after(now, midEntry->when_alloc + (slow_rsp_threshold * HZ)) && in __release_mid()
134 (midEntry->command != command)) { in __release_mid()
140 cifs_stats_inc(&server->smb2slowcmd[smb_cmd]); in __release_mid()
142 trace_smb3_slow_rsp(smb_cmd, midEntry->mid, midEntry->pid, in __release_mid()
143 midEntry->when_sent, midEntry->when_received); in __release_mid()
146 midEntry->command, midEntry->mid); in __release_mid()
148 now - midEntry->when_alloc, in __release_mid()
149 now - midEntry->when_sent, in __release_mid()
150 now - midEntry->when_received); in __release_mid()
154 put_task_struct(midEntry->creator); in __release_mid()
162 spin_lock(&mid->server->mid_lock); in delete_mid()
163 if (!(mid->mid_flags & MID_DELETED)) { in delete_mid()
164 list_del_init(&mid->qhead); in delete_mid()
165 mid->mid_flags |= MID_DELETED; in delete_mid()
167 spin_unlock(&mid->server->mid_lock); in delete_mid()
173 * smb_send_kvec - send an array of kvecs to the server
187 struct socket *ssocket = server->ssocket; in smb_send_kvec()
191 if (server->noblocksnd) in smb_send_kvec()
192 smb_msg->msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; in smb_send_kvec()
194 smb_msg->msg_flags = MSG_NOSIGNAL; in smb_send_kvec()
216 if (rc == -EAGAIN) { in smb_send_kvec()
219 (!server->noblocksnd && (retries > 2))) { in smb_send_kvec()
222 return -EAGAIN; in smb_send_kvec()
254 if (!is_smb1(server) && rqst->rq_nvec >= 2 && in smb_rqst_len()
255 rqst->rq_iov[0].iov_len == 4) { in smb_rqst_len()
256 iov = &rqst->rq_iov[1]; in smb_rqst_len()
257 nvec = rqst->rq_nvec - 1; in smb_rqst_len()
259 iov = rqst->rq_iov; in smb_rqst_len()
260 nvec = rqst->rq_nvec; in smb_rqst_len()
267 buflen += iov_iter_count(&rqst->rq_iter); in smb_rqst_len()
282 struct socket *ssocket = server->ssocket; in __smb_send_rqst()
288 /* return -EAGAIN when connecting or reconnecting */ in __smb_send_rqst()
289 rc = -EAGAIN; in __smb_send_rqst()
290 if (server->smbd_conn) in __smb_send_rqst()
295 rc = -EAGAIN; in __smb_send_rqst()
299 rc = -ERESTARTSYS; in __smb_send_rqst()
307 tcp_sock_set_cork(ssocket->sk, true); in __smb_send_rqst()
384 rc = -ERESTARTSYS; in __smb_send_rqst()
388 tcp_sock_set_cork(ssocket->sk, false); in __smb_send_rqst()
399 trace_smb3_partial_send_reconnect(server->CurrentMid, in __smb_send_rqst()
400 server->conn_id, server->hostname); in __smb_send_rqst()
404 * there's hardly any use for the layers above to know the in __smb_send_rqst()
408 if (rc < 0 && rc != -EINTR && rc != -EAGAIN) { in __smb_send_rqst()
411 rc = -ECONNABORTED; in __smb_send_rqst()
438 if (WARN_ON_ONCE(num_rqst > MAX_COMPOUND - 1)) in smb_send_rqst()
439 return -EIO; in smb_send_rqst()
441 if (!server->ops->init_transform_rq) { in smb_send_rqst()
443 return -EIO; in smb_send_rqst()
448 return -ENOMEM; in smb_send_rqst()
449 cur_rqst = vars->rqst; in smb_send_rqst()
450 iov = &vars->iov; in smb_send_rqst()
452 iov->iov_base = &vars->tr_hdr; in smb_send_rqst()
453 iov->iov_len = sizeof(vars->tr_hdr); in smb_send_rqst()
457 rc = server->ops->init_transform_rq(server, num_rqst + 1, in smb_send_rqst()
505 credits = server->ops->get_credits_field(server, optype); in wait_for_free_credits()
508 return -EAGAIN; in wait_for_free_credits()
510 spin_lock(&server->req_lock); in wait_for_free_credits()
513 server->in_flight++; in wait_for_free_credits()
514 if (server->in_flight > server->max_in_flight) in wait_for_free_credits()
515 server->max_in_flight = server->in_flight; in wait_for_free_credits()
516 *credits -= 1; in wait_for_free_credits()
517 *instance = server->reconnect_instance; in wait_for_free_credits()
519 in_flight = server->in_flight; in wait_for_free_credits()
520 spin_unlock(&server->req_lock); in wait_for_free_credits()
522 trace_smb3_nblk_credits(server->CurrentMid, in wait_for_free_credits()
523 server->conn_id, server->hostname, scredits, -1, in_flight); in wait_for_free_credits()
531 spin_unlock(&server->req_lock); in wait_for_free_credits()
533 spin_lock(&server->srv_lock); in wait_for_free_credits()
534 if (server->tcpStatus == CifsExiting) { in wait_for_free_credits()
535 spin_unlock(&server->srv_lock); in wait_for_free_credits()
536 return -ENOENT; in wait_for_free_credits()
538 spin_unlock(&server->srv_lock); in wait_for_free_credits()
540 spin_lock(&server->req_lock); in wait_for_free_credits()
543 spin_unlock(&server->req_lock); in wait_for_free_credits()
546 rc = wait_event_killable_timeout(server->request_q, in wait_for_free_credits()
550 spin_lock(&server->req_lock); in wait_for_free_credits()
552 in_flight = server->in_flight; in wait_for_free_credits()
553 spin_unlock(&server->req_lock); in wait_for_free_credits()
555 trace_smb3_credit_timeout(server->CurrentMid, in wait_for_free_credits()
556 server->conn_id, server->hostname, scredits, in wait_for_free_credits()
560 return -EBUSY; in wait_for_free_credits()
562 if (rc == -ERESTARTSYS) in wait_for_free_credits()
563 return -ERESTARTSYS; in wait_for_free_credits()
564 spin_lock(&server->req_lock); in wait_for_free_credits()
570 * starved for credits by single-credit requests. in wait_for_free_credits()
580 server->in_flight > 2 * MAX_COMPOUND && in wait_for_free_credits()
582 spin_unlock(&server->req_lock); in wait_for_free_credits()
586 server->request_q, in wait_for_free_credits()
592 spin_lock(&server->req_lock); in wait_for_free_credits()
594 in_flight = server->in_flight; in wait_for_free_credits()
595 spin_unlock(&server->req_lock); in wait_for_free_credits()
598 server->CurrentMid, in wait_for_free_credits()
599 server->conn_id, server->hostname, in wait_for_free_credits()
603 return -EBUSY; in wait_for_free_credits()
605 if (rc == -ERESTARTSYS) in wait_for_free_credits()
606 return -ERESTARTSYS; in wait_for_free_credits()
607 spin_lock(&server->req_lock); in wait_for_free_credits()
618 *credits -= num_credits; in wait_for_free_credits()
619 server->in_flight += num_credits; in wait_for_free_credits()
620 if (server->in_flight > server->max_in_flight) in wait_for_free_credits()
621 server->max_in_flight = server->in_flight; in wait_for_free_credits()
622 *instance = server->reconnect_instance; in wait_for_free_credits()
625 in_flight = server->in_flight; in wait_for_free_credits()
626 spin_unlock(&server->req_lock); in wait_for_free_credits()
628 trace_smb3_waitff_credits(server->CurrentMid, in wait_for_free_credits()
629 server->conn_id, server->hostname, scredits, in wait_for_free_credits()
630 -(num_credits), in_flight); in wait_for_free_credits()
643 return wait_for_free_credits(server, 1, -1, flags, in wait_for_free_request()
654 credits = server->ops->get_credits_field(server, flags & CIFS_OP_MASK); in wait_for_compound_request()
656 spin_lock(&server->req_lock); in wait_for_compound_request()
658 in_flight = server->in_flight; in wait_for_compound_request()
677 if (server->in_flight == 0) { in wait_for_compound_request()
678 spin_unlock(&server->req_lock); in wait_for_compound_request()
679 trace_smb3_insufficient_credits(server->CurrentMid, in wait_for_compound_request()
680 server->conn_id, server->hostname, scredits, in wait_for_compound_request()
684 return -EDEADLK; in wait_for_compound_request()
687 spin_unlock(&server->req_lock); in wait_for_compound_request()
698 credits->value = 0; in cifs_wait_mtu_credits()
699 credits->instance = server->reconnect_instance; in cifs_wait_mtu_credits()
706 spin_lock(&ses->ses_lock); in allocate_mid()
707 if (ses->ses_status == SES_NEW) { in allocate_mid()
708 if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) && in allocate_mid()
709 (in_buf->Command != SMB_COM_NEGOTIATE)) { in allocate_mid()
710 spin_unlock(&ses->ses_lock); in allocate_mid()
711 return -EAGAIN; in allocate_mid()
713 /* else ok - we are setting up session */ in allocate_mid()
716 if (ses->ses_status == SES_EXITING) { in allocate_mid()
718 if (in_buf->Command != SMB_COM_LOGOFF_ANDX) { in allocate_mid()
719 spin_unlock(&ses->ses_lock); in allocate_mid()
720 return -EAGAIN; in allocate_mid()
722 /* else ok - we are shutting down session */ in allocate_mid()
724 spin_unlock(&ses->ses_lock); in allocate_mid()
726 *ppmidQ = alloc_mid(in_buf, ses->server); in allocate_mid()
728 return -ENOMEM; in allocate_mid()
729 spin_lock(&ses->server->mid_lock); in allocate_mid()
730 list_add_tail(&(*ppmidQ)->qhead, &ses->server->pending_mid_q); in allocate_mid()
731 spin_unlock(&ses->server->mid_lock); in allocate_mid()
740 error = wait_event_state(server->response_q, in wait_for_response()
741 midQ->mid_state != MID_REQUEST_SUBMITTED && in wait_for_response()
742 midQ->mid_state != MID_RESPONSE_RECEIVED, in wait_for_response()
745 return -ERESTARTSYS; in wait_for_response()
754 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; in cifs_setup_async_request()
757 if (rqst->rq_iov[0].iov_len != 4 || in cifs_setup_async_request()
758 rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base) in cifs_setup_async_request()
759 return ERR_PTR(-EIO); in cifs_setup_async_request()
762 if (server->sign) in cifs_setup_async_request()
763 hdr->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in cifs_setup_async_request()
767 return ERR_PTR(-ENOMEM); in cifs_setup_async_request()
769 rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); in cifs_setup_async_request()
803 instance = exist_credits->instance; in cifs_call_async()
810 * return -EAGAIN in such cases to let callers handle it. in cifs_call_async()
812 if (instance != server->reconnect_instance) { in cifs_call_async()
815 return -EAGAIN; in cifs_call_async()
818 mid = server->ops->setup_async_request(server, rqst); in cifs_call_async()
825 mid->receive = receive; in cifs_call_async()
826 mid->callback = callback; in cifs_call_async()
827 mid->callback_data = cbdata; in cifs_call_async()
828 mid->handle = handle; in cifs_call_async()
829 mid->mid_state = MID_REQUEST_SUBMITTED; in cifs_call_async()
832 spin_lock(&server->mid_lock); in cifs_call_async()
833 list_add_tail(&mid->qhead, &server->pending_mid_q); in cifs_call_async()
834 spin_unlock(&server->mid_lock); in cifs_call_async()
844 revert_current_mid(server, mid->credits); in cifs_call_async()
845 server->sequence_number -= 2; in cifs_call_async()
891 __func__, le16_to_cpu(mid->command), mid->mid, mid->mid_state); in cifs_sync_mid_result()
893 spin_lock(&server->mid_lock); in cifs_sync_mid_result()
894 switch (mid->mid_state) { in cifs_sync_mid_result()
896 spin_unlock(&server->mid_lock); in cifs_sync_mid_result()
899 rc = -EAGAIN; in cifs_sync_mid_result()
902 rc = -EIO; in cifs_sync_mid_result()
905 rc = -EHOSTDOWN; in cifs_sync_mid_result()
908 if (!(mid->mid_flags & MID_DELETED)) { in cifs_sync_mid_result()
909 list_del_init(&mid->qhead); in cifs_sync_mid_result()
910 mid->mid_flags |= MID_DELETED; in cifs_sync_mid_result()
913 __func__, mid->mid, mid->mid_state); in cifs_sync_mid_result()
914 rc = -EIO; in cifs_sync_mid_result()
916 spin_unlock(&server->mid_lock); in cifs_sync_mid_result()
926 return server->ops->send_cancel ? in send_cancel()
927 server->ops->send_cancel(server, rqst, mid) : 0; in send_cancel()
934 unsigned int len = get_rfc1002_length(mid->resp_buf) + 4; in cifs_check_receive()
936 dump_smb(mid->resp_buf, min_t(u32, 92, len)); in cifs_check_receive()
939 if (server->sign) { in cifs_check_receive()
945 iov[0].iov_base = mid->resp_buf; in cifs_check_receive()
947 iov[1].iov_base = (char *)mid->resp_buf + 4; in cifs_check_receive()
948 iov[1].iov_len = len - 4; in cifs_check_receive()
951 mid->sequence_number); in cifs_check_receive()
966 struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; in cifs_setup_request()
969 if (rqst->rq_iov[0].iov_len != 4 || in cifs_setup_request()
970 rqst->rq_iov[0].iov_base + 4 != rqst->rq_iov[1].iov_base) in cifs_setup_request()
971 return ERR_PTR(-EIO); in cifs_setup_request()
976 rc = cifs_sign_rqst(rqst, ses->server, &mid->sequence_number); in cifs_setup_request()
987 struct TCP_Server_Info *server = mid->server; in cifs_compound_callback()
990 credits.value = server->ops->get_credits(mid); in cifs_compound_callback()
991 credits.instance = server->reconnect_instance; in cifs_compound_callback()
993 add_credits(server, &credits, mid->optype); in cifs_compound_callback()
995 if (mid->mid_state == MID_RESPONSE_RECEIVED) in cifs_compound_callback()
996 mid->mid_state = MID_RESPONSE_READY; in cifs_compound_callback()
1030 spin_lock(&ses->chan_lock); in cifs_pick_channel()
1031 for (i = 0; i < ses->chan_count; i++) { in cifs_pick_channel()
1032 server = ses->chans[i].server; in cifs_pick_channel()
1033 if (!server || server->terminate) in cifs_pick_channel()
1041 * server->in_flight. But it shouldn't matter much here if we in cifs_pick_channel()
1047 if (server->in_flight < min_in_flight) { in cifs_pick_channel()
1048 min_in_flight = server->in_flight; in cifs_pick_channel()
1051 if (server->in_flight > max_in_flight) in cifs_pick_channel()
1052 max_in_flight = server->in_flight; in cifs_pick_channel()
1055 /* if all channels are equally loaded, fall back to round-robin */ in cifs_pick_channel()
1057 index = (uint)atomic_inc_return(&ses->chan_seq); in cifs_pick_channel()
1058 index %= ses->chan_count; in cifs_pick_channel()
1060 spin_unlock(&ses->chan_lock); in cifs_pick_channel()
1062 return ses->chans[index].server; in cifs_pick_channel()
1085 if (!ses || !ses->server || !server) { in compound_send_recv()
1087 return -EIO; in compound_send_recv()
1090 spin_lock(&server->srv_lock); in compound_send_recv()
1091 if (server->tcpStatus == CifsExiting) { in compound_send_recv()
1092 spin_unlock(&server->srv_lock); in compound_send_recv()
1093 return -ENOENT; in compound_send_recv()
1095 spin_unlock(&server->srv_lock); in compound_send_recv()
1127 * we obtained credits and return -EAGAIN in such cases to let callers in compound_send_recv()
1130 if (instance != server->reconnect_instance) { in compound_send_recv()
1134 return -EAGAIN; in compound_send_recv()
1138 midQ[i] = server->ops->setup_request(ses, server, &rqst[i]); in compound_send_recv()
1151 midQ[i]->mid_state = MID_REQUEST_SUBMITTED; in compound_send_recv()
1152 midQ[i]->optype = optype; in compound_send_recv()
1158 if (i < num_rqst - 1) in compound_send_recv()
1159 midQ[i]->callback = cifs_compound_callback; in compound_send_recv()
1161 midQ[i]->callback = cifs_compound_last_callback; in compound_send_recv()
1170 server->sequence_number -= 2; in compound_send_recv()
1177 * will not receive a response to - return credits back in compound_send_recv()
1186 * At this point the request is passed to the network stack - we assume in compound_send_recv()
1196 spin_lock(&ses->ses_lock); in compound_send_recv()
1197 if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) { in compound_send_recv()
1198 spin_unlock(&ses->ses_lock); in compound_send_recv()
1204 spin_lock(&ses->ses_lock); in compound_send_recv()
1206 spin_unlock(&ses->ses_lock); in compound_send_recv()
1216 midQ[i]->mid, le16_to_cpu(midQ[i]->command)); in compound_send_recv()
1218 spin_lock(&server->mid_lock); in compound_send_recv()
1219 midQ[i]->mid_flags |= MID_WAIT_CANCELLED; in compound_send_recv()
1220 if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED || in compound_send_recv()
1221 midQ[i]->mid_state == MID_RESPONSE_RECEIVED) { in compound_send_recv()
1222 midQ[i]->callback = cifs_cancelled_callback; in compound_send_recv()
1226 spin_unlock(&server->mid_lock); in compound_send_recv()
1241 if (!midQ[i]->resp_buf || in compound_send_recv()
1242 midQ[i]->mid_state != MID_RESPONSE_READY) { in compound_send_recv()
1243 rc = -EIO; in compound_send_recv()
1248 buf = (char *)midQ[i]->resp_buf; in compound_send_recv()
1250 resp_iov[i].iov_len = midQ[i]->resp_buf_size + in compound_send_recv()
1253 if (midQ[i]->large_buf) in compound_send_recv()
1258 rc = server->ops->check_receive(midQ[i], server, in compound_send_recv()
1263 midQ[i]->resp_buf = NULL; in compound_send_recv()
1270 spin_lock(&ses->ses_lock); in compound_send_recv()
1271 if ((ses->ses_status == SES_NEW) || (optype & CIFS_NEG_OP) || (optype & CIFS_SESS_OP)) { in compound_send_recv()
1276 spin_unlock(&ses->ses_lock); in compound_send_recv()
1280 spin_lock(&ses->ses_lock); in compound_send_recv()
1282 spin_unlock(&ses->ses_lock); in compound_send_recv()
1324 return -ENOMEM; in SendReceive2()
1335 new_iov[1].iov_len -= 4; in SendReceive2()
1341 rc = cifs_send_recv(xid, ses, ses->server, in SendReceive2()
1355 unsigned int len = be32_to_cpu(in_buf->smb_buf_length); in SendReceive()
1363 return -EIO; in SendReceive()
1365 server = ses->server; in SendReceive()
1368 return -EIO; in SendReceive()
1371 spin_lock(&server->srv_lock); in SendReceive()
1372 if (server->tcpStatus == CifsExiting) { in SendReceive()
1373 spin_unlock(&server->srv_lock); in SendReceive()
1374 return -ENOENT; in SendReceive()
1376 spin_unlock(&server->srv_lock); in SendReceive()
1379 to the same server. We may make this configurable later or in SendReceive()
1380 use ses->maxReq */ in SendReceive()
1382 if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { in SendReceive()
1385 return -EIO; in SendReceive()
1406 rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number); in SendReceive()
1412 midQ->mid_state = MID_REQUEST_SUBMITTED; in SendReceive()
1418 server->sequence_number -= 2; in SendReceive()
1428 spin_lock(&server->mid_lock); in SendReceive()
1429 if (midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceive()
1430 midQ->mid_state == MID_RESPONSE_RECEIVED) { in SendReceive()
1431 /* no longer considered to be "in-flight" */ in SendReceive()
1432 midQ->callback = release_mid; in SendReceive()
1433 spin_unlock(&server->mid_lock); in SendReceive()
1437 spin_unlock(&server->mid_lock); in SendReceive()
1446 if (!midQ->resp_buf || !out_buf || in SendReceive()
1447 midQ->mid_state != MID_RESPONSE_READY) { in SendReceive()
1448 rc = -EIO; in SendReceive()
1453 *pbytes_returned = get_rfc1002_length(midQ->resp_buf); in SendReceive()
1454 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4); in SendReceive()
1472 struct cifs_ses *ses = tcon->ses; in send_lock_cancel()
1480 pSMB->LockType = LOCKING_ANDX_CANCEL_LOCK|LOCKING_ANDX_LARGE_FILES; in send_lock_cancel()
1481 pSMB->Timeout = 0; in send_lock_cancel()
1482 pSMB->hdr.Mid = get_next_mid(ses->server); in send_lock_cancel()
1497 unsigned int len = be32_to_cpu(in_buf->smb_buf_length); in SendReceiveBlockingLock()
1503 if (tcon == NULL || tcon->ses == NULL) { in SendReceiveBlockingLock()
1505 return -EIO; in SendReceiveBlockingLock()
1507 ses = tcon->ses; in SendReceiveBlockingLock()
1508 server = ses->server; in SendReceiveBlockingLock()
1512 return -EIO; in SendReceiveBlockingLock()
1515 spin_lock(&server->srv_lock); in SendReceiveBlockingLock()
1516 if (server->tcpStatus == CifsExiting) { in SendReceiveBlockingLock()
1517 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1518 return -ENOENT; in SendReceiveBlockingLock()
1520 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1523 to the same server. We may make this configurable later or in SendReceiveBlockingLock()
1524 use ses->maxReq */ in SendReceiveBlockingLock()
1526 if (len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { in SendReceiveBlockingLock()
1529 return -EIO; in SendReceiveBlockingLock()
1548 rc = cifs_sign_smb(in_buf, server, &midQ->sequence_number); in SendReceiveBlockingLock()
1555 midQ->mid_state = MID_REQUEST_SUBMITTED; in SendReceiveBlockingLock()
1560 server->sequence_number -= 2; in SendReceiveBlockingLock()
1569 /* Wait for a reply - allow signals to interrupt. */ in SendReceiveBlockingLock()
1570 rc = wait_event_interruptible(server->response_q, in SendReceiveBlockingLock()
1571 (!(midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceiveBlockingLock()
1572 midQ->mid_state == MID_RESPONSE_RECEIVED)) || in SendReceiveBlockingLock()
1573 ((server->tcpStatus != CifsGood) && in SendReceiveBlockingLock()
1574 (server->tcpStatus != CifsNew))); in SendReceiveBlockingLock()
1577 spin_lock(&server->srv_lock); in SendReceiveBlockingLock()
1578 if ((rc == -ERESTARTSYS) && in SendReceiveBlockingLock()
1579 (midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceiveBlockingLock()
1580 midQ->mid_state == MID_RESPONSE_RECEIVED) && in SendReceiveBlockingLock()
1581 ((server->tcpStatus == CifsGood) || in SendReceiveBlockingLock()
1582 (server->tcpStatus == CifsNew))) { in SendReceiveBlockingLock()
1583 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1585 if (in_buf->Command == SMB_COM_TRANSACTION2) { in SendReceiveBlockingLock()
1599 /* If we get -ENOLCK back the lock may have in SendReceiveBlockingLock()
1601 if (rc && rc != -ENOLCK) { in SendReceiveBlockingLock()
1610 spin_lock(&server->mid_lock); in SendReceiveBlockingLock()
1611 if (midQ->mid_state == MID_REQUEST_SUBMITTED || in SendReceiveBlockingLock()
1612 midQ->mid_state == MID_RESPONSE_RECEIVED) { in SendReceiveBlockingLock()
1613 /* no longer considered to be "in-flight" */ in SendReceiveBlockingLock()
1614 midQ->callback = release_mid; in SendReceiveBlockingLock()
1615 spin_unlock(&server->mid_lock); in SendReceiveBlockingLock()
1618 spin_unlock(&server->mid_lock); in SendReceiveBlockingLock()
1621 /* We got the response - restart system call. */ in SendReceiveBlockingLock()
1623 spin_lock(&server->srv_lock); in SendReceiveBlockingLock()
1625 spin_unlock(&server->srv_lock); in SendReceiveBlockingLock()
1632 if (out_buf == NULL || midQ->mid_state != MID_RESPONSE_READY) { in SendReceiveBlockingLock()
1633 rc = -EIO; in SendReceiveBlockingLock()
1638 *pbytes_returned = get_rfc1002_length(midQ->resp_buf); in SendReceiveBlockingLock()
1639 memcpy(out_buf, midQ->resp_buf, *pbytes_returned + 4); in SendReceiveBlockingLock()
1643 if (rstart && rc == -EACCES) in SendReceiveBlockingLock()
1644 return -ERESTARTSYS; in SendReceiveBlockingLock()
1655 unsigned int rfclen = server->pdu_size; in cifs_discard_remaining_data()
1656 size_t remaining = rfclen + HEADER_PREAMBLE_SIZE(server) - in cifs_discard_remaining_data()
1657 server->total_read; in cifs_discard_remaining_data()
1667 server->total_read += length; in cifs_discard_remaining_data()
1668 remaining -= length; in cifs_discard_remaining_data()
1682 mid->resp_buf = server->smallbuf; in __cifs_readv_discard()
1683 server->smallbuf = NULL; in __cifs_readv_discard()
1690 struct cifs_readdata *rdata = mid->callback_data; in cifs_readv_discard()
1692 return __cifs_readv_discard(server, mid, rdata->result); in cifs_readv_discard()
1700 struct cifs_readdata *rdata = mid->callback_data; in cifs_readv_receive()
1701 char *buf = server->smallbuf; in cifs_readv_receive()
1702 unsigned int buflen = server->pdu_size + HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1706 __func__, mid->mid, rdata->offset, rdata->bytes); in cifs_readv_receive()
1713 len = min_t(unsigned int, buflen, server->vals->read_rsp_size) - in cifs_readv_receive()
1717 buf + HEADER_SIZE(server) - 1, len); in cifs_readv_receive()
1720 server->total_read += length; in cifs_readv_receive()
1722 if (server->ops->is_session_expired && in cifs_readv_receive()
1723 server->ops->is_session_expired(buf)) { in cifs_readv_receive()
1725 return -1; in cifs_readv_receive()
1728 if (server->ops->is_status_pending && in cifs_readv_receive()
1729 server->ops->is_status_pending(buf, server)) { in cifs_readv_receive()
1731 return -1; in cifs_readv_receive()
1735 rdata->iov[0].iov_base = buf; in cifs_readv_receive()
1736 rdata->iov[0].iov_len = HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1737 rdata->iov[1].iov_base = buf + HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1738 rdata->iov[1].iov_len = in cifs_readv_receive()
1739 server->total_read - HEADER_PREAMBLE_SIZE(server); in cifs_readv_receive()
1741 rdata->iov[0].iov_base, rdata->iov[0].iov_len); in cifs_readv_receive()
1743 rdata->iov[1].iov_base, rdata->iov[1].iov_len); in cifs_readv_receive()
1746 rdata->result = server->ops->map_error(buf, false); in cifs_readv_receive()
1747 if (rdata->result != 0) { in cifs_readv_receive()
1749 __func__, rdata->result); in cifs_readv_receive()
1755 if (server->total_read < server->vals->read_rsp_size) { in cifs_readv_receive()
1757 __func__, server->total_read, in cifs_readv_receive()
1758 server->vals->read_rsp_size); in cifs_readv_receive()
1759 rdata->result = -EIO; in cifs_readv_receive()
1763 data_offset = server->ops->read_data_offset(buf) + in cifs_readv_receive()
1765 if (data_offset < server->total_read) { in cifs_readv_receive()
1773 data_offset = server->total_read; in cifs_readv_receive()
1778 rdata->result = -EIO; in cifs_readv_receive()
1783 __func__, server->total_read, data_offset); in cifs_readv_receive()
1785 len = data_offset - server->total_read; in cifs_readv_receive()
1789 buf + server->total_read, len); in cifs_readv_receive()
1792 server->total_read += length; in cifs_readv_receive()
1797 use_rdma_mr = rdata->mr; in cifs_readv_receive()
1799 data_len = server->ops->read_data_length(buf, use_rdma_mr); in cifs_readv_receive()
1801 /* data_len is corrupt -- discard frame */ in cifs_readv_receive()
1802 rdata->result = -EIO; in cifs_readv_receive()
1807 if (rdata->mr) in cifs_readv_receive()
1811 length = cifs_read_iter_from_socket(server, &rdata->iter, in cifs_readv_receive()
1814 rdata->got_bytes += length; in cifs_readv_receive()
1815 server->total_read += length; in cifs_readv_receive()
1818 server->total_read, buflen, data_len); in cifs_readv_receive()
1821 if (server->total_read < buflen) in cifs_readv_receive()
1825 mid->resp_buf = server->smallbuf; in cifs_readv_receive()
1826 server->smallbuf = NULL; in cifs_readv_receive()