| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /* SPDX-License-Identifier: GPL-2.0-or-later */
- /*
- * Copyright (C) 2019 Samsung Electronics Co., Ltd.
- */
- #ifndef __KSMBD_WORK_H__
- #define __KSMBD_WORK_H__
- #include <linux/ctype.h>
- #include <linux/workqueue.h>
- struct ksmbd_conn;
- struct ksmbd_session;
- struct ksmbd_tree_connect;
- enum {
- KSMBD_WORK_ACTIVE = 0,
- KSMBD_WORK_CANCELLED,
- KSMBD_WORK_CLOSED,
- };
- struct aux_read {
- void *buf;
- struct list_head entry;
- };
- /* one of these for every pending CIFS request at the connection */
- struct ksmbd_work {
- /* Server corresponding to this mid */
- struct ksmbd_conn *conn;
- struct ksmbd_session *sess;
- struct ksmbd_tree_connect *tcon;
- /* Pointer to received SMB header */
- void *request_buf;
- /* Response buffer */
- void *response_buf;
- struct list_head aux_read_list;
- struct kvec *iov;
- int iov_alloc_cnt;
- int iov_cnt;
- int iov_idx;
- /* Next cmd hdr in compound req buf*/
- int next_smb2_rcv_hdr_off;
- /* Next cmd hdr in compound rsp buf*/
- int next_smb2_rsp_hdr_off;
- /* Current cmd hdr in compound rsp buf*/
- int curr_smb2_rsp_hdr_off;
- /*
- * Current Local FID assigned compound response if SMB2 CREATE
- * command is present in compound request
- */
- u64 compound_fid;
- u64 compound_pfid;
- u64 compound_sid;
- const struct cred *saved_cred;
- /* Number of granted credits */
- unsigned int credits_granted;
- /* response smb header size */
- unsigned int response_sz;
- void *tr_buf;
- unsigned char state;
- /* No response for cancelled request */
- bool send_no_response:1;
- /* Request is encrypted */
- bool encrypted:1;
- /* Is this SYNC or ASYNC ksmbd_work */
- bool asynchronous:1;
- bool need_invalidate_rkey:1;
- unsigned int remote_key;
- /* cancel works */
- int async_id;
- void **cancel_argv;
- void (*cancel_fn)(void **argv);
- struct work_struct work;
- /* List head at conn->requests */
- struct list_head request_entry;
- /* List head at conn->async_requests */
- struct list_head async_request_entry;
- struct list_head fp_entry;
- };
- /**
- * ksmbd_resp_buf_next - Get next buffer on compound response.
- * @work: smb work containing response buffer
- */
- static inline void *ksmbd_resp_buf_next(struct ksmbd_work *work)
- {
- return work->response_buf + work->next_smb2_rsp_hdr_off + 4;
- }
- /**
- * ksmbd_resp_buf_curr - Get current buffer on compound response.
- * @work: smb work containing response buffer
- */
- static inline void *ksmbd_resp_buf_curr(struct ksmbd_work *work)
- {
- return work->response_buf + work->curr_smb2_rsp_hdr_off + 4;
- }
- /**
- * ksmbd_req_buf_next - Get next buffer on compound request.
- * @work: smb work containing response buffer
- */
- static inline void *ksmbd_req_buf_next(struct ksmbd_work *work)
- {
- return work->request_buf + work->next_smb2_rcv_hdr_off + 4;
- }
- struct ksmbd_work *ksmbd_alloc_work_struct(void);
- void ksmbd_free_work_struct(struct ksmbd_work *work);
- void ksmbd_work_pool_destroy(void);
- int ksmbd_work_pool_init(void);
- int ksmbd_workqueue_init(void);
- void ksmbd_workqueue_destroy(void);
- bool ksmbd_queue_work(struct ksmbd_work *work);
- int ksmbd_iov_pin_rsp_read(struct ksmbd_work *work, void *ib, int len,
- void *aux_buf, unsigned int aux_size);
- int ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len);
- int allocate_interim_rsp_buf(struct ksmbd_work *work);
- #endif /* __KSMBD_WORK_H__ */
|