• Home
  • Raw
  • Download

Lines Matching full:work

42 static void __wbuf(struct ksmbd_work *work, void **req, void **rsp)  in __wbuf()  argument
44 if (work->next_smb2_rcv_hdr_off) { in __wbuf()
45 *req = ksmbd_req_buf_next(work); in __wbuf()
46 *rsp = ksmbd_resp_buf_next(work); in __wbuf()
48 *req = smb2_get_msg(work->request_buf); in __wbuf()
49 *rsp = smb2_get_msg(work->response_buf); in __wbuf()
85 * @work: smb work
90 int smb2_get_ksmbd_tcon(struct ksmbd_work *work) in smb2_get_ksmbd_tcon() argument
92 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_get_ksmbd_tcon()
103 if (xa_empty(&work->sess->tree_conns)) { in smb2_get_ksmbd_tcon()
112 * Just validate tree id in header with work->tcon->id. in smb2_get_ksmbd_tcon()
114 if (work->next_smb2_rcv_hdr_off) { in smb2_get_ksmbd_tcon()
115 if (!work->tcon) { in smb2_get_ksmbd_tcon()
119 if (tree_id != UINT_MAX && work->tcon->id != tree_id) { in smb2_get_ksmbd_tcon()
121 tree_id, work->tcon->id); in smb2_get_ksmbd_tcon()
127 work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); in smb2_get_ksmbd_tcon()
128 if (!work->tcon) { in smb2_get_ksmbd_tcon()
138 * @work: smb work containing response buffer
140 void smb2_set_err_rsp(struct ksmbd_work *work) in smb2_set_err_rsp() argument
144 if (work->next_smb2_rcv_hdr_off) in smb2_set_err_rsp()
145 err_rsp = ksmbd_resp_buf_next(work); in smb2_set_err_rsp()
147 err_rsp = smb2_get_msg(work->response_buf); in smb2_set_err_rsp()
157 err = ksmbd_iov_pin_rsp(work, (void *)err_rsp, in smb2_set_err_rsp()
161 work->send_no_response = 1; in smb2_set_err_rsp()
167 * @work: smb work containing smb header
171 bool is_smb2_neg_cmd(struct ksmbd_work *work) in is_smb2_neg_cmd() argument
173 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_smb2_neg_cmd()
191 * @work: smb work containing smb response buffer
195 bool is_smb2_rsp(struct ksmbd_work *work) in is_smb2_rsp() argument
197 struct smb2_hdr *hdr = smb2_get_msg(work->response_buf); in is_smb2_rsp()
212 * @work: smb work containing smb request buffer
216 u16 get_smb2_cmd_val(struct ksmbd_work *work) in get_smb2_cmd_val() argument
220 if (work->next_smb2_rcv_hdr_off) in get_smb2_cmd_val()
221 rcv_hdr = ksmbd_req_buf_next(work); in get_smb2_cmd_val()
223 rcv_hdr = smb2_get_msg(work->request_buf); in get_smb2_cmd_val()
229 * @work: smb work containing response buffer
232 void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err) in set_smb2_rsp_status() argument
236 rsp_hdr = smb2_get_msg(work->response_buf); in set_smb2_rsp_status()
239 work->iov_idx = 0; in set_smb2_rsp_status()
240 work->iov_cnt = 0; in set_smb2_rsp_status()
241 work->next_smb2_rcv_hdr_off = 0; in set_smb2_rsp_status()
242 smb2_set_err_rsp(work); in set_smb2_rsp_status()
247 * @work: smb work containing smb request buffer
252 int init_smb2_neg_rsp(struct ksmbd_work *work) in init_smb2_neg_rsp() argument
256 struct ksmbd_conn *conn = work->conn; in init_smb2_neg_rsp()
259 rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
273 rsp = smb2_get_msg(work->response_buf); in init_smb2_neg_rsp()
299 err = ksmbd_iov_pin_rsp(work, rsp, in init_smb2_neg_rsp()
311 * @work: smb work containing smb response buffer
313 int smb2_set_rsp_credits(struct ksmbd_work *work) in smb2_set_rsp_credits() argument
315 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_set_rsp_credits()
316 struct smb2_hdr *hdr = ksmbd_resp_buf_next(work); in smb2_set_rsp_credits()
317 struct ksmbd_conn *conn = work->conn; in smb2_set_rsp_credits()
321 if (work->send_no_response) in smb2_set_rsp_credits()
358 work->credits_granted += credits_granted; in smb2_set_rsp_credits()
362 hdr->CreditRequest = cpu_to_le16(work->credits_granted); in smb2_set_rsp_credits()
373 * @work: smb work containing smb response buffer
375 static void init_chained_smb2_rsp(struct ksmbd_work *work) in init_chained_smb2_rsp() argument
377 struct smb2_hdr *req = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
378 struct smb2_hdr *rsp = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
392 work->compound_fid = ((struct smb2_create_rsp *)rsp)->VolatileFileId; in init_chained_smb2_rsp()
393 work->compound_pfid = ((struct smb2_create_rsp *)rsp)->PersistentFileId; in init_chained_smb2_rsp()
394 work->compound_sid = le64_to_cpu(rsp->SessionId); in init_chained_smb2_rsp()
397 len = get_rfc1002_len(work->response_buf) - work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
401 work->iov[work->iov_idx].iov_len += (new_len - len); in init_chained_smb2_rsp()
402 inc_rfc1001_len(work->response_buf, new_len - len); in init_chained_smb2_rsp()
405 work->next_smb2_rcv_hdr_off += next_hdr_offset; in init_chained_smb2_rsp()
406 work->curr_smb2_rsp_hdr_off = work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
407 work->next_smb2_rsp_hdr_off += new_len; in init_chained_smb2_rsp()
410 new_len, work->next_smb2_rcv_hdr_off, in init_chained_smb2_rsp()
411 work->next_smb2_rsp_hdr_off); in init_chained_smb2_rsp()
413 rsp_hdr = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
414 rcv_hdr = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
418 work->compound_fid = KSMBD_NO_FID; in init_chained_smb2_rsp()
419 work->compound_pfid = KSMBD_NO_FID; in init_chained_smb2_rsp()
441 * @work: smb work containing smb request buffer
445 bool is_chained_smb2_message(struct ksmbd_work *work) in is_chained_smb2_message() argument
447 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in is_chained_smb2_message()
453 hdr = ksmbd_req_buf_next(work); in is_chained_smb2_message()
456 if ((u64)work->next_smb2_rcv_hdr_off + next_cmd + in is_chained_smb2_message()
458 get_rfc1002_len(work->request_buf)) { in is_chained_smb2_message()
464 if ((u64)get_rfc1002_len(work->response_buf) + MAX_CIFS_SMALL_BUFFER_SIZE > in is_chained_smb2_message()
465 work->response_sz) { in is_chained_smb2_message()
471 init_chained_smb2_rsp(work); in is_chained_smb2_message()
473 } else if (work->next_smb2_rcv_hdr_off) { in is_chained_smb2_message()
478 len = ALIGN(get_rfc1002_len(work->response_buf), 8); in is_chained_smb2_message()
479 len = len - get_rfc1002_len(work->response_buf); in is_chained_smb2_message()
482 work->iov[work->iov_idx].iov_len += len; in is_chained_smb2_message()
483 inc_rfc1001_len(work->response_buf, len); in is_chained_smb2_message()
485 work->curr_smb2_rsp_hdr_off = work->next_smb2_rsp_hdr_off; in is_chained_smb2_message()
492 * @work: smb work containing smb request buffer
496 int init_smb2_rsp_hdr(struct ksmbd_work *work) in init_smb2_rsp_hdr() argument
498 struct smb2_hdr *rsp_hdr = smb2_get_msg(work->response_buf); in init_smb2_rsp_hdr()
499 struct smb2_hdr *rcv_hdr = smb2_get_msg(work->request_buf); in init_smb2_rsp_hdr()
522 * @work: smb work containing smb request buffer
526 int smb2_allocate_rsp_buf(struct ksmbd_work *work) in smb2_allocate_rsp_buf() argument
528 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
530 size_t large_sz = small_sz + work->conn->vals->max_trans_size; in smb2_allocate_rsp_buf()
540 if (get_rfc1002_len(work->request_buf) < in smb2_allocate_rsp_buf()
544 req = smb2_get_msg(work->request_buf); in smb2_allocate_rsp_buf()
556 work->response_buf = kvzalloc(sz, GFP_KERNEL); in smb2_allocate_rsp_buf()
557 if (!work->response_buf) in smb2_allocate_rsp_buf()
560 work->response_sz = sz; in smb2_allocate_rsp_buf()
566 * @work: smb work containing smb request buffer
570 int smb2_check_user_session(struct ksmbd_work *work) in smb2_check_user_session() argument
572 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_check_user_session()
573 struct ksmbd_conn *conn = work->conn; in smb2_check_user_session()
593 * Just validate session id in header with work->sess->id. in smb2_check_user_session()
595 if (work->next_smb2_rcv_hdr_off) { in smb2_check_user_session()
596 if (!work->sess) { in smb2_check_user_session()
600 if (sess_id != ULLONG_MAX && work->sess->id != sess_id) { in smb2_check_user_session()
602 sess_id, work->sess->id); in smb2_check_user_session()
609 work->sess = ksmbd_session_lookup_all(conn, sess_id); in smb2_check_user_session()
610 if (work->sess) in smb2_check_user_session()
651 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
653 struct ksmbd_conn *conn = work->conn; in setup_async_work()
661 work->asynchronous = true; in setup_async_work()
662 work->async_id = id; in setup_async_work()
666 work->async_id); in setup_async_work()
668 work->cancel_fn = fn; in setup_async_work()
669 work->cancel_argv = arg; in setup_async_work()
671 if (list_empty(&work->async_request_entry)) { in setup_async_work()
673 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
680 void release_async_work(struct ksmbd_work *work) in release_async_work() argument
682 struct ksmbd_conn *conn = work->conn; in release_async_work()
685 list_del_init(&work->async_request_entry); in release_async_work()
688 work->asynchronous = 0; in release_async_work()
689 work->cancel_fn = NULL; in release_async_work()
690 kfree(work->cancel_argv); in release_async_work()
691 work->cancel_argv = NULL; in release_async_work()
692 if (work->async_id) { in release_async_work()
693 ksmbd_release_id(&conn->async_ida, work->async_id); in release_async_work()
694 work->async_id = 0; in release_async_work()
698 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
712 in_work->conn = work->conn; in smb2_send_interim_resp()
713 memcpy(smb2_get_msg(in_work->response_buf), ksmbd_resp_buf_next(work), in smb2_send_interim_resp()
718 rsp_hdr->Id.AsyncId = cpu_to_le64(work->async_id); in smb2_send_interim_resp()
1087 * @work: smb work containing smb request buffer
1091 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1093 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1094 struct smb2_negotiate_req *req = smb2_get_msg(work->request_buf); in smb2_handle_negotiate()
1095 struct smb2_negotiate_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_handle_negotiate()
1104 work->send_no_response = 1; in smb2_handle_negotiate()
1108 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1166 get_rfc1002_len(work->request_buf)); in smb2_handle_negotiate()
1186 work->request_buf, in smb2_handle_negotiate()
1262 rc = ksmbd_iov_pin_rsp(work, rsp, in smb2_handle_negotiate()
1266 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1284 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1286 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1287 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1311 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1332 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1343 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->conn); in ntlm_negotiate()
1351 if (!work->conn->use_spnego) { in ntlm_negotiate()
1352 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1368 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1441 static int ntlm_authenticate(struct ksmbd_work *work, in ntlm_authenticate() argument
1445 struct ksmbd_conn *conn = work->conn; in ntlm_authenticate()
1446 struct ksmbd_session *sess = work->sess; in ntlm_authenticate()
1579 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1583 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1584 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1596 out_len = work->response_sz - in krb5_authenticate()
1657 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1665 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1667 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1677 WORK_BUFFERS(work, req, rsp); in smb2_sess_setup()
1779 work->sess = sess; in smb2_sess_setup()
1804 rc = generate_preauth_hash(work); in smb2_sess_setup()
1810 rc = krb5_authenticate(work, req, rsp); in smb2_sess_setup()
1824 rc = ntlm_negotiate(work, negblob, negblob_len, rsp); in smb2_sess_setup()
1830 rc = ntlm_authenticate(work, req, rsp); in smb2_sess_setup()
1908 work->sess = NULL; in smb2_sess_setup()
1915 smb2_set_err_rsp(work); in smb2_sess_setup()
1924 rc = ksmbd_iov_pin_rsp(work, rsp, iov_len); in smb2_sess_setup()
1935 * @work: smb work containing smb request buffer
1939 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1941 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1944 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1950 WORK_BUFFERS(work, req, rsp); in smb2_tree_connect()
1970 status = ksmbd_tree_conn_connect(work, name); in smb2_tree_connect()
2019 rc = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_tree_connect_rsp)); in smb2_tree_connect()
2055 smb2_set_err_rsp(work); in smb2_tree_connect()
2132 * @work: smb work containing request buffer
2136 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2140 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2141 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2144 WORK_BUFFERS(work, req, rsp); in smb2_tree_disconnect()
2156 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2176 work->tcon = NULL; in smb2_tree_disconnect()
2179 err = ksmbd_iov_pin_rsp(work, rsp, in smb2_tree_disconnect()
2189 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2196 * @work: smb work containing request buffer
2200 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2202 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2203 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2209 WORK_BUFFERS(work, req, rsp); in smb2_session_logoff()
2217 smb2_set_err_rsp(work); in smb2_session_logoff()
2224 ksmbd_close_session_fds(work); in smb2_session_logoff()
2230 smb2_set_err_rsp(work); in smb2_session_logoff()
2245 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp)); in smb2_session_logoff()
2248 smb2_set_err_rsp(work); in smb2_session_logoff()
2256 * @work: smb work containing request buffer
2260 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2268 WORK_BUFFERS(work, req, rsp); in create_smb2_pipe()
2271 1, work->conn->local_nls); in create_smb2_pipe()
2278 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2303 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_create_rsp, Buffer)); in create_smb2_pipe()
2324 smb2_set_err_rsp(work); in create_smb2_pipe()
2568 static int smb2_creat(struct ksmbd_work *work, struct path *parent_path, in smb2_creat() argument
2572 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2585 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2592 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2597 rc = ksmbd_vfs_kern_path_locked(work, name, 0, parent_path, path, 0); in smb2_creat()
2606 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2630 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2670 static int parse_durable_handle_context(struct ksmbd_work *work, in parse_durable_handle_context() argument
2675 struct ksmbd_conn *conn = work->conn; in parse_durable_handle_context()
2836 * @work: smb work containing request buffer
2840 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2842 struct ksmbd_conn *conn = work->conn; in smb2_open()
2843 struct ksmbd_session *sess = work->sess; in smb2_open()
2844 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2874 WORK_BUFFERS(work, req, rsp); in smb2_open()
2876 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2880 smb2_set_err_rsp(work); in smb2_open()
2886 return create_smb2_pipe(work); in smb2_open()
2913 work->conn->local_nls); in smb2_open()
2922 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2957 rc = parse_durable_handle_context(work, req, lc, &dh_info); in smb2_open()
2970 rc = ksmbd_reopen_durable_fd(work, dh_info.fp); in smb2_open()
2976 if (ksmbd_override_fsids(work)) { in smb2_open()
3096 if (ksmbd_override_fsids(work)) { in smb2_open()
3101 rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, in smb2_open()
3224 rc = smb2_creat(work, &parent_path, &path, name, open_flags, in smb2_open()
3305 fp = ksmbd_open_fd(work, filp); in smb2_open()
3336 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3343 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
3349 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3433 smb_break_all_oplock(work, fp); in smb2_open()
3438 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3471 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3510 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3559 test_share_config_flag(work->tcon->share_conf, in smb2_open()
3712 ksmbd_revert_fsids(work); in smb2_open()
3716 ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED); in smb2_open()
3717 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len); in smb2_open()
3746 ksmbd_fd_put(work, fp); in smb2_open()
3747 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()
4358 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
4360 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
4362 smb2_set_err_rsp(work); in smb2_query_dir()
4372 dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_query_dir()
4414 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
4426 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
4439 query_dir_private.work = work; in smb2_query_dir()
4485 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4501 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4509 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4510 ksmbd_revert_fsids(work); in smb2_query_dir()
4535 smb2_set_err_rsp(work); in smb2_query_dir()
4536 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4537 ksmbd_revert_fsids(work); in smb2_query_dir()
4631 * @work: smb work containing query info command buffer
4639 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4675 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4876 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4881 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4896 filename = convert_to_nt_pathname(work->tcon->share_conf, &fp->filp->f_path); in get_file_all_info()
4942 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4947 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4963 static int get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4968 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4976 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4987 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
5271 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
5280 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
5283 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
5284 work->response_buf); in smb2_get_info_file()
5287 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
5290 work->compound_fid); in smb2_get_info_file()
5291 id = work->compound_fid; in smb2_get_info_file()
5292 pid = work->compound_pfid; in smb2_get_info_file()
5301 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
5309 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5313 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5317 rc = get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5321 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
5325 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5329 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5333 rc = get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5337 rc = get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5341 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5345 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
5349 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
5353 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5357 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5361 rc = get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5365 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5368 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
5372 rc = find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5382 rsp, work->response_buf); in smb2_get_info_file()
5383 ksmbd_fd_put(work, fp); in smb2_get_info_file()
5387 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
5391 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
5392 struct ksmbd_conn *conn = work->conn; in smb2_get_info_filesystem()
5393 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5427 if (!test_tree_conn_flag(work->tcon, in smb2_get_info_filesystem()
5449 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_filesystem()
5579 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5600 rsp, work->response_buf); in smb2_get_info_filesystem()
5605 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5638 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5641 work->compound_fid); in smb2_get_info_sec()
5642 id = work->compound_fid; in smb2_get_info_sec()
5643 pid = work->compound_pfid; in smb2_get_info_sec()
5652 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5660 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5662 ppntsd_size = ksmbd_vfs_get_sd_xattr(work->conn, idmap, in smb2_get_info_sec()
5667 if (smb2_resp_buf_len(work, 8) > ppntsd_size) in smb2_get_info_sec()
5673 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5683 * @work: smb work containing query info request buffer
5687 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5693 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5697 if (ksmbd_override_fsids(work)) { in smb2_query_info()
5705 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5709 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5713 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5720 ksmbd_revert_fsids(work); in smb2_query_info()
5725 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_info()
5742 smb2_set_err_rsp(work); in smb2_query_info()
5753 * @work: smb work containing close request buffer
5757 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5763 WORK_BUFFERS(work, req, rsp); in smb2_close_pipe()
5766 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5779 return ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close_pipe()
5785 * @work: smb work containing close request buffer
5789 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5795 struct ksmbd_conn *conn = work->conn; in smb2_close()
5800 WORK_BUFFERS(work, req, rsp); in smb2_close()
5802 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5805 return smb2_close_pipe(work); in smb2_close()
5810 sess_id = work->compound_sid; in smb2_close()
5812 work->compound_sid = 0; in smb2_close()
5814 work->compound_sid = sess_id; in smb2_close()
5823 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5825 if (!has_file_id(work->compound_fid)) { in smb2_close()
5834 work->compound_fid, in smb2_close()
5835 work->compound_pfid); in smb2_close()
5836 volatile_id = work->compound_fid; in smb2_close()
5839 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5840 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5854 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5863 ksmbd_fd_put(work, fp); in smb2_close()
5879 ksmbd_fd_put(work, fp); in smb2_close()
5891 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5894 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close()
5900 smb2_set_err_rsp(work); in smb2_close()
5908 * @work: smb work containing echo request buffer
5912 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5914 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5916 if (work->next_smb2_rcv_hdr_off) in smb2_echo()
5917 rsp = ksmbd_resp_buf_next(work); in smb2_echo()
5921 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_echo_rsp)); in smb2_echo()
5924 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5988 rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags); in smb2_rename()
5990 smb_break_all_levII_oplock(work, fp, 0); in smb2_rename()
5996 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
6032 rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS, in smb2_create_link()
6042 rc = ksmbd_vfs_remove_file(work, &path); in smb2_create_link()
6058 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
6151 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
6178 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
6196 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
6207 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
6229 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
6240 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
6256 return smb2_rename(work, fp, rename_info, work->conn->local_nls); in set_rename_info()
6327 * @work: smb work containing set info command buffer
6335 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
6355 return set_file_allocation_info(work, fp, in smb2_set_info_file()
6363 return set_end_of_file_info(work, fp, in smb2_set_info_file()
6371 return set_rename_info(work, fp, in smb2_set_info_file()
6380 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
6383 work->conn->local_nls); in smb2_set_info_file()
6440 * @work: smb work containing set info request buffer
6444 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
6454 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
6455 req = ksmbd_req_buf_next(work); in smb2_set_info()
6456 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
6459 work->compound_fid); in smb2_set_info()
6460 id = work->compound_fid; in smb2_set_info()
6461 pid = work->compound_pfid; in smb2_set_info()
6464 req = smb2_get_msg(work->request_buf); in smb2_set_info()
6465 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6468 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info()
6480 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6490 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6494 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6502 ksmbd_revert_fsids(work); in smb2_set_info()
6512 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_set_info()
6516 ksmbd_fd_put(work, fp); in smb2_set_info()
6538 smb2_set_err_rsp(work); in smb2_set_info()
6539 ksmbd_fd_put(work, fp); in smb2_set_info()
6546 * @work: smb work containing read IPC pipe command buffer
6550 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6558 WORK_BUFFERS(work, req, rsp); in smb2_read_pipe()
6562 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6581 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read_pipe()
6590 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_read_pipe()
6606 smb2_set_err_rsp(work); in smb2_read_pipe()
6611 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work, in smb2_set_remote_key_for_rdma() argument
6618 if (work->conn->dialect == SMB30_PROT_ID && in smb2_set_remote_key_for_rdma()
6634 work->need_invalidate_rkey = in smb2_set_remote_key_for_rdma()
6637 work->remote_key = le32_to_cpu(desc->token); in smb2_set_remote_key_for_rdma()
6641 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6647 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6659 * @work: smb work containing read command buffer
6663 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6665 struct ksmbd_conn *conn = work->conn; in smb2_read()
6678 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6681 return smb2_read_pipe(work); in smb2_read()
6684 if (work->next_smb2_rcv_hdr_off) { in smb2_read()
6685 req = ksmbd_req_buf_next(work); in smb2_read()
6686 rsp = ksmbd_resp_buf_next(work); in smb2_read()
6689 work->compound_fid); in smb2_read()
6690 id = work->compound_fid; in smb2_read()
6691 pid = work->compound_pfid; in smb2_read()
6694 req = smb2_get_msg(work->request_buf); in smb2_read()
6695 rsp = smb2_get_msg(work->response_buf); in smb2_read()
6716 err = smb2_set_remote_key_for_rdma(work, in smb2_read()
6725 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_read()
6761 nbytes = ksmbd_vfs_read(work, fp, length, &offset, aux_payload_buf); in smb2_read()
6770 smb2_set_err_rsp(work); in smb2_read()
6771 ksmbd_fd_put(work, fp); in smb2_read()
6780 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6798 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read()
6805 ksmbd_fd_put(work, fp); in smb2_read()
6825 smb2_set_err_rsp(work); in smb2_read()
6827 ksmbd_fd_put(work, fp); in smb2_read()
6833 * @work: smb work containing write IPC pipe command buffer
6837 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6847 WORK_BUFFERS(work, req, rsp); in smb2_write_pipe()
6853 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6856 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6864 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6869 smb2_set_err_rsp(work); in smb2_write_pipe()
6874 smb2_set_err_rsp(work); in smb2_write_pipe()
6887 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_write_pipe()
6892 smb2_set_err_rsp(work); in smb2_write_pipe()
6898 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6911 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6920 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6930 * @work: smb work containing write command buffer
6934 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6945 unsigned int max_write_size = work->conn->vals->max_write_size; in smb2_write()
6947 WORK_BUFFERS(work, req, rsp); in smb2_write()
6949 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6951 return smb2_write_pipe(work); in smb2_write()
6974 err = smb2_set_remote_key_for_rdma(work, in smb2_write()
6983 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
6989 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_write()
7024 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
7032 nbytes = smb2_write_rdma_channel(work, req, fp, offset, length, in smb2_write()
7046 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_write_rsp, Buffer)); in smb2_write()
7049 ksmbd_fd_put(work, fp); in smb2_write()
7068 smb2_set_err_rsp(work); in smb2_write()
7069 ksmbd_fd_put(work, fp); in smb2_write()
7075 * @work: smb work containing flush command buffer
7079 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
7085 WORK_BUFFERS(work, req, rsp); in smb2_flush()
7089 err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId); in smb2_flush()
7095 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_flush_rsp)); in smb2_flush()
7099 smb2_set_err_rsp(work); in smb2_flush()
7105 * @work: smb work containing cancel command buffer
7109 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
7111 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
7112 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
7117 if (work->next_smb2_rcv_hdr_off) in smb2_cancel()
7118 hdr = ksmbd_resp_buf_next(work); in smb2_cancel()
7153 iter == work) in smb2_cancel()
7167 work->send_no_response = 1; in smb2_cancel()
7273 * @work: smb work containing lock command buffer
7277 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
7297 WORK_BUFFERS(work, req, rsp); in smb2_lock()
7300 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_lock()
7513 rc = setup_async_work(work, in smb2_lock()
7522 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
7525 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
7530 list_del(&work->fp_entry); in smb2_lock()
7533 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
7537 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7541 smb2_send_interim_resp(work, in smb2_lock()
7543 work->send_no_response = 1; in smb2_lock()
7554 release_async_work(work); in smb2_lock()
7558 spin_lock(&work->conn->llist_lock); in smb2_lock()
7560 &work->conn->lock_list); in smb2_lock()
7563 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7572 smb_break_all_oplock(work, fp); in smb2_lock()
7578 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lock_rsp)); in smb2_lock()
7582 ksmbd_fd_put(work, fp); in smb2_lock()
7605 spin_lock(&work->conn->llist_lock); in smb2_lock()
7609 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7629 smb2_set_err_rsp(work); in smb2_lock()
7630 ksmbd_fd_put(work, fp); in smb2_lock()
7634 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7688 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7690 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7713 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7741 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7742 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7914 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7933 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7942 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7946 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7955 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
7991 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
7999 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
8011 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
8029 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
8033 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
8039 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in fsctl_request_resume_key()
8046 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
8053 * @work: smb work containing ioctl command buffer
8057 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
8063 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
8067 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
8068 req = ksmbd_req_buf_next(work); in smb2_ioctl()
8069 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
8072 work->compound_fid); in smb2_ioctl()
8073 id = work->compound_fid; in smb2_ioctl()
8076 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
8077 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
8091 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
8127 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
8169 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
8179 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8199 fsctl_copychunk(work, in smb2_ioctl()
8213 ret = fsctl_set_sparse(work, id, (struct file_sparse *)buffer); in smb2_ioctl()
8223 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8247 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8253 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
8254 ksmbd_fd_put(work, fp); in smb2_ioctl()
8266 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
8286 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8296 ksmbd_fd_put(work, fp); in smb2_ioctl()
8313 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
8321 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8358 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
8359 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
8380 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_ioctl_rsp) + nbytes); in smb2_ioctl()
8395 smb2_set_err_rsp(work); in smb2_ioctl()
8401 * @work: smb work containing oplock break command buffer
8405 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
8417 WORK_BUFFERS(work, req, rsp); in smb20_oplock_break_ack()
8425 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
8428 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8436 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8437 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8512 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); in smb20_oplock_break_ack()
8515 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8521 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8541 * @work: smb work containing lease break command buffer
8545 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
8547 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
8557 WORK_BUFFERS(work, req, rsp); in smb21_lease_break_ack()
8564 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8658 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); in smb21_lease_break_ack()
8661 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8673 * @work: smb work containing oplock/lease break command buffer
8677 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8682 WORK_BUFFERS(work, req, rsp); in smb2_oplock_break()
8686 smb20_oplock_break_ack(work); in smb2_oplock_break()
8689 smb21_lease_break_ack(work); in smb2_oplock_break()
8695 smb2_set_err_rsp(work); in smb2_oplock_break()
8703 * @work: smb work containing notify command buffer
8707 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8712 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8714 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8716 smb2_set_err_rsp(work); in smb2_notify()
8720 smb2_set_err_rsp(work); in smb2_notify()
8727 * @work: smb work containing notify command buffer
8732 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8734 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8747 * @work: smb work containing notify command buffer
8751 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8759 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8760 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8761 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8763 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8764 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8768 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8769 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8777 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8791 * @work: smb work containing notify command buffer
8794 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8801 hdr = ksmbd_resp_buf_curr(work); in smb2_set_sign_rsp()
8806 iov = &work->iov[work->iov_idx - 1]; in smb2_set_sign_rsp()
8809 iov = &work->iov[work->iov_idx]; in smb2_set_sign_rsp()
8812 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8819 * @work: smb work containing notify command buffer
8823 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8825 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8834 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8835 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8836 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8838 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8839 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8843 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8844 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8847 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8849 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8879 * @work: smb work containing notify command buffer
8882 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8884 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8892 hdr = ksmbd_resp_buf_curr(work); in smb3_set_sign_rsp()
8896 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8898 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8912 iov = &work->iov[work->iov_idx - 1]; in smb3_set_sign_rsp()
8915 iov = &work->iov[work->iov_idx]; in smb3_set_sign_rsp()
8925 * @work: smb work containing response buffer
8928 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8930 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8931 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8937 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8941 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8959 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8984 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
8986 struct kvec *iov = work->iov; in smb3_encrypt_resp()
8995 fill_transform_hdr(tr_buf, work->response_buf, work->conn->cipher_type); in smb3_encrypt_resp()
8999 work->tr_buf = tr_buf; in smb3_encrypt_resp()
9001 return ksmbd_crypt_message(work, iov, work->iov_idx + 1, 1); in smb3_encrypt_resp()
9011 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
9014 char *buf = work->request_buf; in smb3_decrypt_req()
9033 sess = ksmbd_session_lookup_all(work->conn, le64_to_cpu(tr_hdr->SessionId)); in smb3_decrypt_req()
9045 rc = ksmbd_crypt_message(work, iov, 2, 0); in smb3_decrypt_req()
9055 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
9057 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
9058 struct ksmbd_session *sess = work->sess; in smb3_11_final_sess_setup_resp()
9059 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
9064 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
9065 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()