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()
1668 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1676 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1678 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1689 work->send_no_response = 1; in smb2_sess_setup()
1693 WORK_BUFFERS(work, req, rsp); in smb2_sess_setup()
1795 work->sess = sess; in smb2_sess_setup()
1820 rc = generate_preauth_hash(work); in smb2_sess_setup()
1826 rc = krb5_authenticate(work, req, rsp); in smb2_sess_setup()
1840 rc = ntlm_negotiate(work, negblob, negblob_len, rsp); in smb2_sess_setup()
1846 rc = ntlm_authenticate(work, req, rsp); in smb2_sess_setup()
1924 work->sess = NULL; in smb2_sess_setup()
1931 smb2_set_err_rsp(work); in smb2_sess_setup()
1940 rc = ksmbd_iov_pin_rsp(work, rsp, iov_len); in smb2_sess_setup()
1951 * @work: smb work containing smb request buffer
1955 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1957 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1960 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1968 WORK_BUFFERS(work, req, rsp); in smb2_tree_connect()
1988 status = ksmbd_tree_conn_connect(work, name); in smb2_tree_connect()
2037 rc = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_tree_connect_rsp)); in smb2_tree_connect()
2073 smb2_set_err_rsp(work); in smb2_tree_connect()
2152 * @work: smb work containing request buffer
2156 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2160 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2161 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2166 WORK_BUFFERS(work, req, rsp); in smb2_tree_disconnect()
2176 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2196 work->tcon = NULL; in smb2_tree_disconnect()
2199 err = ksmbd_iov_pin_rsp(work, rsp, in smb2_tree_disconnect()
2209 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2216 * @work: smb work containing request buffer
2220 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2222 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2223 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2229 WORK_BUFFERS(work, req, rsp); in smb2_session_logoff()
2237 smb2_set_err_rsp(work); in smb2_session_logoff()
2244 ksmbd_close_session_fds(work); in smb2_session_logoff()
2250 smb2_set_err_rsp(work); in smb2_session_logoff()
2261 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp)); in smb2_session_logoff()
2264 smb2_set_err_rsp(work); in smb2_session_logoff()
2272 * @work: smb work containing request buffer
2276 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2284 WORK_BUFFERS(work, req, rsp); in create_smb2_pipe()
2287 1, work->conn->local_nls); in create_smb2_pipe()
2294 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2319 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_create_rsp, Buffer)); in create_smb2_pipe()
2340 smb2_set_err_rsp(work); in create_smb2_pipe()
2584 static int smb2_creat(struct ksmbd_work *work, struct path *parent_path, in smb2_creat() argument
2588 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2601 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2608 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2613 rc = ksmbd_vfs_kern_path_locked(work, name, 0, parent_path, path, 0); in smb2_creat()
2622 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2646 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2686 static int parse_durable_handle_context(struct ksmbd_work *work, in parse_durable_handle_context() argument
2691 struct ksmbd_conn *conn = work->conn; in parse_durable_handle_context()
2852 * @work: smb work containing request buffer
2856 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2858 struct ksmbd_conn *conn = work->conn; in smb2_open()
2859 struct ksmbd_session *sess = work->sess; in smb2_open()
2860 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2892 WORK_BUFFERS(work, req, rsp); in smb2_open()
2894 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2898 smb2_set_err_rsp(work); in smb2_open()
2904 return create_smb2_pipe(work); in smb2_open()
2931 work->conn->local_nls); in smb2_open()
2940 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2975 rc = parse_durable_handle_context(work, req, lc, &dh_info); in smb2_open()
2988 rc = ksmbd_reopen_durable_fd(work, dh_info.fp); in smb2_open()
2994 if (ksmbd_override_fsids(work)) { in smb2_open()
3114 if (ksmbd_override_fsids(work)) { in smb2_open()
3119 rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, in smb2_open()
3241 rc = smb2_creat(work, &parent_path, &path, name, open_flags, in smb2_open()
3322 fp = ksmbd_open_fd(work, filp); in smb2_open()
3353 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3360 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
3366 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3450 smb_break_all_oplock(work, fp); in smb2_open()
3455 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3488 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3527 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3576 test_share_config_flag(work->tcon->share_conf, in smb2_open()
3730 ksmbd_revert_fsids(work); in smb2_open()
3734 ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED); in smb2_open()
3735 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len); in smb2_open()
3764 ksmbd_fd_put(work, fp); in smb2_open()
3765 smb2_set_err_rsp(work); in smb2_open()
4103 struct ksmbd_work *work; member
4161 rc = ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
4171 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
4305 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
4338 static int smb2_resp_buf_len(struct ksmbd_work *work, unsigned short hdr2_len) in smb2_resp_buf_len() argument
4342 free_len = (int)(work->response_sz - in smb2_resp_buf_len()
4343 (get_rfc1002_len(work->response_buf) + 4)) - hdr2_len; in smb2_resp_buf_len()
4347 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
4353 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
4356 free_len = smb2_resp_buf_len(work, hdr2_len); in smb2_calc_max_out_buf_len()
4363 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
4365 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
4368 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
4379 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
4381 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
4383 smb2_set_err_rsp(work); in smb2_query_dir()
4393 dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_query_dir()
4435 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
4447 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
4460 query_dir_private.work = work; in smb2_query_dir()
4506 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4522 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4530 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4531 ksmbd_revert_fsids(work); in smb2_query_dir()
4556 smb2_set_err_rsp(work); in smb2_query_dir()
4557 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4558 ksmbd_revert_fsids(work); in smb2_query_dir()
4652 * @work: smb work containing query info command buffer
4660 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4696 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4902 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4907 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4922 filename = convert_to_nt_pathname(work->tcon->share_conf, &fp->filp->f_path); in get_file_all_info()
4976 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4981 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4997 static int get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
5002 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
5010 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
5021 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
5319 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
5328 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
5331 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
5332 work->response_buf); in smb2_get_info_file()
5335 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
5338 work->compound_fid); in smb2_get_info_file()
5339 id = work->compound_fid; in smb2_get_info_file()
5340 pid = work->compound_pfid; in smb2_get_info_file()
5349 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
5357 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5361 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5365 rc = get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5369 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
5373 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5377 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5381 rc = get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5385 rc = get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5389 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5393 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
5397 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
5401 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5405 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5409 rc = get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5413 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5416 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
5420 rc = find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5430 rsp, work->response_buf); in smb2_get_info_file()
5431 ksmbd_fd_put(work, fp); in smb2_get_info_file()
5435 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
5439 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
5440 struct ksmbd_conn *conn = work->conn; in smb2_get_info_filesystem()
5441 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5475 if (!test_tree_conn_flag(work->tcon, in smb2_get_info_filesystem()
5497 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_filesystem()
5627 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5648 rsp, work->response_buf); in smb2_get_info_filesystem()
5653 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5686 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5689 work->compound_fid); in smb2_get_info_sec()
5690 id = work->compound_fid; in smb2_get_info_sec()
5691 pid = work->compound_pfid; in smb2_get_info_sec()
5700 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5708 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5710 ppntsd_size = ksmbd_vfs_get_sd_xattr(work->conn, idmap, in smb2_get_info_sec()
5715 if (smb2_resp_buf_len(work, 8) > ppntsd_size) in smb2_get_info_sec()
5721 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5731 * @work: smb work containing query info request buffer
5735 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5743 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5745 if (ksmbd_override_fsids(work)) { in smb2_query_info()
5753 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5757 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5761 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5768 ksmbd_revert_fsids(work); in smb2_query_info()
5773 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_info()
5790 smb2_set_err_rsp(work); in smb2_query_info()
5801 * @work: smb work containing close request buffer
5805 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5811 WORK_BUFFERS(work, req, rsp); in smb2_close_pipe()
5814 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5827 return ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close_pipe()
5833 * @work: smb work containing close request buffer
5837 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5843 struct ksmbd_conn *conn = work->conn; in smb2_close()
5850 WORK_BUFFERS(work, req, rsp); in smb2_close()
5852 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5855 return smb2_close_pipe(work); in smb2_close()
5860 sess_id = work->compound_sid; in smb2_close()
5862 work->compound_sid = 0; in smb2_close()
5864 work->compound_sid = sess_id; in smb2_close()
5873 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5875 if (!has_file_id(work->compound_fid)) { in smb2_close()
5884 work->compound_fid, in smb2_close()
5885 work->compound_pfid); in smb2_close()
5886 volatile_id = work->compound_fid; in smb2_close()
5889 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5890 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5904 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5913 ksmbd_fd_put(work, fp); in smb2_close()
5929 ksmbd_fd_put(work, fp); in smb2_close()
5941 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5944 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close()
5950 smb2_set_err_rsp(work); in smb2_close()
5958 * @work: smb work containing echo request buffer
5962 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5964 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5968 if (work->next_smb2_rcv_hdr_off) in smb2_echo()
5969 rsp = ksmbd_resp_buf_next(work); in smb2_echo()
5973 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_echo_rsp)); in smb2_echo()
5976 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
6040 rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags); in smb2_rename()
6042 smb_break_all_levII_oplock(work, fp, 0); in smb2_rename()
6048 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
6084 rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS, in smb2_create_link()
6094 rc = ksmbd_vfs_remove_file(work, &path); in smb2_create_link()
6110 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
6203 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
6233 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
6251 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
6262 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
6285 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
6296 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
6312 return smb2_rename(work, fp, rename_info, work->conn->local_nls); in set_rename_info()
6389 * @work: smb work containing set info command buffer
6397 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
6417 return set_file_allocation_info(work, fp, in smb2_set_info_file()
6425 return set_end_of_file_info(work, fp, in smb2_set_info_file()
6433 return set_rename_info(work, fp, in smb2_set_info_file()
6442 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
6445 work->conn->local_nls); in smb2_set_info_file()
6502 * @work: smb work containing set info request buffer
6506 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
6516 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
6517 req = ksmbd_req_buf_next(work); in smb2_set_info()
6518 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
6521 work->compound_fid); in smb2_set_info()
6522 id = work->compound_fid; in smb2_set_info()
6523 pid = work->compound_pfid; in smb2_set_info()
6526 req = smb2_get_msg(work->request_buf); in smb2_set_info()
6527 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6530 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info()
6542 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6552 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6556 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6564 ksmbd_revert_fsids(work); in smb2_set_info()
6574 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_set_info()
6578 ksmbd_fd_put(work, fp); in smb2_set_info()
6600 smb2_set_err_rsp(work); in smb2_set_info()
6601 ksmbd_fd_put(work, fp); in smb2_set_info()
6608 * @work: smb work containing read IPC pipe command buffer
6612 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6620 WORK_BUFFERS(work, req, rsp); in smb2_read_pipe()
6624 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6643 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read_pipe()
6652 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_read_pipe()
6668 smb2_set_err_rsp(work); in smb2_read_pipe()
6673 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work, in smb2_set_remote_key_for_rdma() argument
6680 if (work->conn->dialect == SMB30_PROT_ID && in smb2_set_remote_key_for_rdma()
6696 work->need_invalidate_rkey = in smb2_set_remote_key_for_rdma()
6699 work->remote_key = le32_to_cpu(desc->token); in smb2_set_remote_key_for_rdma()
6703 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6709 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6721 * @work: smb work containing read command buffer
6725 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6727 struct ksmbd_conn *conn = work->conn; in smb2_read()
6742 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6745 return smb2_read_pipe(work); in smb2_read()
6748 if (work->next_smb2_rcv_hdr_off) { in smb2_read()
6749 req = ksmbd_req_buf_next(work); in smb2_read()
6750 rsp = ksmbd_resp_buf_next(work); in smb2_read()
6753 work->compound_fid); in smb2_read()
6754 id = work->compound_fid; in smb2_read()
6755 pid = work->compound_pfid; in smb2_read()
6758 req = smb2_get_msg(work->request_buf); in smb2_read()
6759 rsp = smb2_get_msg(work->response_buf); in smb2_read()
6780 err = smb2_set_remote_key_for_rdma(work, in smb2_read()
6789 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_read()
6825 nbytes = ksmbd_vfs_read(work, fp, length, &offset, aux_payload_buf); in smb2_read()
6834 smb2_set_err_rsp(work); in smb2_read()
6835 ksmbd_fd_put(work, fp); in smb2_read()
6844 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6862 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read()
6869 ksmbd_fd_put(work, fp); in smb2_read()
6889 smb2_set_err_rsp(work); in smb2_read()
6891 ksmbd_fd_put(work, fp); in smb2_read()
6897 * @work: smb work containing write IPC pipe command buffer
6901 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6911 WORK_BUFFERS(work, req, rsp); in smb2_write_pipe()
6917 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6920 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6928 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6933 smb2_set_err_rsp(work); in smb2_write_pipe()
6938 smb2_set_err_rsp(work); in smb2_write_pipe()
6951 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_write_pipe()
6956 smb2_set_err_rsp(work); in smb2_write_pipe()
6962 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6975 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6984 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6994 * @work: smb work containing write command buffer
6998 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
7009 unsigned int max_write_size = work->conn->vals->max_write_size; in smb2_write()
7013 WORK_BUFFERS(work, req, rsp); in smb2_write()
7015 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
7017 return smb2_write_pipe(work); in smb2_write()
7040 err = smb2_set_remote_key_for_rdma(work, in smb2_write()
7049 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
7055 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_write()
7090 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
7098 nbytes = smb2_write_rdma_channel(work, req, fp, offset, length, in smb2_write()
7112 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_write_rsp, Buffer)); in smb2_write()
7115 ksmbd_fd_put(work, fp); in smb2_write()
7134 smb2_set_err_rsp(work); in smb2_write()
7135 ksmbd_fd_put(work, fp); in smb2_write()
7141 * @work: smb work containing flush command buffer
7145 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
7151 WORK_BUFFERS(work, req, rsp); in smb2_flush()
7155 err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId); in smb2_flush()
7161 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_flush_rsp)); in smb2_flush()
7165 smb2_set_err_rsp(work); in smb2_flush()
7171 * @work: smb work containing cancel command buffer
7175 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
7177 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
7178 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
7183 if (work->next_smb2_rcv_hdr_off) in smb2_cancel()
7184 hdr = ksmbd_resp_buf_next(work); in smb2_cancel()
7219 iter == work) in smb2_cancel()
7233 work->send_no_response = 1; in smb2_cancel()
7339 * @work: smb work containing lock command buffer
7343 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
7363 WORK_BUFFERS(work, req, rsp); in smb2_lock()
7366 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_lock()
7579 rc = setup_async_work(work, in smb2_lock()
7588 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
7591 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
7596 list_del(&work->fp_entry); in smb2_lock()
7599 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
7603 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7607 smb2_send_interim_resp(work, in smb2_lock()
7609 work->send_no_response = 1; in smb2_lock()
7620 release_async_work(work); in smb2_lock()
7624 spin_lock(&work->conn->llist_lock); in smb2_lock()
7626 &work->conn->lock_list); in smb2_lock()
7629 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7638 smb_break_all_oplock(work, fp); in smb2_lock()
7644 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lock_rsp)); in smb2_lock()
7648 ksmbd_fd_put(work, fp); in smb2_lock()
7671 spin_lock(&work->conn->llist_lock); in smb2_lock()
7675 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7695 smb2_set_err_rsp(work); in smb2_lock()
7696 ksmbd_fd_put(work, fp); in smb2_lock()
7700 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7753 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7755 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7778 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7806 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7807 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7982 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
8001 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
8010 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
8014 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
8023 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
8059 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
8067 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
8079 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
8097 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
8101 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
8107 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in fsctl_request_resume_key()
8114 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
8121 * @work: smb work containing ioctl command buffer
8125 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
8131 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
8137 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
8138 req = ksmbd_req_buf_next(work); in smb2_ioctl()
8139 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
8142 work->compound_fid); in smb2_ioctl()
8143 id = work->compound_fid; in smb2_ioctl()
8146 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
8147 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
8161 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
8197 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
8239 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
8249 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8269 fsctl_copychunk(work, in smb2_ioctl()
8283 ret = fsctl_set_sparse(work, id, (struct file_sparse *)buffer); in smb2_ioctl()
8293 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8317 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8323 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
8324 ksmbd_fd_put(work, fp); in smb2_ioctl()
8336 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
8356 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8366 ksmbd_fd_put(work, fp); in smb2_ioctl()
8383 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
8391 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8428 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
8429 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
8450 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_ioctl_rsp) + nbytes); in smb2_ioctl()
8465 smb2_set_err_rsp(work); in smb2_ioctl()
8471 * @work: smb work containing oplock break command buffer
8475 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
8487 WORK_BUFFERS(work, req, rsp); in smb20_oplock_break_ack()
8495 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
8498 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8506 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8507 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8579 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8587 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); in smb20_oplock_break_ack()
8596 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8597 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8617 * @work: smb work containing lease break command buffer
8621 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
8623 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
8633 WORK_BUFFERS(work, req, rsp); in smb21_lease_break_ack()
8640 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8739 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); in smb21_lease_break_ack()
8749 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8754 * @work: smb work containing oplock/lease break command buffer
8758 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8765 WORK_BUFFERS(work, req, rsp); in smb2_oplock_break()
8769 smb20_oplock_break_ack(work); in smb2_oplock_break()
8772 smb21_lease_break_ack(work); in smb2_oplock_break()
8778 smb2_set_err_rsp(work); in smb2_oplock_break()
8786 * @work: smb work containing notify command buffer
8790 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8797 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8799 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8801 smb2_set_err_rsp(work); in smb2_notify()
8805 smb2_set_err_rsp(work); in smb2_notify()
8812 * @work: smb work containing notify command buffer
8817 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8819 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8832 * @work: smb work containing notify command buffer
8836 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8844 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8845 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8846 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8848 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8849 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8853 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8854 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8862 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8876 * @work: smb work containing notify command buffer
8879 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8886 hdr = ksmbd_resp_buf_curr(work); in smb2_set_sign_rsp()
8891 iov = &work->iov[work->iov_idx - 1]; in smb2_set_sign_rsp()
8894 iov = &work->iov[work->iov_idx]; in smb2_set_sign_rsp()
8897 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8904 * @work: smb work containing notify command buffer
8908 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8910 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8919 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8920 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8921 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8923 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8924 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8928 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8929 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8932 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8934 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8964 * @work: smb work containing notify command buffer
8967 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8969 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8977 hdr = ksmbd_resp_buf_curr(work); in smb3_set_sign_rsp()
8981 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8983 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8997 iov = &work->iov[work->iov_idx - 1]; in smb3_set_sign_rsp()
9000 iov = &work->iov[work->iov_idx]; in smb3_set_sign_rsp()
9010 * @work: smb work containing response buffer
9013 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
9015 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
9016 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
9022 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
9026 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
9044 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
9069 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
9071 struct kvec *iov = work->iov; in smb3_encrypt_resp()
9080 fill_transform_hdr(tr_buf, work->response_buf, work->conn->cipher_type); in smb3_encrypt_resp()
9084 work->tr_buf = tr_buf; in smb3_encrypt_resp()
9086 return ksmbd_crypt_message(work, iov, work->iov_idx + 1, 1); in smb3_encrypt_resp()
9096 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
9099 char *buf = work->request_buf; in smb3_decrypt_req()
9118 sess = ksmbd_session_lookup_all(work->conn, le64_to_cpu(tr_hdr->SessionId)); in smb3_decrypt_req()
9130 rc = ksmbd_crypt_message(work, iov, 2, 0); in smb3_decrypt_req()
9140 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
9142 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
9143 struct ksmbd_session *sess = work->sess; in smb3_11_final_sess_setup_resp()
9144 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
9149 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
9150 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()