• 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()
646 int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg) in setup_async_work() argument
648 struct ksmbd_conn *conn = work->conn; in setup_async_work()
656 work->asynchronous = true; in setup_async_work()
657 work->async_id = id; in setup_async_work()
661 work->async_id); in setup_async_work()
663 work->cancel_fn = fn; in setup_async_work()
664 work->cancel_argv = arg; in setup_async_work()
666 if (list_empty(&work->async_request_entry)) { in setup_async_work()
668 list_add_tail(&work->async_request_entry, &conn->async_requests); in setup_async_work()
675 void release_async_work(struct ksmbd_work *work) in release_async_work() argument
677 struct ksmbd_conn *conn = work->conn; in release_async_work()
680 list_del_init(&work->async_request_entry); in release_async_work()
683 work->asynchronous = 0; in release_async_work()
684 work->cancel_fn = NULL; in release_async_work()
685 kfree(work->cancel_argv); in release_async_work()
686 work->cancel_argv = NULL; in release_async_work()
687 if (work->async_id) { in release_async_work()
688 ksmbd_release_id(&conn->async_ida, work->async_id); in release_async_work()
689 work->async_id = 0; in release_async_work()
693 void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status) in smb2_send_interim_resp() argument
707 in_work->conn = work->conn; in smb2_send_interim_resp()
708 memcpy(smb2_get_msg(in_work->response_buf), ksmbd_resp_buf_next(work), in smb2_send_interim_resp()
713 rsp_hdr->Id.AsyncId = cpu_to_le64(work->async_id); in smb2_send_interim_resp()
1082 * @work: smb work containing smb request buffer
1086 int smb2_handle_negotiate(struct ksmbd_work *work) in smb2_handle_negotiate() argument
1088 struct ksmbd_conn *conn = work->conn; in smb2_handle_negotiate()
1089 struct smb2_negotiate_req *req = smb2_get_msg(work->request_buf); in smb2_handle_negotiate()
1090 struct smb2_negotiate_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_handle_negotiate()
1099 work->send_no_response = 1; in smb2_handle_negotiate()
1103 smb2_buf_len = get_rfc1002_len(work->request_buf); in smb2_handle_negotiate()
1161 get_rfc1002_len(work->request_buf)); in smb2_handle_negotiate()
1181 work->request_buf, in smb2_handle_negotiate()
1257 rc = ksmbd_iov_pin_rsp(work, rsp, in smb2_handle_negotiate()
1261 smb2_set_err_rsp(work); in smb2_handle_negotiate()
1279 static int generate_preauth_hash(struct ksmbd_work *work) in generate_preauth_hash() argument
1281 struct ksmbd_conn *conn = work->conn; in generate_preauth_hash()
1282 struct ksmbd_session *sess = work->sess; in generate_preauth_hash()
1306 ksmbd_gen_preauth_integrity_hash(conn, work->request_buf, preauth_hash); in generate_preauth_hash()
1327 static int ntlm_negotiate(struct ksmbd_work *work, in ntlm_negotiate() argument
1338 rc = ksmbd_decode_ntlmssp_neg_blob(negblob, negblob_len, work->conn); in ntlm_negotiate()
1347 if (!work->conn->use_spnego) { in ntlm_negotiate()
1348 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1364 sz = ksmbd_build_ntlmssp_challenge_blob(chgblob, work->conn); in ntlm_negotiate()
1438 static int ntlm_authenticate(struct ksmbd_work *work, in ntlm_authenticate() argument
1442 struct ksmbd_conn *conn = work->conn; in ntlm_authenticate()
1443 struct ksmbd_session *sess = work->sess; in ntlm_authenticate()
1577 static int krb5_authenticate(struct ksmbd_work *work, in krb5_authenticate() argument
1581 struct ksmbd_conn *conn = work->conn; in krb5_authenticate()
1582 struct ksmbd_session *sess = work->sess; in krb5_authenticate()
1594 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()
1785 work->sess = sess; in smb2_sess_setup()
1810 rc = generate_preauth_hash(work); in smb2_sess_setup()
1816 rc = krb5_authenticate(work, req, rsp); in smb2_sess_setup()
1830 rc = ntlm_negotiate(work, negblob, negblob_len, rsp); in smb2_sess_setup()
1836 rc = ntlm_authenticate(work, req, rsp); in smb2_sess_setup()
1919 smb2_set_err_rsp(work); in smb2_sess_setup()
1928 rc = ksmbd_iov_pin_rsp(work, rsp, iov_len); in smb2_sess_setup()
1939 * @work: smb work containing smb request buffer
1943 int smb2_tree_connect(struct ksmbd_work *work) in smb2_tree_connect() argument
1945 struct ksmbd_conn *conn = work->conn; in smb2_tree_connect()
1948 struct ksmbd_session *sess = work->sess; in smb2_tree_connect()
1954 WORK_BUFFERS(work, req, rsp); in smb2_tree_connect()
1974 status = ksmbd_tree_conn_connect(work, name); in smb2_tree_connect()
2023 rc = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_tree_connect_rsp)); in smb2_tree_connect()
2059 smb2_set_err_rsp(work); in smb2_tree_connect()
2136 * @work: smb work containing request buffer
2140 int smb2_tree_disconnect(struct ksmbd_work *work) in smb2_tree_disconnect() argument
2144 struct ksmbd_session *sess = work->sess; in smb2_tree_disconnect()
2145 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_tree_disconnect()
2148 WORK_BUFFERS(work, req, rsp); in smb2_tree_disconnect()
2160 ksmbd_close_tree_conn_fds(work); in smb2_tree_disconnect()
2180 work->tcon = NULL; in smb2_tree_disconnect()
2183 err = ksmbd_iov_pin_rsp(work, rsp, in smb2_tree_disconnect()
2193 smb2_set_err_rsp(work); in smb2_tree_disconnect()
2200 * @work: smb work containing request buffer
2204 int smb2_session_logoff(struct ksmbd_work *work) in smb2_session_logoff() argument
2206 struct ksmbd_conn *conn = work->conn; in smb2_session_logoff()
2207 struct ksmbd_session *sess = work->sess; in smb2_session_logoff()
2213 WORK_BUFFERS(work, req, rsp); in smb2_session_logoff()
2221 smb2_set_err_rsp(work); in smb2_session_logoff()
2228 ksmbd_close_session_fds(work); in smb2_session_logoff()
2234 smb2_set_err_rsp(work); in smb2_session_logoff()
2248 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_logoff_rsp)); in smb2_session_logoff()
2251 smb2_set_err_rsp(work); in smb2_session_logoff()
2259 * @work: smb work containing request buffer
2263 static noinline int create_smb2_pipe(struct ksmbd_work *work) in create_smb2_pipe() argument
2271 WORK_BUFFERS(work, req, rsp); in create_smb2_pipe()
2274 1, work->conn->local_nls); in create_smb2_pipe()
2281 id = ksmbd_session_rpc_open(work->sess, name); in create_smb2_pipe()
2306 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_create_rsp, Buffer)); in create_smb2_pipe()
2327 smb2_set_err_rsp(work); in create_smb2_pipe()
2571 static int smb2_creat(struct ksmbd_work *work, struct path *parent_path, in smb2_creat() argument
2575 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_creat()
2588 rc = ksmbd_vfs_mkdir(work, name, mode); in smb2_creat()
2595 rc = ksmbd_vfs_create(work, name, mode); in smb2_creat()
2600 rc = ksmbd_vfs_kern_path_locked(work, name, 0, parent_path, path, 0); in smb2_creat()
2609 static int smb2_create_sd_buffer(struct ksmbd_work *work, in smb2_create_sd_buffer() argument
2633 return set_info_sec(work->conn, work->tcon, path, &sd_buf->ntsd, in smb2_create_sd_buffer()
2673 static int parse_durable_handle_context(struct ksmbd_work *work, in parse_durable_handle_context() argument
2678 struct ksmbd_conn *conn = work->conn; in parse_durable_handle_context()
2818 * @work: smb work containing request buffer
2822 int smb2_open(struct ksmbd_work *work) in smb2_open() argument
2824 struct ksmbd_conn *conn = work->conn; in smb2_open()
2825 struct ksmbd_session *sess = work->sess; in smb2_open()
2826 struct ksmbd_tree_connect *tcon = work->tcon; in smb2_open()
2856 WORK_BUFFERS(work, req, rsp); in smb2_open()
2858 if (req->hdr.NextCommand && !work->next_smb2_rcv_hdr_off && in smb2_open()
2862 smb2_set_err_rsp(work); in smb2_open()
2868 return create_smb2_pipe(work); in smb2_open()
2874 work->conn->local_nls); in smb2_open()
2883 if (!test_share_config_flag(work->tcon->share_conf, in smb2_open()
2916 rc = parse_durable_handle_context(work, req, lc, &dh_info); in smb2_open()
2929 rc = ksmbd_reopen_durable_fd(work, dh_info.fp); in smb2_open()
2935 if (ksmbd_override_fsids(work)) { in smb2_open()
3077 if (ksmbd_override_fsids(work)) { in smb2_open()
3082 rc = ksmbd_vfs_kern_path_locked(work, name, LOOKUP_NO_SYMLINKS, in smb2_open()
3205 rc = smb2_creat(work, &parent_path, &path, name, open_flags, in smb2_open()
3286 fp = ksmbd_open_fd(work, filp); in smb2_open()
3317 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3324 rc = smb2_create_sd_buffer(work, req, &path); in smb2_open()
3330 if (test_share_config_flag(work->tcon->share_conf, in smb2_open()
3414 smb_break_all_oplock(work, fp); in smb2_open()
3419 if (!test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_OPLOCKS) || in smb2_open()
3452 rc = smb_grant_oplock(work, req_op_level, in smb2_open()
3491 smb_break_all_levII_oplock(work, fp, 1); in smb2_open()
3531 test_share_config_flag(work->tcon->share_conf, in smb2_open()
3684 ksmbd_revert_fsids(work); in smb2_open()
3688 ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED); in smb2_open()
3689 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len); in smb2_open()
3718 ksmbd_fd_put(work, fp); in smb2_open()
3719 smb2_set_err_rsp(work); in smb2_open()
4051 struct ksmbd_work *work; member
4108 rc = ksmbd_vfs_fill_dentry_attrs(priv->work, in process_query_dir_entries()
4118 rc = smb2_populate_readdir_entry(priv->work->conn, in process_query_dir_entries()
4252 if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) in __query_dir()
4285 static int smb2_resp_buf_len(struct ksmbd_work *work, unsigned short hdr2_len) in smb2_resp_buf_len() argument
4289 free_len = (int)(work->response_sz - in smb2_resp_buf_len()
4290 (get_rfc1002_len(work->response_buf) + 4)) - hdr2_len; in smb2_resp_buf_len()
4294 static int smb2_calc_max_out_buf_len(struct ksmbd_work *work, in smb2_calc_max_out_buf_len() argument
4300 if (out_buf_len > work->conn->vals->max_trans_size) in smb2_calc_max_out_buf_len()
4303 free_len = smb2_resp_buf_len(work, hdr2_len); in smb2_calc_max_out_buf_len()
4310 int smb2_query_dir(struct ksmbd_work *work) in smb2_query_dir() argument
4312 struct ksmbd_conn *conn = work->conn; in smb2_query_dir()
4315 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_query_dir()
4324 WORK_BUFFERS(work, req, rsp); in smb2_query_dir()
4326 if (ksmbd_override_fsids(work)) { in smb2_query_dir()
4328 smb2_set_err_rsp(work); in smb2_query_dir()
4338 dir_fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_query_dir()
4380 smb2_calc_max_out_buf_len(work, 8, in smb2_query_dir()
4392 rc = ksmbd_populate_dot_dotdot_entries(work, req->FileInformationClass, in smb2_query_dir()
4405 query_dir_private.work = work; in smb2_query_dir()
4451 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4467 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_dir()
4475 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4476 ksmbd_revert_fsids(work); in smb2_query_dir()
4501 smb2_set_err_rsp(work); in smb2_query_dir()
4502 ksmbd_fd_put(work, dir_fp); in smb2_query_dir()
4503 ksmbd_revert_fsids(work); in smb2_query_dir()
4597 * @work: smb work containing query info command buffer
4605 static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_get_ea() argument
4641 smb2_calc_max_out_buf_len(work, 8, in smb2_get_ea()
4842 static int get_file_all_info(struct ksmbd_work *work, in get_file_all_info() argument
4847 struct ksmbd_conn *conn = work->conn; in get_file_all_info()
4862 filename = convert_to_nt_pathname(work->tcon->share_conf, &fp->filp->f_path); in get_file_all_info()
4908 static void get_file_alternate_info(struct ksmbd_work *work, in get_file_alternate_info() argument
4913 struct ksmbd_conn *conn = work->conn; in get_file_alternate_info()
4929 static int get_file_stream_info(struct ksmbd_work *work, in get_file_stream_info() argument
4934 struct ksmbd_conn *conn = work->conn; in get_file_stream_info()
4942 struct smb2_query_info_req *req = ksmbd_req_buf_next(work); in get_file_stream_info()
4953 smb2_calc_max_out_buf_len(work, 8, in get_file_stream_info()
5237 static int smb2_get_info_file(struct ksmbd_work *work, in smb2_get_info_file() argument
5246 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_file()
5249 return smb2_get_info_file_pipe(work->sess, req, rsp, in smb2_get_info_file()
5250 work->response_buf); in smb2_get_info_file()
5253 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_file()
5256 work->compound_fid); in smb2_get_info_file()
5257 id = work->compound_fid; in smb2_get_info_file()
5258 pid = work->compound_pfid; in smb2_get_info_file()
5267 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_file()
5275 get_file_access_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5279 rc = get_file_basic_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5283 rc = get_file_standard_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5287 get_file_alignment_info(rsp, work->response_buf); in smb2_get_info_file()
5291 rc = get_file_all_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5295 get_file_alternate_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5299 rc = get_file_stream_info(work, rsp, fp, work->response_buf); in smb2_get_info_file()
5303 rc = get_file_internal_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5307 rc = get_file_network_open_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5311 get_file_ea_info(rsp, work->response_buf); in smb2_get_info_file()
5315 rc = smb2_get_ea(work, fp, req, rsp, work->response_buf); in smb2_get_info_file()
5319 get_file_position_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5323 get_file_mode_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5327 rc = get_file_compression_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5331 rc = get_file_attribute_tag_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5334 if (!work->tcon->posix_extensions) { in smb2_get_info_file()
5338 rc = find_file_posix_info(rsp, fp, work->response_buf); in smb2_get_info_file()
5348 rsp, work->response_buf); in smb2_get_info_file()
5349 ksmbd_fd_put(work, fp); in smb2_get_info_file()
5353 static int smb2_get_info_filesystem(struct ksmbd_work *work, in smb2_get_info_filesystem() argument
5357 struct ksmbd_session *sess = work->sess; in smb2_get_info_filesystem()
5358 struct ksmbd_conn *conn = work->conn; in smb2_get_info_filesystem()
5359 struct ksmbd_share_config *share = work->tcon->share_conf; in smb2_get_info_filesystem()
5393 if (!test_tree_conn_flag(work->tcon, in smb2_get_info_filesystem()
5415 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_filesystem()
5545 if (!work->tcon->posix_extensions) { in smb2_get_info_filesystem()
5566 rsp, work->response_buf); in smb2_get_info_filesystem()
5571 static int smb2_get_info_sec(struct ksmbd_work *work, in smb2_get_info_sec() argument
5604 if (work->next_smb2_rcv_hdr_off) { in smb2_get_info_sec()
5607 work->compound_fid); in smb2_get_info_sec()
5608 id = work->compound_fid; in smb2_get_info_sec()
5609 pid = work->compound_pfid; in smb2_get_info_sec()
5618 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_get_info_sec()
5626 if (test_share_config_flag(work->tcon->share_conf, in smb2_get_info_sec()
5628 ppntsd_size = ksmbd_vfs_get_sd_xattr(work->conn, idmap, in smb2_get_info_sec()
5633 if (smb2_resp_buf_len(work, 8) > ppntsd_size) in smb2_get_info_sec()
5639 ksmbd_fd_put(work, fp); in smb2_get_info_sec()
5649 * @work: smb work containing query info request buffer
5653 int smb2_query_info(struct ksmbd_work *work) in smb2_query_info() argument
5659 WORK_BUFFERS(work, req, rsp); in smb2_query_info()
5663 if (ksmbd_override_fsids(work)) { in smb2_query_info()
5671 rc = smb2_get_info_file(work, req, rsp); in smb2_query_info()
5675 rc = smb2_get_info_filesystem(work, req, rsp); in smb2_query_info()
5679 rc = smb2_get_info_sec(work, req, rsp); in smb2_query_info()
5686 ksmbd_revert_fsids(work); in smb2_query_info()
5691 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_query_info()
5708 smb2_set_err_rsp(work); in smb2_query_info()
5719 * @work: smb work containing close request buffer
5723 static noinline int smb2_close_pipe(struct ksmbd_work *work) in smb2_close_pipe() argument
5729 WORK_BUFFERS(work, req, rsp); in smb2_close_pipe()
5732 ksmbd_session_rpc_close(work->sess, id); in smb2_close_pipe()
5745 return ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close_pipe()
5751 * @work: smb work containing close request buffer
5755 int smb2_close(struct ksmbd_work *work) in smb2_close() argument
5761 struct ksmbd_conn *conn = work->conn; in smb2_close()
5766 WORK_BUFFERS(work, req, rsp); in smb2_close()
5768 if (test_share_config_flag(work->tcon->share_conf, in smb2_close()
5771 return smb2_close_pipe(work); in smb2_close()
5776 sess_id = work->compound_sid; in smb2_close()
5778 work->compound_sid = 0; in smb2_close()
5780 work->compound_sid = sess_id; in smb2_close()
5789 if (work->next_smb2_rcv_hdr_off && in smb2_close()
5791 if (!has_file_id(work->compound_fid)) { in smb2_close()
5800 work->compound_fid, in smb2_close()
5801 work->compound_pfid); in smb2_close()
5802 volatile_id = work->compound_fid; in smb2_close()
5805 work->compound_fid = KSMBD_NO_FID; in smb2_close()
5806 work->compound_pfid = KSMBD_NO_FID; in smb2_close()
5820 fp = ksmbd_lookup_fd_fast(work, volatile_id); in smb2_close()
5829 ksmbd_fd_put(work, fp); in smb2_close()
5845 ksmbd_fd_put(work, fp); in smb2_close()
5857 err = ksmbd_close_fd(work, volatile_id); in smb2_close()
5860 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_close()
5866 smb2_set_err_rsp(work); in smb2_close()
5874 * @work: smb work containing echo request buffer
5878 int smb2_echo(struct ksmbd_work *work) in smb2_echo() argument
5880 struct smb2_echo_rsp *rsp = smb2_get_msg(work->response_buf); in smb2_echo()
5882 if (work->next_smb2_rcv_hdr_off) in smb2_echo()
5883 rsp = ksmbd_resp_buf_next(work); in smb2_echo()
5887 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_echo_rsp)); in smb2_echo()
5890 static int smb2_rename(struct ksmbd_work *work, in smb2_rename() argument
5954 rc = ksmbd_vfs_rename(work, &fp->filp->f_path, new_name, flags); in smb2_rename()
5956 smb_break_all_levII_oplock(work, fp, 0); in smb2_rename()
5962 static int smb2_create_link(struct ksmbd_work *work, in smb2_create_link() argument
5998 rc = ksmbd_vfs_kern_path_locked(work, link_name, LOOKUP_NO_SYMLINKS, in smb2_create_link()
6008 rc = ksmbd_vfs_remove_file(work, &path); in smb2_create_link()
6024 rc = ksmbd_vfs_link(work, target_name, link_name); in smb2_create_link()
6117 static int set_file_allocation_info(struct ksmbd_work *work, in set_file_allocation_info() argument
6144 smb_break_all_levII_oplock(work, fp, 1); in set_file_allocation_info()
6162 rc = ksmbd_vfs_truncate(work, fp, alloc_blks * 512); in set_file_allocation_info()
6173 static int set_end_of_file_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_end_of_file_info() argument
6195 rc = ksmbd_vfs_truncate(work, fp, newsize); in set_end_of_file_info()
6206 static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, in set_rename_info() argument
6222 return smb2_rename(work, fp, rename_info, work->conn->local_nls); in set_rename_info()
6293 * @work: smb work containing set info command buffer
6301 static int smb2_set_info_file(struct ksmbd_work *work, struct ksmbd_file *fp, in smb2_set_info_file() argument
6321 return set_file_allocation_info(work, fp, in smb2_set_info_file()
6329 return set_end_of_file_info(work, fp, in smb2_set_info_file()
6337 return set_rename_info(work, fp, in smb2_set_info_file()
6346 return smb2_create_link(work, work->tcon->share_conf, in smb2_set_info_file()
6349 work->conn->local_nls); in smb2_set_info_file()
6406 * @work: smb work containing set info request buffer
6410 int smb2_set_info(struct ksmbd_work *work) in smb2_set_info() argument
6420 if (work->next_smb2_rcv_hdr_off) { in smb2_set_info()
6421 req = ksmbd_req_buf_next(work); in smb2_set_info()
6422 rsp = ksmbd_resp_buf_next(work); in smb2_set_info()
6425 work->compound_fid); in smb2_set_info()
6426 id = work->compound_fid; in smb2_set_info()
6427 pid = work->compound_pfid; in smb2_set_info()
6430 req = smb2_get_msg(work->request_buf); in smb2_set_info()
6431 rsp = smb2_get_msg(work->response_buf); in smb2_set_info()
6434 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_set_info()
6446 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_set_info()
6456 rc = smb2_set_info_file(work, fp, req, work->tcon->share_conf); in smb2_set_info()
6460 if (ksmbd_override_fsids(work)) { in smb2_set_info()
6468 ksmbd_revert_fsids(work); in smb2_set_info()
6478 rc = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_set_info()
6482 ksmbd_fd_put(work, fp); in smb2_set_info()
6504 smb2_set_err_rsp(work); in smb2_set_info()
6505 ksmbd_fd_put(work, fp); in smb2_set_info()
6512 * @work: smb work containing read IPC pipe command buffer
6516 static noinline int smb2_read_pipe(struct ksmbd_work *work) in smb2_read_pipe() argument
6524 WORK_BUFFERS(work, req, rsp); in smb2_read_pipe()
6528 rpc_resp = ksmbd_rpc_read(work->sess, id); in smb2_read_pipe()
6547 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read_pipe()
6556 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_read_pipe()
6572 smb2_set_err_rsp(work); in smb2_read_pipe()
6577 static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work, in smb2_set_remote_key_for_rdma() argument
6584 if (work->conn->dialect == SMB30_PROT_ID && in smb2_set_remote_key_for_rdma()
6600 work->need_invalidate_rkey = in smb2_set_remote_key_for_rdma()
6603 work->remote_key = le32_to_cpu(desc->token); in smb2_set_remote_key_for_rdma()
6607 static ssize_t smb2_read_rdma_channel(struct ksmbd_work *work, in smb2_read_rdma_channel() argument
6613 err = ksmbd_conn_rdma_write(work->conn, data_buf, length, in smb2_read_rdma_channel()
6625 * @work: smb work containing read command buffer
6629 int smb2_read(struct ksmbd_work *work) in smb2_read() argument
6631 struct ksmbd_conn *conn = work->conn; in smb2_read()
6644 if (test_share_config_flag(work->tcon->share_conf, in smb2_read()
6647 return smb2_read_pipe(work); in smb2_read()
6650 if (work->next_smb2_rcv_hdr_off) { in smb2_read()
6651 req = ksmbd_req_buf_next(work); in smb2_read()
6652 rsp = ksmbd_resp_buf_next(work); in smb2_read()
6655 work->compound_fid); in smb2_read()
6656 id = work->compound_fid; in smb2_read()
6657 pid = work->compound_pfid; in smb2_read()
6660 req = smb2_get_msg(work->request_buf); in smb2_read()
6661 rsp = smb2_get_msg(work->response_buf); in smb2_read()
6682 err = smb2_set_remote_key_for_rdma(work, in smb2_read()
6691 fp = ksmbd_lookup_fd_slow(work, id, pid); in smb2_read()
6727 nbytes = ksmbd_vfs_read(work, fp, length, &offset, aux_payload_buf); in smb2_read()
6736 smb2_set_err_rsp(work); in smb2_read()
6737 ksmbd_fd_put(work, fp); in smb2_read()
6746 remain_bytes = smb2_read_rdma_channel(work, req, in smb2_read()
6764 err = ksmbd_iov_pin_rsp_read(work, (void *)rsp, in smb2_read()
6771 ksmbd_fd_put(work, fp); in smb2_read()
6791 smb2_set_err_rsp(work); in smb2_read()
6793 ksmbd_fd_put(work, fp); in smb2_read()
6799 * @work: smb work containing write IPC pipe command buffer
6803 static noinline int smb2_write_pipe(struct ksmbd_work *work) in smb2_write_pipe() argument
6813 WORK_BUFFERS(work, req, rsp); in smb2_write_pipe()
6819 get_rfc1002_len(work->request_buf)) { in smb2_write_pipe()
6822 get_rfc1002_len(work->request_buf)); in smb2_write_pipe()
6830 rpc_resp = ksmbd_rpc_write(work->sess, id, data_buf, length); in smb2_write_pipe()
6835 smb2_set_err_rsp(work); in smb2_write_pipe()
6840 smb2_set_err_rsp(work); in smb2_write_pipe()
6853 err = ksmbd_iov_pin_rsp(work, (void *)rsp, in smb2_write_pipe()
6858 smb2_set_err_rsp(work); in smb2_write_pipe()
6864 static ssize_t smb2_write_rdma_channel(struct ksmbd_work *work, in smb2_write_rdma_channel() argument
6877 ret = ksmbd_conn_rdma_read(work->conn, data_buf, length, in smb2_write_rdma_channel()
6886 ret = ksmbd_vfs_write(work, fp, data_buf, length, &offset, sync, &nbytes); in smb2_write_rdma_channel()
6896 * @work: smb work containing write command buffer
6900 int smb2_write(struct ksmbd_work *work) in smb2_write() argument
6911 unsigned int max_write_size = work->conn->vals->max_write_size; in smb2_write()
6913 WORK_BUFFERS(work, req, rsp); in smb2_write()
6915 if (test_share_config_flag(work->tcon->share_conf, KSMBD_SHARE_FLAG_PIPE)) { in smb2_write()
6917 return smb2_write_pipe(work); in smb2_write()
6940 err = smb2_set_remote_key_for_rdma(work, in smb2_write()
6949 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_write()
6955 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_write()
6990 err = ksmbd_vfs_write(work, fp, data_buf, length, &offset, in smb2_write()
6998 nbytes = smb2_write_rdma_channel(work, req, fp, offset, length, in smb2_write()
7012 err = ksmbd_iov_pin_rsp(work, rsp, offsetof(struct smb2_write_rsp, Buffer)); in smb2_write()
7015 ksmbd_fd_put(work, fp); in smb2_write()
7034 smb2_set_err_rsp(work); in smb2_write()
7035 ksmbd_fd_put(work, fp); in smb2_write()
7041 * @work: smb work containing flush command buffer
7045 int smb2_flush(struct ksmbd_work *work) in smb2_flush() argument
7051 WORK_BUFFERS(work, req, rsp); in smb2_flush()
7055 err = ksmbd_vfs_fsync(work, req->VolatileFileId, req->PersistentFileId); in smb2_flush()
7061 return ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_flush_rsp)); in smb2_flush()
7065 smb2_set_err_rsp(work); in smb2_flush()
7071 * @work: smb work containing cancel command buffer
7075 int smb2_cancel(struct ksmbd_work *work) in smb2_cancel() argument
7077 struct ksmbd_conn *conn = work->conn; in smb2_cancel()
7078 struct smb2_hdr *hdr = smb2_get_msg(work->request_buf); in smb2_cancel()
7083 if (work->next_smb2_rcv_hdr_off) in smb2_cancel()
7084 hdr = ksmbd_resp_buf_next(work); in smb2_cancel()
7119 iter == work) in smb2_cancel()
7133 work->send_no_response = 1; in smb2_cancel()
7239 * @work: smb work containing lock command buffer
7243 int smb2_lock(struct ksmbd_work *work) in smb2_lock() argument
7263 WORK_BUFFERS(work, req, rsp); in smb2_lock()
7266 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in smb2_lock()
7479 rc = setup_async_work(work, in smb2_lock()
7488 list_add(&work->fp_entry, &fp->blocked_works); in smb2_lock()
7491 smb2_send_interim_resp(work, STATUS_PENDING); in smb2_lock()
7496 list_del(&work->fp_entry); in smb2_lock()
7499 if (work->state != KSMBD_WORK_ACTIVE) { in smb2_lock()
7503 if (work->state == KSMBD_WORK_CANCELLED) { in smb2_lock()
7507 smb2_send_interim_resp(work, in smb2_lock()
7509 work->send_no_response = 1; in smb2_lock()
7520 release_async_work(work); in smb2_lock()
7524 spin_lock(&work->conn->llist_lock); in smb2_lock()
7526 &work->conn->lock_list); in smb2_lock()
7529 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7538 smb_break_all_oplock(work, fp); in smb2_lock()
7544 err = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lock_rsp)); in smb2_lock()
7548 ksmbd_fd_put(work, fp); in smb2_lock()
7571 spin_lock(&work->conn->llist_lock); in smb2_lock()
7575 spin_unlock(&work->conn->llist_lock); in smb2_lock()
7595 smb2_set_err_rsp(work); in smb2_lock()
7596 ksmbd_fd_put(work, fp); in smb2_lock()
7600 static int fsctl_copychunk(struct ksmbd_work *work, in fsctl_copychunk() argument
7654 src_fp = ksmbd_lookup_foreign_fd(work, in fsctl_copychunk()
7656 dst_fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in fsctl_copychunk()
7679 ret = ksmbd_vfs_copy_file_ranges(work, src_fp, dst_fp, in fsctl_copychunk()
7707 ksmbd_fd_put(work, src_fp); in fsctl_copychunk()
7708 ksmbd_fd_put(work, dst_fp); in fsctl_copychunk()
7880 static int fsctl_query_allocated_ranges(struct ksmbd_work *work, u64 id, in fsctl_query_allocated_ranges() argument
7899 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_query_allocated_ranges()
7908 ksmbd_fd_put(work, fp); in fsctl_query_allocated_ranges()
7912 static int fsctl_pipe_transceive(struct ksmbd_work *work, u64 id, in fsctl_pipe_transceive() argument
7921 rpc_resp = ksmbd_rpc_ioctl(work->sess, id, data_buf, in fsctl_pipe_transceive()
7957 static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, in fsctl_set_sparse() argument
7965 fp = ksmbd_lookup_fd_fast(work, id); in fsctl_set_sparse()
7977 test_share_config_flag(work->tcon->share_conf, in fsctl_set_sparse()
7995 ksmbd_fd_put(work, fp); in fsctl_set_sparse()
7999 static int fsctl_request_resume_key(struct ksmbd_work *work, in fsctl_request_resume_key() argument
8005 fp = ksmbd_lookup_fd_slow(work, req->VolatileFileId, req->PersistentFileId); in fsctl_request_resume_key()
8012 ksmbd_fd_put(work, fp); in fsctl_request_resume_key()
8019 * @work: smb work containing ioctl command buffer
8023 int smb2_ioctl(struct ksmbd_work *work) in smb2_ioctl() argument
8029 struct ksmbd_conn *conn = work->conn; in smb2_ioctl()
8033 if (work->next_smb2_rcv_hdr_off) { in smb2_ioctl()
8034 req = ksmbd_req_buf_next(work); in smb2_ioctl()
8035 rsp = ksmbd_resp_buf_next(work); in smb2_ioctl()
8038 work->compound_fid); in smb2_ioctl()
8039 id = work->compound_fid; in smb2_ioctl()
8042 req = smb2_get_msg(work->request_buf); in smb2_ioctl()
8043 rsp = smb2_get_msg(work->response_buf); in smb2_ioctl()
8057 ret = smb2_calc_max_out_buf_len(work, 48, in smb2_ioctl()
8093 nbytes = fsctl_pipe_transceive(work, id, out_buf_len, req, rsp); in smb2_ioctl()
8135 ret = fsctl_request_resume_key(work, req, in smb2_ioctl()
8145 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8165 fsctl_copychunk(work, in smb2_ioctl()
8179 ret = fsctl_set_sparse(work, id, (struct file_sparse *)buffer); in smb2_ioctl()
8189 if (!test_tree_conn_flag(work->tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { in smb2_ioctl()
8213 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8219 ret = ksmbd_vfs_zero_data(work, fp, off, len); in smb2_ioctl()
8220 ksmbd_fd_put(work, fp); in smb2_ioctl()
8232 ret = fsctl_query_allocated_ranges(work, id, in smb2_ioctl()
8252 fp = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8262 ksmbd_fd_put(work, fp); in smb2_ioctl()
8279 fp_in = ksmbd_lookup_fd_slow(work, dup_ext->VolatileFileHandle, in smb2_ioctl()
8287 fp_out = ksmbd_lookup_fd_fast(work, id); in smb2_ioctl()
8324 ksmbd_fd_put(work, fp_in); in smb2_ioctl()
8325 ksmbd_fd_put(work, fp_out); in smb2_ioctl()
8346 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_ioctl_rsp) + nbytes); in smb2_ioctl()
8361 smb2_set_err_rsp(work); in smb2_ioctl()
8367 * @work: smb work containing oplock break command buffer
8371 static void smb20_oplock_break_ack(struct ksmbd_work *work) in smb20_oplock_break_ack() argument
8383 WORK_BUFFERS(work, req, rsp); in smb20_oplock_break_ack()
8391 fp = ksmbd_lookup_fd_slow(work, volatile_id, persistent_id); in smb20_oplock_break_ack()
8394 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8402 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8403 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8475 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8483 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_oplock_break)); in smb20_oplock_break_ack()
8492 ksmbd_fd_put(work, fp); in smb20_oplock_break_ack()
8493 smb2_set_err_rsp(work); in smb20_oplock_break_ack()
8513 * @work: smb work containing lease break command buffer
8517 static void smb21_lease_break_ack(struct ksmbd_work *work) in smb21_lease_break_ack() argument
8519 struct ksmbd_conn *conn = work->conn; in smb21_lease_break_ack()
8529 WORK_BUFFERS(work, req, rsp); in smb21_lease_break_ack()
8536 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8635 ret = ksmbd_iov_pin_rsp(work, rsp, sizeof(struct smb2_lease_ack)); in smb21_lease_break_ack()
8645 smb2_set_err_rsp(work); in smb21_lease_break_ack()
8650 * @work: smb work containing oplock/lease break command buffer
8654 int smb2_oplock_break(struct ksmbd_work *work) in smb2_oplock_break() argument
8659 WORK_BUFFERS(work, req, rsp); in smb2_oplock_break()
8663 smb20_oplock_break_ack(work); in smb2_oplock_break()
8666 smb21_lease_break_ack(work); in smb2_oplock_break()
8672 smb2_set_err_rsp(work); in smb2_oplock_break()
8680 * @work: smb work containing notify command buffer
8684 int smb2_notify(struct ksmbd_work *work) in smb2_notify() argument
8689 WORK_BUFFERS(work, req, rsp); in smb2_notify()
8691 if (work->next_smb2_rcv_hdr_off && req->hdr.NextCommand) { in smb2_notify()
8693 smb2_set_err_rsp(work); in smb2_notify()
8697 smb2_set_err_rsp(work); in smb2_notify()
8704 * @work: smb work containing notify command buffer
8709 bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command) in smb2_is_sign_req() argument
8711 struct smb2_hdr *rcv_hdr2 = smb2_get_msg(work->request_buf); in smb2_is_sign_req()
8724 * @work: smb work containing notify command buffer
8728 int smb2_check_sign_req(struct ksmbd_work *work) in smb2_check_sign_req() argument
8736 hdr = smb2_get_msg(work->request_buf); in smb2_check_sign_req()
8737 if (work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8738 hdr = ksmbd_req_buf_next(work); in smb2_check_sign_req()
8740 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb2_check_sign_req()
8741 len = get_rfc1002_len(work->request_buf); in smb2_check_sign_req()
8745 len = get_rfc1002_len(work->request_buf) - in smb2_check_sign_req()
8746 work->next_smb2_rcv_hdr_off; in smb2_check_sign_req()
8754 if (ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, 1, in smb2_check_sign_req()
8768 * @work: smb work containing notify command buffer
8771 void smb2_set_sign_rsp(struct ksmbd_work *work) in smb2_set_sign_rsp() argument
8778 hdr = ksmbd_resp_buf_curr(work); in smb2_set_sign_rsp()
8783 iov = &work->iov[work->iov_idx - 1]; in smb2_set_sign_rsp()
8786 iov = &work->iov[work->iov_idx]; in smb2_set_sign_rsp()
8789 if (!ksmbd_sign_smb2_pdu(work->conn, work->sess->sess_key, iov, n_vec, in smb2_set_sign_rsp()
8796 * @work: smb work containing notify command buffer
8800 int smb3_check_sign_req(struct ksmbd_work *work) in smb3_check_sign_req() argument
8802 struct ksmbd_conn *conn = work->conn; in smb3_check_sign_req()
8811 hdr = smb2_get_msg(work->request_buf); in smb3_check_sign_req()
8812 if (work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8813 hdr = ksmbd_req_buf_next(work); in smb3_check_sign_req()
8815 if (!hdr->NextCommand && !work->next_smb2_rcv_hdr_off) in smb3_check_sign_req()
8816 len = get_rfc1002_len(work->request_buf); in smb3_check_sign_req()
8820 len = get_rfc1002_len(work->request_buf) - in smb3_check_sign_req()
8821 work->next_smb2_rcv_hdr_off; in smb3_check_sign_req()
8824 signing_key = work->sess->smb3signingkey; in smb3_check_sign_req()
8826 chann = lookup_chann_list(work->sess, conn); in smb3_check_sign_req()
8856 * @work: smb work containing notify command buffer
8859 void smb3_set_sign_rsp(struct ksmbd_work *work) in smb3_set_sign_rsp() argument
8861 struct ksmbd_conn *conn = work->conn; in smb3_set_sign_rsp()
8869 hdr = ksmbd_resp_buf_curr(work); in smb3_set_sign_rsp()
8873 signing_key = work->sess->smb3signingkey; in smb3_set_sign_rsp()
8875 chann = lookup_chann_list(work->sess, work->conn); in smb3_set_sign_rsp()
8889 iov = &work->iov[work->iov_idx - 1]; in smb3_set_sign_rsp()
8892 iov = &work->iov[work->iov_idx]; in smb3_set_sign_rsp()
8902 * @work: smb work containing response buffer
8905 void smb3_preauth_hash_rsp(struct ksmbd_work *work) in smb3_preauth_hash_rsp() argument
8907 struct ksmbd_conn *conn = work->conn; in smb3_preauth_hash_rsp()
8908 struct ksmbd_session *sess = work->sess; in smb3_preauth_hash_rsp()
8914 WORK_BUFFERS(work, req, rsp); in smb3_preauth_hash_rsp()
8918 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8936 ksmbd_gen_preauth_integrity_hash(conn, work->response_buf, in smb3_preauth_hash_rsp()
8961 int smb3_encrypt_resp(struct ksmbd_work *work) in smb3_encrypt_resp() argument
8963 struct kvec *iov = work->iov; in smb3_encrypt_resp()
8972 fill_transform_hdr(tr_buf, work->response_buf, work->conn->cipher_type); in smb3_encrypt_resp()
8976 work->tr_buf = tr_buf; in smb3_encrypt_resp()
8978 return ksmbd_crypt_message(work, iov, work->iov_idx + 1, 1); in smb3_encrypt_resp()
8988 int smb3_decrypt_req(struct ksmbd_work *work) in smb3_decrypt_req() argument
8991 char *buf = work->request_buf; in smb3_decrypt_req()
9010 sess = ksmbd_session_lookup_all(work->conn, le64_to_cpu(tr_hdr->SessionId)); in smb3_decrypt_req()
9022 rc = ksmbd_crypt_message(work, iov, 2, 0); in smb3_decrypt_req()
9032 bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work) in smb3_11_final_sess_setup_resp() argument
9034 struct ksmbd_conn *conn = work->conn; in smb3_11_final_sess_setup_resp()
9035 struct ksmbd_session *sess = work->sess; in smb3_11_final_sess_setup_resp()
9036 struct smb2_hdr *rsp = smb2_get_msg(work->response_buf); in smb3_11_final_sess_setup_resp()
9041 if (work->next_smb2_rcv_hdr_off) in smb3_11_final_sess_setup_resp()
9042 rsp = ksmbd_resp_buf_next(work); in smb3_11_final_sess_setup_resp()