138c8a9a5SSteve French /* SPDX-License-Identifier: GPL-2.0-or-later */ 238c8a9a5SSteve French /* 338c8a9a5SSteve French * Copyright (C) 2019 Samsung Electronics Co., Ltd. 438c8a9a5SSteve French */ 538c8a9a5SSteve French 638c8a9a5SSteve French #ifndef __KSMBD_WORK_H__ 738c8a9a5SSteve French #define __KSMBD_WORK_H__ 838c8a9a5SSteve French 938c8a9a5SSteve French #include <linux/ctype.h> 1038c8a9a5SSteve French #include <linux/workqueue.h> 1138c8a9a5SSteve French 1238c8a9a5SSteve French struct ksmbd_conn; 1338c8a9a5SSteve French struct ksmbd_session; 1438c8a9a5SSteve French struct ksmbd_tree_connect; 1538c8a9a5SSteve French 1638c8a9a5SSteve French enum { 1738c8a9a5SSteve French KSMBD_WORK_ACTIVE = 0, 1838c8a9a5SSteve French KSMBD_WORK_CANCELLED, 1938c8a9a5SSteve French KSMBD_WORK_CLOSED, 2038c8a9a5SSteve French }; 2138c8a9a5SSteve French 22*e2b76ab8SNamjae Jeon struct aux_read { 23*e2b76ab8SNamjae Jeon void *buf; 24*e2b76ab8SNamjae Jeon struct list_head entry; 25*e2b76ab8SNamjae Jeon }; 26*e2b76ab8SNamjae Jeon 2738c8a9a5SSteve French /* one of these for every pending CIFS request at the connection */ 2838c8a9a5SSteve French struct ksmbd_work { 2938c8a9a5SSteve French /* Server corresponding to this mid */ 3038c8a9a5SSteve French struct ksmbd_conn *conn; 3138c8a9a5SSteve French struct ksmbd_session *sess; 3238c8a9a5SSteve French struct ksmbd_tree_connect *tcon; 3338c8a9a5SSteve French 3438c8a9a5SSteve French /* Pointer to received SMB header */ 3538c8a9a5SSteve French void *request_buf; 3638c8a9a5SSteve French /* Response buffer */ 3738c8a9a5SSteve French void *response_buf; 3838c8a9a5SSteve French 39*e2b76ab8SNamjae Jeon struct list_head aux_read_list; 40*e2b76ab8SNamjae Jeon 41*e2b76ab8SNamjae Jeon struct kvec *iov; 42*e2b76ab8SNamjae Jeon int iov_alloc_cnt; 43*e2b76ab8SNamjae Jeon int iov_cnt; 44*e2b76ab8SNamjae Jeon int iov_idx; 4538c8a9a5SSteve French 4638c8a9a5SSteve French /* Next cmd hdr in compound req buf*/ 4738c8a9a5SSteve French int next_smb2_rcv_hdr_off; 4838c8a9a5SSteve French /* Next cmd hdr in compound rsp buf*/ 4938c8a9a5SSteve French int next_smb2_rsp_hdr_off; 50*e2b76ab8SNamjae Jeon /* Current cmd hdr in compound rsp buf*/ 51*e2b76ab8SNamjae Jeon int curr_smb2_rsp_hdr_off; 5238c8a9a5SSteve French 5338c8a9a5SSteve French /* 5438c8a9a5SSteve French * Current Local FID assigned compound response if SMB2 CREATE 5538c8a9a5SSteve French * command is present in compound request 5638c8a9a5SSteve French */ 5738c8a9a5SSteve French u64 compound_fid; 5838c8a9a5SSteve French u64 compound_pfid; 5938c8a9a5SSteve French u64 compound_sid; 6038c8a9a5SSteve French 6138c8a9a5SSteve French const struct cred *saved_cred; 6238c8a9a5SSteve French 6338c8a9a5SSteve French /* Number of granted credits */ 6438c8a9a5SSteve French unsigned int credits_granted; 6538c8a9a5SSteve French 6638c8a9a5SSteve French /* response smb header size */ 6738c8a9a5SSteve French unsigned int response_sz; 6838c8a9a5SSteve French 6938c8a9a5SSteve French void *tr_buf; 7038c8a9a5SSteve French 7138c8a9a5SSteve French unsigned char state; 7238c8a9a5SSteve French /* No response for cancelled request */ 7338c8a9a5SSteve French bool send_no_response:1; 7438c8a9a5SSteve French /* Request is encrypted */ 7538c8a9a5SSteve French bool encrypted:1; 7638c8a9a5SSteve French /* Is this SYNC or ASYNC ksmbd_work */ 7738c8a9a5SSteve French bool asynchronous:1; 7838c8a9a5SSteve French bool need_invalidate_rkey:1; 7938c8a9a5SSteve French 8038c8a9a5SSteve French unsigned int remote_key; 8138c8a9a5SSteve French /* cancel works */ 8238c8a9a5SSteve French int async_id; 8338c8a9a5SSteve French void **cancel_argv; 8438c8a9a5SSteve French void (*cancel_fn)(void **argv); 8538c8a9a5SSteve French 8638c8a9a5SSteve French struct work_struct work; 8738c8a9a5SSteve French /* List head at conn->requests */ 8838c8a9a5SSteve French struct list_head request_entry; 8938c8a9a5SSteve French /* List head at conn->async_requests */ 9038c8a9a5SSteve French struct list_head async_request_entry; 9138c8a9a5SSteve French struct list_head fp_entry; 9238c8a9a5SSteve French struct list_head interim_entry; 9338c8a9a5SSteve French }; 9438c8a9a5SSteve French 9538c8a9a5SSteve French /** 9638c8a9a5SSteve French * ksmbd_resp_buf_next - Get next buffer on compound response. 9738c8a9a5SSteve French * @work: smb work containing response buffer 9838c8a9a5SSteve French */ 9938c8a9a5SSteve French static inline void *ksmbd_resp_buf_next(struct ksmbd_work *work) 10038c8a9a5SSteve French { 10138c8a9a5SSteve French return work->response_buf + work->next_smb2_rsp_hdr_off + 4; 10238c8a9a5SSteve French } 10338c8a9a5SSteve French 10438c8a9a5SSteve French /** 105*e2b76ab8SNamjae Jeon * ksmbd_resp_buf_curr - Get current buffer on compound response. 106*e2b76ab8SNamjae Jeon * @work: smb work containing response buffer 107*e2b76ab8SNamjae Jeon */ 108*e2b76ab8SNamjae Jeon static inline void *ksmbd_resp_buf_curr(struct ksmbd_work *work) 109*e2b76ab8SNamjae Jeon { 110*e2b76ab8SNamjae Jeon return work->response_buf + work->curr_smb2_rsp_hdr_off + 4; 111*e2b76ab8SNamjae Jeon } 112*e2b76ab8SNamjae Jeon 113*e2b76ab8SNamjae Jeon /** 11438c8a9a5SSteve French * ksmbd_req_buf_next - Get next buffer on compound request. 11538c8a9a5SSteve French * @work: smb work containing response buffer 11638c8a9a5SSteve French */ 11738c8a9a5SSteve French static inline void *ksmbd_req_buf_next(struct ksmbd_work *work) 11838c8a9a5SSteve French { 11938c8a9a5SSteve French return work->request_buf + work->next_smb2_rcv_hdr_off + 4; 12038c8a9a5SSteve French } 12138c8a9a5SSteve French 12238c8a9a5SSteve French struct ksmbd_work *ksmbd_alloc_work_struct(void); 12338c8a9a5SSteve French void ksmbd_free_work_struct(struct ksmbd_work *work); 12438c8a9a5SSteve French 12538c8a9a5SSteve French void ksmbd_work_pool_destroy(void); 12638c8a9a5SSteve French int ksmbd_work_pool_init(void); 12738c8a9a5SSteve French 12838c8a9a5SSteve French int ksmbd_workqueue_init(void); 12938c8a9a5SSteve French void ksmbd_workqueue_destroy(void); 13038c8a9a5SSteve French bool ksmbd_queue_work(struct ksmbd_work *work); 131*e2b76ab8SNamjae Jeon int ksmbd_iov_pin_rsp_read(struct ksmbd_work *work, void *ib, int len, 132*e2b76ab8SNamjae Jeon void *aux_buf, unsigned int aux_size); 133*e2b76ab8SNamjae Jeon int ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len); 134*e2b76ab8SNamjae Jeon void ksmbd_iov_reset(struct ksmbd_work *work); 13538c8a9a5SSteve French #endif /* __KSMBD_WORK_H__ */ 136