Lines Matching refs:work

40 static void __wbuf(struct ksmbd_work *work, void **req, void **rsp)  in __wbuf()  argument
42 if (work->next_smb2_rcv_hdr_off) { in __wbuf()
43 *req = ksmbd_req_buf_next(work); in __wbuf()
44 *rsp = ksmbd_resp_buf_next(work); in __wbuf()
46 *req = smb2_get_msg(work->request_buf); in __wbuf()
47 *rsp = smb2_get_msg(work->response_buf); in __wbuf()
93 int smb2_get_ksmbd_tcon(struct ksmbd_work *work) in smb2_get_ksmbd_tcon() argument
95 struct smb2_hdr *req_hdr = smb2_get_msg(work->request_buf); in smb2_get_ksmbd_tcon()
99 work->tcon = NULL; in smb2_get_ksmbd_tcon()
107 if (xa_empty(&work->sess->tree_conns)) { in smb2_get_ksmbd_tcon()
113 work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); in smb2_get_ksmbd_tcon()
114 if (!work->tcon) { in smb2_get_ksmbd_tcon()
126 void smb2_set_err_rsp(struct ksmbd_work *work) in smb2_set_err_rsp() argument
130 if (work->next_smb2_rcv_hdr_off) in smb2_set_err_rsp()
131 err_rsp = ksmbd_resp_buf_next(work); in smb2_set_err_rsp()
133 err_rsp = smb2_get_msg(work->response_buf); in smb2_set_err_rsp()
141 inc_rfc1001_len(work->response_buf, SMB2_ERROR_STRUCTURE_SIZE2); in smb2_set_err_rsp()
151 bool is_smb2_neg_cmd(struct ksmbd_work *work) in is_smb2_neg_cmd() argument
153 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_smb2_neg_cmd()
175 bool is_smb2_rsp(struct ksmbd_work *work) in is_smb2_rsp() argument
177 struct smb2_hdr *hdr = smb2_get_msg(work->response_buf); in is_smb2_rsp()
196 u16 get_smb2_cmd_val(struct ksmbd_work *work) in get_smb2_cmd_val() argument
200 if (work->next_smb2_rcv_hdr_off) in get_smb2_cmd_val()
201 rcv_hdr = ksmbd_req_buf_next(work); in get_smb2_cmd_val()
203 rcv_hdr = smb2_get_msg(work->request_buf); in get_smb2_cmd_val()
212 void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err) in set_smb2_rsp_status() argument
216 if (work->next_smb2_rcv_hdr_off) in set_smb2_rsp_status()
217 rsp_hdr = ksmbd_resp_buf_next(work); in set_smb2_rsp_status()
219 rsp_hdr = smb2_get_msg(work->response_buf); in set_smb2_rsp_status()
221 smb2_set_err_rsp(work); in set_smb2_rsp_status()
231 int init_smb2_neg_rsp(struct ksmbd_work *work) in init_smb2_neg_rsp() argument
235 struct ksmbd_conn *conn = work->conn; in init_smb2_neg_rsp()
240 *(__be32 *)work->response_buf = in init_smb2_neg_rsp()
243 rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
257 rsp = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
259 WARN_ON(ksmbd_conn_good(work)); in init_smb2_neg_rsp()
280 inc_rfc1001_len(work->response_buf, in init_smb2_neg_rsp()
289 ksmbd_conn_set_need_negotiate(work); in init_smb2_neg_rsp()
297 int smb2_set_rsp_credits(struct ksmbd_work *work) in smb2_set_rsp_credits() argument
299 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_set_rsp_credits()
300 struct smb2_hdr *hdr = ksmbd_resp_buf_next(work); in smb2_set_rsp_credits()
301 struct ksmbd_conn *conn = work->conn; in smb2_set_rsp_credits()
306 if (work->send_no_response) in smb2_set_rsp_credits()
341 work->credits_granted += credits_granted; in smb2_set_rsp_credits()
345 hdr->CreditRequest = cpu_to_le16(work->credits_granted); in smb2_set_rsp_credits()
358 static void init_chained_smb2_rsp(struct ksmbd_work *work) in init_chained_smb2_rsp() argument
360 struct smb2_hdr *req = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
361 struct smb2_hdr *rsp = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
375 work->compound_fid = in init_chained_smb2_rsp()
378 work->compound_pfid = in init_chained_smb2_rsp()
381 work->compound_sid = le64_to_cpu(rsp->SessionId); in init_chained_smb2_rsp()
384 len = get_rfc1002_len(work->response_buf) - work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
388 inc_rfc1001_len(work->response_buf, in init_chained_smb2_rsp()
392 work->next_smb2_rcv_hdr_off += next_hdr_offset; in init_chained_smb2_rsp()
393 work->next_smb2_rsp_hdr_off += new_len; in init_chained_smb2_rsp()
396 new_len, work->next_smb2_rcv_hdr_off, in init_chained_smb2_rsp()
397 work->next_smb2_rsp_hdr_off); in init_chained_smb2_rsp()
399 rsp_hdr = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
400 rcv_hdr = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
404 work->compound_fid = KSMBD_NO_FID; in init_chained_smb2_rsp()
405 work->compound_pfid = KSMBD_NO_FID; in init_chained_smb2_rsp()
431 bool is_chained_smb2_message(struct ksmbd_work *work) in is_chained_smb2_message() argument
433 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_chained_smb2_message()
439 hdr = ksmbd_req_buf_next(work); in is_chained_smb2_message()
442 if ((u64)work->next_smb2_rcv_hdr_off + next_cmd + in is_chained_smb2_message()
444 get_rfc1002_len(work->request_buf)) { in is_chained_smb2_message()
450 if ((u64)get_rfc1002_len(work->response_buf) + MAX_CIFS_SMALL_BUFFER_SIZE > in is_chained_smb2_message()
451 work->response_sz) { in is_chained_smb2_message()
457 init_chained_smb2_rsp(work); in is_chained_smb2_message()
459 } else if (work->next_smb2_rcv_hdr_off) { in is_chained_smb2_message()
464 len = ALIGN(get_rfc1002_len(work->response_buf), 8); in is_chained_smb2_message()
465 len = len - get_rfc1002_len(work->response_buf); in is_chained_smb2_message()
468 inc_rfc1001_len(work->response_buf, len); in is_chained_smb2_message()
469 if (work->aux_payload_sz) in is_chained_smb2_message()
470 work->aux_payload_sz += len; in is_chained_smb2_message()
482 int init_smb2_rsp_hdr(struct ksmbd_work *work) in init_smb2_rsp_hdr() argument
484 struct smb2_hdr *rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_rsp_hdr()
485 struct smb2_hdr *rcv_hdr = smb2_get_msg(work->request_buf); in init_smb2_rsp_hdr()
486 struct ksmbd_conn *conn = work->conn; in init_smb2_rsp_hdr()
489 *(__be32 *)work->response_buf = in init_smb2_rsp_hdr()
506 work->syncronous = true; in init_smb2_rsp_hdr()
507 if (work->async_id) { in init_smb2_rsp_hdr()
508 ksmbd_release_id(&conn->async_ida, work->async_id); in init_smb2_rsp_hdr()
509 work->async_id = 0; in init_smb2_rsp_hdr()
521 int smb2_allocate_rsp_buf(struct ksmbd_work *work) in smb2_allocate_rsp_buf() argument
523 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
525 size_t large_sz = small_sz + work->conn->vals->max_trans_size; in smb2_allocate_rsp_buf()
535 req = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
546 work->response_buf = kvmalloc(sz, GFP_KERNEL | __GFP_ZERO); in smb2_allocate_rsp_buf()
547 if (!work->response_buf) in smb2_allocate_rsp_buf()
550 work->response_sz = sz; in smb2_allocate_rsp_buf()
560 int smb2_check_user_session(struct ksmbd_work *work) in smb2_check_user_session() argument
562 struct smb2_hdr *req_hdr = smb2_get_msg(work->request_buf); in smb2_check_user_session()
563 struct ksmbd_conn *conn = work->conn; in smb2_check_user_session()
564 unsigned int cmd = conn->ops->get_cmd_val(work); in smb2_check_user_session()
567 work->sess = NULL; in smb2_check_user_session()
577 if (!ksmbd_conn_good(work)) in smb2_check_user_session()
582 work->sess = ksmbd_session_lookup_all(conn, sess_id); in smb2_check_user_session()
583 if (work->sess) in smb2_check_user_session()
637 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
640 struct ksmbd_conn *conn = work->conn; in setup_async_work()
643 rsp_hdr = smb2_get_msg(work->response_buf); in setup_async_work()
651 work->syncronous = false; in setup_async_work()
652 work->async_id = id; in setup_async_work()
657 work->async_id); in setup_async_work()
659 work->cancel_fn = fn; in setup_async_work()
660 work->cancel_argv = arg; in setup_async_work()
662 if (list_empty(&work->async_request_entry)) { in setup_async_work()
664 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
671 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
675 rsp_hdr = smb2_get_msg(work->response_buf); in smb2_send_interim_resp()
676 smb2_set_err_rsp(work); in smb2_send_interim_resp()
679 work->multiRsp = 1; in smb2_send_interim_resp()
680 ksmbd_conn_write(work); in smb2_send_interim_resp()
682 work->multiRsp = 0; in smb2_send_interim_resp()
1061 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1063 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1064 struct smb2_negotiate_req *req = smb2_get_msg(work->request_buf); in smb2_handle_negotiate()
1065 struct smb2_negotiate_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_handle_negotiate()
1072 if (ksmbd_conn_good(work)) { in smb2_handle_negotiate()
1074 work->send_no_response = 1; in smb2_handle_negotiate()
1085 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1136 get_rfc1002_len(work->request_buf)); in smb2_handle_negotiate()
1152 work->request_buf, in smb2_handle_negotiate()
1156 assemble_neg_contexts(conn, rsp, work->response_buf); in smb2_handle_negotiate()
1206 inc_rfc1001_len(work->response_buf, sizeof(struct smb2_negotiate_rsp) - in smb2_handle_negotiate()
1223 ksmbd_conn_set_need_negotiate(work); in smb2_handle_negotiate()
1227 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1246 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1248 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1249 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1273 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1294 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1298 struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf); in ntlm_negotiate()
1306 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->sess); in ntlm_negotiate()
1315 if (!work->conn->use_spnego) { in ntlm_negotiate()
1316 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->sess); in ntlm_negotiate()
1332 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->sess); in ntlm_negotiate()
1404 static int ntlm_authenticate(struct ksmbd_work *work) in ntlm_authenticate() argument
1406 struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf); in ntlm_authenticate()
1407 struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf); in ntlm_authenticate()
1408 struct ksmbd_conn *conn = work->conn; in ntlm_authenticate()
1409 struct ksmbd_session *sess = work->sess; in ntlm_authenticate()
1430 inc_rfc1001_len(work->response_buf, spnego_blob_len - 1); in ntlm_authenticate()
1539 static int krb5_authenticate(struct ksmbd_work *work) in krb5_authenticate() argument
1541 struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf); in krb5_authenticate()
1542 struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf); in krb5_authenticate()
1543 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1544 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1556 out_len = work->response_sz - in krb5_authenticate()
1574 inc_rfc1001_len(work->response_buf, out_len - 1); in krb5_authenticate()
1620 static int krb5_authenticate(struct ksmbd_work *work) in krb5_authenticate() argument
1626 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1628 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1629 struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf); in smb2_sess_setup()
1630 struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_sess_setup()
1642 inc_rfc1001_len(work->response_buf, 9); in smb2_sess_setup()
1709 work->sess = sess; in smb2_sess_setup()
1731 rc = generate_preauth_hash(work); in smb2_sess_setup()
1737 rc = krb5_authenticate(work); in smb2_sess_setup()
1743 ksmbd_conn_set_good(work); in smb2_sess_setup()
1749 rc = ntlm_negotiate(work, negblob, negblob_len); in smb2_sess_setup()
1758 inc_rfc1001_len(work->response_buf, in smb2_sess_setup()
1762 rc = ntlm_authenticate(work); in smb2_sess_setup()
1766 ksmbd_conn_set_good(work); in smb2_sess_setup()
1830 work->sess = NULL; in smb2_sess_setup()
1845 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1847 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1848 struct smb2_tree_connect_req *req = smb2_get_msg(work->request_buf); in smb2_tree_connect()
1849 struct smb2_tree_connect_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_tree_connect()
1850 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1914 inc_rfc1001_len(work->response_buf, 16); in smb2_tree_connect()
2017 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2019 struct smb2_tree_disconnect_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_tree_disconnect()
2020 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2021 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2024 inc_rfc1001_len(work->response_buf, 4); in smb2_tree_disconnect()
2030 smb2_get_msg(work->request_buf); in smb2_tree_disconnect()
2034 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2038 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2049 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2051 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2052 struct smb2_logoff_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_session_logoff()
2053 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2056 inc_rfc1001_len(work->response_buf, 4); in smb2_session_logoff()
2064 ksmbd_conn_set_need_reconnect(work); in smb2_session_logoff()
2065 ksmbd_close_session_fds(work); in smb2_session_logoff()
2069 struct smb2_logoff_req *req = smb2_get_msg(work->request_buf); in smb2_session_logoff()
2073 smb2_set_err_rsp(work); in smb2_session_logoff()
2084 ksmbd_conn_set_need_negotiate(work); in smb2_session_logoff()
2094 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2096 struct smb2_create_rsp *rsp = smb2_get_msg(work->response_buf); in create_smb2_pipe()
2097 struct smb2_create_req *req = smb2_get_msg(work->request_buf); in create_smb2_pipe()
2103 1, work->conn->local_nls); in create_smb2_pipe()
2110 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2135 inc_rfc1001_len(work->response_buf, 88); /* StructureSize - 1*/ in create_smb2_pipe()
2153 smb2_set_err_rsp(work); in create_smb2_pipe()
2390 static int smb2_creat(struct ksmbd_work *work, struct path *path, char *name, in smb2_creat() argument
2393 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2406 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2413 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2418 rc = ksmbd_vfs_kern_path(work, name, 0, path, 0); in smb2_creat()
2427 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2451 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2478 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2480 struct ksmbd_conn *conn = work->conn; in smb2_open()
2481 struct ksmbd_session *sess = work->sess; in smb2_open()
2482 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2510 WORK_BUFFERS(work, req, rsp); in smb2_open()
2512 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2516 smb2_set_err_rsp(work); in smb2_open()
2522 return create_smb2_pipe(work); in smb2_open()
2536 work->conn->local_nls); in smb2_open()
2547 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2702 if (ksmbd_override_fsids(work)) { in smb2_open()
2707 rc = ksmbd_vfs_kern_path(work, name, LOOKUP_NO_SYMLINKS, &path, 1); in smb2_open()
2830 rc = smb2_creat(work, &path, name, open_flags, posix_mode, in smb2_open()
2909 fp = ksmbd_open_fd(work, filp); in smb2_open()
2941 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
2948 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
2954 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3016 smb_break_all_oplock(work, fp); in smb2_open()
3041 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3062 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3101 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3164 inc_rfc1001_len(work->response_buf, 88); /* StructureSize - 1*/ in smb2_open()
3179 inc_rfc1001_len(work->response_buf, in smb2_open()
3200 inc_rfc1001_len(work->response_buf, in smb2_open()
3219 inc_rfc1001_len(work->response_buf, in smb2_open()
3234 inc_rfc1001_len(work->response_buf, in smb2_open()
3248 ksmbd_revert_fsids(work); in smb2_open()
3279 ksmbd_fd_put(work, fp); in smb2_open()
3280 smb2_set_err_rsp(work); in smb2_open()
3587 struct ksmbd_work *work; member
3644 ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
3649 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
3782 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
3822 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
3828 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
3831 free_len = (int)(work->response_sz - in smb2_calc_max_out_buf_len()
3832 (get_rfc1002_len(work->response_buf) + 4)) - in smb2_calc_max_out_buf_len()
3840 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
3842 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
3845 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
3854 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
3856 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
3858 smb2_set_err_rsp(work); in smb2_query_dir()
3868 dir_fp = ksmbd_lookup_fd_slow(work, in smb2_query_dir()
3916 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
3928 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
3941 query_dir_private.work = work; in smb2_query_dir()
3974 inc_rfc1001_len(work->response_buf, 9); in smb2_query_dir()
3983 inc_rfc1001_len(work->response_buf, 8 + d_info.data_count); in smb2_query_dir()
3987 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
3988 ksmbd_revert_fsids(work); in smb2_query_dir()
4011 smb2_set_err_rsp(work); in smb2_query_dir()
4012 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4013 ksmbd_revert_fsids(work); in smb2_query_dir()
4127 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4162 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4377 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4382 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4442 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4447 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4464 static void get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4469 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4477 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4484 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
4721 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
4731 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
4734 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
4735 work->response_buf); in smb2_get_info_file()
4738 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
4741 work->compound_fid); in smb2_get_info_file()
4742 id = work->compound_fid; in smb2_get_info_file()
4743 pid = work->compound_pfid; in smb2_get_info_file()
4752 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
4760 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4765 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4770 get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4775 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
4780 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
4785 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
4790 get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
4795 get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4800 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4805 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
4810 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
4815 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4820 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4825 get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4830 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4834 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
4838 rc = find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4849 rsp, work->response_buf, in smb2_get_info_file()
4851 ksmbd_fd_put(work, fp); in smb2_get_info_file()
4855 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
4859 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
4861 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
4893 inc_rfc1001_len(work->response_buf, 8); in smb2_get_info_filesystem()
4919 inc_rfc1001_len(work->response_buf, sz); in smb2_get_info_filesystem()
4947 inc_rfc1001_len(work->response_buf, sz); in smb2_get_info_filesystem()
4961 inc_rfc1001_len(work->response_buf, 24); in smb2_get_info_filesystem()
4978 inc_rfc1001_len(work->response_buf, 32); in smb2_get_info_filesystem()
4999 inc_rfc1001_len(work->response_buf, 64); in smb2_get_info_filesystem()
5020 inc_rfc1001_len(work->response_buf, 28); in smb2_get_info_filesystem()
5042 inc_rfc1001_len(work->response_buf, 48); in smb2_get_info_filesystem()
5050 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5063 inc_rfc1001_len(work->response_buf, 56); in smb2_get_info_filesystem()
5073 rsp, work->response_buf, in smb2_get_info_filesystem()
5079 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5108 inc_rfc1001_len(work->response_buf, secdesclen); in smb2_get_info_sec()
5113 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5116 work->compound_fid); in smb2_get_info_sec()
5117 id = work->compound_fid; in smb2_get_info_sec()
5118 pid = work->compound_pfid; in smb2_get_info_sec()
5127 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5135 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5137 ksmbd_vfs_get_sd_xattr(work->conn, user_ns, in smb2_get_info_sec()
5145 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5150 inc_rfc1001_len(work->response_buf, secdesclen); in smb2_get_info_sec()
5160 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5166 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5173 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5177 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5181 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5198 smb2_set_err_rsp(work); in smb2_query_info()
5206 inc_rfc1001_len(work->response_buf, 8); in smb2_query_info()
5216 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5219 struct smb2_close_req *req = smb2_get_msg(work->request_buf); in smb2_close_pipe()
5220 struct smb2_close_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_close_pipe()
5223 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5235 inc_rfc1001_len(work->response_buf, 60); in smb2_close_pipe()
5245 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5251 struct ksmbd_conn *conn = work->conn; in smb2_close()
5257 WORK_BUFFERS(work, req, rsp); in smb2_close()
5259 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5262 return smb2_close_pipe(work); in smb2_close()
5267 sess_id = work->compound_sid; in smb2_close()
5269 work->compound_sid = 0; in smb2_close()
5271 work->compound_sid = sess_id; in smb2_close()
5280 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5282 if (!has_file_id(work->compound_fid)) { in smb2_close()
5291 work->compound_fid, in smb2_close()
5292 work->compound_pfid); in smb2_close()
5293 volatile_id = work->compound_fid; in smb2_close()
5296 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5297 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5308 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5327 ksmbd_fd_put(work, fp); in smb2_close()
5339 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5344 smb2_set_err_rsp(work); in smb2_close()
5346 inc_rfc1001_len(work->response_buf, 60); in smb2_close()
5358 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5360 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5364 inc_rfc1001_len(work->response_buf, 4); in smb2_echo()
5368 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5449 rc = ksmbd_vfs_kern_path(work, new_name, LOOKUP_NO_SYMLINKS, &path, 1); in smb2_rename()
5466 rc = ksmbd_vfs_remove_file(work, new_name); in smb2_rename()
5485 rc = ksmbd_vfs_fp_rename(work, fp, new_name); in smb2_rename()
5493 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
5530 rc = ksmbd_vfs_kern_path(work, link_name, LOOKUP_NO_SYMLINKS, &path, 0); in smb2_create_link()
5541 rc = ksmbd_vfs_remove_file(work, link_name); in smb2_create_link()
5557 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
5651 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
5672 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
5690 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
5702 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
5725 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
5737 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
5778 return smb2_rename(work, fp, user_ns, rename_info, in set_rename_info()
5779 work->sess->conn->local_nls); in set_rename_info()
5858 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
5877 return set_file_allocation_info(work, fp, in smb2_set_info_file()
5885 return set_end_of_file_info(work, fp, in smb2_set_info_file()
5890 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info_file()
5899 return set_rename_info(work, fp, in smb2_set_info_file()
5908 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
5911 work->sess->conn->local_nls); in smb2_set_info_file()
5915 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info_file()
5978 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
5988 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
5989 req = ksmbd_req_buf_next(work); in smb2_set_info()
5990 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
5993 work->compound_fid); in smb2_set_info()
5994 id = work->compound_fid; in smb2_set_info()
5995 pid = work->compound_pfid; in smb2_set_info()
5998 req = smb2_get_msg(work->request_buf); in smb2_set_info()
5999 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6007 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6017 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6021 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6029 ksmbd_revert_fsids(work); in smb2_set_info()
6039 inc_rfc1001_len(work->response_buf, 2); in smb2_set_info()
6040 ksmbd_fd_put(work, fp); in smb2_set_info()
6062 smb2_set_err_rsp(work); in smb2_set_info()
6063 ksmbd_fd_put(work, fp); in smb2_set_info()
6074 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6079 struct smb2_read_req *req = smb2_get_msg(work->request_buf); in smb2_read_pipe()
6080 struct smb2_read_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_read_pipe()
6084 inc_rfc1001_len(work->response_buf, 16); in smb2_read_pipe()
6085 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6092 work->aux_payload_buf = in smb2_read_pipe()
6094 if (!work->aux_payload_buf) { in smb2_read_pipe()
6099 memcpy(work->aux_payload_buf, rpc_resp->payload, in smb2_read_pipe()
6103 work->resp_hdr_sz = get_rfc1002_len(work->response_buf) + 4; in smb2_read_pipe()
6104 work->aux_payload_sz = nbytes; in smb2_read_pipe()
6114 inc_rfc1001_len(work->response_buf, nbytes); in smb2_read_pipe()
6119 smb2_set_err_rsp(work); in smb2_read_pipe()
6124 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6132 if (work->conn->dialect == SMB30_PROT_ID && in smb2_read_rdma_channel()
6140 work->need_invalidate_rkey = in smb2_read_rdma_channel()
6142 work->remote_key = le32_to_cpu(desc->token); in smb2_read_rdma_channel()
6144 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6160 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6162 struct ksmbd_conn *conn = work->conn; in smb2_read()
6171 WORK_BUFFERS(work, req, rsp); in smb2_read()
6173 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6176 return smb2_read_pipe(work); in smb2_read()
6179 fp = ksmbd_lookup_fd_slow(work, le64_to_cpu(req->VolatileFileId), in smb2_read()
6206 work->aux_payload_buf = kvmalloc(length, GFP_KERNEL | __GFP_ZERO); in smb2_read()
6207 if (!work->aux_payload_buf) { in smb2_read()
6212 nbytes = ksmbd_vfs_read(work, fp, length, &offset); in smb2_read()
6219 kvfree(work->aux_payload_buf); in smb2_read()
6220 work->aux_payload_buf = NULL; in smb2_read()
6222 smb2_set_err_rsp(work); in smb2_read()
6223 ksmbd_fd_put(work, fp); in smb2_read()
6233 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6234 work->aux_payload_buf, in smb2_read()
6236 kvfree(work->aux_payload_buf); in smb2_read()
6237 work->aux_payload_buf = NULL; in smb2_read()
6252 inc_rfc1001_len(work->response_buf, 16); in smb2_read()
6253 work->resp_hdr_sz = get_rfc1002_len(work->response_buf) + 4; in smb2_read()
6254 work->aux_payload_sz = nbytes; in smb2_read()
6255 inc_rfc1001_len(work->response_buf, nbytes); in smb2_read()
6256 ksmbd_fd_put(work, fp); in smb2_read()
6276 smb2_set_err_rsp(work); in smb2_read()
6278 ksmbd_fd_put(work, fp); in smb2_read()
6288 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6290 struct smb2_write_req *req = smb2_get_msg(work->request_buf); in smb2_write_pipe()
6291 struct smb2_write_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_write_pipe()
6306 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6309 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6318 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6323 smb2_set_err_rsp(work); in smb2_write_pipe()
6328 smb2_set_err_rsp(work); in smb2_write_pipe()
6341 inc_rfc1001_len(work->response_buf, 16); in smb2_write_pipe()
6346 smb2_set_err_rsp(work); in smb2_write_pipe()
6352 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6364 if (work->conn->dialect == SMB30_PROT_ID && in smb2_write_rdma_channel()
6375 work->need_invalidate_rkey = in smb2_write_rdma_channel()
6377 work->remote_key = le32_to_cpu(desc->token); in smb2_write_rdma_channel()
6383 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6392 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6406 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6418 WORK_BUFFERS(work, req, rsp); in smb2_write()
6420 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6422 return smb2_write_pipe(work); in smb2_write()
6425 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
6431 fp = ksmbd_lookup_fd_slow(work, le64_to_cpu(req->VolatileFileId), in smb2_write()
6447 if (length > work->conn->vals->max_write_size) { in smb2_write()
6449 work->conn->vals->max_write_size); in smb2_write()
6464 get_rfc1002_len(work->request_buf)) { in smb2_write()
6467 get_rfc1002_len(work->request_buf)); in smb2_write()
6482 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
6490 nbytes = smb2_write_rdma_channel(work, req, fp, offset, in smb2_write()
6505 inc_rfc1001_len(work->response_buf, 16); in smb2_write()
6506 ksmbd_fd_put(work, fp); in smb2_write()
6525 smb2_set_err_rsp(work); in smb2_write()
6526 ksmbd_fd_put(work, fp); in smb2_write()
6536 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
6542 WORK_BUFFERS(work, req, rsp); in smb2_flush()
6547 err = ksmbd_vfs_fsync(work, in smb2_flush()
6555 inc_rfc1001_len(work->response_buf, 4); in smb2_flush()
6561 smb2_set_err_rsp(work); in smb2_flush()
6573 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
6575 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
6576 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
6613 cancel_work == work) in smb2_cancel()
6633 work->send_no_response = 1; in smb2_cancel()
6743 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
6745 struct smb2_lock_req *req = smb2_get_msg(work->request_buf); in smb2_lock()
6746 struct smb2_lock_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_lock()
6764 fp = ksmbd_lookup_fd_slow(work, in smb2_lock()
6967 spin_lock(&work->conn->llist_lock); in smb2_lock()
6969 &work->conn->lock_list); in smb2_lock()
6970 spin_unlock(&work->conn->llist_lock); in smb2_lock()
6980 rc = setup_async_work(work, in smb2_lock()
6988 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
6991 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
6995 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
6997 spin_lock(&work->conn->llist_lock); in smb2_lock()
6999 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7002 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7004 list_del(&work->fp_entry); in smb2_lock()
7009 smb2_send_interim_resp(work, in smb2_lock()
7011 work->send_no_response = 1; in smb2_lock()
7014 init_smb2_rsp_hdr(work); in smb2_lock()
7015 smb2_set_err_rsp(work); in smb2_lock()
7023 spin_lock(&work->conn->llist_lock); in smb2_lock()
7025 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7028 list_del(&work->fp_entry); in smb2_lock()
7032 spin_lock(&work->conn->llist_lock); in smb2_lock()
7034 &work->conn->lock_list); in smb2_lock()
7037 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7047 smb_break_all_oplock(work, fp); in smb2_lock()
7053 inc_rfc1001_len(work->response_buf, 4); in smb2_lock()
7054 ksmbd_fd_put(work, fp); in smb2_lock()
7077 spin_lock(&work->conn->llist_lock); in smb2_lock()
7081 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7101 smb2_set_err_rsp(work); in smb2_lock()
7102 ksmbd_fd_put(work, fp); in smb2_lock()
7106 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7160 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7162 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7185 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7213 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7214 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7382 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7395 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7407 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7411 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7420 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
7456 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
7464 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
7476 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
7493 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
7497 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
7503 fp = ksmbd_lookup_fd_slow(work, in fsctl_request_resume_key()
7512 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
7523 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
7529 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
7532 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
7533 req = ksmbd_req_buf_next(work); in smb2_ioctl()
7534 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
7537 work->compound_fid); in smb2_ioctl()
7538 id = work->compound_fid; in smb2_ioctl()
7541 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
7542 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
7554 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
7590 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
7627 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
7637 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
7657 fsctl_copychunk(work, in smb2_ioctl()
7671 ret = fsctl_set_sparse(work, id, in smb2_ioctl()
7682 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
7697 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7706 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
7707 ksmbd_fd_put(work, fp); in smb2_ioctl()
7718 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
7738 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7748 ksmbd_fd_put(work, fp); in smb2_ioctl()
7765 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
7773 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7800 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
7801 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
7822 inc_rfc1001_len(work->response_buf, 48 + nbytes); in smb2_ioctl()
7837 smb2_set_err_rsp(work); in smb2_ioctl()
7847 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
7849 struct smb2_oplock_break *req = smb2_get_msg(work->request_buf); in smb20_oplock_break_ack()
7850 struct smb2_oplock_break *rsp = smb2_get_msg(work->response_buf); in smb20_oplock_break_ack()
7865 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
7868 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7876 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7877 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
7947 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
7957 inc_rfc1001_len(work->response_buf, 24); in smb20_oplock_break_ack()
7965 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
7966 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7990 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
7992 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
7993 struct smb2_lease_ack *req = smb2_get_msg(work->request_buf); in smb21_lease_break_ack()
7994 struct smb2_lease_ack *rsp = smb2_get_msg(work->response_buf); in smb21_lease_break_ack()
8007 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8106 inc_rfc1001_len(work->response_buf, 36); in smb21_lease_break_ack()
8116 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8125 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8127 struct smb2_oplock_break *req = smb2_get_msg(work->request_buf); in smb2_oplock_break()
8128 struct smb2_oplock_break *rsp = smb2_get_msg(work->response_buf); in smb2_oplock_break()
8132 smb20_oplock_break_ack(work); in smb2_oplock_break()
8135 smb21_lease_break_ack(work); in smb2_oplock_break()
8141 smb2_set_err_rsp(work); in smb2_oplock_break()
8153 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8158 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8160 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8162 smb2_set_err_rsp(work); in smb2_notify()
8166 smb2_set_err_rsp(work); in smb2_notify()
8178 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8180 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8197 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8205 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8206 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8207 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8209 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8210 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8214 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8215 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8223 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8240 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8249 hdr = smb2_get_msg(work->response_buf); in smb2_set_sign_rsp()
8250 if (work->next_smb2_rsp_hdr_off) in smb2_set_sign_rsp()
8251 hdr = ksmbd_resp_buf_next(work); in smb2_set_sign_rsp()
8253 req_hdr = ksmbd_req_buf_next(work); in smb2_set_sign_rsp()
8255 if (!work->next_smb2_rsp_hdr_off) { in smb2_set_sign_rsp()
8256 len = get_rfc1002_len(work->response_buf); in smb2_set_sign_rsp()
8260 len = get_rfc1002_len(work->response_buf) - in smb2_set_sign_rsp()
8261 work->next_smb2_rsp_hdr_off; in smb2_set_sign_rsp()
8274 if (work->aux_payload_sz) { in smb2_set_sign_rsp()
8275 iov[0].iov_len -= work->aux_payload_sz; in smb2_set_sign_rsp()
8277 iov[1].iov_base = work->aux_payload_buf; in smb2_set_sign_rsp()
8278 iov[1].iov_len = work->aux_payload_sz; in smb2_set_sign_rsp()
8282 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8293 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8295 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8304 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8305 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8306 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8308 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8309 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8313 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8314 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8317 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8319 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8351 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8353 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8362 hdr = smb2_get_msg(work->response_buf); in smb3_set_sign_rsp()
8363 if (work->next_smb2_rsp_hdr_off) in smb3_set_sign_rsp()
8364 hdr = ksmbd_resp_buf_next(work); in smb3_set_sign_rsp()
8366 req_hdr = ksmbd_req_buf_next(work); in smb3_set_sign_rsp()
8368 if (!work->next_smb2_rsp_hdr_off) { in smb3_set_sign_rsp()
8369 len = get_rfc1002_len(work->response_buf); in smb3_set_sign_rsp()
8373 len = get_rfc1002_len(work->response_buf) - in smb3_set_sign_rsp()
8374 work->next_smb2_rsp_hdr_off; in smb3_set_sign_rsp()
8380 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8382 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8398 if (work->aux_payload_sz) { in smb3_set_sign_rsp()
8399 iov[0].iov_len -= work->aux_payload_sz; in smb3_set_sign_rsp()
8400 iov[1].iov_base = work->aux_payload_buf; in smb3_set_sign_rsp()
8401 iov[1].iov_len = work->aux_payload_sz; in smb3_set_sign_rsp()
8414 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8416 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8417 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8423 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8427 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8445 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8470 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
8472 char *buf = work->response_buf; in smb3_encrypt_resp()
8475 int buf_size = 0, rq_nvec = 2 + (work->aux_payload_sz ? 1 : 0); in smb3_encrypt_resp()
8480 work->tr_buf = kzalloc(sizeof(struct smb2_transform_hdr) + 4, GFP_KERNEL); in smb3_encrypt_resp()
8481 if (!work->tr_buf) in smb3_encrypt_resp()
8485 fill_transform_hdr(work->tr_buf, buf, work->conn->cipher_type); in smb3_encrypt_resp()
8487 iov[0].iov_base = work->tr_buf; in smb3_encrypt_resp()
8493 if (work->aux_payload_sz) { in smb3_encrypt_resp()
8494 iov[1].iov_len = work->resp_hdr_sz - 4; in smb3_encrypt_resp()
8496 iov[2].iov_base = work->aux_payload_buf; in smb3_encrypt_resp()
8497 iov[2].iov_len = work->aux_payload_sz; in smb3_encrypt_resp()
8501 work->resp_hdr_sz = iov[1].iov_len; in smb3_encrypt_resp()
8503 rc = ksmbd_crypt_message(work->conn, iov, rq_nvec, 1); in smb3_encrypt_resp()
8508 *(__be32 *)work->tr_buf = cpu_to_be32(buf_size); in smb3_encrypt_resp()
8520 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
8522 struct ksmbd_conn *conn = work->conn; in smb3_decrypt_req()
8524 char *buf = work->request_buf; in smb3_decrypt_req()
8563 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
8565 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
8566 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
8571 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
8572 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()