• Home
  • Raw
  • Download

Lines Matching +full:tcon +full:- +full:top

1 // SPDX-License-Identifier: GPL-2.0
37 server->credits += server->echo_credits + server->oplock_credits; in change_conf()
38 if (server->credits > server->max_credits) in change_conf()
39 server->credits = server->max_credits; in change_conf()
40 server->oplock_credits = server->echo_credits = 0; in change_conf()
41 switch (server->credits) { in change_conf()
45 server->echoes = false; in change_conf()
46 server->oplocks = false; in change_conf()
49 server->echoes = true; in change_conf()
50 server->oplocks = false; in change_conf()
51 server->echo_credits = 1; in change_conf()
54 server->echoes = true; in change_conf()
56 server->oplocks = true; in change_conf()
57 server->oplock_credits = 1; in change_conf()
59 server->oplocks = false; in change_conf()
61 server->echo_credits = 1; in change_conf()
63 server->credits -= server->echo_credits + server->oplock_credits; in change_conf()
64 return server->credits + server->echo_credits + server->oplock_credits; in change_conf()
71 int *val, rc = -1; in smb2_add_credits()
73 unsigned int add = credits->value; in smb2_add_credits()
74 unsigned int instance = credits->instance; in smb2_add_credits()
78 spin_lock(&server->req_lock); in smb2_add_credits()
79 val = server->ops->get_credits_field(server, optype); in smb2_add_credits()
85 if ((instance == 0) || (instance == server->reconnect_instance)) in smb2_add_credits()
93 trace_smb3_overflow_credits(server->CurrentMid, in smb2_add_credits()
94 server->conn_id, server->hostname, *val, in smb2_add_credits()
95 add, server->in_flight); in smb2_add_credits()
97 WARN_ON_ONCE(server->in_flight == 0); in smb2_add_credits()
98 server->in_flight--; in smb2_add_credits()
99 if (server->in_flight == 0 && in smb2_add_credits()
104 * Sometimes server returns 0 credits on oplock break ack - we need to in smb2_add_credits()
107 else if (server->in_flight > 0 && server->oplock_credits == 0 && in smb2_add_credits()
108 server->oplocks) { in smb2_add_credits()
109 if (server->credits > 1) { in smb2_add_credits()
110 server->credits--; in smb2_add_credits()
111 server->oplock_credits++; in smb2_add_credits()
113 } else if ((server->in_flight > 0) && (server->oplock_credits > 3) && in smb2_add_credits()
119 in_flight = server->in_flight; in smb2_add_credits()
120 spin_unlock(&server->req_lock); in smb2_add_credits()
121 wake_up(&server->request_q); in smb2_add_credits()
124 trace_smb3_reconnect_detected(server->CurrentMid, in smb2_add_credits()
125 server->conn_id, server->hostname, scredits, add, in_flight); in smb2_add_credits()
132 trace_smb3_reconnect_with_invalid_credits(server->CurrentMid, in smb2_add_credits()
133 server->conn_id, server->hostname, scredits, add, in_flight); in smb2_add_credits()
134 …cifs_dbg(FYI, "Negotiate operation when server credits is non-zero. Optype: %d, server credits: %d… in smb2_add_credits()
138 spin_lock(&server->srv_lock); in smb2_add_credits()
139 if (server->tcpStatus == CifsNeedReconnect in smb2_add_credits()
140 || server->tcpStatus == CifsExiting) { in smb2_add_credits()
141 spin_unlock(&server->srv_lock); in smb2_add_credits()
144 spin_unlock(&server->srv_lock); in smb2_add_credits()
147 case -1: in smb2_add_credits()
151 cifs_server_dbg(VFS, "Possible client or server bug - zero credits\n"); in smb2_add_credits()
164 trace_smb3_add_credits(server->CurrentMid, in smb2_add_credits()
165 server->conn_id, server->hostname, scredits, add, in_flight); in smb2_add_credits()
174 spin_lock(&server->req_lock); in smb2_set_credits()
175 server->credits = val; in smb2_set_credits()
177 server->reconnect_instance++; in smb2_set_credits()
180 * across SMB3 requests sent on any channel. See MS-SMB2 3.2.4.1 and 3.2.7.1 in smb2_set_credits()
183 server->primary_server->channel_sequence_num++; in smb2_set_credits()
185 server->channel_sequence_num++; in smb2_set_credits()
187 scredits = server->credits; in smb2_set_credits()
188 in_flight = server->in_flight; in smb2_set_credits()
189 spin_unlock(&server->req_lock); in smb2_set_credits()
191 trace_smb3_set_credits(server->CurrentMid, in smb2_set_credits()
192 server->conn_id, server->hostname, scredits, val, in_flight); in smb2_set_credits()
205 return &server->echo_credits; in smb2_get_credits_field()
207 return &server->oplock_credits; in smb2_get_credits_field()
209 return &server->credits; in smb2_get_credits_field()
216 return mid->credits_received; in smb2_get_credits()
226 spin_lock(&server->req_lock); in smb2_wait_mtu_credits()
228 spin_unlock(&server->req_lock); in smb2_wait_mtu_credits()
230 spin_lock(&server->srv_lock); in smb2_wait_mtu_credits()
231 if (server->tcpStatus == CifsExiting) { in smb2_wait_mtu_credits()
232 spin_unlock(&server->srv_lock); in smb2_wait_mtu_credits()
233 return -ENOENT; in smb2_wait_mtu_credits()
235 spin_unlock(&server->srv_lock); in smb2_wait_mtu_credits()
237 spin_lock(&server->req_lock); in smb2_wait_mtu_credits()
238 if (server->credits <= 0) { in smb2_wait_mtu_credits()
239 spin_unlock(&server->req_lock); in smb2_wait_mtu_credits()
241 rc = wait_event_killable(server->request_q, in smb2_wait_mtu_credits()
242 has_credits(server, &server->credits, 1)); in smb2_wait_mtu_credits()
246 spin_lock(&server->req_lock); in smb2_wait_mtu_credits()
248 scredits = server->credits; in smb2_wait_mtu_credits()
252 credits->value = 0; in smb2_wait_mtu_credits()
253 credits->instance = 0; in smb2_wait_mtu_credits()
258 scredits -= 8; in smb2_wait_mtu_credits()
262 credits->value = in smb2_wait_mtu_credits()
264 credits->instance = server->reconnect_instance; in smb2_wait_mtu_credits()
265 server->credits -= credits->value; in smb2_wait_mtu_credits()
266 server->in_flight++; in smb2_wait_mtu_credits()
267 if (server->in_flight > server->max_in_flight) in smb2_wait_mtu_credits()
268 server->max_in_flight = server->in_flight; in smb2_wait_mtu_credits()
272 scredits = server->credits; in smb2_wait_mtu_credits()
273 in_flight = server->in_flight; in smb2_wait_mtu_credits()
274 spin_unlock(&server->req_lock); in smb2_wait_mtu_credits()
276 trace_smb3_wait_credits(server->CurrentMid, in smb2_wait_mtu_credits()
277 server->conn_id, server->hostname, scredits, -(credits->value), in_flight); in smb2_wait_mtu_credits()
279 __func__, credits->value, scredits); in smb2_wait_mtu_credits()
292 if (!credits->value || credits->value == new_val) in smb2_adjust_credits()
295 if (credits->value < new_val) { in smb2_adjust_credits()
296 trace_smb3_too_many_credits(server->CurrentMid, in smb2_adjust_credits()
297 server->conn_id, server->hostname, 0, credits->value - new_val, 0); in smb2_adjust_credits()
299 credits->value, new_val); in smb2_adjust_credits()
301 return -EOPNOTSUPP; in smb2_adjust_credits()
304 spin_lock(&server->req_lock); in smb2_adjust_credits()
306 if (server->reconnect_instance != credits->instance) { in smb2_adjust_credits()
307 scredits = server->credits; in smb2_adjust_credits()
308 in_flight = server->in_flight; in smb2_adjust_credits()
309 spin_unlock(&server->req_lock); in smb2_adjust_credits()
311 trace_smb3_reconnect_detected(server->CurrentMid, in smb2_adjust_credits()
312 server->conn_id, server->hostname, scredits, in smb2_adjust_credits()
313 credits->value - new_val, in_flight); in smb2_adjust_credits()
315 credits->value - new_val); in smb2_adjust_credits()
316 return -EAGAIN; in smb2_adjust_credits()
319 server->credits += credits->value - new_val; in smb2_adjust_credits()
320 scredits = server->credits; in smb2_adjust_credits()
321 in_flight = server->in_flight; in smb2_adjust_credits()
322 spin_unlock(&server->req_lock); in smb2_adjust_credits()
323 wake_up(&server->request_q); in smb2_adjust_credits()
325 trace_smb3_adj_credits(server->CurrentMid, in smb2_adjust_credits()
326 server->conn_id, server->hostname, scredits, in smb2_adjust_credits()
327 credits->value - new_val, in_flight); in smb2_adjust_credits()
329 __func__, credits->value - new_val, scredits); in smb2_adjust_credits()
331 credits->value = new_val; in smb2_adjust_credits()
341 spin_lock(&server->mid_lock); in smb2_get_next_mid()
342 mid = server->CurrentMid++; in smb2_get_next_mid()
343 spin_unlock(&server->mid_lock); in smb2_get_next_mid()
350 spin_lock(&server->mid_lock); in smb2_revert_current_mid()
351 if (server->CurrentMid >= val) in smb2_revert_current_mid()
352 server->CurrentMid -= val; in smb2_revert_current_mid()
353 spin_unlock(&server->mid_lock); in smb2_revert_current_mid()
361 __u64 wire_mid = le64_to_cpu(shdr->MessageId); in __smb2_find_mid()
363 if (shdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) { in __smb2_find_mid()
368 spin_lock(&server->mid_lock); in __smb2_find_mid()
369 list_for_each_entry(mid, &server->pending_mid_q, qhead) { in __smb2_find_mid()
370 if ((mid->mid == wire_mid) && in __smb2_find_mid()
371 (mid->mid_state == MID_REQUEST_SUBMITTED) && in __smb2_find_mid()
372 (mid->command == shdr->Command)) { in __smb2_find_mid()
373 kref_get(&mid->refcount); in __smb2_find_mid()
375 list_del_init(&mid->qhead); in __smb2_find_mid()
376 mid->mid_flags |= MID_DELETED; in __smb2_find_mid()
378 spin_unlock(&server->mid_lock); in __smb2_find_mid()
382 spin_unlock(&server->mid_lock); in __smb2_find_mid()
405 shdr->Command, shdr->Status, shdr->Flags, shdr->MessageId, in smb2_dump_detail()
406 shdr->Id.SyncId.ProcessId); in smb2_dump_detail()
407 if (!server->ops->check_message(buf, server->total_read, server)) { in smb2_dump_detail()
409 server->ops->calc_smb_size(buf)); in smb2_dump_detail()
417 return server->max_read == 0; in smb2_need_neg()
427 spin_lock(&server->mid_lock); in smb2_negotiate()
428 server->CurrentMid = 0; in smb2_negotiate()
429 spin_unlock(&server->mid_lock); in smb2_negotiate()
446 smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb2_negotiate_wsize() argument
448 struct TCP_Server_Info *server = tcon->ses->server; in smb2_negotiate_wsize()
452 wsize = ctx->got_wsize ? ctx->vol_wsize : CIFS_DEFAULT_IOSIZE; in smb2_negotiate_wsize()
453 wsize = min_t(unsigned int, wsize, server->max_write); in smb2_negotiate_wsize()
454 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_negotiate_wsize()
461 smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb3_negotiate_wsize() argument
463 struct TCP_Server_Info *server = tcon->ses->server; in smb3_negotiate_wsize()
467 wsize = ctx->got_wsize ? ctx->vol_wsize : SMB3_DEFAULT_IOSIZE; in smb3_negotiate_wsize()
468 wsize = min_t(unsigned int, wsize, server->max_write); in smb3_negotiate_wsize()
470 if (server->rdma) { in smb3_negotiate_wsize()
471 if (server->sign) in smb3_negotiate_wsize()
478 server->smbd_conn->max_fragmented_send_size - in smb3_negotiate_wsize()
479 SMB2_READWRITE_PDU_HEADER_SIZE - in smb3_negotiate_wsize()
483 wsize, server->smbd_conn->max_readwrite_size); in smb3_negotiate_wsize()
486 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb3_negotiate_wsize()
493 smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb2_negotiate_rsize() argument
495 struct TCP_Server_Info *server = tcon->ses->server; in smb2_negotiate_rsize()
499 rsize = ctx->got_rsize ? ctx->vol_rsize : CIFS_DEFAULT_IOSIZE; in smb2_negotiate_rsize()
500 rsize = min_t(unsigned int, rsize, server->max_read); in smb2_negotiate_rsize()
502 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_negotiate_rsize()
509 smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx) in smb3_negotiate_rsize() argument
511 struct TCP_Server_Info *server = tcon->ses->server; in smb3_negotiate_rsize()
515 rsize = ctx->got_rsize ? ctx->vol_rsize : SMB3_DEFAULT_IOSIZE; in smb3_negotiate_rsize()
516 rsize = min_t(unsigned int, rsize, server->max_read); in smb3_negotiate_rsize()
518 if (server->rdma) { in smb3_negotiate_rsize()
519 if (server->sign) in smb3_negotiate_rsize()
526 server->smbd_conn->max_fragmented_recv_size - in smb3_negotiate_rsize()
527 SMB2_READWRITE_PDU_HEADER_SIZE - in smb3_negotiate_rsize()
531 rsize, server->smbd_conn->max_readwrite_size); in smb3_negotiate_rsize()
535 if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb3_negotiate_rsize()
545 * return -1 otherwise.
553 if (a->rdma_capable == b->rdma_capable) { in iface_cmp()
554 if (a->rss_capable == b->rss_capable) { in iface_cmp()
555 if (a->speed == b->speed) { in iface_cmp()
556 cmp_ret = cifs_ipaddr_cmp((struct sockaddr *) &a->sockaddr, in iface_cmp()
557 (struct sockaddr *) &b->sockaddr); in iface_cmp()
563 return -1; in iface_cmp()
564 } else if (a->speed > b->speed) in iface_cmp()
567 return -1; in iface_cmp()
568 } else if (a->rss_capable > b->rss_capable) in iface_cmp()
571 return -1; in iface_cmp()
572 } else if (a->rdma_capable > b->rdma_capable) in iface_cmp()
575 return -1; in iface_cmp()
597 spin_lock(&ses->iface_lock); in parse_server_interfaces()
599 if (ses->iface_last_update && in parse_server_interfaces()
600 time_before(jiffies, ses->iface_last_update + in parse_server_interfaces()
602 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
609 list_for_each_entry_safe(iface, niface, &ses->iface_list, in parse_server_interfaces()
611 iface->is_active = 0; in parse_server_interfaces()
613 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
621 if ((ses->chan_max > 1) && in_mount) in parse_server_interfaces()
625 ses->server->hostname); in parse_server_interfaces()
626 rc = -EOPNOTSUPP; in parse_server_interfaces()
627 ses->iface_last_update = jiffies; in parse_server_interfaces()
634 tmp_iface.speed = le64_to_cpu(p->LinkSpeed) ?: 1000000000; in parse_server_interfaces()
635 tmp_iface.rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE) ? 1 : 0; in parse_server_interfaces()
636 tmp_iface.rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE) ? 1 : 0; in parse_server_interfaces()
638 switch (p->Family) { in parse_server_interfaces()
646 p4 = (struct iface_info_ipv4 *)p->Buffer; in parse_server_interfaces()
647 addr4->sin_family = AF_INET; in parse_server_interfaces()
648 memcpy(&addr4->sin_addr, &p4->IPv4Address, 4); in parse_server_interfaces()
650 /* [MS-SMB2] 2.2.32.5.1.1 Clients MUST ignore these */ in parse_server_interfaces()
651 addr4->sin_port = cpu_to_be16(CIFS_PORT); in parse_server_interfaces()
654 &addr4->sin_addr); in parse_server_interfaces()
658 p6 = (struct iface_info_ipv6 *)p->Buffer; in parse_server_interfaces()
659 addr6->sin6_family = AF_INET6; in parse_server_interfaces()
660 memcpy(&addr6->sin6_addr, &p6->IPv6Address, 16); in parse_server_interfaces()
662 /* [MS-SMB2] 2.2.32.5.1.2 Clients MUST ignore these */ in parse_server_interfaces()
663 addr6->sin6_flowinfo = 0; in parse_server_interfaces()
664 addr6->sin6_scope_id = 0; in parse_server_interfaces()
665 addr6->sin6_port = cpu_to_be16(CIFS_PORT); in parse_server_interfaces()
668 &addr6->sin6_addr); in parse_server_interfaces()
683 spin_lock(&ses->iface_lock); in parse_server_interfaces()
684 list_for_each_entry_safe(iface, niface, &ses->iface_list, in parse_server_interfaces()
688 iface->is_active = 1; in parse_server_interfaces()
689 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
693 kref_get(&iface->refcount); in parse_server_interfaces()
697 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
703 rc = -ENOMEM; in parse_server_interfaces()
709 kref_init(&info->refcount); in parse_server_interfaces()
710 info->is_active = 1; in parse_server_interfaces()
712 cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, ses->iface_count); in parse_server_interfaces()
713 cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed); in parse_server_interfaces()
715 le32_to_cpu(p->Capability)); in parse_server_interfaces()
717 spin_lock(&ses->iface_lock); in parse_server_interfaces()
718 if (!list_entry_is_head(iface, &ses->iface_list, iface_head)) { in parse_server_interfaces()
719 list_add_tail(&info->iface_head, &iface->iface_head); in parse_server_interfaces()
720 kref_put(&iface->refcount, release_iface); in parse_server_interfaces()
722 list_add_tail(&info->iface_head, &ses->iface_list); in parse_server_interfaces()
724 ses->iface_count++; in parse_server_interfaces()
725 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
728 next = le32_to_cpu(p->Next); in parse_server_interfaces()
730 bytes_left -= sizeof(*p); in parse_server_interfaces()
734 bytes_left -= next; in parse_server_interfaces()
739 rc = -EINVAL; in parse_server_interfaces()
744 if ((bytes_left > 8) || p->Next) in parse_server_interfaces()
747 ses->iface_last_update = jiffies; in parse_server_interfaces()
753 spin_lock(&ses->iface_lock); in parse_server_interfaces()
754 list_for_each_entry_safe(iface, niface, &ses->iface_list, in parse_server_interfaces()
756 if (!iface->is_active) { in parse_server_interfaces()
757 list_del(&iface->iface_head); in parse_server_interfaces()
758 kref_put(&iface->refcount, release_iface); in parse_server_interfaces()
759 ses->iface_count--; in parse_server_interfaces()
762 spin_unlock(&ses->iface_lock); in parse_server_interfaces()
768 SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon, bool in_mount) in SMB3_request_interfaces() argument
773 struct cifs_ses *ses = tcon->ses; in SMB3_request_interfaces()
777 if (ses->iface_last_update && in SMB3_request_interfaces()
778 time_before(jiffies, ses->iface_last_update + in SMB3_request_interfaces()
782 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in SMB3_request_interfaces()
786 if (rc == -EOPNOTSUPP) { in SMB3_request_interfaces()
800 spin_lock(&ses->chan_lock); in SMB3_request_interfaces()
801 pserver = ses->chans[0].server; in SMB3_request_interfaces()
803 spin_unlock(&ses->chan_lock); in SMB3_request_interfaces()
805 spin_lock(&ses->chan_lock); in SMB3_request_interfaces()
807 spin_unlock(&ses->chan_lock); in SMB3_request_interfaces()
815 smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon, in smb3_qfs_tcon() argument
819 __le16 srch_path = 0; /* Null - open root of share */ in smb3_qfs_tcon()
826 .tcon = tcon, in smb3_qfs_tcon()
834 rc = open_cached_dir(xid, tcon, "", cifs_sb, false, &cfid); in smb3_qfs_tcon()
836 memcpy(&fid, &cfid->fid, sizeof(struct cifs_fid)); in smb3_qfs_tcon()
843 SMB3_request_interfaces(xid, tcon, true /* called during mount */); in smb3_qfs_tcon()
845 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
847 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
849 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
851 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_qfs_tcon()
854 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb3_qfs_tcon()
860 smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon, in smb2_qfs_tcon() argument
864 __le16 srch_path = 0; /* Null - open root of share */ in smb2_qfs_tcon()
870 .tcon = tcon, in smb2_qfs_tcon()
883 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb2_qfs_tcon()
885 SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb2_qfs_tcon()
887 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb2_qfs_tcon()
891 smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon, in smb2_is_path_accessible() argument
904 rc = open_cached_dir(xid, tcon, full_path, cifs_sb, true, &cfid); in smb2_is_path_accessible()
906 if (cfid->has_lease) { in smb2_is_path_accessible()
915 return -ENOMEM; in smb2_is_path_accessible()
918 .tcon = tcon, in smb2_is_path_accessible()
934 if (rc != -EREMOTE && hdr->Status == STATUS_OBJECT_NAME_INVALID) { in smb2_is_path_accessible()
935 rc2 = cifs_inval_name_dfs_link_error(xid, tcon, cifs_sb, in smb2_is_path_accessible()
942 rc = -EREMOTE; in smb2_is_path_accessible()
944 if (rc == -EREMOTE && IS_ENABLED(CONFIG_CIFS_DFS_UPCALL) && cifs_sb && in smb2_is_path_accessible()
945 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)) in smb2_is_path_accessible()
946 rc = -EOPNOTSUPP; in smb2_is_path_accessible()
950 rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb2_is_path_accessible()
958 static int smb2_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon, in smb2_get_srv_inum() argument
962 *uniqueid = le64_to_cpu(data->fi.IndexNumber); in smb2_get_srv_inum()
966 static int smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_file_info() argument
969 struct cifs_fid *fid = &cfile->fid; in smb2_query_file_info()
971 if (cfile->symlink_target) { in smb2_query_file_info()
972 data->symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL); in smb2_query_file_info()
973 if (!data->symlink_target) in smb2_query_file_info()
974 return -ENOMEM; in smb2_query_file_info()
976 return SMB2_query_info(xid, tcon, fid->persistent_fid, fid->volatile_fid, &data->fi); in smb2_query_file_info()
992 name_len = (size_t)src->ea_name_length; in move_smb2_ea_to_cifs()
993 value_len = (size_t)le16_to_cpu(src->ea_value_length); in move_smb2_ea_to_cifs()
1000 rc = -EIO; in move_smb2_ea_to_cifs()
1004 name = &src->ea_data[0]; in move_smb2_ea_to_cifs()
1005 value = &src->ea_data[src->ea_name_length + 1]; in move_smb2_ea_to_cifs()
1014 rc = -ERANGE; in move_smb2_ea_to_cifs()
1025 /* skip copy - calc size only */ in move_smb2_ea_to_cifs()
1028 dst_size -= user_name_len; in move_smb2_ea_to_cifs()
1031 memcpy(dst, src->ea_data, name_len); in move_smb2_ea_to_cifs()
1038 rc = -ERANGE; in move_smb2_ea_to_cifs()
1043 if (!src->next_entry_offset) in move_smb2_ea_to_cifs()
1046 if (src_size < le32_to_cpu(src->next_entry_offset)) { in move_smb2_ea_to_cifs()
1048 rc = -ERANGE; in move_smb2_ea_to_cifs()
1051 src_size -= le32_to_cpu(src->next_entry_offset); in move_smb2_ea_to_cifs()
1053 le32_to_cpu(src->next_entry_offset)); in move_smb2_ea_to_cifs()
1058 rc = -ENODATA; in move_smb2_ea_to_cifs()
1065 smb2_query_eas(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_eas() argument
1076 rc = smb2_query_info_compound(xid, tcon, path, in smb2_query_eas()
1080 CIFSMaxBufSize - in smb2_query_eas()
1081 MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_query_eas()
1090 if (!ea_name && rc == -ENODATA) in smb2_query_eas()
1096 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_query_eas()
1097 le32_to_cpu(rsp->OutputBufferLength), in smb2_query_eas()
1104 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in smb2_query_eas()
1106 le32_to_cpu(rsp->OutputBufferLength), ea_name); in smb2_query_eas()
1114 smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_ea() argument
1120 struct cifs_ses *ses = tcon->ses; in smb2_set_ea()
1145 if (smb3_encryption_required(tcon)) in smb2_set_ea()
1149 return -EINVAL; in smb2_set_ea()
1153 return -ENOMEM; in smb2_set_ea()
1159 rc = -ENOMEM; in smb2_set_ea()
1162 rqst = vars->rqst; in smb2_set_ea()
1163 rsp_iov = vars->rsp_iov; in smb2_set_ea()
1165 if (ses->server->ops->query_all_EAs) { in smb2_set_ea()
1167 rc = ses->server->ops->query_all_EAs(xid, tcon, path, in smb2_set_ea()
1170 if (rc == -ENODATA) in smb2_set_ea()
1178 rc = smb2_query_info_compound(xid, tcon, path, in smb2_set_ea()
1182 CIFSMaxBufSize - in smb2_set_ea()
1183 MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_set_ea()
1188 used_len = le32_to_cpu(rsp->OutputBufferLength); in smb2_set_ea()
1198 if (CIFSMaxBufSize - MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_set_ea()
1199 MAX_SMB2_CLOSE_RESPONSE_SIZE - 256 < in smb2_set_ea()
1201 rc = -ENOSPC; in smb2_set_ea()
1208 rqst[0].rq_iov = vars->open_iov; in smb2_set_ea()
1212 .tcon = tcon, in smb2_set_ea()
1221 rc = SMB2_open_init(tcon, server, in smb2_set_ea()
1225 smb2_set_next_command(tcon, &rqst[0]); in smb2_set_ea()
1229 rqst[1].rq_iov = vars->si_iov; in smb2_set_ea()
1235 rc = -ENOMEM; in smb2_set_ea()
1239 ea->ea_name_length = ea_name_len; in smb2_set_ea()
1240 ea->ea_value_length = cpu_to_le16(ea_value_len); in smb2_set_ea()
1241 memcpy(ea->ea_data, ea_name, ea_name_len + 1); in smb2_set_ea()
1242 memcpy(ea->ea_data + ea_name_len + 1, ea_value, ea_value_len); in smb2_set_ea()
1247 rc = SMB2_set_info_init(tcon, server, in smb2_set_ea()
1249 COMPOUND_FID, current->tgid, in smb2_set_ea()
1254 smb2_set_next_command(tcon, &rqst[1]); in smb2_set_ea()
1258 rqst[2].rq_iov = &vars->close_iov; in smb2_set_ea()
1260 rc = SMB2_close_init(tcon, server, in smb2_set_ea()
1290 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_set_ea()
1300 return server->echoes; in smb2_can_echo()
1304 smb2_clear_stats(struct cifs_tcon *tcon) in smb2_clear_stats() argument
1309 atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0); in smb2_clear_stats()
1310 atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0); in smb2_clear_stats()
1315 smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon) in smb2_dump_share_caps() argument
1318 if (tcon->capabilities & SMB2_SHARE_CAP_DFS) in smb2_dump_share_caps()
1320 if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY) in smb2_dump_share_caps()
1322 if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT) in smb2_dump_share_caps()
1324 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) in smb2_dump_share_caps()
1326 if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC) in smb2_dump_share_caps()
1328 if (tcon->capabilities == 0) in smb2_dump_share_caps()
1330 if (tcon->ss_flags & SSINFO_FLAGS_ALIGNED_DEVICE) in smb2_dump_share_caps()
1332 if (tcon->ss_flags & SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE) in smb2_dump_share_caps()
1334 if (tcon->ss_flags & SSINFO_FLAGS_NO_SEEK_PENALTY) in smb2_dump_share_caps()
1336 if (tcon->ss_flags & SSINFO_FLAGS_TRIM_ENABLED) in smb2_dump_share_caps()
1337 seq_puts(m, " TRIM-support,"); in smb2_dump_share_caps()
1339 seq_printf(m, "\tShare Flags: 0x%x", tcon->share_flags); in smb2_dump_share_caps()
1340 seq_printf(m, "\n\ttid: 0x%x", tcon->tid); in smb2_dump_share_caps()
1341 if (tcon->perf_sector_size) in smb2_dump_share_caps()
1343 tcon->perf_sector_size); in smb2_dump_share_caps()
1344 seq_printf(m, "\tMaximal Access: 0x%x", tcon->maximal_access); in smb2_dump_share_caps()
1348 smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon) in smb2_print_stats() argument
1350 atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent; in smb2_print_stats()
1351 atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed; in smb2_print_stats()
1355 * totals (requests sent) since those SMBs are per-session not per tcon in smb2_print_stats()
1358 (long long)(tcon->bytes_read), in smb2_print_stats()
1359 (long long)(tcon->bytes_written)); in smb2_print_stats()
1361 atomic_read(&tcon->num_local_opens), in smb2_print_stats()
1362 atomic_read(&tcon->num_remote_opens)); in smb2_print_stats()
1410 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); in smb2_set_fid()
1411 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; in smb2_set_fid()
1413 cfile->fid.persistent_fid = fid->persistent_fid; in smb2_set_fid()
1414 cfile->fid.volatile_fid = fid->volatile_fid; in smb2_set_fid()
1415 cfile->fid.access = fid->access; in smb2_set_fid()
1417 cfile->fid.mid = fid->mid; in smb2_set_fid()
1419 server->ops->set_oplock_level(cinode, oplock, fid->epoch, in smb2_set_fid()
1420 &fid->purge_cache); in smb2_set_fid()
1421 cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode); in smb2_set_fid()
1422 memcpy(cfile->fid.create_guid, fid->create_guid, 16); in smb2_set_fid()
1426 smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon, in smb2_close_file() argument
1429 return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_close_file()
1433 smb2_close_getattr(const unsigned int xid, struct cifs_tcon *tcon, in smb2_close_getattr() argument
1440 rc = __SMB2_close(xid, tcon, cfile->fid.persistent_fid, in smb2_close_getattr()
1441 cfile->fid.volatile_fid, &file_inf); in smb2_close_getattr()
1445 inode = d_inode(cfile->dentry); in smb2_close_getattr()
1447 spin_lock(&inode->i_lock); in smb2_close_getattr()
1448 CIFS_I(inode)->time = jiffies; in smb2_close_getattr()
1467 inode->i_blocks = in smb2_close_getattr()
1468 (512 - 1 + le64_to_cpu(file_inf.AllocationSize)) >> 9; in smb2_close_getattr()
1471 spin_unlock(&inode->i_lock); in smb2_close_getattr()
1476 SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_request_res_key() argument
1484 rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, in SMB2_request_res_key()
1488 if (rc == -EOPNOTSUPP) { in SMB2_request_res_key()
1489 pr_warn_once("Server share %s does not support copy range\n", tcon->tree_name); in SMB2_request_res_key()
1497 rc = -EINVAL; in SMB2_request_res_key()
1500 memcpy(pcchunk->SourceKey, res_key->ResumeKey, COPY_CHUNK_RES_KEY_SIZE); in SMB2_request_res_key()
1509 struct cifs_tcon *tcon, in smb2_ioctl_query_info() argument
1517 struct cifs_ses *ses = tcon->ses; in smb2_ioctl_query_info()
1545 return -ENOMEM; in smb2_ioctl_query_info()
1546 rqst = &vars->rqst[0]; in smb2_ioctl_query_info()
1547 rsp_iov = &vars->rsp_iov[0]; in smb2_ioctl_query_info()
1552 rc = -EFAULT; in smb2_ioctl_query_info()
1556 rc = -EINVAL; in smb2_ioctl_query_info()
1561 rc = -EIO; in smb2_ioctl_query_info()
1565 if (smb3_encryption_required(tcon)) in smb2_ioctl_query_info()
1577 rqst[0].rq_iov = &vars->open_iov[0]; in smb2_ioctl_query_info()
1581 .tcon = tcon, in smb2_ioctl_query_info()
1609 rc = SMB2_open_init(tcon, server, in smb2_ioctl_query_info()
1613 smb2_set_next_command(tcon, &rqst[0]); in smb2_ioctl_query_info()
1619 rc = -EPERM; in smb2_ioctl_query_info()
1622 rqst[1].rq_iov = &vars->io_iov[0]; in smb2_ioctl_query_info()
1625 rc = SMB2_ioctl_init(tcon, server, &rqst[1], COMPOUND_FID, COMPOUND_FID, in smb2_ioctl_query_info()
1627 CIFSMaxBufSize - MAX_SMB2_CREATE_RESPONSE_SIZE - in smb2_ioctl_query_info()
1633 rc = -EPERM; in smb2_ioctl_query_info()
1637 rc = -EINVAL; in smb2_ioctl_query_info()
1640 rqst[1].rq_iov = vars->si_iov; in smb2_ioctl_query_info()
1643 /* MS-FSCC 2.4.13 FileEndOfFileInformation */ in smb2_ioctl_query_info()
1647 rc = SMB2_set_info_init(tcon, server, &rqst[1], COMPOUND_FID, COMPOUND_FID, in smb2_ioctl_query_info()
1648 current->tgid, FILE_END_OF_FILE_INFORMATION, in smb2_ioctl_query_info()
1652 rqst[1].rq_iov = &vars->qi_iov; in smb2_ioctl_query_info()
1655 rc = SMB2_query_info_init(tcon, server, in smb2_ioctl_query_info()
1665 rc = -EINVAL; in smb2_ioctl_query_info()
1670 smb2_set_next_command(tcon, &rqst[1]); in smb2_ioctl_query_info()
1674 rqst[2].rq_iov = &vars->close_iov; in smb2_ioctl_query_info()
1677 rc = SMB2_close_init(tcon, server, in smb2_ioctl_query_info()
1699 if (le32_to_cpu(io_rsp->OutputCount) < qi.input_buffer_length) in smb2_ioctl_query_info()
1700 qi.input_buffer_length = le32_to_cpu(io_rsp->OutputCount); in smb2_ioctl_query_info()
1702 le32_to_cpu(io_rsp->OutputOffset) + qi.input_buffer_length in smb2_ioctl_query_info()
1704 rc = -EFAULT; in smb2_ioctl_query_info()
1708 if (copy_to_user(&pqi->input_buffer_length, in smb2_ioctl_query_info()
1711 rc = -EFAULT; in smb2_ioctl_query_info()
1716 (const void *)io_rsp + le32_to_cpu(io_rsp->OutputOffset), in smb2_ioctl_query_info()
1718 rc = -EFAULT; in smb2_ioctl_query_info()
1722 if (le32_to_cpu(qi_rsp->OutputBufferLength) < qi.input_buffer_length) in smb2_ioctl_query_info()
1723 qi.input_buffer_length = le32_to_cpu(qi_rsp->OutputBufferLength); in smb2_ioctl_query_info()
1724 if (copy_to_user(&pqi->input_buffer_length, in smb2_ioctl_query_info()
1727 rc = -EFAULT; in smb2_ioctl_query_info()
1731 if (copy_to_user(pqi + 1, qi_rsp->Buffer, in smb2_ioctl_query_info()
1733 rc = -EFAULT; in smb2_ioctl_query_info()
1751 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_ioctl_query_info()
1767 struct cifs_tcon *tcon; in smb2_copychunk_range() local
1774 return -ENOMEM; in smb2_copychunk_range()
1778 rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink), in smb2_copychunk_range()
1779 srcfile->fid.persistent_fid, in smb2_copychunk_range()
1780 srcfile->fid.volatile_fid, pcchunk); in smb2_copychunk_range()
1787 pcchunk->ChunkCount = cpu_to_le32(1); in smb2_copychunk_range()
1788 pcchunk->Reserved = 0; in smb2_copychunk_range()
1789 pcchunk->Reserved2 = 0; in smb2_copychunk_range()
1791 tcon = tlink_tcon(trgtfile->tlink); in smb2_copychunk_range()
1794 pcchunk->SourceOffset = cpu_to_le64(src_off); in smb2_copychunk_range()
1795 pcchunk->TargetOffset = cpu_to_le64(dest_off); in smb2_copychunk_range()
1796 pcchunk->Length = in smb2_copychunk_range()
1797 cpu_to_le32(min_t(u64, len, tcon->max_bytes_chunk)); in smb2_copychunk_range()
1802 rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid, in smb2_copychunk_range()
1803 trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE, in smb2_copychunk_range()
1810 rc = -EIO; in smb2_copychunk_range()
1813 if (retbuf->TotalBytesWritten == 0) { in smb2_copychunk_range()
1815 rc = -EIO; in smb2_copychunk_range()
1821 if (le32_to_cpu(retbuf->TotalBytesWritten) > in smb2_copychunk_range()
1822 le32_to_cpu(pcchunk->Length)) { in smb2_copychunk_range()
1824 rc = -EIO; in smb2_copychunk_range()
1827 if (le32_to_cpu(retbuf->ChunksWritten) != 1) { in smb2_copychunk_range()
1829 rc = -EIO; in smb2_copychunk_range()
1834 bytes_written = le32_to_cpu(retbuf->TotalBytesWritten); in smb2_copychunk_range()
1837 len -= bytes_written; in smb2_copychunk_range()
1841 le32_to_cpu(retbuf->ChunksWritten), in smb2_copychunk_range()
1842 le32_to_cpu(retbuf->ChunkBytesWritten), in smb2_copychunk_range()
1844 } else if (rc == -EINVAL) { in smb2_copychunk_range()
1849 le32_to_cpu(retbuf->ChunksWritten), in smb2_copychunk_range()
1850 le32_to_cpu(retbuf->ChunkBytesWritten), in smb2_copychunk_range()
1851 le32_to_cpu(retbuf->TotalBytesWritten)); in smb2_copychunk_range()
1864 if (le32_to_cpu(retbuf->ChunkBytesWritten) < in smb2_copychunk_range()
1865 tcon->max_bytes_chunk) in smb2_copychunk_range()
1866 tcon->max_bytes_chunk = in smb2_copychunk_range()
1867 le32_to_cpu(retbuf->ChunkBytesWritten); in smb2_copychunk_range()
1887 smb2_flush_file(const unsigned int xid, struct cifs_tcon *tcon, in smb2_flush_file() argument
1890 return SMB2_flush(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_flush_file()
1898 return rsp->DataOffset; in smb2_read_data_offset()
1907 return le32_to_cpu(rsp->DataRemaining); in smb2_read_data_length()
1909 return le32_to_cpu(rsp->DataLength); in smb2_read_data_length()
1918 parms->persistent_fid = pfid->persistent_fid; in smb2_sync_read()
1919 parms->volatile_fid = pfid->volatile_fid; in smb2_sync_read()
1929 parms->persistent_fid = pfid->persistent_fid; in smb2_sync_write()
1930 parms->volatile_fid = pfid->volatile_fid; in smb2_sync_write()
1935 static bool smb2_set_sparse(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_sparse() argument
1944 if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && setsparse) in smb2_set_sparse()
1947 if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && !setsparse) in smb2_set_sparse()
1960 if (tcon->broken_sparse_sup) in smb2_set_sparse()
1963 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb2_set_sparse()
1964 cfile->fid.volatile_fid, FSCTL_SET_SPARSE, in smb2_set_sparse()
1967 tcon->broken_sparse_sup = true; in smb2_set_sparse()
1973 cifsi->cifsAttrs |= FILE_ATTRIBUTE_SPARSE_FILE; in smb2_set_sparse()
1975 cifsi->cifsAttrs &= (~FILE_ATTRIBUTE_SPARSE_FILE); in smb2_set_sparse()
1981 smb2_set_file_size(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_file_size() argument
1990 inode = d_inode(cfile->dentry); in smb2_set_file_size()
1992 if (!set_alloc && (size > inode->i_size + 8192)) { in smb2_set_file_size()
1996 smb2_set_sparse(xid, tcon, cfile, inode, set_sparse); in smb2_set_file_size()
1999 return SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb2_set_file_size()
2000 cfile->fid.volatile_fid, cfile->pid, size); in smb2_set_file_size()
2013 struct cifs_tcon *tcon = tlink_tcon(trgtfile->tlink); in smb2_duplicate_extents() local
2016 if ((le32_to_cpu(tcon->fsAttrInfo.Attributes) & in smb2_duplicate_extents()
2018 return -EOPNOTSUPP; in smb2_duplicate_extents()
2020 dup_ext_buf.VolatileFileHandle = srcfile->fid.volatile_fid; in smb2_duplicate_extents()
2021 dup_ext_buf.PersistentFileHandle = srcfile->fid.persistent_fid; in smb2_duplicate_extents()
2028 inode = d_inode(trgtfile->dentry); in smb2_duplicate_extents()
2029 if (inode->i_size < dest_off + len) { in smb2_duplicate_extents()
2030 rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false); in smb2_duplicate_extents()
2043 rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid, in smb2_duplicate_extents()
2044 trgtfile->fid.volatile_fid, in smb2_duplicate_extents()
2052 cifs_dbg(FYI, "Non-zero response length in duplicate extents\n"); in smb2_duplicate_extents()
2059 smb2_set_compression(const unsigned int xid, struct cifs_tcon *tcon, in smb2_set_compression() argument
2062 return SMB2_set_compression(xid, tcon, cfile->fid.persistent_fid, in smb2_set_compression()
2063 cfile->fid.volatile_fid); in smb2_set_compression()
2067 smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon, in smb3_set_integrity() argument
2077 return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_set_integrity()
2078 cfile->fid.volatile_fid, in smb3_set_integrity()
2087 /* GMT Token is @GMT-YYYY.MM.DD-HH.MM.SS Unicode which is 48 bytes + null */
2090 #define MIN_SNAPSHOT_ARRAY_SIZE 16 /* See MS-SMB2 section 3.3.5.15.1 */
2094 * For output see struct SRV_SNAPSHOT_ARRAY in MS-SMB2 section 2.2.32.2
2097 smb3_enum_snapshots(const unsigned int xid, struct cifs_tcon *tcon, in smb3_enum_snapshots() argument
2115 return -EFAULT; in smb3_enum_snapshots()
2129 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_enum_snapshots()
2130 cfile->fid.volatile_fid, in smb3_enum_snapshots()
2144 rc = -EFAULT; in smb3_enum_snapshots()
2171 rc = -EFAULT; in smb3_enum_snapshots()
2186 struct dentry *dentry = pfile->f_path.dentry; in smb3_notify()
2188 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in smb3_notify()
2191 struct cifs_tcon *tcon; in smb3_notify() local
2208 rc = -ENOMEM; in smb3_notify()
2214 rc = -EFAULT; in smb3_notify()
2219 rc = -EFAULT; in smb3_notify()
2225 tcon = cifs_sb_master_tcon(cifs_sb); in smb3_notify()
2227 .tcon = tcon, in smb3_notify()
2240 rc = SMB2_change_notify(xid, tcon, fid.persistent_fid, fid.volatile_fid, in smb3_notify()
2244 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb3_notify()
2251 if (copy_to_user(pnotify_buf->notify_data, returned_ioctl_info, ret_len)) in smb3_notify()
2252 rc = -EFAULT; in smb3_notify()
2253 else if (copy_to_user(&pnotify_buf->data_len, &ret_len, sizeof(ret_len))) in smb3_notify()
2254 rc = -EFAULT; in smb3_notify()
2264 smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_dir_first() argument
2287 server = cifs_pick_channel(tcon->ses); in smb2_query_dir_first()
2291 return -ENOMEM; in smb2_query_dir_first()
2293 if (smb3_encryption_required(tcon)) in smb2_query_dir_first()
2306 .tcon = tcon, in smb2_query_dir_first()
2315 rc = SMB2_open_init(tcon, server, in smb2_query_dir_first()
2319 smb2_set_next_command(tcon, &rqst[0]); in smb2_query_dir_first()
2322 srch_inf->entries_in_buffer = 0; in smb2_query_dir_first()
2323 srch_inf->index_of_last_entry = 2; in smb2_query_dir_first()
2329 rc = SMB2_query_directory_init(xid, tcon, server, in smb2_query_dir_first()
2332 0, srch_inf->info_level); in smb2_query_dir_first()
2343 rc = compound_send_recv(xid, tcon->ses, server, in smb2_query_dir_first()
2349 if (op_rsp == NULL || op_rsp->hdr.Status != STATUS_SUCCESS) { in smb2_query_dir_first()
2353 fid->persistent_fid = op_rsp->PersistentFileId; in smb2_query_dir_first()
2354 fid->volatile_fid = op_rsp->VolatileFileId; in smb2_query_dir_first()
2357 if (rc && rc != -ENODATA) { in smb2_query_dir_first()
2358 SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_query_dir_first()
2360 trace_smb3_query_dir_err(xid, fid->persistent_fid, in smb2_query_dir_first()
2361 tcon->tid, tcon->ses->Suid, 0, 0, rc); in smb2_query_dir_first()
2365 atomic_inc(&tcon->num_remote_opens); in smb2_query_dir_first()
2368 if (qd_rsp->hdr.Status == STATUS_NO_MORE_FILES) { in smb2_query_dir_first()
2369 trace_smb3_query_dir_done(xid, fid->persistent_fid, in smb2_query_dir_first()
2370 tcon->tid, tcon->ses->Suid, 0, 0); in smb2_query_dir_first()
2371 srch_inf->endOfSearch = true; in smb2_query_dir_first()
2376 rc = smb2_parse_query_directory(tcon, &rsp_iov[1], resp_buftype[1], in smb2_query_dir_first()
2379 trace_smb3_query_dir_err(xid, fid->persistent_fid, tcon->tid, in smb2_query_dir_first()
2380 tcon->ses->Suid, 0, 0, rc); in smb2_query_dir_first()
2385 trace_smb3_query_dir_done(xid, fid->persistent_fid, tcon->tid, in smb2_query_dir_first()
2386 tcon->ses->Suid, 0, srch_inf->entries_in_buffer); in smb2_query_dir_first()
2396 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_query_dir_first()
2403 smb2_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_dir_next() argument
2407 return SMB2_query_directory(xid, tcon, fid->persistent_fid, in smb2_query_dir_next()
2408 fid->volatile_fid, 0, srch_inf); in smb2_query_dir_next()
2412 smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon, in smb2_close_dir() argument
2415 return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid); in smb2_close_dir()
2419 * If we negotiate SMB2 protocol and get STATUS_PENDING - update
2420 * the number of credits and return true. Otherwise - return false.
2428 if (shdr->Status != STATUS_PENDING) in smb2_is_status_pending()
2431 if (shdr->CreditRequest) { in smb2_is_status_pending()
2432 spin_lock(&server->req_lock); in smb2_is_status_pending()
2433 server->credits += le16_to_cpu(shdr->CreditRequest); in smb2_is_status_pending()
2434 scredits = server->credits; in smb2_is_status_pending()
2435 in_flight = server->in_flight; in smb2_is_status_pending()
2436 spin_unlock(&server->req_lock); in smb2_is_status_pending()
2437 wake_up(&server->request_q); in smb2_is_status_pending()
2439 trace_smb3_pend_credits(server->CurrentMid, in smb2_is_status_pending()
2440 server->conn_id, server->hostname, scredits, in smb2_is_status_pending()
2441 le16_to_cpu(shdr->CreditRequest), in_flight); in smb2_is_status_pending()
2443 __func__, le16_to_cpu(shdr->CreditRequest), scredits); in smb2_is_status_pending()
2454 if (shdr->Status != STATUS_NETWORK_SESSION_EXPIRED && in smb2_is_session_expired()
2455 shdr->Status != STATUS_USER_SESSION_DELETED) in smb2_is_session_expired()
2458 trace_smb3_ses_expired(le32_to_cpu(shdr->Id.SyncId.TreeId), in smb2_is_session_expired()
2459 le64_to_cpu(shdr->SessionId), in smb2_is_session_expired()
2460 le16_to_cpu(shdr->Command), in smb2_is_session_expired()
2461 le64_to_cpu(shdr->MessageId)); in smb2_is_session_expired()
2472 if (shdr->Status == STATUS_IO_TIMEOUT) in smb2_is_status_io_timeout()
2484 struct cifs_tcon *tcon; in smb2_is_network_name_deleted() local
2486 if (shdr->Status != STATUS_NETWORK_NAME_DELETED) in smb2_is_network_name_deleted()
2490 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_is_network_name_deleted()
2493 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_is_network_name_deleted()
2496 list_for_each_entry(tcon, &ses->tcon_list, tcon_list) { in smb2_is_network_name_deleted()
2497 if (tcon->tid == le32_to_cpu(shdr->Id.SyncId.TreeId)) { in smb2_is_network_name_deleted()
2498 spin_lock(&tcon->tc_lock); in smb2_is_network_name_deleted()
2499 tcon->need_reconnect = true; in smb2_is_network_name_deleted()
2500 spin_unlock(&tcon->tc_lock); in smb2_is_network_name_deleted()
2503 tcon->tree_name); in smb2_is_network_name_deleted()
2514 smb2_oplock_response(struct cifs_tcon *tcon, __u64 persistent_fid, in smb2_oplock_response() argument
2517 if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING) in smb2_oplock_response()
2518 return SMB2_lease_break(0, tcon, cinode->lease_key, in smb2_oplock_response()
2521 return SMB2_oplock_break(0, tcon, persistent_fid, volatile_fid, in smb2_oplock_response()
2530 if (server->dialect < SMB30_PROT_ID) in smb2_set_replay()
2533 shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base); in smb2_set_replay()
2538 shdr->Flags |= SMB2_FLAGS_REPLAY_OPERATION; in smb2_set_replay()
2546 shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base); in smb2_set_related()
2551 shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; in smb2_set_related()
2557 smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst) in smb2_set_next_command() argument
2560 struct cifs_ses *ses = tcon->ses; in smb2_set_next_command()
2561 struct TCP_Server_Info *server = ses->server; in smb2_set_next_command()
2565 shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base); in smb2_set_next_command()
2577 num_padding = 8 - (len & 7); in smb2_set_next_command()
2578 if (!smb3_encryption_required(tcon)) { in smb2_set_next_command()
2583 rqst->rq_iov[rqst->rq_nvec].iov_base = smb2_padding; in smb2_set_next_command()
2584 rqst->rq_iov[rqst->rq_nvec].iov_len = num_padding; in smb2_set_next_command()
2585 rqst->rq_nvec++; in smb2_set_next_command()
2595 for (i = 1; i < rqst->rq_nvec; i++) { in smb2_set_next_command()
2596 memcpy(rqst->rq_iov[0].iov_base + in smb2_set_next_command()
2597 rqst->rq_iov[0].iov_len, in smb2_set_next_command()
2598 rqst->rq_iov[i].iov_base, in smb2_set_next_command()
2599 rqst->rq_iov[i].iov_len); in smb2_set_next_command()
2600 rqst->rq_iov[0].iov_len += rqst->rq_iov[i].iov_len; in smb2_set_next_command()
2602 memset(rqst->rq_iov[0].iov_base + rqst->rq_iov[0].iov_len, in smb2_set_next_command()
2604 rqst->rq_iov[0].iov_len += num_padding; in smb2_set_next_command()
2606 rqst->rq_nvec = 1; in smb2_set_next_command()
2610 shdr->NextCommand = cpu_to_le32(len); in smb2_set_next_command()
2616 bool smb2_should_replay(struct cifs_tcon *tcon, in smb2_should_replay() argument
2623 if (tcon->retry || (*pretries)++ < tcon->ses->server->retrans) { in smb2_should_replay()
2639 smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon, in smb2_query_info_compound() argument
2646 struct cifs_ses *ses = tcon->ses; in smb2_query_info_compound()
2670 return -ENOMEM; in smb2_query_info_compound()
2672 if (smb3_encryption_required(tcon)) in smb2_query_info_compound()
2678 rc = -ENOMEM; in smb2_query_info_compound()
2681 rqst = vars->rqst; in smb2_query_info_compound()
2682 rsp_iov = vars->rsp_iov; in smb2_query_info_compound()
2688 open_cached_dir(xid, tcon, path, cifs_sb, false, in smb2_query_info_compound()
2691 rqst[0].rq_iov = vars->open_iov; in smb2_query_info_compound()
2695 .tcon = tcon, in smb2_query_info_compound()
2704 rc = SMB2_open_init(tcon, server, in smb2_query_info_compound()
2708 smb2_set_next_command(tcon, &rqst[0]); in smb2_query_info_compound()
2710 rqst[1].rq_iov = &vars->qi_iov; in smb2_query_info_compound()
2714 rc = SMB2_query_info_init(tcon, server, in smb2_query_info_compound()
2716 cfid->fid.persistent_fid, in smb2_query_info_compound()
2717 cfid->fid.volatile_fid, in smb2_query_info_compound()
2722 rc = SMB2_query_info_init(tcon, server, in smb2_query_info_compound()
2733 smb2_set_next_command(tcon, &rqst[1]); in smb2_query_info_compound()
2737 rqst[2].rq_iov = &vars->close_iov; in smb2_query_info_compound()
2740 rc = SMB2_close_init(tcon, server, in smb2_query_info_compound()
2765 if (rc == -EREMCHG) { in smb2_query_info_compound()
2766 tcon->need_reconnect = true; in smb2_query_info_compound()
2768 tcon->tree_name); in smb2_query_info_compound()
2788 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_query_info_compound()
2795 smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon, in smb2_queryfs() argument
2805 rc = smb2_query_info_compound(xid, tcon, path, in smb2_queryfs()
2815 buf->f_type = SMB2_SUPER_MAGIC; in smb2_queryfs()
2817 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in smb2_queryfs()
2818 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_queryfs()
2819 le32_to_cpu(rsp->OutputBufferLength), in smb2_queryfs()
2826 trace_smb3_qfs_done(xid, tcon->tid, tcon->ses->Suid, tcon->tree_name, rc); in smb2_queryfs()
2832 smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon, in smb311_queryfs() argument
2841 if (!tcon->posix_extensions) in smb311_queryfs()
2842 return smb2_queryfs(xid, tcon, path, cifs_sb, buf); in smb311_queryfs()
2845 .tcon = tcon, in smb311_queryfs()
2855 return -ENOMEM; in smb311_queryfs()
2863 rc = SMB311_posix_qfs_info(xid, tcon, fid.persistent_fid, in smb311_queryfs()
2865 buf->f_type = SMB2_SUPER_MAGIC; in smb311_queryfs()
2866 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in smb311_queryfs()
2873 return ob1->fid.persistent_fid == ob2->fid.persistent_fid && in smb2_compare_fids()
2874 ob1->fid.volatile_fid == ob2->fid.volatile_fid; in smb2_compare_fids()
2883 return SMB2_lock(xid, tlink_tcon(cfile->tlink), in smb2_mand_lock()
2884 cfile->fid.persistent_fid, cfile->fid.volatile_fid, in smb2_mand_lock()
2885 current->tgid, length, offset, type, wait); in smb2_mand_lock()
2891 memcpy(fid->lease_key, CIFS_I(inode)->lease_key, SMB2_LEASE_KEY_SIZE); in smb2_get_lease_key()
2897 memcpy(CIFS_I(inode)->lease_key, fid->lease_key, SMB2_LEASE_KEY_SIZE); in smb2_set_lease_key()
2903 generate_random_uuid(fid->lease_key); in smb2_new_lease_key()
2916 struct cifs_tcon *tcon; in smb2_get_dfs_refer() local
2925 * Try to use the IPC tcon, otherwise just use any in smb2_get_dfs_refer()
2927 tcon = ses->tcon_ipc; in smb2_get_dfs_refer()
2928 if (tcon == NULL) { in smb2_get_dfs_refer()
2930 tcon = list_first_entry_or_null(&ses->tcon_list, in smb2_get_dfs_refer()
2933 if (tcon) { in smb2_get_dfs_refer()
2934 tcon->tc_count++; in smb2_get_dfs_refer()
2935 trace_smb3_tcon_ref(tcon->debug_id, tcon->tc_count, in smb2_get_dfs_refer()
2941 if (tcon == NULL) { in smb2_get_dfs_refer()
2942 cifs_dbg(VFS, "session %p has no tcon available for a dfs referral request\n", in smb2_get_dfs_refer()
2944 rc = -ENOTCONN; in smb2_get_dfs_refer()
2952 rc = -ENOMEM; in smb2_get_dfs_refer()
2959 rc = -ENOMEM; in smb2_get_dfs_refer()
2964 dfs_req->MaxReferralLevel = DFS_VERSION; in smb2_get_dfs_refer()
2966 /* Path to resolve in an UTF-16 null-terminated string */ in smb2_get_dfs_refer()
2967 memcpy(dfs_req->RequestFileName, utf16_path, utf16_path_len); in smb2_get_dfs_refer()
2970 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in smb2_get_dfs_refer()
2980 rc = -EIO; in smb2_get_dfs_refer()
2982 if (!is_retryable_error(rc) && rc != -ENOENT && rc != -EOPNOTSUPP) in smb2_get_dfs_refer()
2997 if (tcon && !tcon->ipc) { in smb2_get_dfs_refer()
3000 tcon->tc_count--; in smb2_get_dfs_refer()
3001 trace_smb3_tcon_ref(tcon->debug_id, tcon->tc_count, in smb2_get_dfs_refer()
3004 WARN_ON(tcon->tc_count < 0); in smb2_get_dfs_refer()
3019 int rc = -EOPNOTSUPP; in get_smb2_acl_by_fid()
3028 rc = SMB2_query_acl(xid, tlink_tcon(tlink), cifsfid->persistent_fid, in get_smb2_acl_by_fid()
3029 cifsfid->volatile_fid, (void **)&pntsd, pacllen, in get_smb2_acl_by_fid()
3050 struct cifs_tcon *tcon; in get_smb2_acl_by_path() local
3060 tcon = tlink_tcon(tlink); in get_smb2_acl_by_path()
3065 rc = -ENOMEM; in get_smb2_acl_by_path()
3071 .tcon = tcon, in get_smb2_acl_by_path()
3096 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in get_smb2_acl_by_path()
3115 struct cifs_tcon *tcon; in set_smb2_acl() local
3116 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in set_smb2_acl()
3126 tcon = tlink_tcon(tlink); in set_smb2_acl()
3138 rc = -ENOMEM; in set_smb2_acl()
3144 .tcon = tcon, in set_smb2_acl()
3158 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); in set_smb2_acl()
3180 pntsd = get_smb2_acl_by_fid(cifs_sb, &open_file->fid, pacllen, info); in get_smb2_acl()
3185 static long smb3_zero_data(struct file *file, struct cifs_tcon *tcon, in smb3_zero_data() argument
3188 struct cifsFileInfo *cfile = file->private_data; in smb3_zero_data()
3196 return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_zero_data()
3197 cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, in smb3_zero_data()
3203 static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, in smb3_zero_range() argument
3207 struct cifs_ses *ses = tcon->ses; in smb3_zero_range()
3210 struct cifsFileInfo *cfile = file->private_data; in smb3_zero_range()
3218 trace_smb3_zero_enter(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_zero_range()
3219 ses->Suid, offset, len); in smb3_zero_range()
3222 filemap_invalidate_lock(inode->i_mapping); in smb3_zero_range()
3225 remote_size = ictx->remote_i_size; in smb3_zero_range()
3227 unsigned long long top = umin(offset + len, i_size); in smb3_zero_range() local
3229 rc = filemap_write_and_wait_range(inode->i_mapping, offset, top - 1); in smb3_zero_range()
3238 truncate_pagecache_range(inode, offset, offset + len - 1); in smb3_zero_range()
3241 rc = -EOPNOTSUPP; in smb3_zero_range()
3245 rc = smb3_zero_data(file, tcon, offset, len, xid); in smb3_zero_range()
3254 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_zero_range()
3255 cfile->fid.volatile_fid, cfile->pid, new_size); in smb3_zero_range()
3263 filemap_invalidate_unlock(inode->i_mapping); in smb3_zero_range()
3267 trace_smb3_zero_err(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_zero_range()
3268 ses->Suid, offset, len, rc); in smb3_zero_range()
3270 trace_smb3_zero_done(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_zero_range()
3271 ses->Suid, offset, len); in smb3_zero_range()
3275 static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, in smb3_punch_hole() argument
3279 struct cifsFileInfo *cfile = file->private_data; in smb3_punch_hole()
3291 if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse)) { in smb3_punch_hole()
3292 rc = -EOPNOTSUPP; in smb3_punch_hole()
3296 filemap_invalidate_lock(inode->i_mapping); in smb3_punch_hole()
3301 truncate_pagecache_range(inode, offset, offset + len - 1); in smb3_punch_hole()
3308 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_punch_hole()
3309 cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA, in smb3_punch_hole()
3320 * that we locally hole-punch the tail of the dirty data, the proposed in smb3_punch_hole()
3324 remote_i_size = netfs_inode(inode)->remote_i_size; in smb3_punch_hole()
3327 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_punch_hole()
3328 cfile->fid.volatile_fid, cfile->pid, extend_to); in smb3_punch_hole()
3330 netfs_inode(inode)->remote_i_size = extend_to; in smb3_punch_hole()
3334 filemap_invalidate_unlock(inode->i_mapping); in smb3_punch_hole()
3342 struct cifs_tcon *tcon, in smb3_simple_fallocate_write_range() argument
3352 io_parms.netfid = cfile->fid.netfid; in smb3_simple_fallocate_write_range()
3353 io_parms.pid = current->tgid; in smb3_simple_fallocate_write_range()
3354 io_parms.tcon = tcon; in smb3_simple_fallocate_write_range()
3355 io_parms.persistent_fid = cfile->fid.persistent_fid; in smb3_simple_fallocate_write_range()
3356 io_parms.volatile_fid = cfile->fid.volatile_fid; in smb3_simple_fallocate_write_range()
3370 return -EINVAL; in smb3_simple_fallocate_write_range()
3373 len -= nbytes; in smb3_simple_fallocate_write_range()
3379 struct cifs_tcon *tcon, in smb3_simple_fallocate_range() argument
3391 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_simple_fallocate_range()
3392 cfile->fid.volatile_fid, in smb3_simple_fallocate_range()
3402 rc = -ENOMEM; in smb3_simple_fallocate_range()
3412 rc = smb3_simple_fallocate_write_range(xid, tcon, in smb3_simple_fallocate_range()
3418 rc = -EINVAL; in smb3_simple_fallocate_range()
3422 if (off < le64_to_cpu(tmp_data->file_offset)) { in smb3_simple_fallocate_range()
3428 l = le64_to_cpu(tmp_data->file_offset) - off; in smb3_simple_fallocate_range()
3431 rc = smb3_simple_fallocate_write_range(xid, tcon, in smb3_simple_fallocate_range()
3436 len = len - l; in smb3_simple_fallocate_range()
3445 l = le64_to_cpu(tmp_data->length); in smb3_simple_fallocate_range()
3449 len -= l; in smb3_simple_fallocate_range()
3452 out_data_len -= sizeof(struct file_allocated_range_buffer); in smb3_simple_fallocate_range()
3462 static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, in smb3_simple_falloc() argument
3467 struct cifsFileInfo *cfile = file->private_data; in smb3_simple_falloc()
3468 long rc = -EOPNOTSUPP; in smb3_simple_falloc()
3474 inode = d_inode(cfile->dentry); in smb3_simple_falloc()
3477 trace_smb3_falloc_enter(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_simple_falloc()
3478 tcon->ses->Suid, off, len); in smb3_simple_falloc()
3482 trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, in smb3_simple_falloc()
3483 tcon->tid, tcon->ses->Suid, off, len, rc); in smb3_simple_falloc()
3496 if (cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) in smb3_simple_falloc()
3497 smb2_set_sparse(xid, tcon, cfile, inode, false); in smb3_simple_falloc()
3500 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_simple_falloc()
3501 cfile->fid.volatile_fid, cfile->pid, new_eof); in smb3_simple_falloc()
3503 cifsi->server_eof = new_eof; in smb3_simple_falloc()
3505 cifs_truncate_page(inode->i_mapping, inode->i_size); in smb3_simple_falloc()
3512 * Files are non-sparse by default so falloc may be a no-op in smb3_simple_falloc()
3516 if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) { in smb3_simple_falloc()
3535 len = i_size_read(inode) - off; in smb3_simple_falloc()
3544 * We can either turn the entire file to become non-sparse in smb3_simple_falloc()
3555 rc = smb3_simple_fallocate_range(xid, tcon, cfile, in smb3_simple_falloc()
3566 * or end of the file non-sparse via set_sparse is harmless. in smb3_simple_falloc()
3569 rc = -EOPNOTSUPP; in smb3_simple_falloc()
3574 smb2_set_sparse(xid, tcon, cfile, inode, false); in smb3_simple_falloc()
3579 trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_simple_falloc()
3580 tcon->ses->Suid, off, len, rc); in smb3_simple_falloc()
3582 trace_smb3_falloc_done(xid, cfile->fid.persistent_fid, tcon->tid, in smb3_simple_falloc()
3583 tcon->ses->Suid, off, len); in smb3_simple_falloc()
3589 static long smb3_collapse_range(struct file *file, struct cifs_tcon *tcon, in smb3_collapse_range() argument
3595 struct cifsFileInfo *cfile = file->private_data; in smb3_collapse_range()
3606 rc = -EINVAL; in smb3_collapse_range()
3610 filemap_invalidate_lock(inode->i_mapping); in smb3_collapse_range()
3611 rc = filemap_write_and_wait_range(inode->i_mapping, off, old_eof - 1); in smb3_collapse_range()
3618 old_eof - off - len, off); in smb3_collapse_range()
3622 new_eof = old_eof - len; in smb3_collapse_range()
3623 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_collapse_range()
3624 cfile->fid.volatile_fid, cfile->pid, new_eof); in smb3_collapse_range()
3630 cifsi->server_eof = i_size_read(inode) - len; in smb3_collapse_range()
3631 truncate_setsize(inode, cifsi->server_eof); in smb3_collapse_range()
3632 fscache_resize_cookie(cifs_inode_cookie(inode), cifsi->server_eof); in smb3_collapse_range()
3634 filemap_invalidate_unlock(inode->i_mapping); in smb3_collapse_range()
3641 static long smb3_insert_range(struct file *file, struct cifs_tcon *tcon, in smb3_insert_range() argument
3646 struct cifsFileInfo *cfile = file->private_data; in smb3_insert_range()
3656 rc = -EINVAL; in smb3_insert_range()
3660 count = old_eof - off; in smb3_insert_range()
3663 filemap_invalidate_lock(inode->i_mapping); in smb3_insert_range()
3664 rc = filemap_write_and_wait_range(inode->i_mapping, off, new_eof - 1); in smb3_insert_range()
3669 rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid, in smb3_insert_range()
3670 cfile->fid.volatile_fid, cfile->pid, new_eof); in smb3_insert_range()
3681 rc = smb3_zero_data(file, tcon, off, len, xid); in smb3_insert_range()
3687 filemap_invalidate_unlock(inode->i_mapping); in smb3_insert_range()
3694 static loff_t smb3_llseek(struct file *file, struct cifs_tcon *tcon, loff_t offset, int whence) in smb3_llseek() argument
3696 struct cifsFileInfo *wrcfile, *cfile = file->private_data; in smb3_llseek()
3707 inode = d_inode(cfile->dentry); in smb3_llseek()
3711 return -ENXIO; in smb3_llseek()
3723 filemap_write_and_wait(inode->i_mapping); in smb3_llseek()
3724 smb2_flush_file(xid, tcon, &wrcfile->fid); in smb3_llseek()
3728 if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE)) { in smb3_llseek()
3737 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_llseek()
3738 cfile->fid.volatile_fid, in smb3_llseek()
3743 if (rc == -E2BIG) in smb3_llseek()
3752 rc = -ENXIO; in smb3_llseek()
3757 rc = -EINVAL; in smb3_llseek()
3761 offset = le64_to_cpu(out_data->file_offset); in smb3_llseek()
3764 if (offset < le64_to_cpu(out_data->file_offset)) in smb3_llseek()
3767 offset = le64_to_cpu(out_data->file_offset) + le64_to_cpu(out_data->length); in smb3_llseek()
3773 return vfs_setpos(file, offset, inode->i_sb->s_maxbytes); in smb3_llseek()
3778 static int smb3_fiemap(struct cifs_tcon *tcon, in smb3_fiemap() argument
3788 rc = fiemap_prep(d_inode(cfile->dentry), fei, start, &len, 0); in smb3_fiemap()
3797 rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid, in smb3_fiemap()
3798 cfile->fid.volatile_fid, in smb3_fiemap()
3803 if (rc == -E2BIG) { in smb3_fiemap()
3812 rc = -EINVAL; in smb3_fiemap()
3816 rc = -EINVAL; in smb3_fiemap()
3823 if (i == num - 1 && last_blob) in smb3_fiemap()
3840 next = le64_to_cpu(out_data[num - 1].file_offset) + in smb3_fiemap()
3841 le64_to_cpu(out_data[num - 1].length); in smb3_fiemap()
3842 len = len - (next - start); in smb3_fiemap()
3853 static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode, in smb3_fallocate() argument
3858 return smb3_punch_hole(file, tcon, off, len); in smb3_fallocate()
3861 return smb3_zero_range(file, tcon, off, len, true); in smb3_fallocate()
3862 return smb3_zero_range(file, tcon, off, len, false); in smb3_fallocate()
3864 return smb3_simple_falloc(file, tcon, off, len, true); in smb3_fallocate()
3866 return smb3_collapse_range(file, tcon, off, len); in smb3_fallocate()
3868 return smb3_insert_range(file, tcon, off, len); in smb3_fallocate()
3870 return smb3_simple_falloc(file, tcon, off, len, false); in smb3_fallocate()
3872 return -EOPNOTSUPP; in smb3_fallocate()
3880 server->ops->set_oplock_level(cinode, oplock, 0, NULL); in smb2_downgrade_oplock()
3892 unsigned int old_state = cinode->oplock; in smb3_downgrade_oplock()
3893 __u16 old_epoch = cinode->epoch; in smb3_downgrade_oplock()
3898 cinode->epoch = epoch; in smb3_downgrade_oplock()
3901 new_state = cinode->oplock; in smb3_downgrade_oplock()
3907 else if (old_state == new_state && (epoch - old_epoch > 1)) in smb3_downgrade_oplock()
3916 cinode->lease_granted = false; in smb2_set_oplock_level()
3920 cinode->oplock = CIFS_CACHE_RHW_FLG; in smb2_set_oplock_level()
3922 &cinode->netfs.inode); in smb2_set_oplock_level()
3924 cinode->oplock = CIFS_CACHE_RW_FLG; in smb2_set_oplock_level()
3926 &cinode->netfs.inode); in smb2_set_oplock_level()
3928 cinode->oplock = CIFS_CACHE_READ_FLG; in smb2_set_oplock_level()
3930 &cinode->netfs.inode); in smb2_set_oplock_level()
3932 cinode->oplock = 0; in smb2_set_oplock_level()
3943 cinode->lease_granted = true; in smb21_set_oplock_level()
3967 cinode->oplock = new_oplock; in smb21_set_oplock_level()
3969 &cinode->netfs.inode); in smb21_set_oplock_level()
3976 unsigned int old_oplock = cinode->oplock; in smb3_set_oplock_level()
3983 if (cinode->oplock == CIFS_CACHE_READ_FLG && in smb3_set_oplock_level()
3984 (epoch - cinode->epoch > 0)) in smb3_set_oplock_level()
3986 else if (cinode->oplock == CIFS_CACHE_RH_FLG && in smb3_set_oplock_level()
3987 (epoch - cinode->epoch > 1)) in smb3_set_oplock_level()
3989 else if (cinode->oplock == CIFS_CACHE_RHW_FLG && in smb3_set_oplock_level()
3990 (epoch - cinode->epoch > 1)) in smb3_set_oplock_level()
3992 else if (cinode->oplock == 0 && in smb3_set_oplock_level()
3993 (epoch - cinode->epoch > 0)) in smb3_set_oplock_level()
3996 if (cinode->oplock == CIFS_CACHE_RH_FLG && in smb3_set_oplock_level()
3997 (epoch - cinode->epoch > 0)) in smb3_set_oplock_level()
3999 else if (cinode->oplock == CIFS_CACHE_RHW_FLG && in smb3_set_oplock_level()
4000 (epoch - cinode->epoch > 1)) in smb3_set_oplock_level()
4003 cinode->epoch = epoch; in smb3_set_oplock_level()
4044 memcpy(&buf->lcontext.LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE); in smb2_create_lease_buf()
4045 buf->lcontext.LeaseState = map_oplock_to_lease(oplock); in smb2_create_lease_buf()
4047 buf->ccontext.DataOffset = cpu_to_le16(offsetof in smb2_create_lease_buf()
4049 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context)); in smb2_create_lease_buf()
4050 buf->ccontext.NameOffset = cpu_to_le16(offsetof in smb2_create_lease_buf()
4052 buf->ccontext.NameLength = cpu_to_le16(4); in smb2_create_lease_buf()
4054 buf->Name[0] = 'R'; in smb2_create_lease_buf()
4055 buf->Name[1] = 'q'; in smb2_create_lease_buf()
4056 buf->Name[2] = 'L'; in smb2_create_lease_buf()
4057 buf->Name[3] = 's'; in smb2_create_lease_buf()
4070 memcpy(&buf->lcontext.LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE); in smb3_create_lease_buf()
4071 buf->lcontext.LeaseState = map_oplock_to_lease(oplock); in smb3_create_lease_buf()
4073 buf->ccontext.DataOffset = cpu_to_le16(offsetof in smb3_create_lease_buf()
4075 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2)); in smb3_create_lease_buf()
4076 buf->ccontext.NameOffset = cpu_to_le16(offsetof in smb3_create_lease_buf()
4078 buf->ccontext.NameLength = cpu_to_le16(4); in smb3_create_lease_buf()
4080 buf->Name[0] = 'R'; in smb3_create_lease_buf()
4081 buf->Name[1] = 'q'; in smb3_create_lease_buf()
4082 buf->Name[2] = 'L'; in smb3_create_lease_buf()
4083 buf->Name[3] = 's'; in smb3_create_lease_buf()
4093 if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE) in smb2_parse_lease_buf()
4095 return le32_to_cpu(lc->lcontext.LeaseState); in smb2_parse_lease_buf()
4103 *epoch = le16_to_cpu(lc->lcontext.Epoch); in smb3_parse_lease_buf()
4104 if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE) in smb3_parse_lease_buf()
4107 memcpy(lease_key, &lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE); in smb3_parse_lease_buf()
4108 return le32_to_cpu(lc->lcontext.LeaseState); in smb3_parse_lease_buf()
4114 return min_t(unsigned int, CIFS_SB(inode->i_sb)->ctx->wsize, in smb2_wp_retry_size()
4121 return !cfile->invalidHandle; in smb2_dir_needs_close()
4129 (struct smb2_hdr *)old_rq->rq_iov[0].iov_base; in fill_transform_hdr()
4132 tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM; in fill_transform_hdr()
4133 tr_hdr->OriginalMessageSize = cpu_to_le32(orig_len); in fill_transform_hdr()
4134 tr_hdr->Flags = cpu_to_le16(0x01); in fill_transform_hdr()
4137 get_random_bytes(&tr_hdr->Nonce, SMB3_AES_GCM_NONCE); in fill_transform_hdr()
4139 get_random_bytes(&tr_hdr->Nonce, SMB3_AES_CCM_NONCE); in fill_transform_hdr()
4140 memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8); in fill_transform_hdr()
4158 len += crypto_aead_alignmask(tfm) & ~(crypto_tfm_ctx_alignment() - 1); in smb2_aead_req_alloc()
4167 return ERR_PTR(-ENOMEM); in smb2_aead_req_alloc()
4172 sgt->sgl = (struct scatterlist *)PTR_ALIGN((u8 *)*req + req_size, in smb2_aead_req_alloc()
4207 rqst[i].rq_iov[j].iov_len - skip); in smb2_get_aead_req()
4215 num_sgs - sgtable.nents, 0); in smb2_get_aead_req()
4221 sg_mark_end(&sgtable.sgl[sgtable.nents - 1]); in smb2_get_aead_req()
4234 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_get_enc_key()
4237 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_get_enc_key()
4238 if (ses->Suid == ses_id) { in smb2_get_enc_key()
4239 spin_lock(&ses->ses_lock); in smb2_get_enc_key()
4240 ses_enc_key = enc ? ses->smb3encryptionkey : in smb2_get_enc_key()
4241 ses->smb3decryptionkey; in smb2_get_enc_key()
4243 spin_unlock(&ses->ses_lock); in smb2_get_enc_key()
4252 return -EAGAIN; in smb2_get_enc_key()
4256 * iov[0] - transform header (associate data),
4257 * iov[1-N] - SMB2 header and pages - data to encrypt.
4258 * On success return encrypted data in iov[1-N] and pages, leave iov[0]
4267 unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20; in crypt_message()
4275 unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize); in crypt_message()
4279 rc = smb2_get_enc_key(server, le64_to_cpu(tr_hdr->SessionId), enc, key); in crypt_message()
4282 enc ? "en" : "de", le64_to_cpu(tr_hdr->SessionId)); in crypt_message()
4286 if ((server->cipher_type == SMB2_ENCRYPTION_AES256_CCM) || in crypt_message()
4287 (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM)) in crypt_message()
4309 memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE); in crypt_message()
4313 if ((server->cipher_type == SMB2_ENCRYPTION_AES128_GCM) || in crypt_message()
4314 (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM)) in crypt_message()
4315 memcpy(iv, (char *)tr_hdr->Nonce, SMB3_AES_GCM_NONCE); in crypt_message()
4318 memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES_CCM_NONCE); in crypt_message()
4332 memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE); in crypt_message()
4368 * a smb2_transform_hdr and is pre-allocated by the caller.
4375 * new_rq[0].rq_iov[0] : smb2_transform_hdr pre-allocated by the caller
4386 int rc = -ENOMEM; in smb3_init_transform_rq()
4389 struct smb_rqst *old = &old_rq[i - 1]; in smb3_init_transform_rq()
4391 struct xarray *buffer = &new->rq_buffer; in smb3_init_transform_rq()
4392 size_t size = iov_iter_count(&old->rq_iter), seg, copied = 0; in smb3_init_transform_rq()
4395 new->rq_iov = old->rq_iov; in smb3_init_transform_rq()
4396 new->rq_nvec = old->rq_nvec; in smb3_init_transform_rq()
4406 rc = -ENOMEM; in smb3_init_transform_rq()
4410 page->index = j; in smb3_init_transform_rq()
4420 seg = min_t(size_t, size - copied, PAGE_SIZE); in smb3_init_transform_rq()
4421 if (copy_page_from_iter(page, 0, seg, &old->rq_iter) != seg) { in smb3_init_transform_rq()
4422 rc = -EFAULT; in smb3_init_transform_rq()
4427 iov_iter_xarray(&new->rq_iter, ITER_SOURCE, in smb3_init_transform_rq()
4429 new->rq_iter_size = size; in smb3_init_transform_rq()
4434 fill_transform_hdr(tr_hdr, orig_len, old_rq, server->cipher_type); in smb3_init_transform_rq()
4436 rc = crypt_message(server, num_rqst, new_rq, 1, server->secmech.enc); in smb3_init_transform_rq()
4444 smb3_free_compound_rqst(num_rqst - 1, &new_rq[1]); in smb3_init_transform_rq()
4453 return trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM; in smb3_is_transform_hdr()
4481 if ((server->cipher_type == SMB2_ENCRYPTION_AES128_GCM) || in decrypt_raw_data()
4482 (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM)) in decrypt_raw_data()
4493 if (unlikely(!server->secmech.dec)) in decrypt_raw_data()
4494 return -EIO; in decrypt_raw_data()
4496 tfm = server->secmech.dec; in decrypt_raw_data()
4511 server->total_read = buf_data_size + iter_size; in decrypt_raw_data()
4524 size_t n, len = min_t(unsigned int, PAGE_SIZE - skip, data_size); in cifs_copy_pages_to_iter()
4529 return -EIO; in cifs_copy_pages_to_iter()
4531 data_size -= n; in cifs_copy_pages_to_iter()
4548 struct cifs_readdata *rdata = mid->callback_data; in handle_read_data()
4553 if (shdr->Command != SMB2_READ) { in handle_read_data()
4555 return -EOPNOTSUPP; in handle_read_data()
4558 if (server->ops->is_session_expired && in handle_read_data()
4559 server->ops->is_session_expired(buf)) { in handle_read_data()
4562 return -1; in handle_read_data()
4565 if (server->ops->is_status_pending && in handle_read_data()
4566 server->ops->is_status_pending(buf, server)) in handle_read_data()
4567 return -1; in handle_read_data()
4570 rdata->iov[0].iov_base = buf; in handle_read_data()
4571 rdata->iov[0].iov_len = 0; in handle_read_data()
4572 rdata->iov[1].iov_base = buf; in handle_read_data()
4573 rdata->iov[1].iov_len = in handle_read_data()
4574 min_t(unsigned int, buf_len, server->vals->read_rsp_size); in handle_read_data()
4576 rdata->iov[0].iov_base, rdata->iov[0].iov_len); in handle_read_data()
4578 rdata->iov[1].iov_base, rdata->iov[1].iov_len); in handle_read_data()
4580 rdata->result = server->ops->map_error(buf, true); in handle_read_data()
4581 if (rdata->result != 0) { in handle_read_data()
4583 __func__, rdata->result); in handle_read_data()
4586 mid->mid_state = MID_RESPONSE_RECEIVED; in handle_read_data()
4592 data_offset = server->ops->read_data_offset(buf); in handle_read_data()
4594 use_rdma_mr = rdata->mr; in handle_read_data()
4596 data_len = server->ops->read_data_length(buf, use_rdma_mr); in handle_read_data()
4598 if (data_offset < server->vals->read_rsp_size) { in handle_read_data()
4606 data_offset = server->vals->read_rsp_size; in handle_read_data()
4611 rdata->result = -EIO; in handle_read_data()
4613 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4615 dequeue_mid(mid, rdata->result); in handle_read_data()
4619 pad_len = data_offset - server->vals->read_rsp_size; in handle_read_data()
4630 rdata->result = -EIO; in handle_read_data()
4632 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4634 dequeue_mid(mid, rdata->result); in handle_read_data()
4638 if (data_len > pages_len - pad_len) { in handle_read_data()
4639 /* data_len is corrupt -- discard frame */ in handle_read_data()
4640 rdata->result = -EIO; in handle_read_data()
4642 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4644 dequeue_mid(mid, rdata->result); in handle_read_data()
4649 rdata->result = cifs_copy_pages_to_iter(pages, pages_len, in handle_read_data()
4650 cur_off, &rdata->iter); in handle_read_data()
4651 if (rdata->result != 0) { in handle_read_data()
4653 mid->mid_state = MID_RESPONSE_MALFORMED; in handle_read_data()
4655 dequeue_mid(mid, rdata->result); in handle_read_data()
4658 rdata->got_bytes = pages_len; in handle_read_data()
4664 length = copy_to_iter(buf + data_offset, data_len, &rdata->iter); in handle_read_data()
4667 rdata->got_bytes = data_len; 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()
4680 mid->mid_state = MID_RESPONSE_RECEIVED; in handle_read_data()
4703 iov_iter_xarray(&iter, ITER_DEST, &dw->buffer, 0, dw->len); in smb2_decrypt_offload()
4704 rc = decrypt_raw_data(dw->server, dw->buf, dw->server->vals->read_rsp_size, in smb2_decrypt_offload()
4711 dw->server->lstrp = jiffies; in smb2_decrypt_offload()
4712 mid = smb2_find_dequeue_mid(dw->server, dw->buf); in smb2_decrypt_offload()
4716 mid->decrypted = true; in smb2_decrypt_offload()
4717 rc = handle_read_data(dw->server, mid, dw->buf, in smb2_decrypt_offload()
4718 dw->server->vals->read_rsp_size, in smb2_decrypt_offload()
4719 &dw->buffer, dw->len, in smb2_decrypt_offload()
4723 mid->when_received = jiffies; in smb2_decrypt_offload()
4725 if (dw->server->ops->is_network_name_deleted) in smb2_decrypt_offload()
4726 dw->server->ops->is_network_name_deleted(dw->buf, in smb2_decrypt_offload()
4727 dw->server); in smb2_decrypt_offload()
4729 mid->callback(mid); in smb2_decrypt_offload()
4731 spin_lock(&dw->server->srv_lock); in smb2_decrypt_offload()
4732 if (dw->server->tcpStatus == CifsNeedReconnect) { in smb2_decrypt_offload()
4733 spin_lock(&dw->server->mid_lock); in smb2_decrypt_offload()
4734 mid->mid_state = MID_RETRY_NEEDED; in smb2_decrypt_offload()
4735 spin_unlock(&dw->server->mid_lock); in smb2_decrypt_offload()
4736 spin_unlock(&dw->server->srv_lock); in smb2_decrypt_offload()
4737 mid->callback(mid); in smb2_decrypt_offload()
4739 spin_lock(&dw->server->mid_lock); in smb2_decrypt_offload()
4740 mid->mid_state = MID_REQUEST_SUBMITTED; in smb2_decrypt_offload()
4741 mid->mid_flags &= ~(MID_DELETED); in smb2_decrypt_offload()
4742 list_add_tail(&mid->qhead, in smb2_decrypt_offload()
4743 &dw->server->pending_mid_q); in smb2_decrypt_offload()
4744 spin_unlock(&dw->server->mid_lock); in smb2_decrypt_offload()
4745 spin_unlock(&dw->server->srv_lock); in smb2_decrypt_offload()
4752 cifs_clear_xarray_buffer(&dw->buffer); in smb2_decrypt_offload()
4753 cifs_small_buf_release(dw->buf); in smb2_decrypt_offload()
4763 char *buf = server->smallbuf; in receive_encrypted_read()
4767 unsigned int buflen = server->pdu_size; in receive_encrypted_read()
4774 return -ENOMEM; in receive_encrypted_read()
4775 xa_init(&dw->buffer); in receive_encrypted_read()
4776 INIT_WORK(&dw->decrypt, smb2_decrypt_offload); in receive_encrypted_read()
4777 dw->server = server; in receive_encrypted_read()
4780 len = min_t(unsigned int, buflen, server->vals->read_rsp_size + in receive_encrypted_read()
4781 sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1; in receive_encrypted_read()
4783 rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len); in receive_encrypted_read()
4786 server->total_read += rc; in receive_encrypted_read()
4788 len = le32_to_cpu(tr_hdr->OriginalMessageSize) - in receive_encrypted_read()
4789 server->vals->read_rsp_size; in receive_encrypted_read()
4790 dw->len = len; in receive_encrypted_read()
4793 rc = -ENOMEM; in receive_encrypted_read()
4800 page->index = i; in receive_encrypted_read()
4801 old = xa_store(&dw->buffer, i, page, GFP_KERNEL); in receive_encrypted_read()
4807 xa_set_mark(&dw->buffer, i, XA_MARK_0); in receive_encrypted_read()
4810 iov_iter_xarray(&iter, ITER_DEST, &dw->buffer, 0, npages * PAGE_SIZE); in receive_encrypted_read()
4813 rc = cifs_read_iter_from_socket(server, &iter, dw->len); in receive_encrypted_read()
4817 server->total_read += rc; in receive_encrypted_read()
4819 iov_iter_zero(npages * PAGE_SIZE - rc, &iter); in receive_encrypted_read()
4821 iov_iter_truncate(&iter, dw->len); in receive_encrypted_read()
4832 if ((server->min_offload) && (server->in_flight > 1) && in receive_encrypted_read()
4833 (server->pdu_size >= server->min_offload)) { in receive_encrypted_read()
4834 dw->buf = server->smallbuf; in receive_encrypted_read()
4835 server->smallbuf = (char *)cifs_small_buf_get(); in receive_encrypted_read()
4837 queue_work(decrypt_wq, &dw->decrypt); in receive_encrypted_read()
4839 return -1; in receive_encrypted_read()
4842 rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size, in receive_encrypted_read()
4852 (*mid)->decrypted = true; in receive_encrypted_read()
4854 server->vals->read_rsp_size, in receive_encrypted_read()
4855 &dw->buffer, dw->len, false); in receive_encrypted_read()
4857 if (server->ops->is_network_name_deleted) { in receive_encrypted_read()
4858 server->ops->is_network_name_deleted(buf, in receive_encrypted_read()
4865 cifs_clear_xarray_buffer(&dw->buffer); in receive_encrypted_read()
4880 char *buf = server->smallbuf; in receive_encrypted_standard()
4882 unsigned int pdu_length = server->pdu_size; in receive_encrypted_standard()
4893 server->large_buf = true; in receive_encrypted_standard()
4894 memcpy(server->bigbuf, buf, server->total_read); in receive_encrypted_standard()
4895 buf = server->bigbuf; in receive_encrypted_standard()
4899 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, in receive_encrypted_standard()
4900 pdu_length - HEADER_SIZE(server) + 1); in receive_encrypted_standard()
4903 server->total_read += length; in receive_encrypted_standard()
4905 buf_size = pdu_length - sizeof(struct smb2_transform_hdr); in receive_encrypted_standard()
4910 next_is_large = server->large_buf; in receive_encrypted_standard()
4913 next_cmd = le32_to_cpu(shdr->NextCommand); in receive_encrypted_standard()
4916 return -1; in receive_encrypted_standard()
4923 return -1; in receive_encrypted_standard()
4925 memcpy(next_buffer, buf + next_cmd, pdu_length - next_cmd); in receive_encrypted_standard()
4933 mid_entry->decrypted = true; in receive_encrypted_standard()
4934 mid_entry->resp_buf_size = server->pdu_size; in receive_encrypted_standard()
4939 return -1; in receive_encrypted_standard()
4944 if (mid_entry && mid_entry->handle) in receive_encrypted_standard()
4945 ret = mid_entry->handle(server, mid_entry); in receive_encrypted_standard()
4950 pdu_length -= next_cmd; in receive_encrypted_standard()
4951 server->large_buf = next_is_large; in receive_encrypted_standard()
4953 server->bigbuf = buf = next_buffer; in receive_encrypted_standard()
4955 server->smallbuf = buf = next_buffer; in receive_encrypted_standard()
4960 * server->smallbuf and server->bigbuf are still valid. We need in receive_encrypted_standard()
4977 char *buf = server->smallbuf; in smb3_receive_transform()
4978 unsigned int pdu_length = server->pdu_size; in smb3_receive_transform()
4980 unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize); in smb3_receive_transform()
4987 return -ECONNABORTED; in smb3_receive_transform()
4993 return -ECONNABORTED; in smb3_receive_transform()
5007 char *buf = server->large_buf ? server->bigbuf : server->smallbuf; in smb3_handle_read_data()
5009 return handle_read_data(server, mid, buf, server->pdu_size, in smb3_handle_read_data()
5019 if (hdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) { in smb2_next_header()
5020 *noff = le32_to_cpu(t_hdr->OriginalMessageSize); in smb2_next_header()
5022 return -EINVAL; in smb2_next_header()
5024 *noff = le32_to_cpu(hdr->NextCommand); in smb2_next_header()
5027 return -EINVAL; in smb2_next_header()
5032 struct dentry *dentry, struct cifs_tcon *tcon, in __cifs_sfu_make_node() argument
5035 struct TCP_Server_Info *server = tcon->ses->server; in __cifs_sfu_make_node()
5038 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in __cifs_sfu_make_node()
5043 __u32 oplock = server->oplocks ? REQ_OPLOCK : 0; in __cifs_sfu_make_node()
5061 return -EPERM; in __cifs_sfu_make_node()
5064 oparms = CIFS_OPARMS(cifs_sb, tcon, full_path, GENERIC_WRITE, in __cifs_sfu_make_node()
5069 rc = server->ops->open(xid, &oparms, &oplock, NULL); in __cifs_sfu_make_node()
5073 io_parms.pid = current->tgid; in __cifs_sfu_make_node()
5074 io_parms.tcon = tcon; in __cifs_sfu_make_node()
5079 rc = server->ops->sync_write(xid, &fid, &io_parms, in __cifs_sfu_make_node()
5081 server->ops->close(xid, tcon, &fid); in __cifs_sfu_make_node()
5086 struct dentry *dentry, struct cifs_tcon *tcon, in cifs_sfu_make_node() argument
5092 rc = __cifs_sfu_make_node(xid, inode, dentry, tcon, in cifs_sfu_make_node()
5097 if (tcon->posix_extensions) { in cifs_sfu_make_node()
5099 inode->i_sb, xid); in cifs_sfu_make_node()
5100 } else if (tcon->unix_ext) { in cifs_sfu_make_node()
5102 inode->i_sb, xid); in cifs_sfu_make_node()
5105 inode->i_sb, xid, NULL); in cifs_sfu_make_node()
5113 struct dentry *dentry, struct cifs_tcon *tcon, in smb2_make_node() argument
5116 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); in smb2_make_node()
5125 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { in smb2_make_node()
5126 rc = cifs_sfu_make_node(xid, inode, dentry, tcon, in smb2_make_node()
5129 rc = smb2_mknod_reparse(xid, inode, dentry, tcon, in smb2_make_node()