xref: /openbmc/linux/fs/smb/server/ksmbd_work.h (revision 38c8a9a5)
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