2021-03-16 07:07:11 +03:00
/* 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 ,
} ;
/* 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 */
2021-03-30 06:35:23 +03:00
void * request_buf ;
2021-03-16 07:07:11 +03:00
/* Response buffer */
2021-03-30 06:35:23 +03:00
void * response_buf ;
2021-03-16 07:07:11 +03:00
/* Read data buffer */
2021-03-30 06:35:23 +03:00
void * aux_payload_buf ;
2021-03-16 07:07:11 +03:00
/* 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 Local FID assigned compound response if SMB2 CREATE
* command is present in compound request
*/
2021-07-08 06:32:27 +03:00
u64 compound_fid ;
u64 compound_pfid ;
u64 compound_sid ;
2021-03-16 07:07:11 +03:00
const struct cred * saved_cred ;
/* Number of granted credits */
unsigned int credits_granted ;
/* response smb header size */
unsigned int resp_hdr_sz ;
unsigned int response_sz ;
/* Read data count */
unsigned int aux_payload_sz ;
void * tr_buf ;
unsigned char state ;
/* Multiple responses for one request e.g. SMB ECHO */
bool multiRsp : 1 ;
/* No response for cancelled request */
bool send_no_response : 1 ;
/* Request is encrypted */
bool encrypted : 1 ;
/* Is this SYNC or ASYNC ksmbd_work */
bool syncronous : 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 ;
struct list_head interim_entry ;
} ;
2021-06-25 07:43:37 +03:00
/**
* 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 ;
}
/**
* 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 ;
}
2021-03-16 07:07:11 +03:00
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 ) ;
# endif /* __KSMBD_WORK_H__ */