Lines Matching full:work
41 static void __wbuf(struct ksmbd_work *work, void **req, void **rsp) in __wbuf() argument
43 if (work->next_smb2_rcv_hdr_off) { in __wbuf()
44 *req = ksmbd_req_buf_next(work); in __wbuf()
45 *rsp = ksmbd_resp_buf_next(work); in __wbuf()
47 *req = work->request_buf; in __wbuf()
48 *rsp = work->response_buf; in __wbuf()
89 * @work: smb work
94 int smb2_get_ksmbd_tcon(struct ksmbd_work *work) in smb2_get_ksmbd_tcon() argument
96 struct smb2_hdr *req_hdr = work->request_buf; in smb2_get_ksmbd_tcon()
99 work->tcon = NULL; in smb2_get_ksmbd_tcon()
100 if (work->conn->ops->get_cmd_val(work) == SMB2_TREE_CONNECT_HE || in smb2_get_ksmbd_tcon()
101 work->conn->ops->get_cmd_val(work) == SMB2_CANCEL_HE || in smb2_get_ksmbd_tcon()
102 work->conn->ops->get_cmd_val(work) == SMB2_LOGOFF_HE) { in smb2_get_ksmbd_tcon()
107 if (xa_empty(&work->sess->tree_conns)) { in smb2_get_ksmbd_tcon()
113 work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); in smb2_get_ksmbd_tcon()
114 if (!work->tcon) { in smb2_get_ksmbd_tcon()
124 * @work: smb work containing response buffer
126 void smb2_set_err_rsp(struct ksmbd_work *work) in smb2_set_err_rsp() argument
130 if (work->next_smb2_rcv_hdr_off) in smb2_set_err_rsp()
131 err_rsp = ksmbd_resp_buf_next(work); in smb2_set_err_rsp()
133 err_rsp = work->response_buf; in smb2_set_err_rsp()
141 inc_rfc1001_len(work->response_buf, SMB2_ERROR_STRUCTURE_SIZE2); in smb2_set_err_rsp()
147 * @work: smb work containing smb header
151 bool is_smb2_neg_cmd(struct ksmbd_work *work) in is_smb2_neg_cmd() argument
153 struct smb2_hdr *hdr = work->request_buf; in is_smb2_neg_cmd()
171 * @work: smb work containing smb response buffer
175 bool is_smb2_rsp(struct ksmbd_work *work) in is_smb2_rsp() argument
177 struct smb2_hdr *hdr = work->response_buf; in is_smb2_rsp()
192 * @work: smb work containing smb request buffer
196 u16 get_smb2_cmd_val(struct ksmbd_work *work) in get_smb2_cmd_val() argument
200 if (work->next_smb2_rcv_hdr_off) in get_smb2_cmd_val()
201 rcv_hdr = ksmbd_req_buf_next(work); in get_smb2_cmd_val()
203 rcv_hdr = work->request_buf; in get_smb2_cmd_val()
209 * @work: smb work containing response buffer
212 void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err) in set_smb2_rsp_status() argument
216 if (work->next_smb2_rcv_hdr_off) in set_smb2_rsp_status()
217 rsp_hdr = ksmbd_resp_buf_next(work); in set_smb2_rsp_status()
219 rsp_hdr = work->response_buf; in set_smb2_rsp_status()
221 smb2_set_err_rsp(work); in set_smb2_rsp_status()
226 * @work: smb work containing smb request buffer
231 int init_smb2_neg_rsp(struct ksmbd_work *work) in init_smb2_neg_rsp() argument
235 struct ksmbd_conn *conn = work->conn; in init_smb2_neg_rsp()
240 rsp_hdr = work->response_buf; in init_smb2_neg_rsp()
259 rsp = work->response_buf; in init_smb2_neg_rsp()
261 WARN_ON(ksmbd_conn_good(work)); in init_smb2_neg_rsp()
291 ksmbd_conn_set_need_negotiate(work); in init_smb2_neg_rsp()
297 * @work: smb work containing smb response buffer
299 int smb2_set_rsp_credits(struct ksmbd_work *work) in smb2_set_rsp_credits() argument
301 struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); in smb2_set_rsp_credits()
302 struct smb2_hdr *hdr = ksmbd_resp_buf_next(work); in smb2_set_rsp_credits()
303 struct ksmbd_conn *conn = work->conn; in smb2_set_rsp_credits()
308 if (work->send_no_response) in smb2_set_rsp_credits()
343 work->credits_granted += credits_granted; in smb2_set_rsp_credits()
347 hdr->CreditRequest = cpu_to_le16(work->credits_granted); in smb2_set_rsp_credits()
358 * @work: smb work containing smb response buffer
360 static void init_chained_smb2_rsp(struct ksmbd_work *work) in init_chained_smb2_rsp() argument
362 struct smb2_hdr *req = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
363 struct smb2_hdr *rsp = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
377 work->compound_fid = in init_chained_smb2_rsp()
380 work->compound_pfid = in init_chained_smb2_rsp()
383 work->compound_sid = le64_to_cpu(rsp->SessionId); in init_chained_smb2_rsp()
386 len = get_rfc1002_len(work->response_buf) - work->next_smb2_rsp_hdr_off; in init_chained_smb2_rsp()
390 inc_rfc1001_len(work->response_buf, ((sizeof(struct smb2_hdr) - 4) in init_chained_smb2_rsp()
394 work->next_smb2_rcv_hdr_off += next_hdr_offset; in init_chained_smb2_rsp()
395 work->next_smb2_rsp_hdr_off += new_len; in init_chained_smb2_rsp()
398 new_len, work->next_smb2_rcv_hdr_off, in init_chained_smb2_rsp()
399 work->next_smb2_rsp_hdr_off); in init_chained_smb2_rsp()
401 rsp_hdr = ksmbd_resp_buf_next(work); in init_chained_smb2_rsp()
402 rcv_hdr = ksmbd_req_buf_next(work); in init_chained_smb2_rsp()
406 work->compound_fid = KSMBD_NO_FID; in init_chained_smb2_rsp()
407 work->compound_pfid = KSMBD_NO_FID; in init_chained_smb2_rsp()
429 * @work: smb work containing smb request buffer
433 bool is_chained_smb2_message(struct ksmbd_work *work) in is_chained_smb2_message() argument
435 struct smb2_hdr *hdr = work->request_buf; in is_chained_smb2_message()
441 hdr = ksmbd_req_buf_next(work); in is_chained_smb2_message()
444 if ((u64)work->next_smb2_rcv_hdr_off + next_cmd + in is_chained_smb2_message()
446 get_rfc1002_len(work->request_buf)) { in is_chained_smb2_message()
452 if ((u64)get_rfc1002_len(work->response_buf) + MAX_CIFS_SMALL_BUFFER_SIZE > in is_chained_smb2_message()
453 work->response_sz) { in is_chained_smb2_message()
459 init_chained_smb2_rsp(work); in is_chained_smb2_message()
461 } else if (work->next_smb2_rcv_hdr_off) { in is_chained_smb2_message()
466 len = ALIGN(get_rfc1002_len(work->response_buf), 8); in is_chained_smb2_message()
467 len = len - get_rfc1002_len(work->response_buf); in is_chained_smb2_message()
470 inc_rfc1001_len(work->response_buf, len); in is_chained_smb2_message()
471 if (work->aux_payload_sz) in is_chained_smb2_message()
472 work->aux_payload_sz += len; in is_chained_smb2_message()
480 * @work: smb work containing smb request buffer
484 int init_smb2_rsp_hdr(struct ksmbd_work *work) in init_smb2_rsp_hdr() argument
486 struct smb2_hdr *rsp_hdr = work->response_buf; in init_smb2_rsp_hdr()
487 struct smb2_hdr *rcv_hdr = work->request_buf; in init_smb2_rsp_hdr()
488 struct ksmbd_conn *conn = work->conn; in init_smb2_rsp_hdr()
508 work->syncronous = true; in init_smb2_rsp_hdr()
509 if (work->async_id) { in init_smb2_rsp_hdr()
510 ksmbd_release_id(&conn->async_ida, work->async_id); in init_smb2_rsp_hdr()
511 work->async_id = 0; in init_smb2_rsp_hdr()
519 * @work: smb work containing smb request buffer
523 int smb2_allocate_rsp_buf(struct ksmbd_work *work) in smb2_allocate_rsp_buf() argument
525 struct smb2_hdr *hdr = work->request_buf; in smb2_allocate_rsp_buf()
527 size_t large_sz = small_sz + work->conn->vals->max_trans_size; in smb2_allocate_rsp_buf()
537 req = work->request_buf; in smb2_allocate_rsp_buf()
548 work->response_buf = kvmalloc(sz, GFP_KERNEL | __GFP_ZERO); in smb2_allocate_rsp_buf()
549 if (!work->response_buf) in smb2_allocate_rsp_buf()
552 work->response_sz = sz; in smb2_allocate_rsp_buf()
558 * @work: smb work containing smb request buffer
562 int smb2_check_user_session(struct ksmbd_work *work) in smb2_check_user_session() argument
564 struct smb2_hdr *req_hdr = work->request_buf; in smb2_check_user_session()
565 struct ksmbd_conn *conn = work->conn; in smb2_check_user_session()
566 unsigned int cmd = conn->ops->get_cmd_val(work); in smb2_check_user_session()
569 work->sess = NULL; in smb2_check_user_session()
579 if (!ksmbd_conn_good(work)) in smb2_check_user_session()
584 work->sess = ksmbd_session_lookup_all(conn, sess_id); in smb2_check_user_session()
585 if (work->sess) in smb2_check_user_session()
639 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
642 struct ksmbd_conn *conn = work->conn; in setup_async_work()
645 rsp_hdr = work->response_buf; in setup_async_work()
653 work->syncronous = false; in setup_async_work()
654 work->async_id = id; in setup_async_work()
659 work->async_id); in setup_async_work()
661 work->cancel_fn = fn; in setup_async_work()
662 work->cancel_argv = arg; in setup_async_work()
664 if (list_empty(&work->async_request_entry)) { in setup_async_work()
666 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
673 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
677 rsp_hdr = work->response_buf; in smb2_send_interim_resp()
678 smb2_set_err_rsp(work); in smb2_send_interim_resp()
681 work->multiRsp = 1; in smb2_send_interim_resp()
682 ksmbd_conn_write(work); in smb2_send_interim_resp()
684 work->multiRsp = 0; in smb2_send_interim_resp()
1040 * @work: smb work containing smb request buffer
1044 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1046 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1047 struct smb2_negotiate_req *req = work->request_buf; in smb2_handle_negotiate()
1048 struct smb2_negotiate_rsp *rsp = work->response_buf; in smb2_handle_negotiate()
1055 if (ksmbd_conn_good(work)) { in smb2_handle_negotiate()
1057 work->send_no_response = 1; in smb2_handle_negotiate()
1068 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1134 work->request_buf, in smb2_handle_negotiate()
1206 ksmbd_conn_set_need_negotiate(work); in smb2_handle_negotiate()
1210 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1229 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1231 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1232 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1256 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1277 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1281 struct smb2_sess_setup_rsp *rsp = work->response_buf; in ntlm_negotiate()
1289 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->sess); in ntlm_negotiate()
1298 if (!work->conn->use_spnego) { in ntlm_negotiate()
1299 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->sess); in ntlm_negotiate()
1315 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->sess); in ntlm_negotiate()
1387 static int ntlm_authenticate(struct ksmbd_work *work) in ntlm_authenticate() argument
1389 struct smb2_sess_setup_req *req = work->request_buf; in ntlm_authenticate()
1390 struct smb2_sess_setup_rsp *rsp = work->response_buf; in ntlm_authenticate()
1391 struct ksmbd_conn *conn = work->conn; in ntlm_authenticate()
1392 struct ksmbd_session *sess = work->sess; in ntlm_authenticate()
1523 static int krb5_authenticate(struct ksmbd_work *work) in krb5_authenticate() argument
1525 struct smb2_sess_setup_req *req = work->request_buf; in krb5_authenticate()
1526 struct smb2_sess_setup_rsp *rsp = work->response_buf; in krb5_authenticate()
1527 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1528 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1540 out_len = work->response_sz - in krb5_authenticate()
1606 static int krb5_authenticate(struct ksmbd_work *work) in krb5_authenticate() argument
1612 int smb2_sess_setup(struct ksmbd_work *work) in smb2_sess_setup() argument
1614 struct ksmbd_conn *conn = work->conn; in smb2_sess_setup()
1615 struct smb2_sess_setup_req *req = work->request_buf; in smb2_sess_setup()
1616 struct smb2_sess_setup_rsp *rsp = work->response_buf; in smb2_sess_setup()
1695 work->sess = sess; in smb2_sess_setup()
1715 rc = generate_preauth_hash(work); in smb2_sess_setup()
1721 rc = krb5_authenticate(work); in smb2_sess_setup()
1727 ksmbd_conn_set_good(work); in smb2_sess_setup()
1733 rc = ntlm_negotiate(work, negblob, negblob_len); in smb2_sess_setup()
1745 rc = ntlm_authenticate(work); in smb2_sess_setup()
1749 ksmbd_conn_set_good(work); in smb2_sess_setup()
1813 work->sess = NULL; in smb2_sess_setup()
1824 * @work: smb work containing smb request buffer
1828 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1830 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1831 struct smb2_tree_connect_req *req = work->request_buf; in smb2_tree_connect()
1832 struct smb2_tree_connect_rsp *rsp = work->response_buf; in smb2_tree_connect()
1833 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1996 * @work: smb work containing request buffer
2000 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2002 struct smb2_tree_disconnect_rsp *rsp = work->response_buf; in smb2_tree_disconnect()
2003 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2004 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2012 struct smb2_tree_disconnect_req *req = work->request_buf; in smb2_tree_disconnect()
2016 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2020 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2027 * @work: smb work containing request buffer
2031 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2033 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2034 struct smb2_logoff_rsp *rsp = work->response_buf; in smb2_session_logoff()
2035 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2046 ksmbd_conn_set_need_reconnect(work); in smb2_session_logoff()
2047 ksmbd_close_session_fds(work); in smb2_session_logoff()
2051 struct smb2_logoff_req *req = work->request_buf; in smb2_session_logoff()
2055 smb2_set_err_rsp(work); in smb2_session_logoff()
2066 ksmbd_conn_set_need_negotiate(work); in smb2_session_logoff()
2072 * @work: smb work containing request buffer
2076 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2078 struct smb2_create_rsp *rsp = work->response_buf; in create_smb2_pipe()
2079 struct smb2_create_req *req = work->request_buf; in create_smb2_pipe()
2085 1, work->conn->local_nls); in create_smb2_pipe()
2092 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2135 smb2_set_err_rsp(work); in create_smb2_pipe()
2372 static int smb2_creat(struct ksmbd_work *work, struct path *path, char *name, in smb2_creat() argument
2375 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2388 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2395 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2400 rc = ksmbd_vfs_kern_path(work, name, 0, path, 0); in smb2_creat()
2409 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2433 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2456 * @work: smb work containing request buffer
2460 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2462 struct ksmbd_conn *conn = work->conn; in smb2_open()
2463 struct ksmbd_session *sess = work->sess; in smb2_open()
2464 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2492 rsp_org = work->response_buf; in smb2_open()
2493 WORK_BUFFERS(work, req, rsp); in smb2_open()
2495 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2499 smb2_set_err_rsp(work); in smb2_open()
2505 return create_smb2_pipe(work); in smb2_open()
2519 work->conn->local_nls); in smb2_open()
2530 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2685 if (ksmbd_override_fsids(work)) { in smb2_open()
2690 rc = ksmbd_vfs_kern_path(work, name, LOOKUP_NO_SYMLINKS, &path, 1); in smb2_open()
2813 rc = smb2_creat(work, &path, name, open_flags, posix_mode, in smb2_open()
2892 fp = ksmbd_open_fd(work, filp); in smb2_open()
2924 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
2931 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
2937 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
2995 smb_break_all_oplock(work, fp); in smb2_open()
3020 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3041 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3080 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3224 ksmbd_revert_fsids(work); in smb2_open()
3255 ksmbd_fd_put(work, fp); in smb2_open()
3256 smb2_set_err_rsp(work); in smb2_open()
3562 struct ksmbd_work *work; member
3619 ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
3624 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
3757 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
3797 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
3803 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
3806 free_len = (int)(work->response_sz - in smb2_calc_max_out_buf_len()
3807 (get_rfc1002_len(work->response_buf) + 4)) - in smb2_calc_max_out_buf_len()
3815 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
3817 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
3820 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
3829 rsp_org = work->response_buf; in smb2_query_dir()
3830 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
3832 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
3834 smb2_set_err_rsp(work); in smb2_query_dir()
3844 dir_fp = ksmbd_lookup_fd_slow(work, in smb2_query_dir()
3892 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
3904 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
3917 query_dir_private.work = work; in smb2_query_dir()
3963 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
3964 ksmbd_revert_fsids(work); in smb2_query_dir()
3987 smb2_set_err_rsp(work); in smb2_query_dir()
3988 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
3989 ksmbd_revert_fsids(work); in smb2_query_dir()
4089 * @work: smb work containing query info command buffer
4097 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4132 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4347 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4352 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4412 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4417 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4434 static void get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4439 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4447 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4462 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
4689 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
4699 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
4702 return smb2_get_info_file_pipe(work->sess, req, rsp); in smb2_get_info_file()
4705 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
4708 work->compound_fid); in smb2_get_info_file()
4709 id = work->compound_fid; in smb2_get_info_file()
4710 pid = work->compound_pfid; in smb2_get_info_file()
4719 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
4747 rc = get_file_all_info(work, rsp, fp, rsp_org); in smb2_get_info_file()
4752 get_file_alternate_info(work, rsp, fp, rsp_org); in smb2_get_info_file()
4757 get_file_stream_info(work, rsp, fp, rsp_org); in smb2_get_info_file()
4777 rc = smb2_get_ea(work, fp, req, rsp, rsp_org); in smb2_get_info_file()
4801 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
4818 ksmbd_fd_put(work, fp); in smb2_get_info_file()
4822 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
4826 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
4828 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5010 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5039 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5073 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5076 work->compound_fid); in smb2_get_info_sec()
5077 id = work->compound_fid; in smb2_get_info_sec()
5078 pid = work->compound_pfid; in smb2_get_info_sec()
5087 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5095 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5097 ksmbd_vfs_get_sd_xattr(work->conn, user_ns, in smb2_get_info_sec()
5105 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5116 * @work: smb work containing query info request buffer
5120 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5126 rsp_org = work->response_buf; in smb2_query_info()
5127 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5134 rc = smb2_get_info_file(work, req, rsp, (void *)rsp_org); in smb2_query_info()
5138 rc = smb2_get_info_filesystem(work, req, rsp, (void *)rsp_org); in smb2_query_info()
5142 rc = smb2_get_info_sec(work, req, rsp, (void *)rsp_org); in smb2_query_info()
5159 smb2_set_err_rsp(work); in smb2_query_info()
5173 * @work: smb work containing close request buffer
5177 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5180 struct smb2_close_req *req = work->request_buf; in smb2_close_pipe()
5181 struct smb2_close_rsp *rsp = work->response_buf; in smb2_close_pipe()
5184 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5202 * @work: smb work containing close request buffer
5206 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5213 struct ksmbd_conn *conn = work->conn; in smb2_close()
5219 rsp_org = work->response_buf; in smb2_close()
5220 WORK_BUFFERS(work, req, rsp); in smb2_close()
5222 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5225 return smb2_close_pipe(work); in smb2_close()
5230 sess_id = work->compound_sid; in smb2_close()
5232 work->compound_sid = 0; in smb2_close()
5234 work->compound_sid = sess_id; in smb2_close()
5243 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5245 if (!has_file_id(work->compound_fid)) { in smb2_close()
5254 work->compound_fid, in smb2_close()
5255 work->compound_pfid); in smb2_close()
5256 volatile_id = work->compound_fid; in smb2_close()
5259 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5260 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5271 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5290 ksmbd_fd_put(work, fp); in smb2_close()
5302 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5307 smb2_set_err_rsp(work); in smb2_close()
5317 * @work: smb work containing echo request buffer
5321 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5323 struct smb2_echo_rsp *rsp = work->response_buf; in smb2_echo()
5331 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5412 rc = ksmbd_vfs_kern_path(work, new_name, LOOKUP_NO_SYMLINKS, &path, 1); in smb2_rename()
5429 rc = ksmbd_vfs_remove_file(work, new_name); in smb2_rename()
5448 rc = ksmbd_vfs_fp_rename(work, fp, new_name); in smb2_rename()
5456 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
5493 rc = ksmbd_vfs_kern_path(work, link_name, LOOKUP_NO_SYMLINKS, &path, 0); in smb2_create_link()
5504 rc = ksmbd_vfs_remove_file(work, link_name); in smb2_create_link()
5520 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
5614 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
5635 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
5653 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
5665 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
5688 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
5700 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
5741 return smb2_rename(work, fp, user_ns, rename_info, in set_rename_info()
5742 work->sess->conn->local_nls); in set_rename_info()
5815 * @work: smb work containing set info command buffer
5823 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
5842 return set_file_allocation_info(work, fp, in smb2_set_info_file()
5850 return set_end_of_file_info(work, fp, in smb2_set_info_file()
5855 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info_file()
5864 return set_rename_info(work, fp, in smb2_set_info_file()
5873 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
5876 work->sess->conn->local_nls); in smb2_set_info_file()
5880 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info_file()
5939 * @work: smb work containing set info request buffer
5943 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
5953 rsp_org = work->response_buf; in smb2_set_info()
5954 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
5955 req = ksmbd_req_buf_next(work); in smb2_set_info()
5956 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
5959 work->compound_fid); in smb2_set_info()
5960 id = work->compound_fid; in smb2_set_info()
5961 pid = work->compound_pfid; in smb2_set_info()
5964 req = work->request_buf; in smb2_set_info()
5965 rsp = work->response_buf; in smb2_set_info()
5973 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
5983 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
5987 if (ksmbd_override_fsids(work)) { in smb2_set_info()
5995 ksmbd_revert_fsids(work); in smb2_set_info()
6006 ksmbd_fd_put(work, fp); in smb2_set_info()
6028 smb2_set_err_rsp(work); in smb2_set_info()
6029 ksmbd_fd_put(work, fp); in smb2_set_info()
6036 * @work: smb work containing read IPC pipe command buffer
6040 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6045 struct smb2_read_req *req = work->request_buf; in smb2_read_pipe()
6046 struct smb2_read_rsp *rsp = work->response_buf; in smb2_read_pipe()
6051 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6058 work->aux_payload_buf = in smb2_read_pipe()
6060 if (!work->aux_payload_buf) { in smb2_read_pipe()
6065 memcpy(work->aux_payload_buf, rpc_resp->payload, in smb2_read_pipe()
6069 work->resp_hdr_sz = get_rfc1002_len(rsp) + 4; in smb2_read_pipe()
6070 work->aux_payload_sz = nbytes; in smb2_read_pipe()
6085 smb2_set_err_rsp(work); in smb2_read_pipe()
6090 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6098 if (work->conn->dialect == SMB30_PROT_ID && in smb2_read_rdma_channel()
6106 work->need_invalidate_rkey = in smb2_read_rdma_channel()
6108 work->remote_key = le32_to_cpu(desc->token); in smb2_read_rdma_channel()
6110 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6122 * @work: smb work containing read command buffer
6126 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6128 struct ksmbd_conn *conn = work->conn; in smb2_read()
6137 rsp_org = work->response_buf; in smb2_read()
6138 WORK_BUFFERS(work, req, rsp); in smb2_read()
6140 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6143 return smb2_read_pipe(work); in smb2_read()
6146 fp = ksmbd_lookup_fd_slow(work, le64_to_cpu(req->VolatileFileId), in smb2_read()
6173 work->aux_payload_buf = kvmalloc(length, GFP_KERNEL | __GFP_ZERO); in smb2_read()
6174 if (!work->aux_payload_buf) { in smb2_read()
6179 nbytes = ksmbd_vfs_read(work, fp, length, &offset); in smb2_read()
6186 kvfree(work->aux_payload_buf); in smb2_read()
6187 work->aux_payload_buf = NULL; in smb2_read()
6189 smb2_set_err_rsp(work); in smb2_read()
6190 ksmbd_fd_put(work, fp); in smb2_read()
6200 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6201 work->aux_payload_buf, in smb2_read()
6203 kvfree(work->aux_payload_buf); in smb2_read()
6204 work->aux_payload_buf = NULL; in smb2_read()
6220 work->resp_hdr_sz = get_rfc1002_len(rsp_org) + 4; in smb2_read()
6221 work->aux_payload_sz = nbytes; in smb2_read()
6223 ksmbd_fd_put(work, fp); in smb2_read()
6243 smb2_set_err_rsp(work); in smb2_read()
6245 ksmbd_fd_put(work, fp); in smb2_read()
6251 * @work: smb work containing write IPC pipe command buffer
6255 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6257 struct smb2_write_req *req = work->request_buf; in smb2_write_pipe()
6258 struct smb2_write_rsp *rsp = work->response_buf; in smb2_write_pipe()
6284 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6289 smb2_set_err_rsp(work); in smb2_write_pipe()
6294 smb2_set_err_rsp(work); in smb2_write_pipe()
6312 smb2_set_err_rsp(work); in smb2_write_pipe()
6318 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6330 if (work->conn->dialect == SMB30_PROT_ID && in smb2_write_rdma_channel()
6341 work->need_invalidate_rkey = in smb2_write_rdma_channel()
6343 work->remote_key = le32_to_cpu(desc->token); in smb2_write_rdma_channel()
6349 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6358 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6368 * @work: smb work containing write command buffer
6372 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6384 rsp_org = work->response_buf; in smb2_write()
6385 WORK_BUFFERS(work, req, rsp); in smb2_write()
6387 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6389 return smb2_write_pipe(work); in smb2_write()
6392 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
6398 fp = ksmbd_lookup_fd_slow(work, le64_to_cpu(req->VolatileFileId), in smb2_write()
6414 if (length > work->conn->vals->max_write_size) { in smb2_write()
6416 work->conn->vals->max_write_size); in smb2_write()
6448 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
6456 nbytes = smb2_write_rdma_channel(work, req, fp, offset, in smb2_write()
6472 ksmbd_fd_put(work, fp); in smb2_write()
6491 smb2_set_err_rsp(work); in smb2_write()
6492 ksmbd_fd_put(work, fp); in smb2_write()
6498 * @work: smb work containing flush command buffer
6502 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
6508 rsp_org = work->response_buf; in smb2_flush()
6509 WORK_BUFFERS(work, req, rsp); in smb2_flush()
6514 err = ksmbd_vfs_fsync(work, in smb2_flush()
6528 smb2_set_err_rsp(work); in smb2_flush()
6536 * @work: smb work containing cancel command buffer
6540 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
6542 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
6543 struct smb2_hdr *hdr = work->request_buf; in smb2_cancel()
6580 cancel_work == work) in smb2_cancel()
6600 work->send_no_response = 1; in smb2_cancel()
6706 * @work: smb work containing lock command buffer
6710 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
6712 struct smb2_lock_req *req = work->request_buf; in smb2_lock()
6713 struct smb2_lock_rsp *rsp = work->response_buf; in smb2_lock()
6731 fp = ksmbd_lookup_fd_slow(work, in smb2_lock()
6934 spin_lock(&work->conn->llist_lock); in smb2_lock()
6936 &work->conn->lock_list); in smb2_lock()
6937 spin_unlock(&work->conn->llist_lock); in smb2_lock()
6947 rc = setup_async_work(work, in smb2_lock()
6955 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
6958 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
6962 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
6964 spin_lock(&work->conn->llist_lock); in smb2_lock()
6966 spin_unlock(&work->conn->llist_lock); in smb2_lock()
6969 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
6971 list_del(&work->fp_entry); in smb2_lock()
6976 smb2_send_interim_resp(work, in smb2_lock()
6978 work->send_no_response = 1; in smb2_lock()
6981 init_smb2_rsp_hdr(work); in smb2_lock()
6982 smb2_set_err_rsp(work); in smb2_lock()
6990 spin_lock(&work->conn->llist_lock); in smb2_lock()
6992 spin_unlock(&work->conn->llist_lock); in smb2_lock()
6995 list_del(&work->fp_entry); in smb2_lock()
6999 spin_lock(&work->conn->llist_lock); in smb2_lock()
7001 &work->conn->lock_list); in smb2_lock()
7004 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7014 smb_break_all_oplock(work, fp); in smb2_lock()
7021 ksmbd_fd_put(work, fp); in smb2_lock()
7044 spin_lock(&work->conn->llist_lock); in smb2_lock()
7048 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7068 smb2_set_err_rsp(work); in smb2_lock()
7069 ksmbd_fd_put(work, fp); in smb2_lock()
7073 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7127 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7129 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7152 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7180 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7181 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7349 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7362 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7374 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7378 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7387 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
7423 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
7431 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
7443 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
7460 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
7464 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
7470 fp = ksmbd_lookup_fd_slow(work, in fsctl_request_resume_key()
7479 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
7486 * @work: smb work containing ioctl command buffer
7490 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
7496 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
7499 rsp_org = work->response_buf; in smb2_ioctl()
7500 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
7501 req = ksmbd_req_buf_next(work); in smb2_ioctl()
7502 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
7505 work->compound_fid); in smb2_ioctl()
7506 id = work->compound_fid; in smb2_ioctl()
7509 req = work->request_buf; in smb2_ioctl()
7510 rsp = work->response_buf; in smb2_ioctl()
7522 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
7558 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
7595 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
7605 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
7625 fsctl_copychunk(work, in smb2_ioctl()
7639 ret = fsctl_set_sparse(work, id, in smb2_ioctl()
7650 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
7665 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7674 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
7675 ksmbd_fd_put(work, fp); in smb2_ioctl()
7686 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
7706 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7716 ksmbd_fd_put(work, fp); in smb2_ioctl()
7733 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
7741 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
7768 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
7769 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
7805 smb2_set_err_rsp(work); in smb2_ioctl()
7811 * @work: smb work containing oplock break command buffer
7815 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
7817 struct smb2_oplock_break *req = work->request_buf; in smb20_oplock_break_ack()
7818 struct smb2_oplock_break *rsp = work->response_buf; in smb20_oplock_break_ack()
7833 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
7836 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7844 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7845 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
7915 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
7933 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
7934 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
7954 * @work: smb work containing lease break command buffer
7958 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
7960 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
7961 struct smb2_lease_ack *req = work->request_buf; in smb21_lease_break_ack()
7962 struct smb2_lease_ack *rsp = work->response_buf; in smb21_lease_break_ack()
7975 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8084 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8089 * @work: smb work containing oplock/lease break command buffer
8093 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8095 struct smb2_oplock_break *req = work->request_buf; in smb2_oplock_break()
8096 struct smb2_oplock_break *rsp = work->response_buf; in smb2_oplock_break()
8100 smb20_oplock_break_ack(work); in smb2_oplock_break()
8103 smb21_lease_break_ack(work); in smb2_oplock_break()
8109 smb2_set_err_rsp(work); in smb2_oplock_break()
8117 * @work: smb work containing notify command buffer
8121 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8126 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8128 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8130 smb2_set_err_rsp(work); in smb2_notify()
8134 smb2_set_err_rsp(work); in smb2_notify()
8141 * @work: smb work containing notify command buffer
8146 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8148 struct smb2_hdr *rcv_hdr2 = work->request_buf; in smb2_is_sign_req()
8161 * @work: smb work containing notify command buffer
8165 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8173 hdr_org = hdr = work->request_buf; in smb2_check_sign_req()
8174 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8175 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8177 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8183 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8191 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8205 * @work: smb work containing notify command buffer
8208 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8217 hdr_org = hdr = work->response_buf; in smb2_set_sign_rsp()
8218 if (work->next_smb2_rsp_hdr_off) in smb2_set_sign_rsp()
8219 hdr = ksmbd_resp_buf_next(work); in smb2_set_sign_rsp()
8221 req_hdr = ksmbd_req_buf_next(work); in smb2_set_sign_rsp()
8223 if (!work->next_smb2_rsp_hdr_off) { in smb2_set_sign_rsp()
8228 len = get_rfc1002_len(hdr_org) - work->next_smb2_rsp_hdr_off; in smb2_set_sign_rsp()
8241 if (work->aux_payload_sz) { in smb2_set_sign_rsp()
8242 iov[0].iov_len -= work->aux_payload_sz; in smb2_set_sign_rsp()
8244 iov[1].iov_base = work->aux_payload_buf; in smb2_set_sign_rsp()
8245 iov[1].iov_len = work->aux_payload_sz; in smb2_set_sign_rsp()
8249 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8256 * @work: smb work containing notify command buffer
8260 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8262 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8271 hdr_org = hdr = work->request_buf; in smb3_check_sign_req()
8272 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8273 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8275 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8281 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8284 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8286 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8315 * @work: smb work containing notify command buffer
8318 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8320 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8330 hdr_org = hdr = work->response_buf; in smb3_set_sign_rsp()
8331 if (work->next_smb2_rsp_hdr_off) in smb3_set_sign_rsp()
8332 hdr = ksmbd_resp_buf_next(work); in smb3_set_sign_rsp()
8334 req_hdr = ksmbd_req_buf_next(work); in smb3_set_sign_rsp()
8336 if (!work->next_smb2_rsp_hdr_off) { in smb3_set_sign_rsp()
8341 len = get_rfc1002_len(hdr_org) - work->next_smb2_rsp_hdr_off; in smb3_set_sign_rsp()
8347 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8349 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8365 if (work->aux_payload_sz) { in smb3_set_sign_rsp()
8366 iov[0].iov_len -= work->aux_payload_sz; in smb3_set_sign_rsp()
8367 iov[1].iov_base = work->aux_payload_buf; in smb3_set_sign_rsp()
8368 iov[1].iov_len = work->aux_payload_sz; in smb3_set_sign_rsp()
8378 * @work: smb work containing response buffer
8381 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8383 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8384 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8390 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8437 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
8439 char *buf = work->response_buf; in smb3_encrypt_resp()
8443 int buf_size = 0, rq_nvec = 2 + (work->aux_payload_sz ? 1 : 0); in smb3_encrypt_resp()
8453 fill_transform_hdr(tr_hdr, buf, work->conn->cipher_type); in smb3_encrypt_resp()
8461 if (work->aux_payload_sz) { in smb3_encrypt_resp()
8462 iov[1].iov_len = work->resp_hdr_sz - 4; in smb3_encrypt_resp()
8464 iov[2].iov_base = work->aux_payload_buf; in smb3_encrypt_resp()
8465 iov[2].iov_len = work->aux_payload_sz; in smb3_encrypt_resp()
8469 work->resp_hdr_sz = iov[1].iov_len; in smb3_encrypt_resp()
8471 rc = ksmbd_crypt_message(work->conn, iov, rq_nvec, 1); in smb3_encrypt_resp()
8477 work->tr_buf = tr_hdr; in smb3_encrypt_resp()
8489 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
8491 struct ksmbd_conn *conn = work->conn; in smb3_decrypt_req()
8493 char *buf = work->request_buf; in smb3_decrypt_req()
8535 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
8537 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
8538 struct smb2_hdr *rsp = work->response_buf; in smb3_11_final_sess_setup_resp()
8543 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
8544 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()