Lines Matching full:work

43 static void __wbuf(struct ksmbd_work *work, void **req, void **rsp)  in __wbuf()  argument
45 if (work->next_smb2_rcv_hdr_off) { in __wbuf()
46 *req = ksmbd_req_buf_next(work); in __wbuf()
47 *rsp = ksmbd_resp_buf_next(work); in __wbuf()
49 *req = smb2_get_msg(work->request_buf); in __wbuf()
50 *rsp = smb2_get_msg(work->response_buf); in __wbuf()
86 * @work: smb work
91 int smb2_get_ksmbd_tcon(struct ksmbd_work *work) in smb2_get_ksmbd_tcon() argument
93 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_get_ksmbd_tcon()
104 if (xa_empty(&work->sess->tree_conns)) { in smb2_get_ksmbd_tcon()
113 * Just validate tree id in header with work->tcon->id. in smb2_get_ksmbd_tcon()
115 if (work->next_smb2_rcv_hdr_off) { in smb2_get_ksmbd_tcon()
116 if (!work->tcon) { in smb2_get_ksmbd_tcon()
120 if (tree_id != UINT_MAX && work->tcon->id != tree_id) { in smb2_get_ksmbd_tcon()
122 tree_id, work->tcon->id); in smb2_get_ksmbd_tcon()
128 work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); in smb2_get_ksmbd_tcon()
129 if (!work->tcon) { in smb2_get_ksmbd_tcon()
139 * @work: smb work containing response buffer
141 void smb2_set_err_rsp(struct ksmbd_work *work) in smb2_set_err_rsp() argument
145 if (work->next_smb2_rcv_hdr_off) in smb2_set_err_rsp()
146 err_rsp = ksmbd_resp_buf_next(work); in smb2_set_err_rsp()
148 err_rsp = smb2_get_msg(work->response_buf); in smb2_set_err_rsp()
158 err = ksmbd_iov_pin_rsp(work, (void *)err_rsp, in smb2_set_err_rsp()
162 work->send_no_response = 1; in smb2_set_err_rsp()
168 * @work: smb work containing smb header
172 bool is_smb2_neg_cmd(struct ksmbd_work *work) in is_smb2_neg_cmd() argument
174 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_smb2_neg_cmd()
192 * @work: smb work containing smb response buffer
196 bool is_smb2_rsp(struct ksmbd_work *work) in is_smb2_rsp() argument
198 struct smb2_hdr *hdr = smb2_get_msg(work->response_buf); in is_smb2_rsp()
213 * @work: smb work containing smb request buffer
217 u16 get_smb2_cmd_val(struct ksmbd_work *work) in get_smb2_cmd_val() argument
221 if (work->next_smb2_rcv_hdr_off) in get_smb2_cmd_val()
222 rcv_hdr = ksmbd_req_buf_next(work); in get_smb2_cmd_val()
224 rcv_hdr = smb2_get_msg(work->request_buf); in get_smb2_cmd_val()
230 * @work: smb work containing response buffer
233 void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err) in set_smb2_rsp_status() argument
237 rsp_hdr = smb2_get_msg(work->response_buf); in set_smb2_rsp_status()
240 work->iov_idx = 0; in set_smb2_rsp_status()
241 work->iov_cnt = 0; in set_smb2_rsp_status()
242 work->next_smb2_rcv_hdr_off = 0; in set_smb2_rsp_status()
243 smb2_set_err_rsp(work); in set_smb2_rsp_status()
248 * @work: smb work containing smb request buffer
253 int init_smb2_neg_rsp(struct ksmbd_work *work) in init_smb2_neg_rsp() argument
257 struct ksmbd_conn *conn = work->conn; in init_smb2_neg_rsp()
260 rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
274 rsp = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
300 err = ksmbd_iov_pin_rsp(work, rsp, in init_smb2_neg_rsp()
312 * @work: smb work containing smb response buffer
314 int smb2_set_rsp_credits(struct ksmbd_work *work) in smb2_set_rsp_credits() argument
316 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_set_rsp_credits()
317 struct smb2_hdr *hdr = ksmbd_resp_buf_next(work); in smb2_set_rsp_credits()
318 struct ksmbd_conn *conn = work->conn; in smb2_set_rsp_credits()
322 if (work->send_no_response) in smb2_set_rsp_credits()
359 work->credits_granted += credits_granted; in smb2_set_rsp_credits()
363 hdr->CreditRequest = cpu_to_le16(work->credits_granted); in smb2_set_rsp_credits()
374 * @work: smb work containing smb response buffer
376 static void init_chained_smb2_rsp(struct ksmbd_work *work) in init_chained_smb2_rsp() argument
378 struct smb2_hdr *req = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
379 struct smb2_hdr *rsp = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
393 work->compound_fid = ((struct smb2_create_rsp *)rsp)->VolatileFileId; in init_chained_smb2_rsp()
394 work->compound_pfid = ((struct smb2_create_rsp *)rsp)->PersistentFileId; in init_chained_smb2_rsp()
395 work->compound_sid = le64_to_cpu(rsp->SessionId); in init_chained_smb2_rsp()
398 len = get_rfc1002_len(work->response_buf) - work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
402 work->iov[work->iov_idx].iov_len += (new_len - len); in init_chained_smb2_rsp()
403 inc_rfc1001_len(work->response_buf, new_len - len); in init_chained_smb2_rsp()
406 work->next_smb2_rcv_hdr_off += next_hdr_offset; in init_chained_smb2_rsp()
407 work->curr_smb2_rsp_hdr_off = work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
408 work->next_smb2_rsp_hdr_off += new_len; in init_chained_smb2_rsp()
411 new_len, work->next_smb2_rcv_hdr_off, in init_chained_smb2_rsp()
412 work->next_smb2_rsp_hdr_off); in init_chained_smb2_rsp()
414 rsp_hdr = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
415 rcv_hdr = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
419 work->compound_fid = KSMBD_NO_FID; in init_chained_smb2_rsp()
420 work->compound_pfid = KSMBD_NO_FID; in init_chained_smb2_rsp()
442 * @work: smb work containing smb request buffer
446 bool is_chained_smb2_message(struct ksmbd_work *work) in is_chained_smb2_message() argument
448 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_chained_smb2_message()
454 hdr = ksmbd_req_buf_next(work); in is_chained_smb2_message()
457 if ((u64)work->next_smb2_rcv_hdr_off + next_cmd + in is_chained_smb2_message()
459 get_rfc1002_len(work->request_buf)) { in is_chained_smb2_message()
465 if ((u64)get_rfc1002_len(work->response_buf) + MAX_CIFS_SMALL_BUFFER_SIZE > in is_chained_smb2_message()
466 work->response_sz) { in is_chained_smb2_message()
472 init_chained_smb2_rsp(work); in is_chained_smb2_message()
474 } else if (work->next_smb2_rcv_hdr_off) { in is_chained_smb2_message()
479 len = ALIGN(get_rfc1002_len(work->response_buf), 8); in is_chained_smb2_message()
480 len = len - get_rfc1002_len(work->response_buf); in is_chained_smb2_message()
483 work->iov[work->iov_idx].iov_len += len; in is_chained_smb2_message()
484 inc_rfc1001_len(work->response_buf, len); in is_chained_smb2_message()
486 work->curr_smb2_rsp_hdr_off = work->next_smb2_rsp_hdr_off; in is_chained_smb2_message()
493 * @work: smb work containing smb request buffer
497 int init_smb2_rsp_hdr(struct ksmbd_work *work) in init_smb2_rsp_hdr() argument
499 struct smb2_hdr *rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_rsp_hdr()
500 struct smb2_hdr *rcv_hdr = smb2_get_msg(work->request_buf); in init_smb2_rsp_hdr()
523 * @work: smb work containing smb request buffer
527 int smb2_allocate_rsp_buf(struct ksmbd_work *work) in smb2_allocate_rsp_buf() argument
529 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
531 size_t large_sz = small_sz + work->conn->vals->max_trans_size; in smb2_allocate_rsp_buf()
541 if (get_rfc1002_len(work->request_buf) < in smb2_allocate_rsp_buf()
545 req = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
557 work->response_buf = kvzalloc(sz, KSMBD_DEFAULT_GFP); in smb2_allocate_rsp_buf()
558 if (!work->response_buf) in smb2_allocate_rsp_buf()
561 work->response_sz = sz; in smb2_allocate_rsp_buf()
567 * @work: smb work containing smb request buffer
571 int smb2_check_user_session(struct ksmbd_work *work) in smb2_check_user_session() argument
573 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_check_user_session()
574 struct ksmbd_conn *conn = work->conn; in smb2_check_user_session()
594 * Just validate session id in header with work->sess->id. in smb2_check_user_session()
596 if (work->next_smb2_rcv_hdr_off) { in smb2_check_user_session()
597 if (!work->sess) { in smb2_check_user_session()
601 if (sess_id != ULLONG_MAX && work->sess->id != sess_id) { in smb2_check_user_session()
603 sess_id, work->sess->id); in smb2_check_user_session()
610 work->sess = ksmbd_session_lookup_all(conn, sess_id); in smb2_check_user_session()
611 if (work->sess) in smb2_check_user_session()
652 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
654 struct ksmbd_conn *conn = work->conn; in setup_async_work()
662 work->asynchronous = true; in setup_async_work()
663 work->async_id = id; in setup_async_work()
667 work->async_id); in setup_async_work()
669 work->cancel_fn = fn; in setup_async_work()
670 work->cancel_argv = arg; in setup_async_work()
672 if (list_empty(&work->async_request_entry)) { in setup_async_work()
674 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
681 void release_async_work(struct ksmbd_work *work) in release_async_work() argument
683 struct ksmbd_conn *conn = work->conn; in release_async_work()
686 list_del_init(&work->async_request_entry); in release_async_work()
689 work->asynchronous = 0; in release_async_work()
690 work->cancel_fn = NULL; in release_async_work()
691 kfree(work->cancel_argv); in release_async_work()
692 work->cancel_argv = NULL; in release_async_work()
693 if (work->async_id) { in release_async_work()
694 ksmbd_release_id(&conn->async_ida, work->async_id); in release_async_work()
695 work->async_id = 0; in release_async_work()
699 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
713 in_work->conn = work->conn; in smb2_send_interim_resp()
714 memcpy(smb2_get_msg(in_work->response_buf), ksmbd_resp_buf_next(work), in smb2_send_interim_resp()
719 rsp_hdr->Id.AsyncId = cpu_to_le64(work->async_id); in smb2_send_interim_resp()
1088 * @work: smb work containing smb request buffer
1092 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1094 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1095 struct smb2_negotiate_req *req = smb2_get_msg(work->request_buf); in smb2_handle_negotiate()
1096 struct smb2_negotiate_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_handle_negotiate()
1105 work->send_no_response = 1; in smb2_handle_negotiate()
1110 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1168 get_rfc1002_len(work->request_buf)); in smb2_handle_negotiate()
1188 work->request_buf, in smb2_handle_negotiate()
1265 rc = ksmbd_iov_pin_rsp(work, rsp, in smb2_handle_negotiate()
1269 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1290 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1292 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1293 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1317 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1338 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1349 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->conn); in ntlm_negotiate()
1357 if (!work->conn->use_spnego) { in ntlm_negotiate()
1358 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1374 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()
1590 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1594 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1595 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1607 out_len = work->response_sz - in krb5_authenticate()
1667 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1675 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1677 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1688 work->send_no_response = 1; in smb2_sess_setup()
1692 WORK_BUFFERS(work, req, rsp); in smb2_sess_setup()
1794 work->sess = sess; in smb2_sess_setup()
1819 rc = generate_preauth_hash(work); in smb2_sess_setup()
1825 rc = krb5_authenticate(work, req, rsp); in smb2_sess_setup()
1839 rc = ntlm_negotiate(work, negblob, negblob_len, rsp); in smb2_sess_setup()
1845 rc = ntlm_authenticate(work, req, rsp); in smb2_sess_setup()
1923 work->sess = NULL; in smb2_sess_setup()
1930 smb2_set_err_rsp(work); in smb2_sess_setup()
1939 rc = ksmbd_iov_pin_rsp(work, rsp, iov_len); in smb2_sess_setup()
1950 * @work: smb work containing smb request buffer
1954 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1956 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1959 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1967 WORK_BUFFERS(work, req, rsp); in smb2_tree_connect()
1987 status = ksmbd_tree_conn_connect(work, name); in smb2_tree_connect()
2036 rc = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_tree_connect_rsp)); in smb2_tree_connect()
2072 smb2_set_err_rsp(work); in smb2_tree_connect()
2151 * @work: smb work containing request buffer
2155 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2159 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2160 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2165 WORK_BUFFERS(work, req, rsp); in smb2_tree_disconnect()
2175 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2195 work->tcon = NULL; in smb2_tree_disconnect()
2198 err = ksmbd_iov_pin_rsp(work, rsp, in smb2_tree_disconnect()
2208 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2215 * @work: smb work containing request buffer
2219 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2221 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2222 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2228 WORK_BUFFERS(work, req, rsp); in smb2_session_logoff()
2236 smb2_set_err_rsp(work); in smb2_session_logoff()
2243 ksmbd_close_session_fds(work); in smb2_session_logoff()
2249 smb2_set_err_rsp(work); in smb2_session_logoff()
2260 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp)); in smb2_session_logoff()
2263 smb2_set_err_rsp(work); in smb2_session_logoff()
2271 * @work: smb work containing request buffer
2275 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2283 WORK_BUFFERS(work, req, rsp); in create_smb2_pipe()
2286 1, work->conn->local_nls); in create_smb2_pipe()
2293 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2318 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_create_rsp, Buffer)); in create_smb2_pipe()
2339 smb2_set_err_rsp(work); in create_smb2_pipe()
2583 static int smb2_creat(struct ksmbd_work *work, struct path *parent_path, in smb2_creat() argument
2587 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2600 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2607 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2612 rc = ksmbd_vfs_kern_path_locked(work, name, 0, parent_path, path, 0); in smb2_creat()
2621 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2645 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2685 static int parse_durable_handle_context(struct ksmbd_work *work, in parse_durable_handle_context() argument
2690 struct ksmbd_conn *conn = work->conn; in parse_durable_handle_context()
2851 * @work: smb work containing request buffer
2855 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2857 struct ksmbd_conn *conn = work->conn; in smb2_open()
2858 struct ksmbd_session *sess = work->sess; in smb2_open()
2859 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2891 WORK_BUFFERS(work, req, rsp); in smb2_open()
2893 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2897 smb2_set_err_rsp(work); in smb2_open()
2903 return create_smb2_pipe(work); in smb2_open()
2909 work->conn->local_nls); in smb2_open()
2918 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2951 rc = parse_durable_handle_context(work, req, lc, &dh_info); in smb2_open()
2964 rc = ksmbd_reopen_durable_fd(work, dh_info.fp); in smb2_open()
2970 if (ksmbd_override_fsids(work)) { in smb2_open()
3112 if (ksmbd_override_fsids(work)) { in smb2_open()
3117 rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, in smb2_open()
3239 rc = smb2_creat(work, &parent_path, &path, name, open_flags, in smb2_open()
3320 fp = ksmbd_open_fd(work, filp); in smb2_open()
3351 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3358 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
3364 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3448 smb_break_all_oplock(work, fp); in smb2_open()
3453 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3486 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3525 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3565 test_share_config_flag(work->tcon->share_conf, in smb2_open()
3719 ksmbd_revert_fsids(work); in smb2_open()
3723 ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED); in smb2_open()
3724 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len); in smb2_open()
3753 ksmbd_fd_put(work, fp); in smb2_open()
3754 smb2_set_err_rsp(work); in smb2_open()
4086 struct ksmbd_work *work; member
4143 rc = ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
4153 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
4287 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
4320 static int smb2_resp_buf_len(struct ksmbd_work *work, unsigned short hdr2_len) in smb2_resp_buf_len() argument
4324 free_len = (int)(work->response_sz - in smb2_resp_buf_len()
4325 (get_rfc1002_len(work->response_buf) + 4)) - hdr2_len; in smb2_resp_buf_len()
4329 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
4335 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
4338 free_len = smb2_resp_buf_len(work, hdr2_len); in smb2_calc_max_out_buf_len()
4345 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
4347 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
4350 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
4361 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
4363 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
4365 smb2_set_err_rsp(work); in smb2_query_dir()
4375 dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_query_dir()
4417 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
4429 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
4442 query_dir_private.work = work; in smb2_query_dir()
4488 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4504 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4512 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4513 ksmbd_revert_fsids(work); in smb2_query_dir()
4538 smb2_set_err_rsp(work); in smb2_query_dir()
4539 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4540 ksmbd_revert_fsids(work); in smb2_query_dir()
4634 * @work: smb work containing query info command buffer
4642 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4678 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4879 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4884 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4899 filename = convert_to_nt_pathname(work->tcon->share_conf, &fp->filp->f_path); in get_file_all_info()
4945 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4950 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4966 static int get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4971 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4979 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4990 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
5274 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
5283 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
5286 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
5287 work->response_buf); in smb2_get_info_file()
5290 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
5293 work->compound_fid); in smb2_get_info_file()
5294 id = work->compound_fid; in smb2_get_info_file()
5295 pid = work->compound_pfid; in smb2_get_info_file()
5304 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
5312 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5316 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5320 rc = get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5324 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
5328 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5332 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5336 rc = get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5340 rc = get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5344 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5348 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
5352 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
5356 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5360 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5364 rc = get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5368 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5371 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
5375 rc = find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5385 rsp, work->response_buf); in smb2_get_info_file()
5386 ksmbd_fd_put(work, fp); in smb2_get_info_file()
5390 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
5394 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
5395 struct ksmbd_conn *conn = work->conn; in smb2_get_info_filesystem()
5396 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5430 if (!test_tree_conn_flag(work->tcon, in smb2_get_info_filesystem()
5452 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_filesystem()
5582 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5603 rsp, work->response_buf); in smb2_get_info_filesystem()
5608 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5641 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5644 work->compound_fid); in smb2_get_info_sec()
5645 id = work->compound_fid; in smb2_get_info_sec()
5646 pid = work->compound_pfid; in smb2_get_info_sec()
5655 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5663 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5665 ppntsd_size = ksmbd_vfs_get_sd_xattr(work->conn, idmap, in smb2_get_info_sec()
5670 if (smb2_resp_buf_len(work, 8) > ppntsd_size) in smb2_get_info_sec()
5676 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5686 * @work: smb work containing query info request buffer
5690 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5698 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5700 if (ksmbd_override_fsids(work)) { in smb2_query_info()
5708 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5712 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5716 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5723 ksmbd_revert_fsids(work); in smb2_query_info()
5728 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_info()
5745 smb2_set_err_rsp(work); in smb2_query_info()
5756 * @work: smb work containing close request buffer
5760 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5766 WORK_BUFFERS(work, req, rsp); in smb2_close_pipe()
5769 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5782 return ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close_pipe()
5788 * @work: smb work containing close request buffer
5792 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5798 struct ksmbd_conn *conn = work->conn; in smb2_close()
5805 WORK_BUFFERS(work, req, rsp); in smb2_close()
5807 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5810 return smb2_close_pipe(work); in smb2_close()
5815 sess_id = work->compound_sid; in smb2_close()
5817 work->compound_sid = 0; in smb2_close()
5819 work->compound_sid = sess_id; in smb2_close()
5828 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5830 if (!has_file_id(work->compound_fid)) { in smb2_close()
5839 work->compound_fid, in smb2_close()
5840 work->compound_pfid); in smb2_close()
5841 volatile_id = work->compound_fid; in smb2_close()
5844 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5845 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5859 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5868 ksmbd_fd_put(work, fp); in smb2_close()
5884 ksmbd_fd_put(work, fp); in smb2_close()
5896 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5899 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close()
5905 smb2_set_err_rsp(work); in smb2_close()
5913 * @work: smb work containing echo request buffer
5917 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5919 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5923 if (work->next_smb2_rcv_hdr_off) in smb2_echo()
5924 rsp = ksmbd_resp_buf_next(work); in smb2_echo()
5928 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_echo_rsp)); in smb2_echo()
5931 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5995 rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags); in smb2_rename()
5997 smb_break_all_levII_oplock(work, fp, 0); in smb2_rename()
6003 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
6039 rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS, in smb2_create_link()
6049 rc = ksmbd_vfs_remove_file(work, &path); in smb2_create_link()
6065 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
6158 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
6185 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
6203 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
6214 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
6236 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
6247 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
6263 return smb2_rename(work, fp, rename_info, work->conn->local_nls); in set_rename_info()
6334 * @work: smb work containing set info command buffer
6342 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
6362 return set_file_allocation_info(work, fp, in smb2_set_info_file()
6370 return set_end_of_file_info(work, fp, in smb2_set_info_file()
6378 return set_rename_info(work, fp, in smb2_set_info_file()
6387 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
6390 work->conn->local_nls); in smb2_set_info_file()
6447 * @work: smb work containing set info request buffer
6451 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
6461 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
6462 req = ksmbd_req_buf_next(work); in smb2_set_info()
6463 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
6466 work->compound_fid); in smb2_set_info()
6467 id = work->compound_fid; in smb2_set_info()
6468 pid = work->compound_pfid; in smb2_set_info()
6471 req = smb2_get_msg(work->request_buf); in smb2_set_info()
6472 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6475 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info()
6487 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6497 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6501 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6509 ksmbd_revert_fsids(work); in smb2_set_info()
6519 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_set_info()
6523 ksmbd_fd_put(work, fp); in smb2_set_info()
6545 smb2_set_err_rsp(work); in smb2_set_info()
6546 ksmbd_fd_put(work, fp); in smb2_set_info()
6553 * @work: smb work containing read IPC pipe command buffer
6557 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6565 WORK_BUFFERS(work, req, rsp); in smb2_read_pipe()
6569 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6588 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read_pipe()
6597 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_read_pipe()
6613 smb2_set_err_rsp(work); in smb2_read_pipe()
6618 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work, in smb2_set_remote_key_for_rdma() argument
6625 if (work->conn->dialect == SMB30_PROT_ID && in smb2_set_remote_key_for_rdma()
6641 work->need_invalidate_rkey = in smb2_set_remote_key_for_rdma()
6644 work->remote_key = le32_to_cpu(desc->token); in smb2_set_remote_key_for_rdma()
6648 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6654 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6666 * @work: smb work containing read command buffer
6670 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6672 struct ksmbd_conn *conn = work->conn; in smb2_read()
6687 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6690 return smb2_read_pipe(work); in smb2_read()
6693 if (work->next_smb2_rcv_hdr_off) { in smb2_read()
6694 req = ksmbd_req_buf_next(work); in smb2_read()
6695 rsp = ksmbd_resp_buf_next(work); in smb2_read()
6698 work->compound_fid); in smb2_read()
6699 id = work->compound_fid; in smb2_read()
6700 pid = work->compound_pfid; in smb2_read()
6703 req = smb2_get_msg(work->request_buf); in smb2_read()
6704 rsp = smb2_get_msg(work->response_buf); in smb2_read()
6725 err = smb2_set_remote_key_for_rdma(work, in smb2_read()
6734 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_read()
6770 nbytes = ksmbd_vfs_read(work, fp, length, &offset, aux_payload_buf); in smb2_read()
6779 smb2_set_err_rsp(work); in smb2_read()
6780 ksmbd_fd_put(work, fp); in smb2_read()
6789 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6807 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read()
6814 ksmbd_fd_put(work, fp); in smb2_read()
6834 smb2_set_err_rsp(work); in smb2_read()
6836 ksmbd_fd_put(work, fp); in smb2_read()
6842 * @work: smb work containing write IPC pipe command buffer
6846 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6856 WORK_BUFFERS(work, req, rsp); in smb2_write_pipe()
6862 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6865 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6873 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6878 smb2_set_err_rsp(work); in smb2_write_pipe()
6883 smb2_set_err_rsp(work); in smb2_write_pipe()
6896 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_write_pipe()
6901 smb2_set_err_rsp(work); in smb2_write_pipe()
6907 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6920 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6929 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6939 * @work: smb work containing write command buffer
6943 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6954 unsigned int max_write_size = work->conn->vals->max_write_size; in smb2_write()
6958 WORK_BUFFERS(work, req, rsp); in smb2_write()
6960 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6962 return smb2_write_pipe(work); in smb2_write()
6985 err = smb2_set_remote_key_for_rdma(work, in smb2_write()
6994 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
7000 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_write()
7035 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
7043 nbytes = smb2_write_rdma_channel(work, req, fp, offset, length, in smb2_write()
7057 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_write_rsp, Buffer)); in smb2_write()
7060 ksmbd_fd_put(work, fp); in smb2_write()
7079 smb2_set_err_rsp(work); in smb2_write()
7080 ksmbd_fd_put(work, fp); in smb2_write()
7086 * @work: smb work containing flush command buffer
7090 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
7096 WORK_BUFFERS(work, req, rsp); in smb2_flush()
7100 err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId); in smb2_flush()
7106 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_flush_rsp)); in smb2_flush()
7110 smb2_set_err_rsp(work); in smb2_flush()
7116 * @work: smb work containing cancel command buffer
7120 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
7122 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
7123 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
7128 if (work->next_smb2_rcv_hdr_off) in smb2_cancel()
7129 hdr = ksmbd_resp_buf_next(work); in smb2_cancel()
7164 iter == work) in smb2_cancel()
7178 work->send_no_response = 1; in smb2_cancel()
7284 * @work: smb work containing lock command buffer
7288 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
7308 WORK_BUFFERS(work, req, rsp); in smb2_lock()
7311 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_lock()
7524 rc = setup_async_work(work, in smb2_lock()
7533 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
7536 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
7541 list_del(&work->fp_entry); in smb2_lock()
7544 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
7548 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7552 smb2_send_interim_resp(work, in smb2_lock()
7554 work->send_no_response = 1; in smb2_lock()
7565 release_async_work(work); in smb2_lock()
7569 spin_lock(&work->conn->llist_lock); in smb2_lock()
7571 &work->conn->lock_list); in smb2_lock()
7574 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7583 smb_break_all_oplock(work, fp); in smb2_lock()
7589 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lock_rsp)); in smb2_lock()
7593 ksmbd_fd_put(work, fp); in smb2_lock()
7616 spin_lock(&work->conn->llist_lock); in smb2_lock()
7620 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7640 smb2_set_err_rsp(work); in smb2_lock()
7641 ksmbd_fd_put(work, fp); in smb2_lock()
7645 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7698 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7700 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7723 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7751 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7752 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7927 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7946 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7955 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7959 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7968 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
8004 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
8012 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
8024 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
8042 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
8046 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
8052 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in fsctl_request_resume_key()
8059 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
8066 * @work: smb work containing ioctl command buffer
8070 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
8076 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
8082 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
8083 req = ksmbd_req_buf_next(work); in smb2_ioctl()
8084 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
8087 work->compound_fid); in smb2_ioctl()
8088 id = work->compound_fid; in smb2_ioctl()
8091 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
8092 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
8106 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
8142 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
8184 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
8194 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8214 fsctl_copychunk(work, in smb2_ioctl()
8228 ret = fsctl_set_sparse(work, id, (struct file_sparse *)buffer); in smb2_ioctl()
8238 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8262 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8268 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
8269 ksmbd_fd_put(work, fp); in smb2_ioctl()
8281 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
8301 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8311 ksmbd_fd_put(work, fp); in smb2_ioctl()
8328 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
8336 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8373 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
8374 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
8395 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_ioctl_rsp) + nbytes); in smb2_ioctl()
8410 smb2_set_err_rsp(work); in smb2_ioctl()
8416 * @work: smb work containing oplock break command buffer
8420 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
8432 WORK_BUFFERS(work, req, rsp); in smb20_oplock_break_ack()
8440 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
8443 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8451 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8452 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8524 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8532 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); in smb20_oplock_break_ack()
8541 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8542 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8562 * @work: smb work containing lease break command buffer
8566 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
8568 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
8578 WORK_BUFFERS(work, req, rsp); in smb21_lease_break_ack()
8585 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8684 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); in smb21_lease_break_ack()
8694 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8699 * @work: smb work containing oplock/lease break command buffer
8703 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8710 WORK_BUFFERS(work, req, rsp); in smb2_oplock_break()
8714 smb20_oplock_break_ack(work); in smb2_oplock_break()
8717 smb21_lease_break_ack(work); in smb2_oplock_break()
8723 smb2_set_err_rsp(work); in smb2_oplock_break()
8731 * @work: smb work containing notify command buffer
8735 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8742 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8744 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8746 smb2_set_err_rsp(work); in smb2_notify()
8750 smb2_set_err_rsp(work); in smb2_notify()
8757 * @work: smb work containing notify command buffer
8762 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8764 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8777 * @work: smb work containing notify command buffer
8781 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8789 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8790 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8791 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8793 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8794 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8798 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8799 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8807 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8821 * @work: smb work containing notify command buffer
8824 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8831 hdr = ksmbd_resp_buf_curr(work); in smb2_set_sign_rsp()
8836 iov = &work->iov[work->iov_idx - 1]; in smb2_set_sign_rsp()
8839 iov = &work->iov[work->iov_idx]; in smb2_set_sign_rsp()
8842 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8849 * @work: smb work containing notify command buffer
8853 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8855 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8864 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8865 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8866 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8868 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8869 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8873 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8874 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8877 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8879 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8909 * @work: smb work containing notify command buffer
8912 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8914 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8922 hdr = ksmbd_resp_buf_curr(work); in smb3_set_sign_rsp()
8926 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8928 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8942 iov = &work->iov[work->iov_idx - 1]; in smb3_set_sign_rsp()
8945 iov = &work->iov[work->iov_idx]; in smb3_set_sign_rsp()
8955 * @work: smb work containing response buffer
8958 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8960 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8961 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8967 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8971 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8989 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
9014 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
9016 struct kvec *iov = work->iov; in smb3_encrypt_resp()
9025 fill_transform_hdr(tr_buf, work->response_buf, work->conn->cipher_type); in smb3_encrypt_resp()
9029 work->tr_buf = tr_buf; in smb3_encrypt_resp()
9031 return ksmbd_crypt_message(work, iov, work->iov_idx + 1, 1); in smb3_encrypt_resp()
9041 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
9044 char *buf = work->request_buf; in smb3_decrypt_req()
9063 sess = ksmbd_session_lookup_all(work->conn, le64_to_cpu(tr_hdr->SessionId)); in smb3_decrypt_req()
9075 rc = ksmbd_crypt_message(work, iov, 2, 0); in smb3_decrypt_req()
9085 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
9087 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
9088 struct ksmbd_session *sess = work->sess; in smb3_11_final_sess_setup_resp()
9089 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
9094 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
9095 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()