1*38c8a9a5SSteve French /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*38c8a9a5SSteve French /* 3*38c8a9a5SSteve French * Copyright (C) 2019 Samsung Electronics Co., Ltd. 4*38c8a9a5SSteve French */ 5*38c8a9a5SSteve French 6*38c8a9a5SSteve French #ifndef __KSMBD_WORK_H__ 7*38c8a9a5SSteve French #define __KSMBD_WORK_H__ 8*38c8a9a5SSteve French 9*38c8a9a5SSteve French #include <linux/ctype.h> 10*38c8a9a5SSteve French #include <linux/workqueue.h> 11*38c8a9a5SSteve French 12*38c8a9a5SSteve French struct ksmbd_conn; 13*38c8a9a5SSteve French struct ksmbd_session; 14*38c8a9a5SSteve French struct ksmbd_tree_connect; 15*38c8a9a5SSteve French 16*38c8a9a5SSteve French enum { 17*38c8a9a5SSteve French KSMBD_WORK_ACTIVE = 0, 18*38c8a9a5SSteve French KSMBD_WORK_CANCELLED, 19*38c8a9a5SSteve French KSMBD_WORK_CLOSED, 20*38c8a9a5SSteve French }; 21*38c8a9a5SSteve French 22*38c8a9a5SSteve French /* one of these for every pending CIFS request at the connection */ 23*38c8a9a5SSteve French struct ksmbd_work { 24*38c8a9a5SSteve French /* Server corresponding to this mid */ 25*38c8a9a5SSteve French struct ksmbd_conn *conn; 26*38c8a9a5SSteve French struct ksmbd_session *sess; 27*38c8a9a5SSteve French struct ksmbd_tree_connect *tcon; 28*38c8a9a5SSteve French 29*38c8a9a5SSteve French /* Pointer to received SMB header */ 30*38c8a9a5SSteve French void *request_buf; 31*38c8a9a5SSteve French /* Response buffer */ 32*38c8a9a5SSteve French void *response_buf; 33*38c8a9a5SSteve French 34*38c8a9a5SSteve French /* Read data buffer */ 35*38c8a9a5SSteve French void *aux_payload_buf; 36*38c8a9a5SSteve French 37*38c8a9a5SSteve French /* Next cmd hdr in compound req buf*/ 38*38c8a9a5SSteve French int next_smb2_rcv_hdr_off; 39*38c8a9a5SSteve French /* Next cmd hdr in compound rsp buf*/ 40*38c8a9a5SSteve French int next_smb2_rsp_hdr_off; 41*38c8a9a5SSteve French 42*38c8a9a5SSteve French /* 43*38c8a9a5SSteve French * Current Local FID assigned compound response if SMB2 CREATE 44*38c8a9a5SSteve French * command is present in compound request 45*38c8a9a5SSteve French */ 46*38c8a9a5SSteve French u64 compound_fid; 47*38c8a9a5SSteve French u64 compound_pfid; 48*38c8a9a5SSteve French u64 compound_sid; 49*38c8a9a5SSteve French 50*38c8a9a5SSteve French const struct cred *saved_cred; 51*38c8a9a5SSteve French 52*38c8a9a5SSteve French /* Number of granted credits */ 53*38c8a9a5SSteve French unsigned int credits_granted; 54*38c8a9a5SSteve French 55*38c8a9a5SSteve French /* response smb header size */ 56*38c8a9a5SSteve French unsigned int resp_hdr_sz; 57*38c8a9a5SSteve French unsigned int response_sz; 58*38c8a9a5SSteve French /* Read data count */ 59*38c8a9a5SSteve French unsigned int aux_payload_sz; 60*38c8a9a5SSteve French 61*38c8a9a5SSteve French void *tr_buf; 62*38c8a9a5SSteve French 63*38c8a9a5SSteve French unsigned char state; 64*38c8a9a5SSteve French /* Multiple responses for one request e.g. SMB ECHO */ 65*38c8a9a5SSteve French bool multiRsp:1; 66*38c8a9a5SSteve French /* No response for cancelled request */ 67*38c8a9a5SSteve French bool send_no_response:1; 68*38c8a9a5SSteve French /* Request is encrypted */ 69*38c8a9a5SSteve French bool encrypted:1; 70*38c8a9a5SSteve French /* Is this SYNC or ASYNC ksmbd_work */ 71*38c8a9a5SSteve French bool asynchronous:1; 72*38c8a9a5SSteve French bool need_invalidate_rkey:1; 73*38c8a9a5SSteve French 74*38c8a9a5SSteve French unsigned int remote_key; 75*38c8a9a5SSteve French /* cancel works */ 76*38c8a9a5SSteve French int async_id; 77*38c8a9a5SSteve French void **cancel_argv; 78*38c8a9a5SSteve French void (*cancel_fn)(void **argv); 79*38c8a9a5SSteve French 80*38c8a9a5SSteve French struct work_struct work; 81*38c8a9a5SSteve French /* List head at conn->requests */ 82*38c8a9a5SSteve French struct list_head request_entry; 83*38c8a9a5SSteve French /* List head at conn->async_requests */ 84*38c8a9a5SSteve French struct list_head async_request_entry; 85*38c8a9a5SSteve French struct list_head fp_entry; 86*38c8a9a5SSteve French struct list_head interim_entry; 87*38c8a9a5SSteve French }; 88*38c8a9a5SSteve French 89*38c8a9a5SSteve French /** 90*38c8a9a5SSteve French * ksmbd_resp_buf_next - Get next buffer on compound response. 91*38c8a9a5SSteve French * @work: smb work containing response buffer 92*38c8a9a5SSteve French */ 93*38c8a9a5SSteve French static inline void *ksmbd_resp_buf_next(struct ksmbd_work *work) 94*38c8a9a5SSteve French { 95*38c8a9a5SSteve French return work->response_buf + work->next_smb2_rsp_hdr_off + 4; 96*38c8a9a5SSteve French } 97*38c8a9a5SSteve French 98*38c8a9a5SSteve French /** 99*38c8a9a5SSteve French * ksmbd_req_buf_next - Get next buffer on compound request. 100*38c8a9a5SSteve French * @work: smb work containing response buffer 101*38c8a9a5SSteve French */ 102*38c8a9a5SSteve French static inline void *ksmbd_req_buf_next(struct ksmbd_work *work) 103*38c8a9a5SSteve French { 104*38c8a9a5SSteve French return work->request_buf + work->next_smb2_rcv_hdr_off + 4; 105*38c8a9a5SSteve French } 106*38c8a9a5SSteve French 107*38c8a9a5SSteve French struct ksmbd_work *ksmbd_alloc_work_struct(void); 108*38c8a9a5SSteve French void ksmbd_free_work_struct(struct ksmbd_work *work); 109*38c8a9a5SSteve French 110*38c8a9a5SSteve French void ksmbd_work_pool_destroy(void); 111*38c8a9a5SSteve French int ksmbd_work_pool_init(void); 112*38c8a9a5SSteve French 113*38c8a9a5SSteve French int ksmbd_workqueue_init(void); 114*38c8a9a5SSteve French void ksmbd_workqueue_destroy(void); 115*38c8a9a5SSteve French bool ksmbd_queue_work(struct ksmbd_work *work); 116*38c8a9a5SSteve French 117*38c8a9a5SSteve French #endif /* __KSMBD_WORK_H__ */ 118