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()
647 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
649 struct ksmbd_conn *conn = work->conn; in setup_async_work()
657 work->asynchronous = true; in setup_async_work()
658 work->async_id = id; in setup_async_work()
662 work->async_id); in setup_async_work()
664 work->cancel_fn = fn; in setup_async_work()
665 work->cancel_argv = arg; in setup_async_work()
667 if (list_empty(&work->async_request_entry)) { in setup_async_work()
669 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
676 void release_async_work(struct ksmbd_work *work) in release_async_work() argument
678 struct ksmbd_conn *conn = work->conn; in release_async_work()
681 list_del_init(&work->async_request_entry); in release_async_work()
684 work->asynchronous = 0; in release_async_work()
685 work->cancel_fn = NULL; in release_async_work()
686 kfree(work->cancel_argv); in release_async_work()
687 work->cancel_argv = NULL; in release_async_work()
688 if (work->async_id) { in release_async_work()
689 ksmbd_release_id(&conn->async_ida, work->async_id); in release_async_work()
690 work->async_id = 0; in release_async_work()
694 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
708 in_work->conn = work->conn; in smb2_send_interim_resp()
709 memcpy(smb2_get_msg(in_work->response_buf), ksmbd_resp_buf_next(work), in smb2_send_interim_resp()
714 rsp_hdr->Id.AsyncId = cpu_to_le64(work->async_id); in smb2_send_interim_resp()
1083 * @work: smb work containing smb request buffer
1087 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1089 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1090 struct smb2_negotiate_req *req = smb2_get_msg(work->request_buf); in smb2_handle_negotiate()
1091 struct smb2_negotiate_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_handle_negotiate()
1100 work->send_no_response = 1; in smb2_handle_negotiate()
1105 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1163 get_rfc1002_len(work->request_buf)); in smb2_handle_negotiate()
1183 work->request_buf, in smb2_handle_negotiate()
1260 rc = ksmbd_iov_pin_rsp(work, rsp, in smb2_handle_negotiate()
1264 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1285 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1287 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1288 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1312 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1333 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1344 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->conn); in ntlm_negotiate()
1352 if (!work->conn->use_spnego) { in ntlm_negotiate()
1353 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1369 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1442 static int ntlm_authenticate(struct ksmbd_work *work, in ntlm_authenticate() argument
1446 struct ksmbd_conn *conn = work->conn; in ntlm_authenticate()
1447 struct ksmbd_session *sess = work->sess; in ntlm_authenticate()
1580 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1584 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1585 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1597 out_len = work->response_sz - in krb5_authenticate()
1662 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1670 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1672 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1683 work->send_no_response = 1; in smb2_sess_setup()
1687 WORK_BUFFERS(work, req, rsp); in smb2_sess_setup()
1789 work->sess = sess; in smb2_sess_setup()
1814 rc = generate_preauth_hash(work); in smb2_sess_setup()
1820 rc = krb5_authenticate(work, req, rsp); in smb2_sess_setup()
1834 rc = ntlm_negotiate(work, negblob, negblob_len, rsp); in smb2_sess_setup()
1840 rc = ntlm_authenticate(work, req, rsp); in smb2_sess_setup()
1918 work->sess = NULL; in smb2_sess_setup()
1925 smb2_set_err_rsp(work); in smb2_sess_setup()
1934 rc = ksmbd_iov_pin_rsp(work, rsp, iov_len); in smb2_sess_setup()
1945 * @work: smb work containing smb request buffer
1949 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1951 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1954 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1962 WORK_BUFFERS(work, req, rsp); in smb2_tree_connect()
1982 status = ksmbd_tree_conn_connect(work, name); in smb2_tree_connect()
2031 rc = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_tree_connect_rsp)); in smb2_tree_connect()
2067 smb2_set_err_rsp(work); in smb2_tree_connect()
2146 * @work: smb work containing request buffer
2150 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2154 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2155 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2160 WORK_BUFFERS(work, req, rsp); in smb2_tree_disconnect()
2170 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2190 work->tcon = NULL; in smb2_tree_disconnect()
2193 err = ksmbd_iov_pin_rsp(work, rsp, in smb2_tree_disconnect()
2203 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2210 * @work: smb work containing request buffer
2214 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2216 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2217 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2223 WORK_BUFFERS(work, req, rsp); in smb2_session_logoff()
2231 smb2_set_err_rsp(work); in smb2_session_logoff()
2238 ksmbd_close_session_fds(work); in smb2_session_logoff()
2244 smb2_set_err_rsp(work); in smb2_session_logoff()
2259 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp)); in smb2_session_logoff()
2262 smb2_set_err_rsp(work); in smb2_session_logoff()
2270 * @work: smb work containing request buffer
2274 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2282 WORK_BUFFERS(work, req, rsp); in create_smb2_pipe()
2285 1, work->conn->local_nls); in create_smb2_pipe()
2292 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2317 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_create_rsp, Buffer)); in create_smb2_pipe()
2338 smb2_set_err_rsp(work); in create_smb2_pipe()
2582 static int smb2_creat(struct ksmbd_work *work, struct path *parent_path, in smb2_creat() argument
2586 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2599 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2606 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2611 rc = ksmbd_vfs_kern_path_locked(work, name, 0, parent_path, path, 0); in smb2_creat()
2620 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2644 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2684 static int parse_durable_handle_context(struct ksmbd_work *work, in parse_durable_handle_context() argument
2689 struct ksmbd_conn *conn = work->conn; in parse_durable_handle_context()
2850 * @work: smb work containing request buffer
2854 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2856 struct ksmbd_conn *conn = work->conn; in smb2_open()
2857 struct ksmbd_session *sess = work->sess; in smb2_open()
2858 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2890 WORK_BUFFERS(work, req, rsp); in smb2_open()
2892 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2896 smb2_set_err_rsp(work); in smb2_open()
2902 return create_smb2_pipe(work); in smb2_open()
2908 work->conn->local_nls); in smb2_open()
2917 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2950 rc = parse_durable_handle_context(work, req, lc, &dh_info); in smb2_open()
2963 rc = ksmbd_reopen_durable_fd(work, dh_info.fp); in smb2_open()
2969 if (ksmbd_override_fsids(work)) { in smb2_open()
3111 if (ksmbd_override_fsids(work)) { in smb2_open()
3116 rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, in smb2_open()
3238 rc = smb2_creat(work, &parent_path, &path, name, open_flags, in smb2_open()
3319 fp = ksmbd_open_fd(work, filp); in smb2_open()
3350 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3357 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
3363 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3447 smb_break_all_oplock(work, fp); in smb2_open()
3452 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3485 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3524 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3564 test_share_config_flag(work->tcon->share_conf, in smb2_open()
3718 ksmbd_revert_fsids(work); in smb2_open()
3722 ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED); in smb2_open()
3723 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len); in smb2_open()
3752 ksmbd_fd_put(work, fp); in smb2_open()
3753 smb2_set_err_rsp(work); in smb2_open()
4085 struct ksmbd_work *work; member
4142 rc = ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
4152 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
4286 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
4319 static int smb2_resp_buf_len(struct ksmbd_work *work, unsigned short hdr2_len) in smb2_resp_buf_len() argument
4323 free_len = (int)(work->response_sz - in smb2_resp_buf_len()
4324 (get_rfc1002_len(work->response_buf) + 4)) - hdr2_len; in smb2_resp_buf_len()
4328 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
4334 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
4337 free_len = smb2_resp_buf_len(work, hdr2_len); in smb2_calc_max_out_buf_len()
4344 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
4346 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
4349 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
4360 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
4362 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
4364 smb2_set_err_rsp(work); in smb2_query_dir()
4374 dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_query_dir()
4416 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
4428 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
4441 query_dir_private.work = work; in smb2_query_dir()
4487 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4503 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4511 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4512 ksmbd_revert_fsids(work); in smb2_query_dir()
4537 smb2_set_err_rsp(work); in smb2_query_dir()
4538 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4539 ksmbd_revert_fsids(work); in smb2_query_dir()
4633 * @work: smb work containing query info command buffer
4641 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4677 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4878 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4883 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4898 filename = convert_to_nt_pathname(work->tcon->share_conf, &fp->filp->f_path); in get_file_all_info()
4944 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4949 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4965 static int get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4970 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4978 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4989 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
5273 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
5282 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
5285 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
5286 work->response_buf); in smb2_get_info_file()
5289 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
5292 work->compound_fid); in smb2_get_info_file()
5293 id = work->compound_fid; in smb2_get_info_file()
5294 pid = work->compound_pfid; in smb2_get_info_file()
5303 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
5311 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5315 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5319 rc = get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5323 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
5327 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5331 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5335 rc = get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5339 rc = get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5343 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5347 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
5351 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
5355 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5359 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5363 rc = get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5367 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5370 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
5374 rc = find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5384 rsp, work->response_buf); in smb2_get_info_file()
5385 ksmbd_fd_put(work, fp); in smb2_get_info_file()
5389 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
5393 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
5394 struct ksmbd_conn *conn = work->conn; in smb2_get_info_filesystem()
5395 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5429 if (!test_tree_conn_flag(work->tcon, in smb2_get_info_filesystem()
5451 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_filesystem()
5581 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5602 rsp, work->response_buf); in smb2_get_info_filesystem()
5607 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5640 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5643 work->compound_fid); in smb2_get_info_sec()
5644 id = work->compound_fid; in smb2_get_info_sec()
5645 pid = work->compound_pfid; in smb2_get_info_sec()
5654 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5662 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5664 ppntsd_size = ksmbd_vfs_get_sd_xattr(work->conn, idmap, in smb2_get_info_sec()
5669 if (smb2_resp_buf_len(work, 8) > ppntsd_size) in smb2_get_info_sec()
5675 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5685 * @work: smb work containing query info request buffer
5689 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5697 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5699 if (ksmbd_override_fsids(work)) { in smb2_query_info()
5707 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5711 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5715 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5722 ksmbd_revert_fsids(work); in smb2_query_info()
5727 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_info()
5744 smb2_set_err_rsp(work); in smb2_query_info()
5755 * @work: smb work containing close request buffer
5759 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5765 WORK_BUFFERS(work, req, rsp); in smb2_close_pipe()
5768 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5781 return ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close_pipe()
5787 * @work: smb work containing close request buffer
5791 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5797 struct ksmbd_conn *conn = work->conn; in smb2_close()
5804 WORK_BUFFERS(work, req, rsp); in smb2_close()
5806 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5809 return smb2_close_pipe(work); in smb2_close()
5814 sess_id = work->compound_sid; in smb2_close()
5816 work->compound_sid = 0; in smb2_close()
5818 work->compound_sid = sess_id; in smb2_close()
5827 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5829 if (!has_file_id(work->compound_fid)) { in smb2_close()
5838 work->compound_fid, in smb2_close()
5839 work->compound_pfid); in smb2_close()
5840 volatile_id = work->compound_fid; in smb2_close()
5843 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5844 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5858 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5867 ksmbd_fd_put(work, fp); in smb2_close()
5883 ksmbd_fd_put(work, fp); in smb2_close()
5895 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5898 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close()
5904 smb2_set_err_rsp(work); in smb2_close()
5912 * @work: smb work containing echo request buffer
5916 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5918 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5922 if (work->next_smb2_rcv_hdr_off) in smb2_echo()
5923 rsp = ksmbd_resp_buf_next(work); in smb2_echo()
5927 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_echo_rsp)); in smb2_echo()
5930 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5994 rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags); in smb2_rename()
5996 smb_break_all_levII_oplock(work, fp, 0); in smb2_rename()
6002 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
6038 rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS, in smb2_create_link()
6048 rc = ksmbd_vfs_remove_file(work, &path); in smb2_create_link()
6064 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
6157 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
6184 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
6202 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
6213 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
6235 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
6246 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
6262 return smb2_rename(work, fp, rename_info, work->conn->local_nls); in set_rename_info()
6333 * @work: smb work containing set info command buffer
6341 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
6361 return set_file_allocation_info(work, fp, in smb2_set_info_file()
6369 return set_end_of_file_info(work, fp, in smb2_set_info_file()
6377 return set_rename_info(work, fp, in smb2_set_info_file()
6386 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
6389 work->conn->local_nls); in smb2_set_info_file()
6446 * @work: smb work containing set info request buffer
6450 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
6460 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
6461 req = ksmbd_req_buf_next(work); in smb2_set_info()
6462 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
6465 work->compound_fid); in smb2_set_info()
6466 id = work->compound_fid; in smb2_set_info()
6467 pid = work->compound_pfid; in smb2_set_info()
6470 req = smb2_get_msg(work->request_buf); in smb2_set_info()
6471 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6474 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info()
6486 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6496 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6500 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6508 ksmbd_revert_fsids(work); in smb2_set_info()
6518 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_set_info()
6522 ksmbd_fd_put(work, fp); in smb2_set_info()
6544 smb2_set_err_rsp(work); in smb2_set_info()
6545 ksmbd_fd_put(work, fp); in smb2_set_info()
6552 * @work: smb work containing read IPC pipe command buffer
6556 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6564 WORK_BUFFERS(work, req, rsp); in smb2_read_pipe()
6568 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6587 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read_pipe()
6596 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_read_pipe()
6612 smb2_set_err_rsp(work); in smb2_read_pipe()
6617 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work, in smb2_set_remote_key_for_rdma() argument
6624 if (work->conn->dialect == SMB30_PROT_ID && in smb2_set_remote_key_for_rdma()
6640 work->need_invalidate_rkey = in smb2_set_remote_key_for_rdma()
6643 work->remote_key = le32_to_cpu(desc->token); in smb2_set_remote_key_for_rdma()
6647 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6653 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6665 * @work: smb work containing read command buffer
6669 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6671 struct ksmbd_conn *conn = work->conn; in smb2_read()
6686 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6689 return smb2_read_pipe(work); in smb2_read()
6692 if (work->next_smb2_rcv_hdr_off) { in smb2_read()
6693 req = ksmbd_req_buf_next(work); in smb2_read()
6694 rsp = ksmbd_resp_buf_next(work); in smb2_read()
6697 work->compound_fid); in smb2_read()
6698 id = work->compound_fid; in smb2_read()
6699 pid = work->compound_pfid; in smb2_read()
6702 req = smb2_get_msg(work->request_buf); in smb2_read()
6703 rsp = smb2_get_msg(work->response_buf); in smb2_read()
6724 err = smb2_set_remote_key_for_rdma(work, in smb2_read()
6733 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_read()
6769 nbytes = ksmbd_vfs_read(work, fp, length, &offset, aux_payload_buf); in smb2_read()
6778 smb2_set_err_rsp(work); in smb2_read()
6779 ksmbd_fd_put(work, fp); in smb2_read()
6788 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6806 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read()
6813 ksmbd_fd_put(work, fp); in smb2_read()
6833 smb2_set_err_rsp(work); in smb2_read()
6835 ksmbd_fd_put(work, fp); in smb2_read()
6841 * @work: smb work containing write IPC pipe command buffer
6845 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6855 WORK_BUFFERS(work, req, rsp); in smb2_write_pipe()
6861 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6864 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6872 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6877 smb2_set_err_rsp(work); in smb2_write_pipe()
6882 smb2_set_err_rsp(work); in smb2_write_pipe()
6895 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_write_pipe()
6900 smb2_set_err_rsp(work); in smb2_write_pipe()
6906 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6919 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6928 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6938 * @work: smb work containing write command buffer
6942 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6953 unsigned int max_write_size = work->conn->vals->max_write_size; in smb2_write()
6957 WORK_BUFFERS(work, req, rsp); in smb2_write()
6959 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6961 return smb2_write_pipe(work); in smb2_write()
6984 err = smb2_set_remote_key_for_rdma(work, in smb2_write()
6993 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
6999 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_write()
7034 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
7042 nbytes = smb2_write_rdma_channel(work, req, fp, offset, length, in smb2_write()
7056 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_write_rsp, Buffer)); in smb2_write()
7059 ksmbd_fd_put(work, fp); in smb2_write()
7078 smb2_set_err_rsp(work); in smb2_write()
7079 ksmbd_fd_put(work, fp); in smb2_write()
7085 * @work: smb work containing flush command buffer
7089 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
7095 WORK_BUFFERS(work, req, rsp); in smb2_flush()
7099 err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId); in smb2_flush()
7105 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_flush_rsp)); in smb2_flush()
7109 smb2_set_err_rsp(work); in smb2_flush()
7115 * @work: smb work containing cancel command buffer
7119 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
7121 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
7122 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
7127 if (work->next_smb2_rcv_hdr_off) in smb2_cancel()
7128 hdr = ksmbd_resp_buf_next(work); in smb2_cancel()
7163 iter == work) in smb2_cancel()
7177 work->send_no_response = 1; in smb2_cancel()
7283 * @work: smb work containing lock command buffer
7287 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
7307 WORK_BUFFERS(work, req, rsp); in smb2_lock()
7310 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_lock()
7523 rc = setup_async_work(work, in smb2_lock()
7532 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
7535 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
7540 list_del(&work->fp_entry); in smb2_lock()
7543 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
7547 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7551 smb2_send_interim_resp(work, in smb2_lock()
7553 work->send_no_response = 1; in smb2_lock()
7564 release_async_work(work); in smb2_lock()
7568 spin_lock(&work->conn->llist_lock); in smb2_lock()
7570 &work->conn->lock_list); in smb2_lock()
7573 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7582 smb_break_all_oplock(work, fp); in smb2_lock()
7588 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lock_rsp)); in smb2_lock()
7592 ksmbd_fd_put(work, fp); in smb2_lock()
7615 spin_lock(&work->conn->llist_lock); in smb2_lock()
7619 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7639 smb2_set_err_rsp(work); in smb2_lock()
7640 ksmbd_fd_put(work, fp); in smb2_lock()
7644 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7697 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7699 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7722 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7750 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7751 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7926 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7945 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7954 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7958 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7967 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
8003 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
8011 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
8023 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
8041 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
8045 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
8051 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in fsctl_request_resume_key()
8058 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
8065 * @work: smb work containing ioctl command buffer
8069 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
8075 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
8081 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
8082 req = ksmbd_req_buf_next(work); in smb2_ioctl()
8083 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
8086 work->compound_fid); in smb2_ioctl()
8087 id = work->compound_fid; in smb2_ioctl()
8090 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
8091 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
8105 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
8141 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
8183 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
8193 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8213 fsctl_copychunk(work, in smb2_ioctl()
8227 ret = fsctl_set_sparse(work, id, (struct file_sparse *)buffer); in smb2_ioctl()
8237 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8261 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8267 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
8268 ksmbd_fd_put(work, fp); in smb2_ioctl()
8280 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
8300 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8310 ksmbd_fd_put(work, fp); in smb2_ioctl()
8327 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
8335 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8372 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
8373 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
8394 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_ioctl_rsp) + nbytes); in smb2_ioctl()
8409 smb2_set_err_rsp(work); in smb2_ioctl()
8415 * @work: smb work containing oplock break command buffer
8419 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
8431 WORK_BUFFERS(work, req, rsp); in smb20_oplock_break_ack()
8439 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
8442 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8450 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8451 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8523 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8531 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); in smb20_oplock_break_ack()
8540 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8541 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8561 * @work: smb work containing lease break command buffer
8565 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
8567 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
8577 WORK_BUFFERS(work, req, rsp); in smb21_lease_break_ack()
8584 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8683 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); in smb21_lease_break_ack()
8693 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8698 * @work: smb work containing oplock/lease break command buffer
8702 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8709 WORK_BUFFERS(work, req, rsp); in smb2_oplock_break()
8713 smb20_oplock_break_ack(work); in smb2_oplock_break()
8716 smb21_lease_break_ack(work); in smb2_oplock_break()
8722 smb2_set_err_rsp(work); in smb2_oplock_break()
8730 * @work: smb work containing notify command buffer
8734 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8741 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8743 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8745 smb2_set_err_rsp(work); in smb2_notify()
8749 smb2_set_err_rsp(work); in smb2_notify()
8756 * @work: smb work containing notify command buffer
8761 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8763 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8776 * @work: smb work containing notify command buffer
8780 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8788 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8789 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8790 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8792 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8793 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8797 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8798 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8806 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8820 * @work: smb work containing notify command buffer
8823 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8830 hdr = ksmbd_resp_buf_curr(work); in smb2_set_sign_rsp()
8835 iov = &work->iov[work->iov_idx - 1]; in smb2_set_sign_rsp()
8838 iov = &work->iov[work->iov_idx]; in smb2_set_sign_rsp()
8841 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8848 * @work: smb work containing notify command buffer
8852 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8854 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8863 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8864 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8865 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8867 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8868 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8872 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8873 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8876 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8878 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8908 * @work: smb work containing notify command buffer
8911 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8913 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8921 hdr = ksmbd_resp_buf_curr(work); in smb3_set_sign_rsp()
8925 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8927 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8941 iov = &work->iov[work->iov_idx - 1]; in smb3_set_sign_rsp()
8944 iov = &work->iov[work->iov_idx]; in smb3_set_sign_rsp()
8954 * @work: smb work containing response buffer
8957 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8959 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8960 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8966 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8970 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8988 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
9013 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
9015 struct kvec *iov = work->iov; in smb3_encrypt_resp()
9024 fill_transform_hdr(tr_buf, work->response_buf, work->conn->cipher_type); in smb3_encrypt_resp()
9028 work->tr_buf = tr_buf; in smb3_encrypt_resp()
9030 return ksmbd_crypt_message(work, iov, work->iov_idx + 1, 1); in smb3_encrypt_resp()
9040 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
9043 char *buf = work->request_buf; in smb3_decrypt_req()
9062 sess = ksmbd_session_lookup_all(work->conn, le64_to_cpu(tr_hdr->SessionId)); in smb3_decrypt_req()
9074 rc = ksmbd_crypt_message(work, iov, 2, 0); in smb3_decrypt_req()
9084 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
9086 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
9087 struct ksmbd_session *sess = work->sess; in smb3_11_final_sess_setup_resp()
9088 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
9093 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
9094 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()