Lines Matching full:work

42 static void __wbuf(struct ksmbd_work *work, void **req, void **rsp)  in __wbuf()  argument
44 if (work->next_smb2_rcv_hdr_off) { in __wbuf()
45 *req = ksmbd_req_buf_next(work); in __wbuf()
46 *rsp = ksmbd_resp_buf_next(work); in __wbuf()
48 *req = smb2_get_msg(work->request_buf); in __wbuf()
49 *rsp = smb2_get_msg(work->response_buf); in __wbuf()
83 * @work: smb work
88 int smb2_get_ksmbd_tcon(struct ksmbd_work *work) in smb2_get_ksmbd_tcon() argument
90 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_get_ksmbd_tcon()
101 if (xa_empty(&work->sess->tree_conns)) { in smb2_get_ksmbd_tcon()
110 * Just validate tree id in header with work->tcon->id. in smb2_get_ksmbd_tcon()
112 if (work->next_smb2_rcv_hdr_off) { in smb2_get_ksmbd_tcon()
113 if (!work->tcon) { in smb2_get_ksmbd_tcon()
117 if (tree_id != UINT_MAX && work->tcon->id != tree_id) { in smb2_get_ksmbd_tcon()
119 tree_id, work->tcon->id); in smb2_get_ksmbd_tcon()
125 work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); in smb2_get_ksmbd_tcon()
126 if (!work->tcon) { in smb2_get_ksmbd_tcon()
136 * @work: smb work containing response buffer
138 void smb2_set_err_rsp(struct ksmbd_work *work) in smb2_set_err_rsp() argument
142 if (work->next_smb2_rcv_hdr_off) in smb2_set_err_rsp()
143 err_rsp = ksmbd_resp_buf_next(work); in smb2_set_err_rsp()
145 err_rsp = smb2_get_msg(work->response_buf); in smb2_set_err_rsp()
155 err = ksmbd_iov_pin_rsp(work, (void *)err_rsp, in smb2_set_err_rsp()
159 work->send_no_response = 1; in smb2_set_err_rsp()
165 * @work: smb work containing smb header
169 bool is_smb2_neg_cmd(struct ksmbd_work *work) in is_smb2_neg_cmd() argument
171 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_smb2_neg_cmd()
189 * @work: smb work containing smb response buffer
193 bool is_smb2_rsp(struct ksmbd_work *work) in is_smb2_rsp() argument
195 struct smb2_hdr *hdr = smb2_get_msg(work->response_buf); in is_smb2_rsp()
210 * @work: smb work containing smb request buffer
214 u16 get_smb2_cmd_val(struct ksmbd_work *work) in get_smb2_cmd_val() argument
218 if (work->next_smb2_rcv_hdr_off) in get_smb2_cmd_val()
219 rcv_hdr = ksmbd_req_buf_next(work); in get_smb2_cmd_val()
221 rcv_hdr = smb2_get_msg(work->request_buf); in get_smb2_cmd_val()
227 * @work: smb work containing response buffer
230 void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err) in set_smb2_rsp_status() argument
234 rsp_hdr = smb2_get_msg(work->response_buf); in set_smb2_rsp_status()
237 work->iov_idx = 0; in set_smb2_rsp_status()
238 work->iov_cnt = 0; in set_smb2_rsp_status()
239 work->next_smb2_rcv_hdr_off = 0; in set_smb2_rsp_status()
240 smb2_set_err_rsp(work); in set_smb2_rsp_status()
245 * @work: smb work containing smb request buffer
250 int init_smb2_neg_rsp(struct ksmbd_work *work) in init_smb2_neg_rsp() argument
254 struct ksmbd_conn *conn = work->conn; in init_smb2_neg_rsp()
257 rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
271 rsp = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
297 err = ksmbd_iov_pin_rsp(work, rsp, in init_smb2_neg_rsp()
309 * @work: smb work containing smb response buffer
311 int smb2_set_rsp_credits(struct ksmbd_work *work) in smb2_set_rsp_credits() argument
313 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_set_rsp_credits()
314 struct smb2_hdr *hdr = ksmbd_resp_buf_next(work); in smb2_set_rsp_credits()
315 struct ksmbd_conn *conn = work->conn; in smb2_set_rsp_credits()
319 if (work->send_no_response) in smb2_set_rsp_credits()
356 work->credits_granted += credits_granted; in smb2_set_rsp_credits()
360 hdr->CreditRequest = cpu_to_le16(work->credits_granted); in smb2_set_rsp_credits()
371 * @work: smb work containing smb response buffer
373 static void init_chained_smb2_rsp(struct ksmbd_work *work) in init_chained_smb2_rsp() argument
375 struct smb2_hdr *req = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
376 struct smb2_hdr *rsp = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
390 work->compound_fid = ((struct smb2_create_rsp *)rsp)->VolatileFileId; in init_chained_smb2_rsp()
391 work->compound_pfid = ((struct smb2_create_rsp *)rsp)->PersistentFileId; in init_chained_smb2_rsp()
392 work->compound_sid = le64_to_cpu(rsp->SessionId); in init_chained_smb2_rsp()
395 len = get_rfc1002_len(work->response_buf) - work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
399 work->iov[work->iov_idx].iov_len += (new_len - len); in init_chained_smb2_rsp()
400 inc_rfc1001_len(work->response_buf, new_len - len); in init_chained_smb2_rsp()
403 work->next_smb2_rcv_hdr_off += next_hdr_offset; in init_chained_smb2_rsp()
404 work->curr_smb2_rsp_hdr_off = work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
405 work->next_smb2_rsp_hdr_off += new_len; in init_chained_smb2_rsp()
408 new_len, work->next_smb2_rcv_hdr_off, in init_chained_smb2_rsp()
409 work->next_smb2_rsp_hdr_off); in init_chained_smb2_rsp()
411 rsp_hdr = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
412 rcv_hdr = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
416 work->compound_fid = KSMBD_NO_FID; in init_chained_smb2_rsp()
417 work->compound_pfid = KSMBD_NO_FID; in init_chained_smb2_rsp()
439 * @work: smb work containing smb request buffer
443 bool is_chained_smb2_message(struct ksmbd_work *work) in is_chained_smb2_message() argument
445 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_chained_smb2_message()
451 hdr = ksmbd_req_buf_next(work); in is_chained_smb2_message()
454 if ((u64)work->next_smb2_rcv_hdr_off + next_cmd + in is_chained_smb2_message()
456 get_rfc1002_len(work->request_buf)) { in is_chained_smb2_message()
462 if ((u64)get_rfc1002_len(work->response_buf) + MAX_CIFS_SMALL_BUFFER_SIZE > in is_chained_smb2_message()
463 work->response_sz) { in is_chained_smb2_message()
469 init_chained_smb2_rsp(work); in is_chained_smb2_message()
471 } else if (work->next_smb2_rcv_hdr_off) { in is_chained_smb2_message()
476 len = ALIGN(get_rfc1002_len(work->response_buf), 8); in is_chained_smb2_message()
477 len = len - get_rfc1002_len(work->response_buf); in is_chained_smb2_message()
480 work->iov[work->iov_idx].iov_len += len; in is_chained_smb2_message()
481 inc_rfc1001_len(work->response_buf, len); in is_chained_smb2_message()
483 work->curr_smb2_rsp_hdr_off = work->next_smb2_rsp_hdr_off; in is_chained_smb2_message()
490 * @work: smb work containing smb request buffer
494 int init_smb2_rsp_hdr(struct ksmbd_work *work) in init_smb2_rsp_hdr() argument
496 struct smb2_hdr *rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_rsp_hdr()
497 struct smb2_hdr *rcv_hdr = smb2_get_msg(work->request_buf); in init_smb2_rsp_hdr()
520 * @work: smb work containing smb request buffer
524 int smb2_allocate_rsp_buf(struct ksmbd_work *work) in smb2_allocate_rsp_buf() argument
526 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
528 size_t large_sz = small_sz + work->conn->vals->max_trans_size; in smb2_allocate_rsp_buf()
538 req = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
550 work->response_buf = kvzalloc(sz, GFP_KERNEL); in smb2_allocate_rsp_buf()
551 if (!work->response_buf) in smb2_allocate_rsp_buf()
554 work->response_sz = sz; in smb2_allocate_rsp_buf()
560 * @work: smb work containing smb request buffer
564 int smb2_check_user_session(struct ksmbd_work *work) in smb2_check_user_session() argument
566 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_check_user_session()
567 struct ksmbd_conn *conn = work->conn; in smb2_check_user_session()
587 * Just validate session id in header with work->sess->id. in smb2_check_user_session()
589 if (work->next_smb2_rcv_hdr_off) { in smb2_check_user_session()
590 if (!work->sess) { in smb2_check_user_session()
594 if (sess_id != ULLONG_MAX && work->sess->id != sess_id) { in smb2_check_user_session()
596 sess_id, work->sess->id); in smb2_check_user_session()
603 work->sess = ksmbd_session_lookup_all(conn, sess_id); in smb2_check_user_session()
604 if (work->sess) in smb2_check_user_session()
658 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
661 struct ksmbd_conn *conn = work->conn; in setup_async_work()
664 rsp_hdr = ksmbd_resp_buf_next(work); in setup_async_work()
672 work->asynchronous = true; in setup_async_work()
673 work->async_id = id; in setup_async_work()
678 work->async_id); in setup_async_work()
680 work->cancel_fn = fn; in setup_async_work()
681 work->cancel_argv = arg; in setup_async_work()
683 if (list_empty(&work->async_request_entry)) { in setup_async_work()
685 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
692 void release_async_work(struct ksmbd_work *work) in release_async_work() argument
694 struct ksmbd_conn *conn = work->conn; in release_async_work()
697 list_del_init(&work->async_request_entry); in release_async_work()
700 work->asynchronous = 0; in release_async_work()
701 work->cancel_fn = NULL; in release_async_work()
702 kfree(work->cancel_argv); in release_async_work()
703 work->cancel_argv = NULL; in release_async_work()
704 if (work->async_id) { in release_async_work()
705 ksmbd_release_id(&conn->async_ida, work->async_id); in release_async_work()
706 work->async_id = 0; in release_async_work()
710 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
721 in_work->conn = work->conn; in smb2_send_interim_resp()
722 memcpy(smb2_get_msg(in_work->response_buf), ksmbd_resp_buf_next(work), in smb2_send_interim_resp()
1094 * @work: smb work containing smb request buffer
1098 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1100 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1101 struct smb2_negotiate_req *req = smb2_get_msg(work->request_buf); in smb2_handle_negotiate()
1102 struct smb2_negotiate_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_handle_negotiate()
1111 work->send_no_response = 1; in smb2_handle_negotiate()
1115 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1173 get_rfc1002_len(work->request_buf)); in smb2_handle_negotiate()
1193 work->request_buf, in smb2_handle_negotiate()
1269 rc = ksmbd_iov_pin_rsp(work, rsp, in smb2_handle_negotiate()
1273 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1291 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1293 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1294 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1318 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1339 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1350 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->conn); in ntlm_negotiate()
1359 if (!work->conn->use_spnego) { in ntlm_negotiate()
1360 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1376 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1447 static int ntlm_authenticate(struct ksmbd_work *work, in ntlm_authenticate() argument
1451 struct ksmbd_conn *conn = work->conn; in ntlm_authenticate()
1452 struct ksmbd_session *sess = work->sess; in ntlm_authenticate()
1583 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1587 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1588 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1600 out_len = work->response_sz - in krb5_authenticate()
1663 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1671 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1673 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1683 WORK_BUFFERS(work, req, rsp); in smb2_sess_setup()
1780 work->sess = sess; in smb2_sess_setup()
1799 rc = generate_preauth_hash(work); in smb2_sess_setup()
1805 rc = krb5_authenticate(work, req, rsp); in smb2_sess_setup()
1819 rc = ntlm_negotiate(work, negblob, negblob_len, rsp); in smb2_sess_setup()
1825 rc = ntlm_authenticate(work, req, rsp); in smb2_sess_setup()
1908 smb2_set_err_rsp(work); in smb2_sess_setup()
1917 rc = ksmbd_iov_pin_rsp(work, rsp, iov_len); in smb2_sess_setup()
1928 * @work: smb work containing smb request buffer
1932 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1934 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1937 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1943 WORK_BUFFERS(work, req, rsp); in smb2_tree_connect()
2007 rc = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_tree_connect_rsp)); in smb2_tree_connect()
2043 smb2_set_err_rsp(work); in smb2_tree_connect()
2113 * @work: smb work containing request buffer
2117 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2121 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2122 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2125 WORK_BUFFERS(work, req, rsp); in smb2_tree_disconnect()
2137 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2157 work->tcon = NULL; in smb2_tree_disconnect()
2160 err = ksmbd_iov_pin_rsp(work, rsp, in smb2_tree_disconnect()
2170 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2177 * @work: smb work containing request buffer
2181 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2183 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2190 WORK_BUFFERS(work, req, rsp); in smb2_session_logoff()
2198 smb2_set_err_rsp(work); in smb2_session_logoff()
2205 ksmbd_close_session_fds(work); in smb2_session_logoff()
2216 smb2_set_err_rsp(work); in smb2_session_logoff()
2228 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp)); in smb2_session_logoff()
2231 smb2_set_err_rsp(work); in smb2_session_logoff()
2239 * @work: smb work containing request buffer
2243 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2251 WORK_BUFFERS(work, req, rsp); in create_smb2_pipe()
2254 1, work->conn->local_nls); in create_smb2_pipe()
2261 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2286 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_create_rsp, Buffer)); in create_smb2_pipe()
2307 smb2_set_err_rsp(work); in create_smb2_pipe()
2548 static int smb2_creat(struct ksmbd_work *work, struct path *parent_path, in smb2_creat() argument
2552 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2565 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2572 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2577 rc = ksmbd_vfs_kern_path_locked(work, name, 0, parent_path, path, 0); in smb2_creat()
2586 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2610 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2636 * @work: smb work containing request buffer
2640 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2642 struct ksmbd_conn *conn = work->conn; in smb2_open()
2643 struct ksmbd_session *sess = work->sess; in smb2_open()
2644 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2673 WORK_BUFFERS(work, req, rsp); in smb2_open()
2675 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2679 smb2_set_err_rsp(work); in smb2_open()
2685 return create_smb2_pipe(work); in smb2_open()
2698 work->conn->local_nls); in smb2_open()
2709 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2864 if (ksmbd_override_fsids(work)) { in smb2_open()
2869 rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, in smb2_open()
2990 rc = smb2_creat(work, &parent_path, &path, name, open_flags, in smb2_open()
3071 fp = ksmbd_open_fd(work, filp); in smb2_open()
3102 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3109 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
3115 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3180 smb_break_all_oplock(work, fp); in smb2_open()
3199 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3220 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3259 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3406 ksmbd_revert_fsids(work); in smb2_open()
3409 ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED); in smb2_open()
3410 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len); in smb2_open()
3439 ksmbd_fd_put(work, fp); in smb2_open()
3440 smb2_set_err_rsp(work); in smb2_open()
3752 struct ksmbd_work *work; member
3809 ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
3814 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
3947 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
3980 static int smb2_resp_buf_len(struct ksmbd_work *work, unsigned short hdr2_len) in smb2_resp_buf_len() argument
3984 free_len = (int)(work->response_sz - in smb2_resp_buf_len()
3985 (get_rfc1002_len(work->response_buf) + 4)) - hdr2_len; in smb2_resp_buf_len()
3989 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
3995 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
3998 free_len = smb2_resp_buf_len(work, hdr2_len); in smb2_calc_max_out_buf_len()
4005 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
4007 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
4010 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
4019 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
4021 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
4023 smb2_set_err_rsp(work); in smb2_query_dir()
4033 dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_query_dir()
4075 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
4087 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
4100 query_dir_private.work = work; in smb2_query_dir()
4137 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4152 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4160 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4161 ksmbd_revert_fsids(work); in smb2_query_dir()
4186 smb2_set_err_rsp(work); in smb2_query_dir()
4187 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4188 ksmbd_revert_fsids(work); in smb2_query_dir()
4282 * @work: smb work containing query info command buffer
4290 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4325 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4518 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4523 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4538 filename = convert_to_nt_pathname(work->tcon->share_conf, &fp->filp->f_path); in get_file_all_info()
4582 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4587 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4603 static void get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4608 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4616 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4623 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
4864 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
4873 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
4876 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
4877 work->response_buf); in smb2_get_info_file()
4880 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
4883 work->compound_fid); in smb2_get_info_file()
4884 id = work->compound_fid; in smb2_get_info_file()
4885 pid = work->compound_pfid; in smb2_get_info_file()
4894 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
4902 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4906 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4910 get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4914 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
4918 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
4922 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
4926 get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
4930 get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4934 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4938 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
4942 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
4946 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4950 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4954 get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4958 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4961 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
4965 find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
4975 rsp, work->response_buf); in smb2_get_info_file()
4976 ksmbd_fd_put(work, fp); in smb2_get_info_file()
4980 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
4984 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
4985 struct ksmbd_conn *conn = work->conn; in smb2_get_info_filesystem()
4986 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5037 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_filesystem()
5167 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5188 rsp, work->response_buf); in smb2_get_info_filesystem()
5193 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5226 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5229 work->compound_fid); in smb2_get_info_sec()
5230 id = work->compound_fid; in smb2_get_info_sec()
5231 pid = work->compound_pfid; in smb2_get_info_sec()
5240 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5248 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5250 ppntsd_size = ksmbd_vfs_get_sd_xattr(work->conn, idmap, in smb2_get_info_sec()
5255 if (smb2_resp_buf_len(work, 8) > ppntsd_size) in smb2_get_info_sec()
5261 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5271 * @work: smb work containing query info request buffer
5275 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5281 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5288 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5292 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5296 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5307 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_info()
5323 smb2_set_err_rsp(work); in smb2_query_info()
5334 * @work: smb work containing close request buffer
5338 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5344 WORK_BUFFERS(work, req, rsp); in smb2_close_pipe()
5347 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5360 return ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close_pipe()
5366 * @work: smb work containing close request buffer
5370 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5376 struct ksmbd_conn *conn = work->conn; in smb2_close()
5382 WORK_BUFFERS(work, req, rsp); in smb2_close()
5384 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5387 return smb2_close_pipe(work); in smb2_close()
5392 sess_id = work->compound_sid; in smb2_close()
5394 work->compound_sid = 0; in smb2_close()
5396 work->compound_sid = sess_id; in smb2_close()
5405 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5407 if (!has_file_id(work->compound_fid)) { in smb2_close()
5416 work->compound_fid, in smb2_close()
5417 work->compound_pfid); in smb2_close()
5418 volatile_id = work->compound_fid; in smb2_close()
5421 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5422 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5433 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5452 ksmbd_fd_put(work, fp); in smb2_close()
5464 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5467 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close()
5473 smb2_set_err_rsp(work); in smb2_close()
5481 * @work: smb work containing echo request buffer
5485 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5487 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5489 if (work->next_smb2_rcv_hdr_off) in smb2_echo()
5490 rsp = ksmbd_resp_buf_next(work); in smb2_echo()
5494 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_echo_rsp)); in smb2_echo()
5497 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5561 rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags); in smb2_rename()
5567 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
5603 rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS, in smb2_create_link()
5613 rc = ksmbd_vfs_remove_file(work, &path); in smb2_create_link()
5629 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
5727 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
5748 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
5766 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
5777 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
5799 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
5810 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
5826 return smb2_rename(work, fp, rename_info, work->conn->local_nls); in set_rename_info()
5897 * @work: smb work containing set info command buffer
5905 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
5924 return set_file_allocation_info(work, fp, in smb2_set_info_file()
5932 return set_end_of_file_info(work, fp, in smb2_set_info_file()
5937 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info_file()
5946 return set_rename_info(work, fp, in smb2_set_info_file()
5955 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
5958 work->conn->local_nls); in smb2_set_info_file()
5962 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info_file()
6021 * @work: smb work containing set info request buffer
6025 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
6035 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
6036 req = ksmbd_req_buf_next(work); in smb2_set_info()
6037 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
6040 work->compound_fid); in smb2_set_info()
6041 id = work->compound_fid; in smb2_set_info()
6042 pid = work->compound_pfid; in smb2_set_info()
6045 req = smb2_get_msg(work->request_buf); in smb2_set_info()
6046 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6054 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6064 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6068 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6076 ksmbd_revert_fsids(work); in smb2_set_info()
6086 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_set_info()
6090 ksmbd_fd_put(work, fp); in smb2_set_info()
6112 smb2_set_err_rsp(work); in smb2_set_info()
6113 ksmbd_fd_put(work, fp); in smb2_set_info()
6120 * @work: smb work containing read IPC pipe command buffer
6124 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6132 WORK_BUFFERS(work, req, rsp); in smb2_read_pipe()
6136 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6155 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read_pipe()
6162 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_read_pipe()
6178 smb2_set_err_rsp(work); in smb2_read_pipe()
6183 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work, in smb2_set_remote_key_for_rdma() argument
6190 if (work->conn->dialect == SMB30_PROT_ID && in smb2_set_remote_key_for_rdma()
6206 work->need_invalidate_rkey = in smb2_set_remote_key_for_rdma()
6209 work->remote_key = le32_to_cpu(desc->token); in smb2_set_remote_key_for_rdma()
6213 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6219 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6231 * @work: smb work containing read command buffer
6235 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6237 struct ksmbd_conn *conn = work->conn; in smb2_read()
6250 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6253 return smb2_read_pipe(work); in smb2_read()
6256 if (work->next_smb2_rcv_hdr_off) { in smb2_read()
6257 req = ksmbd_req_buf_next(work); in smb2_read()
6258 rsp = ksmbd_resp_buf_next(work); in smb2_read()
6261 work->compound_fid); in smb2_read()
6262 id = work->compound_fid; in smb2_read()
6263 pid = work->compound_pfid; in smb2_read()
6266 req = smb2_get_msg(work->request_buf); in smb2_read()
6267 rsp = smb2_get_msg(work->response_buf); in smb2_read()
6288 err = smb2_set_remote_key_for_rdma(work, in smb2_read()
6297 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_read()
6329 nbytes = ksmbd_vfs_read(work, fp, length, &offset, aux_payload_buf); in smb2_read()
6338 smb2_set_err_rsp(work); in smb2_read()
6339 ksmbd_fd_put(work, fp); in smb2_read()
6348 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6366 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read()
6371 ksmbd_fd_put(work, fp); in smb2_read()
6391 smb2_set_err_rsp(work); in smb2_read()
6393 ksmbd_fd_put(work, fp); in smb2_read()
6399 * @work: smb work containing write IPC pipe command buffer
6403 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6413 WORK_BUFFERS(work, req, rsp); in smb2_write_pipe()
6419 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6422 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6430 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6435 smb2_set_err_rsp(work); in smb2_write_pipe()
6440 smb2_set_err_rsp(work); in smb2_write_pipe()
6453 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_write_pipe()
6458 smb2_set_err_rsp(work); in smb2_write_pipe()
6464 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6477 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6486 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6496 * @work: smb work containing write command buffer
6500 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6511 unsigned int max_write_size = work->conn->vals->max_write_size; in smb2_write()
6513 WORK_BUFFERS(work, req, rsp); in smb2_write()
6515 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6517 return smb2_write_pipe(work); in smb2_write()
6538 err = smb2_set_remote_key_for_rdma(work, in smb2_write()
6547 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
6553 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_write()
6588 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
6596 nbytes = smb2_write_rdma_channel(work, req, fp, offset, length, in smb2_write()
6610 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_write_rsp, Buffer)); in smb2_write()
6613 ksmbd_fd_put(work, fp); in smb2_write()
6632 smb2_set_err_rsp(work); in smb2_write()
6633 ksmbd_fd_put(work, fp); in smb2_write()
6639 * @work: smb work containing flush command buffer
6643 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
6649 WORK_BUFFERS(work, req, rsp); in smb2_flush()
6653 err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId); in smb2_flush()
6659 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_flush_rsp)); in smb2_flush()
6663 smb2_set_err_rsp(work); in smb2_flush()
6669 * @work: smb work containing cancel command buffer
6673 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
6675 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
6676 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
6681 if (work->next_smb2_rcv_hdr_off) in smb2_cancel()
6682 hdr = ksmbd_resp_buf_next(work); in smb2_cancel()
6717 iter == work) in smb2_cancel()
6731 work->send_no_response = 1; in smb2_cancel()
6837 * @work: smb work containing lock command buffer
6841 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
6861 WORK_BUFFERS(work, req, rsp); in smb2_lock()
6864 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_lock()
7077 rc = setup_async_work(work, in smb2_lock()
7085 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
7088 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
7093 list_del(&work->fp_entry); in smb2_lock()
7096 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
7100 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7104 smb2_send_interim_resp(work, in smb2_lock()
7106 work->send_no_response = 1; in smb2_lock()
7117 release_async_work(work); in smb2_lock()
7121 spin_lock(&work->conn->llist_lock); in smb2_lock()
7123 &work->conn->lock_list); in smb2_lock()
7126 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7135 smb_break_all_oplock(work, fp); in smb2_lock()
7141 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lock_rsp)); in smb2_lock()
7145 ksmbd_fd_put(work, fp); in smb2_lock()
7168 spin_lock(&work->conn->llist_lock); in smb2_lock()
7172 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7192 smb2_set_err_rsp(work); in smb2_lock()
7193 ksmbd_fd_put(work, fp); in smb2_lock()
7197 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7251 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7253 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7276 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7304 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7305 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7477 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7496 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7505 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7509 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7518 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
7554 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
7562 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
7574 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
7591 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
7595 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
7601 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in fsctl_request_resume_key()
7608 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
7615 * @work: smb work containing ioctl command buffer
7619 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
7625 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
7628 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
7629 req = ksmbd_req_buf_next(work); in smb2_ioctl()
7630 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
7633 work->compound_fid); in smb2_ioctl()
7634 id = work->compound_fid; in smb2_ioctl()
7637 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
7638 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
7650 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
7686 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
7728 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
7738 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
7758 fsctl_copychunk(work, in smb2_ioctl()
7772 ret = fsctl_set_sparse(work, id, in smb2_ioctl()
7783 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
7807 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7813 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
7814 ksmbd_fd_put(work, fp); in smb2_ioctl()
7826 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
7846 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7856 ksmbd_fd_put(work, fp); in smb2_ioctl()
7873 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
7881 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7918 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
7919 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
7940 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_ioctl_rsp) + nbytes); in smb2_ioctl()
7955 smb2_set_err_rsp(work); in smb2_ioctl()
7961 * @work: smb work containing oplock break command buffer
7965 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
7977 WORK_BUFFERS(work, req, rsp); in smb20_oplock_break_ack()
7985 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
7988 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7996 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7997 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8069 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8077 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); in smb20_oplock_break_ack()
8086 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8087 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8107 * @work: smb work containing lease break command buffer
8111 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
8113 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
8123 WORK_BUFFERS(work, req, rsp); in smb21_lease_break_ack()
8130 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8229 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); in smb21_lease_break_ack()
8240 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8245 * @work: smb work containing oplock/lease break command buffer
8249 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8254 WORK_BUFFERS(work, req, rsp); in smb2_oplock_break()
8258 smb20_oplock_break_ack(work); in smb2_oplock_break()
8261 smb21_lease_break_ack(work); in smb2_oplock_break()
8267 smb2_set_err_rsp(work); in smb2_oplock_break()
8275 * @work: smb work containing notify command buffer
8279 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8284 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8286 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8288 smb2_set_err_rsp(work); in smb2_notify()
8292 smb2_set_err_rsp(work); in smb2_notify()
8299 * @work: smb work containing notify command buffer
8304 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8306 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8319 * @work: smb work containing notify command buffer
8323 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8331 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8332 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8333 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8335 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8336 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8340 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8341 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8349 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8363 * @work: smb work containing notify command buffer
8366 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8373 hdr = ksmbd_resp_buf_curr(work); in smb2_set_sign_rsp()
8378 iov = &work->iov[work->iov_idx - 1]; in smb2_set_sign_rsp()
8381 iov = &work->iov[work->iov_idx]; in smb2_set_sign_rsp()
8384 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8391 * @work: smb work containing notify command buffer
8395 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8397 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8406 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8407 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8408 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8410 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8411 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8415 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8416 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8419 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8421 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8451 * @work: smb work containing notify command buffer
8454 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8456 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8464 hdr = ksmbd_resp_buf_curr(work); in smb3_set_sign_rsp()
8468 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8470 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8484 iov = &work->iov[work->iov_idx - 1]; in smb3_set_sign_rsp()
8487 iov = &work->iov[work->iov_idx]; in smb3_set_sign_rsp()
8497 * @work: smb work containing response buffer
8500 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8502 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8503 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8509 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8513 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8531 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8556 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
8558 struct kvec *iov = work->iov; in smb3_encrypt_resp()
8567 fill_transform_hdr(tr_buf, work->response_buf, work->conn->cipher_type); in smb3_encrypt_resp()
8571 work->tr_buf = tr_buf; in smb3_encrypt_resp()
8573 return ksmbd_crypt_message(work, iov, work->iov_idx + 1, 1); in smb3_encrypt_resp()
8583 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
8586 char *buf = work->request_buf; in smb3_decrypt_req()
8605 sess = ksmbd_session_lookup_all(work->conn, le64_to_cpu(tr_hdr->SessionId)); in smb3_decrypt_req()
8616 rc = ksmbd_crypt_message(work, iov, 2, 0); in smb3_decrypt_req()
8626 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
8628 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
8629 struct ksmbd_session *sess = work->sess; in smb3_11_final_sess_setup_resp()
8630 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
8635 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
8636 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()