Lines Matching +full:tcon +full:- +full:channel

1 // SPDX-License-Identifier: GPL-2.0
38 server->credits += server->echo_credits + server->oplock_credits; in change_conf()
39 if (server->credits > server->max_credits) in change_conf()
40 server->credits = server->max_credits; in change_conf()
41 server->oplock_credits = server->echo_credits = 0; in change_conf()
42 switch (server->credits) { in change_conf()
46 server->echoes = false; in change_conf()
47 server->oplocks = false; in change_conf()
50 server->echoes = true; in change_conf()
51 server->oplocks = false; in change_conf()
52 server->echo_credits = 1; in change_conf()
55 server->echoes = true; in change_conf()
57 server->oplocks = true; in change_conf()
58 server->oplock_credits = 1; in change_conf()
60 server->oplocks = false; in change_conf()
62 server->echo_credits = 1; in change_conf()
64 server->credits -= server->echo_credits + server->oplock_credits; in change_conf()
65 return server->credits + server->echo_credits + server->oplock_credits; in change_conf()
72 int *val, rc = -1; in smb2_add_credits()
74 unsigned int add = credits->value; in smb2_add_credits()
75 unsigned int instance = credits->instance; in smb2_add_credits()
79 spin_lock(&server->req_lock); in smb2_add_credits()
80 val = server->ops->get_credits_field(server, optype); in smb2_add_credits()
86 if ((instance == 0) || (instance == server->reconnect_instance)) in smb2_add_credits()
94 trace_smb3_overflow_credits(server->CurrentMid, in smb2_add_credits()
95 server->conn_id, server->hostname, *val, in smb2_add_credits()
96 add, server->in_flight); in smb2_add_credits()
98 if (credits->in_flight_check > 1) { in smb2_add_credits()
100 credits->rreq_debug_id, credits->rreq_debug_index); in smb2_add_credits()
102 credits->in_flight_check = 2; in smb2_add_credits()
104 if (WARN_ON_ONCE(server->in_flight == 0)) { in smb2_add_credits()
106 credits->rreq_debug_id, credits->rreq_debug_index); in smb2_add_credits()
107 trace_smb3_rw_credits(credits->rreq_debug_id, in smb2_add_credits()
108 credits->rreq_debug_index, in smb2_add_credits()
109 credits->value, in smb2_add_credits()
110 server->credits, server->in_flight, 0, in smb2_add_credits()
113 server->in_flight--; in smb2_add_credits()
114 if (server->in_flight == 0 && in smb2_add_credits()
119 * Sometimes server returns 0 credits on oplock break ack - we need to in smb2_add_credits()
122 else if (server->in_flight > 0 && server->oplock_credits == 0 && in smb2_add_credits()
123 server->oplocks) { in smb2_add_credits()
124 if (server->credits > 1) { in smb2_add_credits()
125 server->credits--; in smb2_add_credits()
126 server->oplock_credits++; in smb2_add_credits()
128 } else if ((server->in_flight > 0) && (server->oplock_credits > 3) && in smb2_add_credits()
134 in_flight = server->in_flight; in smb2_add_credits()
135 spin_unlock(&server->req_lock); in smb2_add_credits()
136 wake_up(&server->request_q); in smb2_add_credits()
139 trace_smb3_reconnect_detected(server->CurrentMid, in smb2_add_credits()
140 server->conn_id, server->hostname, scredits, add, in_flight); in smb2_add_credits()
147 trace_smb3_reconnect_with_invalid_credits(server->CurrentMid, in smb2_add_credits()
148 server->conn_id, server->hostname, scredits, add, in_flight); in smb2_add_credits()
149 …cifs_dbg(FYI, "Negotiate operation when server credits is non-zero. Optype: %d, server credits: %d… in smb2_add_credits()
153 spin_lock(&server->srv_lock); in smb2_add_credits()
154 if (server->tcpStatus == CifsNeedReconnect in smb2_add_credits()
155 || server->tcpStatus == CifsExiting) { in smb2_add_credits()
156 spin_unlock(&server->srv_lock); in smb2_add_credits()
159 spin_unlock(&server->srv_lock); in smb2_add_credits()
162 case -1: in smb2_add_credits()
166 cifs_server_dbg(VFS, "Possible client or server bug - zero credits\n"); in smb2_add_credits()
179 trace_smb3_add_credits(server->CurrentMid, in smb2_add_credits()
180 server->conn_id, server->hostname, scredits, add, in_flight); in smb2_add_credits()
189 spin_lock(&server->req_lock); in smb2_set_credits()
190 server->credits = val; in smb2_set_credits()
192 server->reconnect_instance++; in smb2_set_credits()
194 * ChannelSequence updated for all channels in primary channel so that consistent in smb2_set_credits()
195 * across SMB3 requests sent on any channel. See MS-SMB2 3.2.4.1 and 3.2.7.1 in smb2_set_credits()
198 server->primary_server->channel_sequence_num++; in smb2_set_credits()
200 server->channel_sequence_num++; in smb2_set_credits()
202 scredits = server->credits; in smb2_set_credits()
203 in_flight = server->in_flight; in smb2_set_credits()
204 spin_unlock(&server->req_lock); in smb2_set_credits()
206 trace_smb3_set_credits(server->CurrentMid, in smb2_set_credits()
207 server->conn_id, server->hostname, scredits, val, in_flight); in smb2_set_credits()
220 return &server->echo_credits; in smb2_get_credits_field()
222 return &server->oplock_credits; in smb2_get_credits_field()
224 return &server->credits; in smb2_get_credits_field()
231 return mid->credits_received; in smb2_get_credits()
241 spin_lock(&server->req_lock); in smb2_wait_mtu_credits()
243 spin_unlock(&server->req_lock); in smb2_wait_mtu_credits()
245 spin_lock(&server->srv_lock); in smb2_wait_mtu_credits()
246 if (server->tcpStatus == CifsExiting) { in smb2_wait_mtu_credits()
247 spin_unlock(&server->srv_lock); in smb2_wait_mtu_credits()
248 return -ENOENT; in smb2_wait_mtu_credits()
250 spin_unlock(&server->srv_lock); in smb2_wait_mtu_credits()
252 spin_lock(&server->req_lock); in smb2_wait_mtu_credits()
253 if (server->credits <= 0) { in smb2_wait_mtu_credits()
254 spin_unlock(&server->req_lock); in smb2_wait_mtu_credits()
256 rc = wait_event_killable(server->request_q, in smb2_wait_mtu_credits()
257 has_credits(server, &server->credits, 1)); in smb2_wait_mtu_credits()
261 spin_lock(&server->req_lock); in smb2_wait_mtu_credits()
263 scredits = server->credits; in smb2_wait_mtu_credits()
267 credits->value = 0; in smb2_wait_mtu_credits()
268 credits->instance = 0; in smb2_wait_mtu_credits()
273 scredits -= 8; in smb2_wait_mtu_credits()
277 credits->value = in smb2_wait_mtu_credits()
279 credits->instance = server->reconnect_instance; in smb2_wait_mtu_credits()
280 server->credits -= credits->value; in smb2_wait_mtu_credits()
281 server->in_flight++; in smb2_wait_mtu_credits()
282 if (server->in_flight > server->max_in_flight) in smb2_wait_mtu_credits()
283 server->max_in_flight = server->in_flight; in smb2_wait_mtu_credits()
287 scredits = server->credits; in smb2_wait_mtu_credits()
288 in_flight = server->in_flight; in smb2_wait_mtu_credits()
289 spin_unlock(&server->req_lock); in smb2_wait_mtu_credits()
291 trace_smb3_wait_credits(server->CurrentMid, in smb2_wait_mtu_credits()
292 server->conn_id, server->hostname, scredits, -(credits->value), in_flight); in smb2_wait_mtu_credits()
294 __func__, credits->value, scredits); in smb2_wait_mtu_credits()
304 struct cifs_credits *credits = &subreq->credits; in smb2_adjust_credits()
305 int new_val = DIV_ROUND_UP(subreq->subreq.len - subreq->subreq.transferred, in smb2_adjust_credits()
309 if (!credits->value || credits->value == new_val) in smb2_adjust_credits()
312 if (credits->value < new_val) { in smb2_adjust_credits()
313 trace_smb3_rw_credits(subreq->rreq->debug_id, in smb2_adjust_credits()
314 subreq->subreq.debug_index, in smb2_adjust_credits()
315 credits->value, in smb2_adjust_credits()
316 server->credits, server->in_flight, in smb2_adjust_credits()
317 new_val - credits->value, in smb2_adjust_credits()
319 trace_smb3_too_many_credits(server->CurrentMid, in smb2_adjust_credits()
320 server->conn_id, server->hostname, 0, credits->value - new_val, 0); in smb2_adjust_credits()
322 subreq->rreq->debug_id, subreq->subreq.debug_index, in smb2_adjust_credits()
323 credits->value, new_val); in smb2_adjust_credits()
325 return -EOPNOTSUPP; in smb2_adjust_credits()
328 spin_lock(&server->req_lock); in smb2_adjust_credits()
330 if (server->reconnect_instance != credits->instance) { in smb2_adjust_credits()
331 scredits = server->credits; in smb2_adjust_credits()
332 in_flight = server->in_flight; in smb2_adjust_credits()
333 spin_unlock(&server->req_lock); in smb2_adjust_credits()
335 trace_smb3_rw_credits(subreq->rreq->debug_id, in smb2_adjust_credits()
336 subreq->subreq.debug_index, in smb2_adjust_credits()
337 credits->value, in smb2_adjust_credits()
338 server->credits, server->in_flight, in smb2_adjust_credits()
339 new_val - credits->value, in smb2_adjust_credits()
341 trace_smb3_reconnect_detected(server->CurrentMid, in smb2_adjust_credits()
342 server->conn_id, server->hostname, scredits, in smb2_adjust_credits()
343 credits->value - new_val, in_flight); in smb2_adjust_credits()
345 subreq->rreq->debug_id, subreq->subreq.debug_index, in smb2_adjust_credits()
346 credits->value - new_val); in smb2_adjust_credits()
347 return -EAGAIN; in smb2_adjust_credits()
350 trace_smb3_rw_credits(subreq->rreq->debug_id, in smb2_adjust_credits()
351 subreq->subreq.debug_index, in smb2_adjust_credits()
352 credits->value, in smb2_adjust_credits()
353 server->credits, server->in_flight, in smb2_adjust_credits()
354 new_val - credits->value, trace); in smb2_adjust_credits()
355 server->credits += credits->value - new_val; in smb2_adjust_credits()
356 scredits = server->credits; in smb2_adjust_credits()
357 in_flight = server->in_flight; in smb2_adjust_credits()
358 spin_unlock(&server->req_lock); in smb2_adjust_credits()
359 wake_up(&server->request_q); in smb2_adjust_credits()
361 trace_smb3_adj_credits(server->CurrentMid, in smb2_adjust_credits()
362 server->conn_id, server->hostname, scredits, in smb2_adjust_credits()
363 credits->value - new_val, in_flight); in smb2_adjust_credits()
365 __func__, credits->value - new_val, scredits); in smb2_adjust_credits()
367 credits->value = new_val; in smb2_adjust_credits()
377 spin_lock(&server->mid_lock); in smb2_get_next_mid()
378 mid = server->CurrentMid++; in smb2_get_next_mid()
379 spin_unlock(&server->mid_lock); in smb2_get_next_mid()
386 spin_lock(&server->mid_lock); in smb2_revert_current_mid()
387 if (server->CurrentMid >= val) in smb2_revert_current_mid()
388 server->CurrentMid -= val; in smb2_revert_current_mid()
389 spin_unlock(&server->mid_lock); in smb2_revert_current_mid()
397 __u64 wire_mid = le64_to_cpu(shdr->MessageId); in __smb2_find_mid()
399 if (shdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) { in __smb2_find_mid()
404 spin_lock(&server->mid_lock); in __smb2_find_mid()
405 list_for_each_entry(mid, &server->pending_mid_q, qhead) { in __smb2_find_mid()
406 if ((mid->mid == wire_mid) && in __smb2_find_mid()
407 (mid->mid_state == MID_REQUEST_SUBMITTED) && in __smb2_find_mid()
408 (mid->command == shdr->Command)) { in __smb2_find_mid()
409 kref_get(&mid->refcount); in __smb2_find_mid()
411 list_del_init(&mid->qhead); in __smb2_find_mid()
412 mid->mid_flags |= MID_DELETED; in __smb2_find_mid()
414 spin_unlock(&server->mid_lock); in __smb2_find_mid()
418 spin_unlock(&server->mid_lock); in __smb2_find_mid()
441 shdr->Command, shdr->Status, shdr->Flags, shdr->MessageId, in smb2_dump_detail()
442 shdr->Id.SyncId.ProcessId); in smb2_dump_detail()
443 if (!server->ops->check_message(buf, server->total_read, server)) { in smb2_dump_detail()
445 server->ops->calc_smb_size(buf)); in smb2_dump_detail()
453 return server->max_read == 0; in smb2_need_neg()
463 spin_lock(&server->mid_lock); in smb2_negotiate()
464 server->CurrentMid = 0; in smb2_negotiate()
465 spin_unlock(&server->mid_lock); in smb2_negotiate()
468 if (rc == -EAGAIN) in smb2_negotiate()
469 rc = -EHOSTDOWN; in smb2_negotiate()
474 smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb2_negotiate_wsize() argument
476 struct TCP_Server_Info *server = tcon->ses->server; in smb2_negotiate_wsize()
480 wsize = ctx->wsize ? ctx->wsize : CIFS_DEFAULT_IOSIZE; in smb2_negotiate_wsize()
481 wsize = min_t(unsigned int, wsize, server->max_write); in smb2_negotiate_wsize()
482 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_negotiate_wsize()
489 smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb3_negotiate_wsize() argument
491 struct TCP_Server_Info *server = tcon->ses->server; in smb3_negotiate_wsize()
495 wsize = ctx->wsize ? ctx->wsize : SMB3_DEFAULT_IOSIZE; in smb3_negotiate_wsize()
496 wsize = min_t(unsigned int, wsize, server->max_write); in smb3_negotiate_wsize()
498 if (server->rdma) { in smb3_negotiate_wsize()
499 if (server->sign) in smb3_negotiate_wsize()
506 server->smbd_conn->max_fragmented_send_size - in smb3_negotiate_wsize()
507 SMB2_READWRITE_PDU_HEADER_SIZE - in smb3_negotiate_wsize()
511 wsize, server->smbd_conn->max_readwrite_size); in smb3_negotiate_wsize()
514 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb3_negotiate_wsize()
521 smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb2_negotiate_rsize() argument
523 struct TCP_Server_Info *server = tcon->ses->server; in smb2_negotiate_rsize()
527 rsize = ctx->rsize ? ctx->rsize : CIFS_DEFAULT_IOSIZE; in smb2_negotiate_rsize()
528 rsize = min_t(unsigned int, rsize, server->max_read); in smb2_negotiate_rsize()
530 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_negotiate_rsize()
537 smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb3_negotiate_rsize() argument
539 struct TCP_Server_Info *server = tcon->ses->server; in smb3_negotiate_rsize()
543 rsize = ctx->rsize ? ctx->rsize : SMB3_DEFAULT_IOSIZE; in smb3_negotiate_rsize()
544 rsize = min_t(unsigned int, rsize, server->max_read); in smb3_negotiate_rsize()
546 if (server->rdma) { in smb3_negotiate_rsize()
547 if (server->sign) in smb3_negotiate_rsize()
554 server->smbd_conn->max_fragmented_recv_size - in smb3_negotiate_rsize()
555 SMB2_READWRITE_PDU_HEADER_SIZE - in smb3_negotiate_rsize()
559 rsize, server->smbd_conn->max_readwrite_size); in smb3_negotiate_rsize()
563 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb3_negotiate_rsize()
573 * return -1 otherwise.
581 if (a->rdma_capable == b->rdma_capable) { in iface_cmp()
582 if (a->rss_capable == b->rss_capable) { in iface_cmp()
583 if (a->speed == b->speed) { in iface_cmp()
584 cmp_ret = cifs_ipaddr_cmp((struct sockaddr *) &a->sockaddr, in iface_cmp()
585 (struct sockaddr *) &b->sockaddr); in iface_cmp()
591 return -1; in iface_cmp()
592 } else if (a->speed > b->speed) in iface_cmp()
595 return -1; in iface_cmp()
596 } else if (a->rss_capable > b->rss_capable) in iface_cmp()
599 return -1; in iface_cmp()
600 } else if (a->rdma_capable > b->rdma_capable) in iface_cmp()
603 return -1; in iface_cmp()
625 spin_lock(&ses->iface_lock); in parse_server_interfaces()
627 if (ses->iface_last_update && in parse_server_interfaces()
628 time_before(jiffies, ses->iface_last_update + in parse_server_interfaces()
630 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
637 list_for_each_entry_safe(iface, niface, &ses->iface_list, in parse_server_interfaces()
639 iface->is_active = 0; in parse_server_interfaces()
641 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
649 if ((ses->chan_max > 1) && in_mount) in parse_server_interfaces()
653 ses->server->hostname); in parse_server_interfaces()
654 rc = -EOPNOTSUPP; in parse_server_interfaces()
655 ses->iface_last_update = jiffies; in parse_server_interfaces()
662 tmp_iface.speed = le64_to_cpu(p->LinkSpeed) ?: 1000000000; in parse_server_interfaces()
663 tmp_iface.rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE) ? 1 : 0; in parse_server_interfaces()
664 tmp_iface.rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE) ? 1 : 0; in parse_server_interfaces()
666 switch (p->Family) { in parse_server_interfaces()
674 p4 = (struct iface_info_ipv4 *)p->Buffer; in parse_server_interfaces()
675 addr4->sin_family = AF_INET; in parse_server_interfaces()
676 memcpy(&addr4->sin_addr, &p4->IPv4Address, 4); in parse_server_interfaces()
678 /* [MS-SMB2] 2.2.32.5.1.1 Clients MUST ignore these */ in parse_server_interfaces()
679 addr4->sin_port = cpu_to_be16(CIFS_PORT); in parse_server_interfaces()
682 &addr4->sin_addr); in parse_server_interfaces()
686 p6 = (struct iface_info_ipv6 *)p->Buffer; in parse_server_interfaces()
687 addr6->sin6_family = AF_INET6; in parse_server_interfaces()
688 memcpy(&addr6->sin6_addr, &p6->IPv6Address, 16); in parse_server_interfaces()
690 /* [MS-SMB2] 2.2.32.5.1.2 Clients MUST ignore these */ in parse_server_interfaces()
691 addr6->sin6_flowinfo = 0; in parse_server_interfaces()
692 addr6->sin6_scope_id = 0; in parse_server_interfaces()
693 addr6->sin6_port = cpu_to_be16(CIFS_PORT); in parse_server_interfaces()
696 &addr6->sin6_addr); in parse_server_interfaces()
711 spin_lock(&ses->iface_lock); in parse_server_interfaces()
712 list_for_each_entry_safe(iface, niface, &ses->iface_list, in parse_server_interfaces()
716 iface->is_active = 1; in parse_server_interfaces()
717 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
721 kref_get(&iface->refcount); in parse_server_interfaces()
725 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
731 rc = -ENOMEM; in parse_server_interfaces()
737 kref_init(&info->refcount); in parse_server_interfaces()
738 info->is_active = 1; in parse_server_interfaces()
740 cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, ses->iface_count); in parse_server_interfaces()
741 cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed); in parse_server_interfaces()
743 le32_to_cpu(p->Capability)); in parse_server_interfaces()
745 spin_lock(&ses->iface_lock); in parse_server_interfaces()
746 if (!list_entry_is_head(iface, &ses->iface_list, iface_head)) { in parse_server_interfaces()
747 list_add_tail(&info->iface_head, &iface->iface_head); in parse_server_interfaces()
748 kref_put(&iface->refcount, release_iface); in parse_server_interfaces()
750 list_add_tail(&info->iface_head, &ses->iface_list); in parse_server_interfaces()
752 ses->iface_count++; in parse_server_interfaces()
753 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
756 next = le32_to_cpu(p->Next); in parse_server_interfaces()
758 bytes_left -= sizeof(*p); in parse_server_interfaces()
762 bytes_left -= next; in parse_server_interfaces()
767 rc = -EINVAL; in parse_server_interfaces()
772 if ((bytes_left > 8) || p->Next) in parse_server_interfaces()
775 ses->iface_last_update = jiffies; in parse_server_interfaces()
781 spin_lock(&ses->iface_lock); in parse_server_interfaces()
782 list_for_each_entry_safe(iface, niface, &ses->iface_list, in parse_server_interfaces()
784 if (!iface->is_active) { in parse_server_interfaces()
785 list_del(&iface->iface_head); in parse_server_interfaces()
786 kref_put(&iface->refcount, release_iface); in parse_server_interfaces()
787 ses->iface_count--; in parse_server_interfaces()
790 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
796 SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon, bool in_mount) in SMB3_request_interfaces() argument
801 struct cifs_ses *ses = tcon->ses; in SMB3_request_interfaces()
805 if (ses->iface_last_update && in SMB3_request_interfaces()
806 time_before(jiffies, ses->iface_last_update + in SMB3_request_interfaces()
810 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in SMB3_request_interfaces()
814 if (rc == -EOPNOTSUPP) { in SMB3_request_interfaces()
828 spin_lock(&ses->chan_lock); in SMB3_request_interfaces()
829 pserver = ses->chans[0].server; in SMB3_request_interfaces()
831 spin_unlock(&ses->chan_lock); in SMB3_request_interfaces()
833 spin_lock(&ses->chan_lock); in SMB3_request_interfaces()
835 spin_unlock(&ses->chan_lock); in SMB3_request_interfaces()
843 smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon, in smb3_qfs_tcon() argument
847 __le16 srch_path = 0; /* Null - open root of share */ in smb3_qfs_tcon()
854 .tcon = tcon, in smb3_qfs_tcon()
862 rc = open_cached_dir(xid, tcon, "", cifs_sb, false, &cfid); in smb3_qfs_tcon()
864 memcpy(&fid, &cfid->fid, sizeof(struct cifs_fid)); in smb3_qfs_tcon()
871 SMB3_request_interfaces(xid, tcon, true /* called during mount */); in smb3_qfs_tcon()
873 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
875 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
877 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
879 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
882 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb3_qfs_tcon()
888 smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon, in smb2_qfs_tcon() argument
892 __le16 srch_path = 0; /* Null - open root of share */ in smb2_qfs_tcon()
898 .tcon = tcon, in smb2_qfs_tcon()
911 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb2_qfs_tcon()
913 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb2_qfs_tcon()
915 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb2_qfs_tcon()
919 smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon, in smb2_is_path_accessible() argument
932 rc = open_cached_dir(xid, tcon, full_path, cifs_sb, true, &cfid); in smb2_is_path_accessible()
934 if (cfid->has_lease) { in smb2_is_path_accessible()
943 return -ENOMEM; in smb2_is_path_accessible()
946 .tcon = tcon, in smb2_is_path_accessible()
962 if (rc != -EREMOTE && hdr->Status == STATUS_OBJECT_NAME_INVALID) { in smb2_is_path_accessible()
963 rc2 = cifs_inval_name_dfs_link_error(xid, tcon, cifs_sb, in smb2_is_path_accessible()
970 rc = -EREMOTE; in smb2_is_path_accessible()
972 if (rc == -EREMOTE && IS_ENABLED(CONFIG_CIFS_DFS_UPCALL) && cifs_sb && in smb2_is_path_accessible()
973 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)) in smb2_is_path_accessible()
974 rc = -EOPNOTSUPP; in smb2_is_path_accessible()
978 rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb2_is_path_accessible()
986 static int smb2_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon, in smb2_get_srv_inum() argument
990 *uniqueid = le64_to_cpu(data->fi.IndexNumber); in smb2_get_srv_inum()
994 static int smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_file_info() argument
997 struct cifs_fid *fid = &cfile->fid; in smb2_query_file_info()
999 if (cfile->symlink_target) { in smb2_query_file_info()
1000 data->symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL); in smb2_query_file_info()
1001 if (!data->symlink_target) in smb2_query_file_info()
1002 return -ENOMEM; in smb2_query_file_info()
1004 data->contains_posix_file_info = false; in smb2_query_file_info()
1005 return SMB2_query_info(xid, tcon, fid->persistent_fid, fid->volatile_fid, &data->fi); in smb2_query_file_info()
1021 name_len = (size_t)src->ea_name_length; in move_smb2_ea_to_cifs()
1022 value_len = (size_t)le16_to_cpu(src->ea_value_length); in move_smb2_ea_to_cifs()
1029 rc = -EIO; in move_smb2_ea_to_cifs()
1033 name = &src->ea_data[0]; in move_smb2_ea_to_cifs()
1034 value = &src->ea_data[src->ea_name_length + 1]; in move_smb2_ea_to_cifs()
1043 rc = -ERANGE; in move_smb2_ea_to_cifs()
1054 /* skip copy - calc size only */ in move_smb2_ea_to_cifs()
1057 dst_size -= user_name_len; in move_smb2_ea_to_cifs()
1060 memcpy(dst, src->ea_data, name_len); in move_smb2_ea_to_cifs()
1067 rc = -ERANGE; in move_smb2_ea_to_cifs()
1072 if (!src->next_entry_offset) in move_smb2_ea_to_cifs()
1075 if (src_size < le32_to_cpu(src->next_entry_offset)) { in move_smb2_ea_to_cifs()
1077 rc = -ERANGE; in move_smb2_ea_to_cifs()
1080 src_size -= le32_to_cpu(src->next_entry_offset); in move_smb2_ea_to_cifs()
1082 le32_to_cpu(src->next_entry_offset)); in move_smb2_ea_to_cifs()
1087 rc = -ENODATA; in move_smb2_ea_to_cifs()
1094 smb2_query_eas(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_eas() argument
1105 rc = smb2_query_info_compound(xid, tcon, path, in smb2_query_eas()
1109 CIFSMaxBufSize - in smb2_query_eas()
1110 MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_query_eas()
1119 if (!ea_name && rc == -ENODATA) in smb2_query_eas()
1125 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_query_eas()
1126 le32_to_cpu(rsp->OutputBufferLength), in smb2_query_eas()
1133 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in smb2_query_eas()
1135 le32_to_cpu(rsp->OutputBufferLength), ea_name); in smb2_query_eas()
1143 smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_ea() argument
1149 struct cifs_ses *ses = tcon->ses; in smb2_set_ea()
1174 if (smb3_encryption_required(tcon)) in smb2_set_ea()
1178 return -EINVAL; in smb2_set_ea()
1182 return -ENOMEM; in smb2_set_ea()
1188 rc = -ENOMEM; in smb2_set_ea()
1191 rqst = vars->rqst; in smb2_set_ea()
1192 rsp_iov = vars->rsp_iov; in smb2_set_ea()
1194 if (ses->server->ops->query_all_EAs) { in smb2_set_ea()
1196 rc = ses->server->ops->query_all_EAs(xid, tcon, path, in smb2_set_ea()
1199 if (rc == -ENODATA) in smb2_set_ea()
1207 rc = smb2_query_info_compound(xid, tcon, path, in smb2_set_ea()
1211 CIFSMaxBufSize - in smb2_set_ea()
1212 MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_set_ea()
1217 used_len = le32_to_cpu(rsp->OutputBufferLength); in smb2_set_ea()
1227 if (CIFSMaxBufSize - MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_set_ea()
1228 MAX_SMB2_CLOSE_RESPONSE_SIZE - 256 < in smb2_set_ea()
1230 rc = -ENOSPC; in smb2_set_ea()
1237 rqst[0].rq_iov = vars->open_iov; in smb2_set_ea()
1241 .tcon = tcon, in smb2_set_ea()
1250 rc = SMB2_open_init(tcon, server, in smb2_set_ea()
1254 smb2_set_next_command(tcon, &rqst[0]); in smb2_set_ea()
1258 rqst[1].rq_iov = vars->si_iov; in smb2_set_ea()
1264 rc = -ENOMEM; in smb2_set_ea()
1268 ea->ea_name_length = ea_name_len; in smb2_set_ea()
1269 ea->ea_value_length = cpu_to_le16(ea_value_len); in smb2_set_ea()
1270 memcpy(ea->ea_data, ea_name, ea_name_len + 1); in smb2_set_ea()
1271 memcpy(ea->ea_data + ea_name_len + 1, ea_value, ea_value_len); in smb2_set_ea()
1276 rc = SMB2_set_info_init(tcon, server, in smb2_set_ea()
1278 COMPOUND_FID, current->tgid, in smb2_set_ea()
1283 smb2_set_next_command(tcon, &rqst[1]); in smb2_set_ea()
1287 rqst[2].rq_iov = &vars->close_iov; in smb2_set_ea()
1289 rc = SMB2_close_init(tcon, server, in smb2_set_ea()
1319 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_set_ea()
1329 return server->echoes; in smb2_can_echo()
1333 smb2_clear_stats(struct cifs_tcon *tcon) in smb2_clear_stats() argument
1338 atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0); in smb2_clear_stats()
1339 atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0); in smb2_clear_stats()
1344 smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon) in smb2_dump_share_caps() argument
1347 if (tcon->capabilities & SMB2_SHARE_CAP_DFS) in smb2_dump_share_caps()
1349 if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY) in smb2_dump_share_caps()
1351 if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT) in smb2_dump_share_caps()
1353 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) in smb2_dump_share_caps()
1355 if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC) in smb2_dump_share_caps()
1357 if (tcon->capabilities == 0) in smb2_dump_share_caps()
1359 if (tcon->ss_flags & SSINFO_FLAGS_ALIGNED_DEVICE) in smb2_dump_share_caps()
1361 if (tcon->ss_flags & SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE) in smb2_dump_share_caps()
1363 if (tcon->ss_flags & SSINFO_FLAGS_NO_SEEK_PENALTY) in smb2_dump_share_caps()
1365 if (tcon->ss_flags & SSINFO_FLAGS_TRIM_ENABLED) in smb2_dump_share_caps()
1366 seq_puts(m, " TRIM-support,"); in smb2_dump_share_caps()
1368 seq_printf(m, "\tShare Flags: 0x%x", tcon->share_flags); in smb2_dump_share_caps()
1369 seq_printf(m, "\n\ttid: 0x%x", tcon->tid); in smb2_dump_share_caps()
1370 if (tcon->perf_sector_size) in smb2_dump_share_caps()
1372 tcon->perf_sector_size); in smb2_dump_share_caps()
1373 seq_printf(m, "\tMaximal Access: 0x%x", tcon->maximal_access); in smb2_dump_share_caps()
1377 smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon) in smb2_print_stats() argument
1379 atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent; in smb2_print_stats()
1380 atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed; in smb2_print_stats()
1384 * totals (requests sent) since those SMBs are per-session not per tcon in smb2_print_stats()
1387 (long long)(tcon->bytes_read), in smb2_print_stats()
1388 (long long)(tcon->bytes_written)); in smb2_print_stats()
1390 atomic_read(&tcon->num_local_opens), in smb2_print_stats()
1391 atomic_read(&tcon->num_remote_opens)); in smb2_print_stats()
1439 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); in smb2_set_fid()
1440 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; in smb2_set_fid()
1442 cfile->fid.persistent_fid = fid->persistent_fid; in smb2_set_fid()
1443 cfile->fid.volatile_fid = fid->volatile_fid; in smb2_set_fid()
1444 cfile->fid.access = fid->access; in smb2_set_fid()
1446 cfile->fid.mid = fid->mid; in smb2_set_fid()
1448 server->ops->set_oplock_level(cinode, oplock, fid->epoch, in smb2_set_fid()
1449 &fid->purge_cache); in smb2_set_fid()
1450 cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode); in smb2_set_fid()
1451 memcpy(cfile->fid.create_guid, fid->create_guid, 16); in smb2_set_fid()
1455 smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon, in smb2_close_file() argument
1458 return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_close_file()
1462 smb2_close_getattr(const unsigned int xid, struct cifs_tcon *tcon, in smb2_close_getattr() argument
1469 rc = __SMB2_close(xid, tcon, cfile->fid.persistent_fid, in smb2_close_getattr()
1470 cfile->fid.volatile_fid, &file_inf); in smb2_close_getattr()
1474 inode = d_inode(cfile->dentry); in smb2_close_getattr()
1476 spin_lock(&inode->i_lock); in smb2_close_getattr()
1477 CIFS_I(inode)->time = jiffies; in smb2_close_getattr()
1496 inode->i_blocks = in smb2_close_getattr()
1497 (512 - 1 + le64_to_cpu(file_inf.AllocationSize)) >> 9; in smb2_close_getattr()
1500 spin_unlock(&inode->i_lock); in smb2_close_getattr()
1505 SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_request_res_key() argument
1513 rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, in SMB2_request_res_key()
1517 if (rc == -EOPNOTSUPP) { in SMB2_request_res_key()
1518 pr_warn_once("Server share %s does not support copy range\n", tcon->tree_name); in SMB2_request_res_key()
1526 rc = -EINVAL; in SMB2_request_res_key()
1529 memcpy(pcchunk->SourceKey, res_key->ResumeKey, COPY_CHUNK_RES_KEY_SIZE); in SMB2_request_res_key()
1538 struct cifs_tcon *tcon, in smb2_ioctl_query_info() argument
1546 struct cifs_ses *ses = tcon->ses; in smb2_ioctl_query_info()
1574 return -ENOMEM; in smb2_ioctl_query_info()
1575 rqst = &vars->rqst[0]; in smb2_ioctl_query_info()
1576 rsp_iov = &vars->rsp_iov[0]; in smb2_ioctl_query_info()
1581 rc = -EFAULT; in smb2_ioctl_query_info()
1585 rc = -EINVAL; in smb2_ioctl_query_info()
1590 rc = -EIO; in smb2_ioctl_query_info()
1594 if (smb3_encryption_required(tcon)) in smb2_ioctl_query_info()
1606 rqst[0].rq_iov = &vars->open_iov[0]; in smb2_ioctl_query_info()
1610 .tcon = tcon, in smb2_ioctl_query_info()
1638 rc = SMB2_open_init(tcon, server, in smb2_ioctl_query_info()
1642 smb2_set_next_command(tcon, &rqst[0]); in smb2_ioctl_query_info()
1648 rc = -EPERM; in smb2_ioctl_query_info()
1651 rqst[1].rq_iov = &vars->io_iov[0]; in smb2_ioctl_query_info()
1654 rc = SMB2_ioctl_init(tcon, server, &rqst[1], COMPOUND_FID, COMPOUND_FID, in smb2_ioctl_query_info()
1656 CIFSMaxBufSize - MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_ioctl_query_info()
1662 rc = -EPERM; in smb2_ioctl_query_info()
1666 rc = -EINVAL; in smb2_ioctl_query_info()
1669 rqst[1].rq_iov = vars->si_iov; in smb2_ioctl_query_info()
1672 /* MS-FSCC 2.4.13 FileEndOfFileInformation */ in smb2_ioctl_query_info()
1676 rc = SMB2_set_info_init(tcon, server, &rqst[1], COMPOUND_FID, COMPOUND_FID, in smb2_ioctl_query_info()
1677 current->tgid, FILE_END_OF_FILE_INFORMATION, in smb2_ioctl_query_info()
1681 rqst[1].rq_iov = &vars->qi_iov; in smb2_ioctl_query_info()
1684 rc = SMB2_query_info_init(tcon, server, in smb2_ioctl_query_info()
1694 rc = -EINVAL; in smb2_ioctl_query_info()
1699 smb2_set_next_command(tcon, &rqst[1]); in smb2_ioctl_query_info()
1703 rqst[2].rq_iov = &vars->close_iov; in smb2_ioctl_query_info()
1706 rc = SMB2_close_init(tcon, server, in smb2_ioctl_query_info()
1728 if (le32_to_cpu(io_rsp->OutputCount) < qi.input_buffer_length) in smb2_ioctl_query_info()
1729 qi.input_buffer_length = le32_to_cpu(io_rsp->OutputCount); in smb2_ioctl_query_info()
1731 le32_to_cpu(io_rsp->OutputOffset) + qi.input_buffer_length in smb2_ioctl_query_info()
1733 rc = -EFAULT; in smb2_ioctl_query_info()
1737 if (copy_to_user(&pqi->input_buffer_length, in smb2_ioctl_query_info()
1740 rc = -EFAULT; in smb2_ioctl_query_info()
1745 (const void *)io_rsp + le32_to_cpu(io_rsp->OutputOffset), in smb2_ioctl_query_info()
1747 rc = -EFAULT; in smb2_ioctl_query_info()
1751 if (le32_to_cpu(qi_rsp->OutputBufferLength) < qi.input_buffer_length) in smb2_ioctl_query_info()
1752 qi.input_buffer_length = le32_to_cpu(qi_rsp->OutputBufferLength); in smb2_ioctl_query_info()
1753 if (copy_to_user(&pqi->input_buffer_length, in smb2_ioctl_query_info()
1756 rc = -EFAULT; in smb2_ioctl_query_info()
1760 if (copy_to_user(pqi + 1, qi_rsp->Buffer, in smb2_ioctl_query_info()
1762 rc = -EFAULT; in smb2_ioctl_query_info()
1780 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_ioctl_query_info()
1796 struct cifs_tcon *tcon; in smb2_copychunk_range() local
1803 return -ENOMEM; in smb2_copychunk_range()
1807 rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink), in smb2_copychunk_range()
1808 srcfile->fid.persistent_fid, in smb2_copychunk_range()
1809 srcfile->fid.volatile_fid, pcchunk); in smb2_copychunk_range()
1816 pcchunk->ChunkCount = cpu_to_le32(1); in smb2_copychunk_range()
1817 pcchunk->Reserved = 0; in smb2_copychunk_range()
1818 pcchunk->Reserved2 = 0; in smb2_copychunk_range()
1820 tcon = tlink_tcon(trgtfile->tlink); in smb2_copychunk_range()
1822 trace_smb3_copychunk_enter(xid, srcfile->fid.volatile_fid, in smb2_copychunk_range()
1823 trgtfile->fid.volatile_fid, tcon->tid, in smb2_copychunk_range()
1824 tcon->ses->Suid, src_off, dest_off, len); in smb2_copychunk_range()
1827 pcchunk->SourceOffset = cpu_to_le64(src_off); in smb2_copychunk_range()
1828 pcchunk->TargetOffset = cpu_to_le64(dest_off); in smb2_copychunk_range()
1829 pcchunk->Length = in smb2_copychunk_range()
1830 cpu_to_le32(min_t(u64, len, tcon->max_bytes_chunk)); in smb2_copychunk_range()
1835 rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid, in smb2_copychunk_range()
1836 trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE, in smb2_copychunk_range()
1843 rc = -EIO; in smb2_copychunk_range()
1846 if (retbuf->TotalBytesWritten == 0) { in smb2_copychunk_range()
1848 rc = -EIO; in smb2_copychunk_range()
1854 if (le32_to_cpu(retbuf->TotalBytesWritten) > in smb2_copychunk_range()
1855 le32_to_cpu(pcchunk->Length)) { in smb2_copychunk_range()
1857 rc = -EIO; in smb2_copychunk_range()
1860 if (le32_to_cpu(retbuf->ChunksWritten) != 1) { in smb2_copychunk_range()
1862 rc = -EIO; in smb2_copychunk_range()
1867 bytes_written = le32_to_cpu(retbuf->TotalBytesWritten); in smb2_copychunk_range()
1870 len -= bytes_written; in smb2_copychunk_range()
1874 le32_to_cpu(retbuf->ChunksWritten), in smb2_copychunk_range()
1875 le32_to_cpu(retbuf->ChunkBytesWritten), in smb2_copychunk_range()
1877 trace_smb3_copychunk_done(xid, srcfile->fid.volatile_fid, in smb2_copychunk_range()
1878 trgtfile->fid.volatile_fid, tcon->tid, in smb2_copychunk_range()
1879 tcon->ses->Suid, src_off, dest_off, len); in smb2_copychunk_range()
1880 } else if (rc == -EINVAL) { in smb2_copychunk_range()
1885 le32_to_cpu(retbuf->ChunksWritten), in smb2_copychunk_range()
1886 le32_to_cpu(retbuf->ChunkBytesWritten), in smb2_copychunk_range()
1887 le32_to_cpu(retbuf->TotalBytesWritten)); in smb2_copychunk_range()
1900 if (le32_to_cpu(retbuf->ChunkBytesWritten) < in smb2_copychunk_range()
1901 tcon->max_bytes_chunk) in smb2_copychunk_range()
1902 tcon->max_bytes_chunk = in smb2_copychunk_range()
1903 le32_to_cpu(retbuf->ChunkBytesWritten); in smb2_copychunk_range()
1923 smb2_flush_file(const unsigned int xid, struct cifs_tcon *tcon, in smb2_flush_file() argument
1926 return SMB2_flush(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_flush_file()
1934 return rsp->DataOffset; in smb2_read_data_offset()
1943 return le32_to_cpu(rsp->DataRemaining); in smb2_read_data_length()
1945 return le32_to_cpu(rsp->DataLength); in smb2_read_data_length()
1954 parms->persistent_fid = pfid->persistent_fid; in smb2_sync_read()
1955 parms->volatile_fid = pfid->volatile_fid; in smb2_sync_read()
1965 parms->persistent_fid = pfid->persistent_fid; in smb2_sync_write()
1966 parms->volatile_fid = pfid->volatile_fid; in smb2_sync_write()
1971 static bool smb2_set_sparse(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_sparse() argument
1980 if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && setsparse) in smb2_set_sparse()
1983 if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && !setsparse) in smb2_set_sparse()
1996 if (tcon->broken_sparse_sup) in smb2_set_sparse()
1999 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb2_set_sparse()
2000 cfile->fid.volatile_fid, FSCTL_SET_SPARSE, in smb2_set_sparse()
2003 tcon->broken_sparse_sup = true; in smb2_set_sparse()
2009 cifsi->cifsAttrs |= FILE_ATTRIBUTE_SPARSE_FILE; in smb2_set_sparse()
2011 cifsi->cifsAttrs &= (~FILE_ATTRIBUTE_SPARSE_FILE); in smb2_set_sparse()
2017 smb2_set_file_size(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_file_size() argument
2026 inode = d_inode(cfile->dentry); in smb2_set_file_size()
2028 if (!set_alloc && (size > inode->i_size + 8192)) { in smb2_set_file_size()
2032 smb2_set_sparse(xid, tcon, cfile, inode, set_sparse); in smb2_set_file_size()
2035 return SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb2_set_file_size()
2036 cfile->fid.volatile_fid, cfile->pid, size); in smb2_set_file_size()
2049 struct cifs_tcon *tcon = tlink_tcon(trgtfile->tlink); in smb2_duplicate_extents() local
2052 if ((le32_to_cpu(tcon->fsAttrInfo.Attributes) & in smb2_duplicate_extents()
2054 return -EOPNOTSUPP; in smb2_duplicate_extents()
2056 dup_ext_buf.VolatileFileHandle = srcfile->fid.volatile_fid; in smb2_duplicate_extents()
2057 dup_ext_buf.PersistentFileHandle = srcfile->fid.persistent_fid; in smb2_duplicate_extents()
2063 trace_smb3_clone_enter(xid, srcfile->fid.volatile_fid, in smb2_duplicate_extents()
2064 trgtfile->fid.volatile_fid, tcon->tid, in smb2_duplicate_extents()
2065 tcon->ses->Suid, src_off, dest_off, len); in smb2_duplicate_extents()
2066 inode = d_inode(trgtfile->dentry); in smb2_duplicate_extents()
2067 if (inode->i_size < dest_off + len) { in smb2_duplicate_extents()
2068 rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false); in smb2_duplicate_extents()
2082 rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid, in smb2_duplicate_extents()
2083 trgtfile->fid.volatile_fid, in smb2_duplicate_extents()
2091 cifs_dbg(FYI, "Non-zero response length in duplicate extents\n"); in smb2_duplicate_extents()
2095 trace_smb3_clone_err(xid, srcfile->fid.volatile_fid, in smb2_duplicate_extents()
2096 trgtfile->fid.volatile_fid, in smb2_duplicate_extents()
2097 tcon->tid, tcon->ses->Suid, src_off, in smb2_duplicate_extents()
2100 trace_smb3_clone_done(xid, srcfile->fid.volatile_fid, in smb2_duplicate_extents()
2101 trgtfile->fid.volatile_fid, tcon->tid, in smb2_duplicate_extents()
2102 tcon->ses->Suid, src_off, dest_off, len); in smb2_duplicate_extents()
2107 smb2_set_compression(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_compression() argument
2110 return SMB2_set_compression(xid, tcon, cfile->fid.persistent_fid, in smb2_set_compression()
2111 cfile->fid.volatile_fid); in smb2_set_compression()
2115 smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon, in smb3_set_integrity() argument
2125 return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_set_integrity()
2126 cfile->fid.volatile_fid, in smb3_set_integrity()
2135 /* GMT Token is @GMT-YYYY.MM.DD-HH.MM.SS Unicode which is 48 bytes + null */
2138 #define MIN_SNAPSHOT_ARRAY_SIZE 16 /* See MS-SMB2 section 3.3.5.15.1 */
2142 * For output see struct SRV_SNAPSHOT_ARRAY in MS-SMB2 section 2.2.32.2
2145 smb3_enum_snapshots(const unsigned int xid, struct cifs_tcon *tcon, in smb3_enum_snapshots() argument
2163 return -EFAULT; in smb3_enum_snapshots()
2177 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_enum_snapshots()
2178 cfile->fid.volatile_fid, in smb3_enum_snapshots()
2192 rc = -EFAULT; in smb3_enum_snapshots()
2219 rc = -EFAULT; in smb3_enum_snapshots()
2234 struct dentry *dentry = pfile->f_path.dentry; in smb3_notify()
2236 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in smb3_notify()
2239 struct cifs_tcon *tcon; in smb3_notify() local
2256 rc = -ENOMEM; in smb3_notify()
2262 rc = -EFAULT; in smb3_notify()
2267 rc = -EFAULT; in smb3_notify()
2273 tcon = cifs_sb_master_tcon(cifs_sb); in smb3_notify()
2275 .tcon = tcon, in smb3_notify()
2288 rc = SMB2_change_notify(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_notify()
2292 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb3_notify()
2299 if (copy_to_user(pnotify_buf->notify_data, returned_ioctl_info, ret_len)) in smb3_notify()
2300 rc = -EFAULT; in smb3_notify()
2301 else if (copy_to_user(&pnotify_buf->data_len, &ret_len, sizeof(ret_len))) in smb3_notify()
2302 rc = -EFAULT; in smb3_notify()
2312 smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_dir_first() argument
2335 server = cifs_pick_channel(tcon->ses); in smb2_query_dir_first()
2339 return -ENOMEM; in smb2_query_dir_first()
2341 if (smb3_encryption_required(tcon)) in smb2_query_dir_first()
2354 .tcon = tcon, in smb2_query_dir_first()
2363 rc = SMB2_open_init(tcon, server, in smb2_query_dir_first()
2367 smb2_set_next_command(tcon, &rqst[0]); in smb2_query_dir_first()
2370 srch_inf->entries_in_buffer = 0; in smb2_query_dir_first()
2371 srch_inf->index_of_last_entry = 2; in smb2_query_dir_first()
2377 rc = SMB2_query_directory_init(xid, tcon, server, in smb2_query_dir_first()
2380 0, srch_inf->info_level); in smb2_query_dir_first()
2391 rc = compound_send_recv(xid, tcon->ses, server, in smb2_query_dir_first()
2397 if (op_rsp == NULL || op_rsp->hdr.Status != STATUS_SUCCESS) { in smb2_query_dir_first()
2401 fid->persistent_fid = op_rsp->PersistentFileId; in smb2_query_dir_first()
2402 fid->volatile_fid = op_rsp->VolatileFileId; in smb2_query_dir_first()
2405 if (rc && rc != -ENODATA) { in smb2_query_dir_first()
2406 SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_query_dir_first()
2408 trace_smb3_query_dir_err(xid, fid->persistent_fid, in smb2_query_dir_first()
2409 tcon->tid, tcon->ses->Suid, 0, 0, rc); in smb2_query_dir_first()
2413 atomic_inc(&tcon->num_remote_opens); in smb2_query_dir_first()
2416 if (qd_rsp->hdr.Status == STATUS_NO_MORE_FILES) { in smb2_query_dir_first()
2417 trace_smb3_query_dir_done(xid, fid->persistent_fid, in smb2_query_dir_first()
2418 tcon->tid, tcon->ses->Suid, 0, 0); in smb2_query_dir_first()
2419 srch_inf->endOfSearch = true; in smb2_query_dir_first()
2424 rc = smb2_parse_query_directory(tcon, &rsp_iov[1], resp_buftype[1], in smb2_query_dir_first()
2427 trace_smb3_query_dir_err(xid, fid->persistent_fid, tcon->tid, in smb2_query_dir_first()
2428 tcon->ses->Suid, 0, 0, rc); in smb2_query_dir_first()
2433 trace_smb3_query_dir_done(xid, fid->persistent_fid, tcon->tid, in smb2_query_dir_first()
2434 tcon->ses->Suid, 0, srch_inf->entries_in_buffer); in smb2_query_dir_first()
2444 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_query_dir_first()
2451 smb2_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_dir_next() argument
2455 return SMB2_query_directory(xid, tcon, fid->persistent_fid, in smb2_query_dir_next()
2456 fid->volatile_fid, 0, srch_inf); in smb2_query_dir_next()
2460 smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon, in smb2_close_dir() argument
2463 return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_close_dir()
2467 * If we negotiate SMB2 protocol and get STATUS_PENDING - update
2468 * the number of credits and return true. Otherwise - return false.
2476 if (shdr->Status != STATUS_PENDING) in smb2_is_status_pending()
2479 if (shdr->CreditRequest) { in smb2_is_status_pending()
2480 spin_lock(&server->req_lock); in smb2_is_status_pending()
2481 server->credits += le16_to_cpu(shdr->CreditRequest); in smb2_is_status_pending()
2482 scredits = server->credits; in smb2_is_status_pending()
2483 in_flight = server->in_flight; in smb2_is_status_pending()
2484 spin_unlock(&server->req_lock); in smb2_is_status_pending()
2485 wake_up(&server->request_q); in smb2_is_status_pending()
2487 trace_smb3_pend_credits(server->CurrentMid, in smb2_is_status_pending()
2488 server->conn_id, server->hostname, scredits, in smb2_is_status_pending()
2489 le16_to_cpu(shdr->CreditRequest), in_flight); in smb2_is_status_pending()
2491 __func__, le16_to_cpu(shdr->CreditRequest), scredits); in smb2_is_status_pending()
2502 if (shdr->Status != STATUS_NETWORK_SESSION_EXPIRED && in smb2_is_session_expired()
2503 shdr->Status != STATUS_USER_SESSION_DELETED) in smb2_is_session_expired()
2506 trace_smb3_ses_expired(le32_to_cpu(shdr->Id.SyncId.TreeId), in smb2_is_session_expired()
2507 le64_to_cpu(shdr->SessionId), in smb2_is_session_expired()
2508 le16_to_cpu(shdr->Command), in smb2_is_session_expired()
2509 le64_to_cpu(shdr->MessageId)); in smb2_is_session_expired()
2520 if (shdr->Status == STATUS_IO_TIMEOUT) in smb2_is_status_io_timeout()
2532 struct cifs_tcon *tcon; in smb2_is_network_name_deleted() local
2534 if (shdr->Status != STATUS_NETWORK_NAME_DELETED) in smb2_is_network_name_deleted()
2537 /* If server is a channel, select the primary channel */ in smb2_is_network_name_deleted()
2538 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_is_network_name_deleted()
2541 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_is_network_name_deleted()
2544 list_for_each_entry(tcon, &ses->tcon_list, tcon_list) { in smb2_is_network_name_deleted()
2545 if (tcon->tid == le32_to_cpu(shdr->Id.SyncId.TreeId)) { in smb2_is_network_name_deleted()
2546 spin_lock(&tcon->tc_lock); in smb2_is_network_name_deleted()
2547 tcon->need_reconnect = true; in smb2_is_network_name_deleted()
2548 spin_unlock(&tcon->tc_lock); in smb2_is_network_name_deleted()
2551 tcon->tree_name); in smb2_is_network_name_deleted()
2562 smb2_oplock_response(struct cifs_tcon *tcon, __u64 persistent_fid, in smb2_oplock_response() argument
2565 if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING) in smb2_oplock_response()
2566 return SMB2_lease_break(0, tcon, cinode->lease_key, in smb2_oplock_response()
2569 return SMB2_oplock_break(0, tcon, persistent_fid, volatile_fid, in smb2_oplock_response()
2578 if (server->dialect < SMB30_PROT_ID) in smb2_set_replay()
2581 shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base); in smb2_set_replay()
2586 shdr->Flags |= SMB2_FLAGS_REPLAY_OPERATION; in smb2_set_replay()
2594 shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base); in smb2_set_related()
2599 shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; in smb2_set_related()
2605 smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst) in smb2_set_next_command() argument
2608 struct cifs_ses *ses = tcon->ses; in smb2_set_next_command()
2609 struct TCP_Server_Info *server = ses->server; in smb2_set_next_command()
2613 shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base); in smb2_set_next_command()
2621 num_padding = 8 - (len & 7); in smb2_set_next_command()
2622 rqst->rq_iov[rqst->rq_nvec].iov_base = smb2_padding; in smb2_set_next_command()
2623 rqst->rq_iov[rqst->rq_nvec].iov_len = num_padding; in smb2_set_next_command()
2624 rqst->rq_nvec++; in smb2_set_next_command()
2627 shdr->NextCommand = cpu_to_le32(len); in smb2_set_next_command()
2633 bool smb2_should_replay(struct cifs_tcon *tcon, in smb2_should_replay() argument
2640 if (tcon->retry || (*pretries)++ < tcon->ses->server->retrans) { in smb2_should_replay()
2656 smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_info_compound() argument
2663 struct cifs_ses *ses = tcon->ses; in smb2_query_info_compound()
2687 return -ENOMEM; in smb2_query_info_compound()
2689 if (smb3_encryption_required(tcon)) in smb2_query_info_compound()
2695 rc = -ENOMEM; in smb2_query_info_compound()
2698 rqst = vars->rqst; in smb2_query_info_compound()
2699 rsp_iov = vars->rsp_iov; in smb2_query_info_compound()
2705 open_cached_dir(xid, tcon, path, cifs_sb, false, in smb2_query_info_compound()
2708 rqst[0].rq_iov = vars->open_iov; in smb2_query_info_compound()
2712 .tcon = tcon, in smb2_query_info_compound()
2721 rc = SMB2_open_init(tcon, server, in smb2_query_info_compound()
2725 smb2_set_next_command(tcon, &rqst[0]); in smb2_query_info_compound()
2727 rqst[1].rq_iov = &vars->qi_iov; in smb2_query_info_compound()
2731 rc = SMB2_query_info_init(tcon, server, in smb2_query_info_compound()
2733 cfid->fid.persistent_fid, in smb2_query_info_compound()
2734 cfid->fid.volatile_fid, in smb2_query_info_compound()
2739 rc = SMB2_query_info_init(tcon, server, in smb2_query_info_compound()
2750 smb2_set_next_command(tcon, &rqst[1]); in smb2_query_info_compound()
2754 rqst[2].rq_iov = &vars->close_iov; in smb2_query_info_compound()
2757 rc = SMB2_close_init(tcon, server, in smb2_query_info_compound()
2782 if (rc == -EREMCHG) { in smb2_query_info_compound()
2783 tcon->need_reconnect = true; in smb2_query_info_compound()
2785 tcon->tree_name); in smb2_query_info_compound()
2805 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_query_info_compound()
2812 smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon, in smb2_queryfs() argument
2822 rc = smb2_query_info_compound(xid, tcon, path, in smb2_queryfs()
2832 buf->f_type = SMB2_SUPER_MAGIC; in smb2_queryfs()
2834 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in smb2_queryfs()
2835 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_queryfs()
2836 le32_to_cpu(rsp->OutputBufferLength), in smb2_queryfs()
2843 trace_smb3_qfs_done(xid, tcon->tid, tcon->ses->Suid, tcon->tree_name, rc); in smb2_queryfs()
2849 smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon, in smb311_queryfs() argument
2858 if (!tcon->posix_extensions) in smb311_queryfs()
2859 return smb2_queryfs(xid, tcon, path, cifs_sb, buf); in smb311_queryfs()
2862 .tcon = tcon, in smb311_queryfs()
2872 return -ENOMEM; in smb311_queryfs()
2880 rc = SMB311_posix_qfs_info(xid, tcon, fid.persistent_fid, in smb311_queryfs()
2882 buf->f_type = SMB2_SUPER_MAGIC; in smb311_queryfs()
2883 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb311_queryfs()
2890 return ob1->fid.persistent_fid == ob2->fid.persistent_fid && in smb2_compare_fids()
2891 ob1->fid.volatile_fid == ob2->fid.volatile_fid; in smb2_compare_fids()
2900 return SMB2_lock(xid, tlink_tcon(cfile->tlink), in smb2_mand_lock()
2901 cfile->fid.persistent_fid, cfile->fid.volatile_fid, in smb2_mand_lock()
2902 current->tgid, length, offset, type, wait); in smb2_mand_lock()
2908 memcpy(fid->lease_key, CIFS_I(inode)->lease_key, SMB2_LEASE_KEY_SIZE); in smb2_get_lease_key()
2914 memcpy(CIFS_I(inode)->lease_key, fid->lease_key, SMB2_LEASE_KEY_SIZE); in smb2_set_lease_key()
2920 generate_random_uuid(fid->lease_key); in smb2_new_lease_key()
2933 struct cifs_tcon *tcon; in smb2_get_dfs_refer() local
2942 * Try to use the IPC tcon, otherwise just use any in smb2_get_dfs_refer()
2944 tcon = ses->tcon_ipc; in smb2_get_dfs_refer()
2945 if (tcon == NULL) { in smb2_get_dfs_refer()
2947 tcon = list_first_entry_or_null(&ses->tcon_list, in smb2_get_dfs_refer()
2950 if (tcon) { in smb2_get_dfs_refer()
2951 tcon->tc_count++; in smb2_get_dfs_refer()
2952 trace_smb3_tcon_ref(tcon->debug_id, tcon->tc_count, in smb2_get_dfs_refer()
2958 if (tcon == NULL) { in smb2_get_dfs_refer()
2959 cifs_dbg(VFS, "session %p has no tcon available for a dfs referral request\n", in smb2_get_dfs_refer()
2961 rc = -ENOTCONN; in smb2_get_dfs_refer()
2969 rc = -ENOMEM; in smb2_get_dfs_refer()
2976 rc = -ENOMEM; in smb2_get_dfs_refer()
2981 dfs_req->MaxReferralLevel = DFS_VERSION; in smb2_get_dfs_refer()
2983 /* Path to resolve in an UTF-16 null-terminated string */ in smb2_get_dfs_refer()
2984 memcpy(dfs_req->RequestFileName, utf16_path, utf16_path_len); in smb2_get_dfs_refer()
2987 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in smb2_get_dfs_refer()
2992 rc = -EINTR; in smb2_get_dfs_refer()
3001 rc = -EIO; in smb2_get_dfs_refer()
3003 if (!is_retryable_error(rc) && rc != -ENOENT && rc != -EOPNOTSUPP) in smb2_get_dfs_refer()
3012 if (rc && rc != -ENOENT) { in smb2_get_dfs_refer()
3018 if (tcon && !tcon->ipc) { in smb2_get_dfs_refer()
3021 tcon->tc_count--; in smb2_get_dfs_refer()
3022 trace_smb3_tcon_ref(tcon->debug_id, tcon->tc_count, in smb2_get_dfs_refer()
3025 WARN_ON(tcon->tc_count < 0); in smb2_get_dfs_refer()
3040 int rc = -EOPNOTSUPP; in get_smb2_acl_by_fid()
3049 rc = SMB2_query_acl(xid, tlink_tcon(tlink), cifsfid->persistent_fid, in get_smb2_acl_by_fid()
3050 cifsfid->volatile_fid, (void **)&pntsd, pacllen, in get_smb2_acl_by_fid()
3071 struct cifs_tcon *tcon; in get_smb2_acl_by_path() local
3081 tcon = tlink_tcon(tlink); in get_smb2_acl_by_path()
3086 rc = -ENOMEM; in get_smb2_acl_by_path()
3092 .tcon = tcon, in get_smb2_acl_by_path()
3117 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in get_smb2_acl_by_path()
3136 struct cifs_tcon *tcon; in set_smb2_acl() local
3137 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in set_smb2_acl()
3147 tcon = tlink_tcon(tlink); in set_smb2_acl()
3159 rc = -ENOMEM; in set_smb2_acl()
3165 .tcon = tcon, in set_smb2_acl()
3179 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in set_smb2_acl()
3201 pntsd = get_smb2_acl_by_fid(cifs_sb, &open_file->fid, pacllen, info); in get_smb2_acl()
3206 static long smb3_zero_data(struct file *file, struct cifs_tcon *tcon, in smb3_zero_data() argument
3209 struct cifsFileInfo *cfile = file->private_data; in smb3_zero_data()
3217 return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_zero_data()
3218 cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, in smb3_zero_data()
3224 static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, in smb3_zero_range() argument
3228 struct cifs_ses *ses = tcon->ses; in smb3_zero_range()
3231 struct cifsFileInfo *cfile = file->private_data; in smb3_zero_range()
3239 trace_smb3_zero_enter(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_zero_range()
3240 ses->Suid, offset, len); in smb3_zero_range()
3243 filemap_invalidate_lock(inode->i_mapping); in smb3_zero_range()
3246 remote_size = ictx->remote_i_size; in smb3_zero_range()
3250 rc = filemap_write_and_wait_range(inode->i_mapping, offset, top - 1); in smb3_zero_range()
3259 truncate_pagecache_range(inode, offset, offset + len - 1); in smb3_zero_range()
3262 rc = -EOPNOTSUPP; in smb3_zero_range()
3266 rc = smb3_zero_data(file, tcon, offset, len, xid); in smb3_zero_range()
3275 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_zero_range()
3276 cfile->fid.volatile_fid, cfile->pid, new_size); in smb3_zero_range()
3279 netfs_resize_file(&cifsi->netfs, new_size, true); in smb3_zero_range()
3280 if (offset < cifsi->netfs.zero_point) in smb3_zero_range()
3281 cifsi->netfs.zero_point = offset; in smb3_zero_range()
3287 filemap_invalidate_unlock(inode->i_mapping); in smb3_zero_range()
3291 trace_smb3_zero_err(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_zero_range()
3292 ses->Suid, offset, len, rc); in smb3_zero_range()
3294 trace_smb3_zero_done(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_zero_range()
3295 ses->Suid, offset, len); in smb3_zero_range()
3299 static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, in smb3_punch_hole() argument
3303 struct cifsFileInfo *cfile = file->private_data; in smb3_punch_hole()
3315 if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse)) { in smb3_punch_hole()
3316 rc = -EOPNOTSUPP; in smb3_punch_hole()
3320 filemap_invalidate_lock(inode->i_mapping); in smb3_punch_hole()
3325 truncate_pagecache_range(inode, offset, offset + len - 1); in smb3_punch_hole()
3332 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_punch_hole()
3333 cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, in smb3_punch_hole()
3344 * that we locally hole-punch the tail of the dirty data, the proposed in smb3_punch_hole()
3348 remote_i_size = netfs_inode(inode)->remote_i_size; in smb3_punch_hole()
3351 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_punch_hole()
3352 cfile->fid.volatile_fid, cfile->pid, extend_to); in smb3_punch_hole()
3354 netfs_inode(inode)->remote_i_size = extend_to; in smb3_punch_hole()
3358 filemap_invalidate_unlock(inode->i_mapping); in smb3_punch_hole()
3366 struct cifs_tcon *tcon, in smb3_simple_fallocate_write_range() argument
3376 io_parms.netfid = cfile->fid.netfid; in smb3_simple_fallocate_write_range()
3377 io_parms.pid = current->tgid; in smb3_simple_fallocate_write_range()
3378 io_parms.tcon = tcon; in smb3_simple_fallocate_write_range()
3379 io_parms.persistent_fid = cfile->fid.persistent_fid; in smb3_simple_fallocate_write_range()
3380 io_parms.volatile_fid = cfile->fid.volatile_fid; in smb3_simple_fallocate_write_range()
3394 return -EINVAL; in smb3_simple_fallocate_write_range()
3397 len -= nbytes; in smb3_simple_fallocate_write_range()
3403 struct cifs_tcon *tcon, in smb3_simple_fallocate_range() argument
3415 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_simple_fallocate_range()
3416 cfile->fid.volatile_fid, in smb3_simple_fallocate_range()
3426 rc = -ENOMEM; in smb3_simple_fallocate_range()
3436 rc = smb3_simple_fallocate_write_range(xid, tcon, in smb3_simple_fallocate_range()
3442 rc = -EINVAL; in smb3_simple_fallocate_range()
3446 if (off < le64_to_cpu(tmp_data->file_offset)) { in smb3_simple_fallocate_range()
3452 l = le64_to_cpu(tmp_data->file_offset) - off; in smb3_simple_fallocate_range()
3455 rc = smb3_simple_fallocate_write_range(xid, tcon, in smb3_simple_fallocate_range()
3460 len = len - l; in smb3_simple_fallocate_range()
3469 l = le64_to_cpu(tmp_data->length); in smb3_simple_fallocate_range()
3473 len -= l; in smb3_simple_fallocate_range()
3476 out_data_len -= sizeof(struct file_allocated_range_buffer); in smb3_simple_fallocate_range()
3486 static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, in smb3_simple_falloc() argument
3491 struct cifsFileInfo *cfile = file->private_data; in smb3_simple_falloc()
3492 long rc = -EOPNOTSUPP; in smb3_simple_falloc()
3498 inode = d_inode(cfile->dentry); in smb3_simple_falloc()
3501 trace_smb3_falloc_enter(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_simple_falloc()
3502 tcon->ses->Suid, off, len); in smb3_simple_falloc()
3506 trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, in smb3_simple_falloc()
3507 tcon->tid, tcon->ses->Suid, off, len, rc); in smb3_simple_falloc()
3520 if (cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) in smb3_simple_falloc()
3521 smb2_set_sparse(xid, tcon, cfile, inode, false); in smb3_simple_falloc()
3524 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_simple_falloc()
3525 cfile->fid.volatile_fid, cfile->pid, new_eof); in smb3_simple_falloc()
3527 netfs_resize_file(&cifsi->netfs, new_eof, true); in smb3_simple_falloc()
3529 cifs_truncate_page(inode->i_mapping, inode->i_size); in smb3_simple_falloc()
3536 * Files are non-sparse by default so falloc may be a no-op in smb3_simple_falloc()
3540 if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) { in smb3_simple_falloc()
3559 len = i_size_read(inode) - off; in smb3_simple_falloc()
3568 * We can either turn the entire file to become non-sparse in smb3_simple_falloc()
3579 rc = smb3_simple_fallocate_range(xid, tcon, cfile, in smb3_simple_falloc()
3590 * or end of the file non-sparse via set_sparse is harmless. in smb3_simple_falloc()
3593 rc = -EOPNOTSUPP; in smb3_simple_falloc()
3598 smb2_set_sparse(xid, tcon, cfile, inode, false); in smb3_simple_falloc()
3603 trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_simple_falloc()
3604 tcon->ses->Suid, off, len, rc); in smb3_simple_falloc()
3606 trace_smb3_falloc_done(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_simple_falloc()
3607 tcon->ses->Suid, off, len); in smb3_simple_falloc()
3613 static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon, in smb3_collapse_range() argument
3620 struct cifsFileInfo *cfile = file->private_data; in smb3_collapse_range()
3621 struct netfs_inode *ictx = &cifsi->netfs; in smb3_collapse_range()
3631 rc = -EINVAL; in smb3_collapse_range()
3635 filemap_invalidate_lock(inode->i_mapping); in smb3_collapse_range()
3636 rc = filemap_write_and_wait_range(inode->i_mapping, off, old_eof - 1); in smb3_collapse_range()
3641 ictx->zero_point = old_eof; in smb3_collapse_range()
3644 old_eof - off - len, off); in smb3_collapse_range()
3648 new_eof = old_eof - len; in smb3_collapse_range()
3649 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_collapse_range()
3650 cfile->fid.volatile_fid, cfile->pid, new_eof); in smb3_collapse_range()
3657 netfs_resize_file(&cifsi->netfs, new_eof, true); in smb3_collapse_range()
3658 ictx->zero_point = new_eof; in smb3_collapse_range()
3661 filemap_invalidate_unlock(inode->i_mapping); in smb3_collapse_range()
3668 static long smb3_insert_range(struct file *file, struct cifs_tcon *tcon, in smb3_insert_range() argument
3673 struct cifsFileInfo *cfile = file->private_data; in smb3_insert_range()
3684 rc = -EINVAL; in smb3_insert_range()
3688 count = old_eof - off; in smb3_insert_range()
3691 filemap_invalidate_lock(inode->i_mapping); in smb3_insert_range()
3692 rc = filemap_write_and_wait_range(inode->i_mapping, off, new_eof - 1); in smb3_insert_range()
3697 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_insert_range()
3698 cfile->fid.volatile_fid, cfile->pid, new_eof); in smb3_insert_range()
3703 netfs_resize_file(&cifsi->netfs, i_size_read(inode), true); in smb3_insert_range()
3709 cifsi->netfs.zero_point = new_eof; in smb3_insert_range()
3711 rc = smb3_zero_data(file, tcon, off, len, xid); in smb3_insert_range()
3717 filemap_invalidate_unlock(inode->i_mapping); in smb3_insert_range()
3724 static loff_t smb3_llseek(struct file *file, struct cifs_tcon *tcon, loff_t offset, int whence) in smb3_llseek() argument
3726 struct cifsFileInfo *wrcfile, *cfile = file->private_data; in smb3_llseek()
3737 inode = d_inode(cfile->dentry); in smb3_llseek()
3741 return -ENXIO; in smb3_llseek()
3753 filemap_write_and_wait(inode->i_mapping); in smb3_llseek()
3754 smb2_flush_file(xid, tcon, &wrcfile->fid); in smb3_llseek()
3758 if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE)) { in smb3_llseek()
3767 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_llseek()
3768 cfile->fid.volatile_fid, in smb3_llseek()
3773 if (rc == -E2BIG) in smb3_llseek()
3782 rc = -ENXIO; in smb3_llseek()
3787 rc = -EINVAL; in smb3_llseek()
3791 offset = le64_to_cpu(out_data->file_offset); in smb3_llseek()
3794 if (offset < le64_to_cpu(out_data->file_offset)) in smb3_llseek()
3797 offset = le64_to_cpu(out_data->file_offset) + le64_to_cpu(out_data->length); in smb3_llseek()
3803 return vfs_setpos(file, offset, inode->i_sb->s_maxbytes); in smb3_llseek()
3808 static int smb3_fiemap(struct cifs_tcon *tcon, in smb3_fiemap() argument
3818 rc = fiemap_prep(d_inode(cfile->dentry), fei, start, &len, 0); in smb3_fiemap()
3827 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_fiemap()
3828 cfile->fid.volatile_fid, in smb3_fiemap()
3833 if (rc == -E2BIG) { in smb3_fiemap()
3842 rc = -EINVAL; in smb3_fiemap()
3846 rc = -EINVAL; in smb3_fiemap()
3853 if (i == num - 1 && last_blob) in smb3_fiemap()
3870 next = le64_to_cpu(out_data[num - 1].file_offset) + in smb3_fiemap()
3871 le64_to_cpu(out_data[num - 1].length); in smb3_fiemap()
3872 len = len - (next - start); in smb3_fiemap()
3883 static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode, in smb3_fallocate() argument
3888 return smb3_punch_hole(file, tcon, off, len); in smb3_fallocate()
3891 return smb3_zero_range(file, tcon, off, len, true); in smb3_fallocate()
3892 return smb3_zero_range(file, tcon, off, len, false); in smb3_fallocate()
3894 return smb3_simple_falloc(file, tcon, off, len, true); in smb3_fallocate()
3896 return smb3_collapse_range(file, tcon, off, len); in smb3_fallocate()
3898 return smb3_insert_range(file, tcon, off, len); in smb3_fallocate()
3900 return smb3_simple_falloc(file, tcon, off, len, false); in smb3_fallocate()
3902 return -EOPNOTSUPP; in smb3_fallocate()
3910 server->ops->set_oplock_level(cinode, oplock, 0, NULL); in smb2_downgrade_oplock()
3922 unsigned int old_state = cinode->oplock; in smb3_downgrade_oplock()
3923 __u16 old_epoch = cinode->epoch; in smb3_downgrade_oplock()
3928 cinode->epoch = epoch; in smb3_downgrade_oplock()
3931 new_state = cinode->oplock; in smb3_downgrade_oplock()
3937 else if (old_state == new_state && (epoch - old_epoch > 1)) in smb3_downgrade_oplock()
3946 cinode->lease_granted = false; in smb2_set_oplock_level()
3950 cinode->oplock = CIFS_CACHE_RHW_FLG; in smb2_set_oplock_level()
3952 &cinode->netfs.inode); in smb2_set_oplock_level()
3954 cinode->oplock = CIFS_CACHE_RW_FLG; in smb2_set_oplock_level()
3956 &cinode->netfs.inode); in smb2_set_oplock_level()
3958 cinode->oplock = CIFS_CACHE_READ_FLG; in smb2_set_oplock_level()
3960 &cinode->netfs.inode); in smb2_set_oplock_level()
3962 cinode->oplock = 0; in smb2_set_oplock_level()
3973 cinode->lease_granted = true; in smb21_set_oplock_level()
3997 cinode->oplock = new_oplock; in smb21_set_oplock_level()
3999 &cinode->netfs.inode); in smb21_set_oplock_level()
4006 unsigned int old_oplock = cinode->oplock; in smb3_set_oplock_level()
4013 if (cinode->oplock == CIFS_CACHE_READ_FLG && in smb3_set_oplock_level()
4014 (epoch - cinode->epoch > 0)) in smb3_set_oplock_level()
4016 else if (cinode->oplock == CIFS_CACHE_RH_FLG && in smb3_set_oplock_level()
4017 (epoch - cinode->epoch > 1)) in smb3_set_oplock_level()
4019 else if (cinode->oplock == CIFS_CACHE_RHW_FLG && in smb3_set_oplock_level()
4020 (epoch - cinode->epoch > 1)) in smb3_set_oplock_level()
4022 else if (cinode->oplock == 0 && in smb3_set_oplock_level()
4023 (epoch - cinode->epoch > 0)) in smb3_set_oplock_level()
4026 if (cinode->oplock == CIFS_CACHE_RH_FLG && in smb3_set_oplock_level()
4027 (epoch - cinode->epoch > 0)) in smb3_set_oplock_level()
4029 else if (cinode->oplock == CIFS_CACHE_RHW_FLG && in smb3_set_oplock_level()
4030 (epoch - cinode->epoch > 1)) in smb3_set_oplock_level()
4033 cinode->epoch = epoch; in smb3_set_oplock_level()
4074 memcpy(&buf->lcontext.LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE); in smb2_create_lease_buf()
4075 buf->lcontext.LeaseState = map_oplock_to_lease(oplock); in smb2_create_lease_buf()
4077 buf->ccontext.DataOffset = cpu_to_le16(offsetof in smb2_create_lease_buf()
4079 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context)); in smb2_create_lease_buf()
4080 buf->ccontext.NameOffset = cpu_to_le16(offsetof in smb2_create_lease_buf()
4082 buf->ccontext.NameLength = cpu_to_le16(4); in smb2_create_lease_buf()
4084 buf->Name[0] = 'R'; in smb2_create_lease_buf()
4085 buf->Name[1] = 'q'; in smb2_create_lease_buf()
4086 buf->Name[2] = 'L'; in smb2_create_lease_buf()
4087 buf->Name[3] = 's'; in smb2_create_lease_buf()
4100 memcpy(&buf->lcontext.LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE); in smb3_create_lease_buf()
4101 buf->lcontext.LeaseState = map_oplock_to_lease(oplock); in smb3_create_lease_buf()
4103 buf->ccontext.DataOffset = cpu_to_le16(offsetof in smb3_create_lease_buf()
4105 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2)); in smb3_create_lease_buf()
4106 buf->ccontext.NameOffset = cpu_to_le16(offsetof in smb3_create_lease_buf()
4108 buf->ccontext.NameLength = cpu_to_le16(4); in smb3_create_lease_buf()
4110 buf->Name[0] = 'R'; in smb3_create_lease_buf()
4111 buf->Name[1] = 'q'; in smb3_create_lease_buf()
4112 buf->Name[2] = 'L'; in smb3_create_lease_buf()
4113 buf->Name[3] = 's'; in smb3_create_lease_buf()
4123 if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE) in smb2_parse_lease_buf()
4125 return le32_to_cpu(lc->lcontext.LeaseState); in smb2_parse_lease_buf()
4133 *epoch = le16_to_cpu(lc->lcontext.Epoch); in smb3_parse_lease_buf()
4134 if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE) in smb3_parse_lease_buf()
4137 memcpy(lease_key, &lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE); in smb3_parse_lease_buf()
4138 return le32_to_cpu(lc->lcontext.LeaseState); in smb3_parse_lease_buf()
4144 return min_t(unsigned int, CIFS_SB(inode->i_sb)->ctx->wsize, in smb2_wp_retry_size()
4151 return !cfile->invalidHandle; in smb2_dir_needs_close()
4159 (struct smb2_hdr *)old_rq->rq_iov[0].iov_base; in fill_transform_hdr()
4162 tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM; in fill_transform_hdr()
4163 tr_hdr->OriginalMessageSize = cpu_to_le32(orig_len); in fill_transform_hdr()
4164 tr_hdr->Flags = cpu_to_le16(0x01); in fill_transform_hdr()
4167 get_random_bytes(&tr_hdr->Nonce, SMB3_AES_GCM_NONCE); in fill_transform_hdr()
4169 get_random_bytes(&tr_hdr->Nonce, SMB3_AES_CCM_NONCE); in fill_transform_hdr()
4170 memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8); in fill_transform_hdr()
4188 len += crypto_aead_alignmask(tfm) & ~(crypto_tfm_ctx_alignment() - 1); in smb2_aead_req_alloc()
4197 return ERR_PTR(-ENOMEM); in smb2_aead_req_alloc()
4202 sgt->sgl = (struct scatterlist *)PTR_ALIGN((u8 *)*req + req_size, in smb2_aead_req_alloc()
4237 rqst[i].rq_iov[j].iov_len - skip); in smb2_get_aead_req()
4245 num_sgs - sgtable.nents, 0); in smb2_get_aead_req()
4251 sg_mark_end(&sgtable.sgl[sgtable.nents - 1]); in smb2_get_aead_req()
4263 /* If server is a channel, select the primary channel */ in smb2_get_enc_key()
4264 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_get_enc_key()
4267 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_get_enc_key()
4268 if (ses->Suid == ses_id) { in smb2_get_enc_key()
4269 spin_lock(&ses->ses_lock); in smb2_get_enc_key()
4270 ses_enc_key = enc ? ses->smb3encryptionkey : in smb2_get_enc_key()
4271 ses->smb3decryptionkey; in smb2_get_enc_key()
4273 spin_unlock(&ses->ses_lock); in smb2_get_enc_key()
4282 return -EAGAIN; in smb2_get_enc_key()
4286 * iov[0] - transform header (associate data),
4287 * iov[1-N] - SMB2 header and pages - data to encrypt.
4288 * On success return encrypted data in iov[1-N] and pages, leave iov[0]
4297 unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20; in crypt_message()
4304 unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize); in crypt_message()
4308 rc = smb2_get_enc_key(server, le64_to_cpu(tr_hdr->SessionId), enc, key); in crypt_message()
4311 enc ? "en" : "de", le64_to_cpu(tr_hdr->SessionId)); in crypt_message()
4315 if ((server->cipher_type == SMB2_ENCRYPTION_AES256_CCM) || in crypt_message()
4316 (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM)) in crypt_message()
4338 memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE); in crypt_message()
4342 if ((server->cipher_type == SMB2_ENCRYPTION_AES128_GCM) || in crypt_message()
4343 (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM)) in crypt_message()
4344 memcpy(iv, (char *)tr_hdr->Nonce, SMB3_AES_GCM_NONCE); in crypt_message()
4347 memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES_CCM_NONCE); in crypt_message()
4357 memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE); in crypt_message()
4374 buffer = folioq->next; in cifs_clear_folioq_buffer()
4395 tail->next = p; in cifs_alloc_folioq_buffer()
4396 p->prev = tail; in cifs_alloc_folioq_buffer()
4408 size -= folioq_folio_size(tail, slot); in cifs_alloc_folioq_buffer()
4424 for (; buffer; buffer = buffer->next) { in cifs_copy_iter_to_folioq()
4433 size -= part; in cifs_copy_iter_to_folioq()
4449 * a smb2_transform_hdr and is pre-allocated by the caller.
4456 * new_rq[0].rq_iov[0] : smb2_transform_hdr pre-allocated by the caller
4465 int rc = -ENOMEM; in smb3_init_transform_rq()
4468 struct smb_rqst *old = &old_rq[i - 1]; in smb3_init_transform_rq()
4471 size_t size = iov_iter_count(&old->rq_iter); in smb3_init_transform_rq()
4474 new->rq_iov = old->rq_iov; in smb3_init_transform_rq()
4475 new->rq_nvec = old->rq_nvec; in smb3_init_transform_rq()
4482 new->rq_buffer = buffer; in smb3_init_transform_rq()
4483 iov_iter_folio_queue(&new->rq_iter, ITER_SOURCE, in smb3_init_transform_rq()
4486 if (!cifs_copy_iter_to_folioq(&old->rq_iter, size, buffer)) { in smb3_init_transform_rq()
4487 rc = -EIO; in smb3_init_transform_rq()
4494 fill_transform_hdr(tr_hdr, orig_len, old_rq, server->cipher_type); in smb3_init_transform_rq()
4496 rc = crypt_message(server, num_rqst, new_rq, 1, server->secmech.enc); in smb3_init_transform_rq()
4504 smb3_free_compound_rqst(num_rqst - 1, &new_rq[1]); in smb3_init_transform_rq()
4513 return trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM; in smb3_is_transform_hdr()
4540 if ((server->cipher_type == SMB2_ENCRYPTION_AES128_GCM) || in decrypt_raw_data()
4541 (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM)) in decrypt_raw_data()
4552 if (unlikely(!server->secmech.dec)) in decrypt_raw_data()
4553 return -EIO; in decrypt_raw_data()
4555 tfm = server->secmech.dec; in decrypt_raw_data()
4570 server->total_read = buf_data_size + iter_size; in decrypt_raw_data()
4579 for (; folioq; folioq = folioq->next) { in cifs_copy_folioq_to_iter()
4583 size_t n, len = umin(fsize - skip, data_size); in cifs_copy_folioq_to_iter()
4588 return -EIO; in cifs_copy_folioq_to_iter()
4590 data_size -= n; in cifs_copy_folioq_to_iter()
4608 struct cifs_io_subrequest *rdata = mid->callback_data; in handle_read_data()
4613 if (shdr->Command != SMB2_READ) { in handle_read_data()
4615 return -EOPNOTSUPP; in handle_read_data()
4618 if (server->ops->is_session_expired && in handle_read_data()
4619 server->ops->is_session_expired(buf)) { in handle_read_data()
4622 return -1; in handle_read_data()
4625 if (server->ops->is_status_pending && in handle_read_data()
4626 server->ops->is_status_pending(buf, server)) in handle_read_data()
4627 return -1; in handle_read_data()
4630 rdata->iov[0].iov_base = buf; in handle_read_data()
4631 rdata->iov[0].iov_len = 0; in handle_read_data()
4632 rdata->iov[1].iov_base = buf; in handle_read_data()
4633 rdata->iov[1].iov_len = in handle_read_data()
4634 min_t(unsigned int, buf_len, server->vals->read_rsp_size); in handle_read_data()
4636 rdata->iov[0].iov_base, rdata->iov[0].iov_len); in handle_read_data()
4638 rdata->iov[1].iov_base, rdata->iov[1].iov_len); in handle_read_data()
4640 rdata->result = server->ops->map_error(buf, true); in handle_read_data()
4641 if (rdata->result != 0) { in handle_read_data()
4643 __func__, rdata->result); in handle_read_data()
4646 mid->mid_state = MID_RESPONSE_RECEIVED; in handle_read_data()
4652 data_offset = server->ops->read_data_offset(buf); in handle_read_data()
4654 use_rdma_mr = rdata->mr; in handle_read_data()
4656 data_len = server->ops->read_data_length(buf, use_rdma_mr); in handle_read_data()
4658 if (data_offset < server->vals->read_rsp_size) { in handle_read_data()
4666 data_offset = server->vals->read_rsp_size; in handle_read_data()
4671 rdata->result = -EIO; in handle_read_data()
4673 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4675 dequeue_mid(mid, rdata->result); in handle_read_data()
4679 pad_len = data_offset - server->vals->read_rsp_size; in handle_read_data()
4690 rdata->result = -EIO; in handle_read_data()
4692 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4694 dequeue_mid(mid, rdata->result); in handle_read_data()
4698 if (data_len > buffer_len - pad_len) { in handle_read_data()
4699 /* data_len is corrupt -- discard frame */ in handle_read_data()
4700 rdata->result = -EIO; in handle_read_data()
4702 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4704 dequeue_mid(mid, rdata->result); in handle_read_data()
4709 rdata->result = cifs_copy_folioq_to_iter(buffer, buffer_len, in handle_read_data()
4710 cur_off, &rdata->subreq.io_iter); in handle_read_data()
4711 if (rdata->result != 0) { in handle_read_data()
4713 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4715 dequeue_mid(mid, rdata->result); in handle_read_data()
4718 rdata->got_bytes = buffer_len; in handle_read_data()
4723 length = copy_to_iter(buf + data_offset, data_len, &rdata->subreq.io_iter); in handle_read_data()
4726 rdata->got_bytes = data_len; in handle_read_data()
4730 rdata->result = -EIO; in handle_read_data()
4732 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4734 dequeue_mid(mid, rdata->result); in handle_read_data()
4739 mid->mid_state = MID_RESPONSE_RECEIVED; in handle_read_data()
4762 iov_iter_folio_queue(&iter, ITER_DEST, dw->buffer, 0, 0, dw->len); in smb2_decrypt_offload()
4763 rc = decrypt_raw_data(dw->server, dw->buf, dw->server->vals->read_rsp_size, in smb2_decrypt_offload()
4770 dw->server->lstrp = jiffies; in smb2_decrypt_offload()
4771 mid = smb2_find_dequeue_mid(dw->server, dw->buf); in smb2_decrypt_offload()
4775 mid->decrypted = true; in smb2_decrypt_offload()
4776 rc = handle_read_data(dw->server, mid, dw->buf, in smb2_decrypt_offload()
4777 dw->server->vals->read_rsp_size, in smb2_decrypt_offload()
4778 dw->buffer, dw->len, in smb2_decrypt_offload()
4782 mid->when_received = jiffies; in smb2_decrypt_offload()
4784 if (dw->server->ops->is_network_name_deleted) in smb2_decrypt_offload()
4785 dw->server->ops->is_network_name_deleted(dw->buf, in smb2_decrypt_offload()
4786 dw->server); in smb2_decrypt_offload()
4788 mid->callback(mid); in smb2_decrypt_offload()
4790 spin_lock(&dw->server->srv_lock); in smb2_decrypt_offload()
4791 if (dw->server->tcpStatus == CifsNeedReconnect) { in smb2_decrypt_offload()
4792 spin_lock(&dw->server->mid_lock); in smb2_decrypt_offload()
4793 mid->mid_state = MID_RETRY_NEEDED; in smb2_decrypt_offload()
4794 spin_unlock(&dw->server->mid_lock); in smb2_decrypt_offload()
4795 spin_unlock(&dw->server->srv_lock); in smb2_decrypt_offload()
4796 mid->callback(mid); in smb2_decrypt_offload()
4798 spin_lock(&dw->server->mid_lock); in smb2_decrypt_offload()
4799 mid->mid_state = MID_REQUEST_SUBMITTED; in smb2_decrypt_offload()
4800 mid->mid_flags &= ~(MID_DELETED); in smb2_decrypt_offload()
4801 list_add_tail(&mid->qhead, in smb2_decrypt_offload()
4802 &dw->server->pending_mid_q); in smb2_decrypt_offload()
4803 spin_unlock(&dw->server->mid_lock); in smb2_decrypt_offload()
4804 spin_unlock(&dw->server->srv_lock); in smb2_decrypt_offload()
4811 cifs_clear_folioq_buffer(dw->buffer); in smb2_decrypt_offload()
4812 cifs_small_buf_release(dw->buf); in smb2_decrypt_offload()
4821 char *buf = server->smallbuf; in receive_encrypted_read()
4825 unsigned int buflen = server->pdu_size; in receive_encrypted_read()
4831 return -ENOMEM; in receive_encrypted_read()
4832 INIT_WORK(&dw->decrypt, smb2_decrypt_offload); in receive_encrypted_read()
4833 dw->server = server; in receive_encrypted_read()
4836 len = min_t(unsigned int, buflen, server->vals->read_rsp_size + in receive_encrypted_read()
4837 sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1; in receive_encrypted_read()
4839 rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len); in receive_encrypted_read()
4842 server->total_read += rc; in receive_encrypted_read()
4844 len = le32_to_cpu(tr_hdr->OriginalMessageSize) - in receive_encrypted_read()
4845 server->vals->read_rsp_size; in receive_encrypted_read()
4846 dw->len = len; in receive_encrypted_read()
4847 len = round_up(dw->len, PAGE_SIZE); in receive_encrypted_read()
4849 rc = -ENOMEM; in receive_encrypted_read()
4850 dw->buffer = cifs_alloc_folioq_buffer(len); in receive_encrypted_read()
4851 if (!dw->buffer) in receive_encrypted_read()
4854 iov_iter_folio_queue(&iter, ITER_DEST, dw->buffer, 0, 0, len); in receive_encrypted_read()
4857 rc = cifs_read_iter_from_socket(server, &iter, dw->len); in receive_encrypted_read()
4861 server->total_read += rc; in receive_encrypted_read()
4866 iov_iter_zero(len - rc, &tmp); in receive_encrypted_read()
4868 iov_iter_truncate(&iter, dw->len); in receive_encrypted_read()
4879 if ((server->min_offload) && (server->in_flight > 1) && in receive_encrypted_read()
4880 (server->pdu_size >= server->min_offload)) { in receive_encrypted_read()
4881 dw->buf = server->smallbuf; in receive_encrypted_read()
4882 server->smallbuf = (char *)cifs_small_buf_get(); in receive_encrypted_read()
4884 queue_work(decrypt_wq, &dw->decrypt); in receive_encrypted_read()
4886 return -1; in receive_encrypted_read()
4889 rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size, in receive_encrypted_read()
4899 (*mid)->decrypted = true; in receive_encrypted_read()
4901 server->vals->read_rsp_size, in receive_encrypted_read()
4902 dw->buffer, dw->len, false); in receive_encrypted_read()
4904 if (server->ops->is_network_name_deleted) { in receive_encrypted_read()
4905 server->ops->is_network_name_deleted(buf, in receive_encrypted_read()
4912 cifs_clear_folioq_buffer(dw->buffer); in receive_encrypted_read()
4927 char *buf = server->smallbuf; in receive_encrypted_standard()
4929 unsigned int pdu_length = server->pdu_size; in receive_encrypted_standard()
4940 server->large_buf = true; in receive_encrypted_standard()
4941 memcpy(server->bigbuf, buf, server->total_read); in receive_encrypted_standard()
4942 buf = server->bigbuf; in receive_encrypted_standard()
4946 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, in receive_encrypted_standard()
4947 pdu_length - HEADER_SIZE(server) + 1); in receive_encrypted_standard()
4950 server->total_read += length; in receive_encrypted_standard()
4952 buf_size = pdu_length - sizeof(struct smb2_transform_hdr); in receive_encrypted_standard()
4957 next_is_large = server->large_buf; in receive_encrypted_standard()
4960 next_cmd = le32_to_cpu(shdr->NextCommand); in receive_encrypted_standard()
4963 return -1; in receive_encrypted_standard()
4970 return -1; in receive_encrypted_standard()
4972 memcpy(next_buffer, buf + next_cmd, pdu_length - next_cmd); in receive_encrypted_standard()
4980 mid_entry->decrypted = true; in receive_encrypted_standard()
4981 mid_entry->resp_buf_size = server->pdu_size; in receive_encrypted_standard()
4986 return -1; in receive_encrypted_standard()
4991 if (mid_entry && mid_entry->handle) in receive_encrypted_standard()
4992 ret = mid_entry->handle(server, mid_entry); in receive_encrypted_standard()
4997 pdu_length -= next_cmd; in receive_encrypted_standard()
4998 server->large_buf = next_is_large; in receive_encrypted_standard()
5000 server->bigbuf = buf = next_buffer; in receive_encrypted_standard()
5002 server->smallbuf = buf = next_buffer; in receive_encrypted_standard()
5007 * server->smallbuf and server->bigbuf are still valid. We need in receive_encrypted_standard()
5024 char *buf = server->smallbuf; in smb3_receive_transform()
5025 unsigned int pdu_length = server->pdu_size; in smb3_receive_transform()
5027 unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize); in smb3_receive_transform()
5034 return -ECONNABORTED; in smb3_receive_transform()
5040 return -ECONNABORTED; in smb3_receive_transform()
5054 char *buf = server->large_buf ? server->bigbuf : server->smallbuf; in smb3_handle_read_data()
5056 return handle_read_data(server, mid, buf, server->pdu_size, in smb3_handle_read_data()
5066 if (hdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) { in smb2_next_header()
5067 *noff = le32_to_cpu(t_hdr->OriginalMessageSize); in smb2_next_header()
5069 return -EINVAL; in smb2_next_header()
5071 *noff = le32_to_cpu(hdr->NextCommand); in smb2_next_header()
5074 return -EINVAL; in smb2_next_header()
5079 struct dentry *dentry, struct cifs_tcon *tcon, in __cifs_sfu_make_node() argument
5083 struct TCP_Server_Info *server = tcon->ses->server; in __cifs_sfu_make_node()
5087 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in __cifs_sfu_make_node()
5100 __u32 oplock = server->oplocks ? REQ_OPLOCK : 0; in __cifs_sfu_make_node()
5124 &data_len, cifs_sb->local_nls, in __cifs_sfu_make_node()
5127 rc = -ENOMEM; in __cifs_sfu_make_node()
5130 data_len -= 2; /* symlink is without trailing wide-nul */ in __cifs_sfu_make_node()
5146 rc = -EPERM; in __cifs_sfu_make_node()
5150 oparms = CIFS_OPARMS(cifs_sb, tcon, full_path, GENERIC_WRITE, in __cifs_sfu_make_node()
5155 rc = server->ops->open(xid, &oparms, &oplock, &idata); in __cifs_sfu_make_node()
5165 rc = -EOPNOTSUPP; in __cifs_sfu_make_node()
5170 io_parms.pid = current->tgid; in __cifs_sfu_make_node()
5171 io_parms.tcon = tcon; in __cifs_sfu_make_node()
5178 rc = server->ops->sync_write(xid, &fid, &io_parms, in __cifs_sfu_make_node()
5180 iov, ARRAY_SIZE(iov)-1); in __cifs_sfu_make_node()
5184 server->ops->close(xid, tcon, &fid); in __cifs_sfu_make_node()
5193 server->ops->unlink(xid, tcon, full_path, cifs_sb, NULL); in __cifs_sfu_make_node()
5201 struct dentry *dentry, struct cifs_tcon *tcon, in cifs_sfu_make_node() argument
5207 rc = __cifs_sfu_make_node(xid, inode, dentry, tcon, in cifs_sfu_make_node()
5212 if (tcon->posix_extensions) { in cifs_sfu_make_node()
5214 inode->i_sb, xid); in cifs_sfu_make_node()
5215 } else if (tcon->unix_ext) { in cifs_sfu_make_node()
5217 inode->i_sb, xid); in cifs_sfu_make_node()
5220 inode->i_sb, xid, NULL); in cifs_sfu_make_node()
5228 struct dentry *dentry, struct cifs_tcon *tcon, in smb2_make_node() argument
5231 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in smb2_make_node()
5240 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { in smb2_make_node()
5241 rc = cifs_sfu_make_node(xid, inode, dentry, tcon, in smb2_make_node()
5244 rc = smb2_mknod_reparse(xid, inode, dentry, tcon, in smb2_make_node()