194047d49SGordon Ross /* 294047d49SGordon Ross * CDDL HEADER START 394047d49SGordon Ross * 494047d49SGordon Ross * The contents of this file are subject to the terms of the 594047d49SGordon Ross * Common Development and Distribution License (the "License"). 694047d49SGordon Ross * You may not use this file except in compliance with the License. 794047d49SGordon Ross * 894047d49SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 994047d49SGordon Ross * or http://www.opensolaris.org/os/licensing. 1094047d49SGordon Ross * See the License for the specific language governing permissions 1194047d49SGordon Ross * and limitations under the License. 1294047d49SGordon Ross * 1394047d49SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each 1494047d49SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1594047d49SGordon Ross * If applicable, add the following below this CDDL HEADER, with the 1694047d49SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying 1794047d49SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner] 1894047d49SGordon Ross * 1994047d49SGordon Ross * CDDL HEADER END 2094047d49SGordon Ross */ 2194047d49SGordon Ross /* 2294047d49SGordon Ross * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 231f0845f1SGordon Ross * Copyright 2020 Nexenta by DDN, Inc. All rights reserved. 24*7f6a299eSGordon Ross * Copyright 2022 RackTop Systems, Inc. 2594047d49SGordon Ross */ 2694047d49SGordon Ross 2794047d49SGordon Ross /* 2894047d49SGordon Ross * Structures and type definitions needed by the "testoplock" program 2994047d49SGordon Ross * (a small subset of what the SMB server uses) 3094047d49SGordon Ross */ 3194047d49SGordon Ross 3294047d49SGordon Ross #ifndef _SMB_KTYPES_H 3394047d49SGordon Ross #define _SMB_KTYPES_H 3494047d49SGordon Ross 3594047d49SGordon Ross #ifdef __cplusplus 3694047d49SGordon Ross extern "C" { 3794047d49SGordon Ross #endif 3894047d49SGordon Ross 3994047d49SGordon Ross #include <sys/types.h> 4094047d49SGordon Ross #include <sys/debug.h> 4194047d49SGordon Ross #include <sys/systm.h> 4294047d49SGordon Ross #include <sys/cred.h> 4394047d49SGordon Ross #include <sys/list.h> 4494047d49SGordon Ross #include <sys/sdt.h> 4594047d49SGordon Ross 4694047d49SGordon Ross typedef struct smb_session smb_session_t; 4794047d49SGordon Ross typedef struct smb_user smb_user_t; 4894047d49SGordon Ross typedef struct smb_tree smb_tree_t; 4994047d49SGordon Ross 5094047d49SGordon Ross 5194047d49SGordon Ross /* 5294047d49SGordon Ross * Destructor object used in the locked-list delete queue. 5394047d49SGordon Ross */ 5494047d49SGordon Ross #define SMB_DTOR_MAGIC 0x44544F52 /* DTOR */ 5594047d49SGordon Ross #define SMB_DTOR_VALID(d) \ 5694047d49SGordon Ross ASSERT(((d) != NULL) && ((d)->dt_magic == SMB_DTOR_MAGIC)) 5794047d49SGordon Ross 5894047d49SGordon Ross typedef void (*smb_dtorproc_t)(void *); 5994047d49SGordon Ross 6094047d49SGordon Ross typedef struct smb_dtor { 6194047d49SGordon Ross list_node_t dt_lnd; 6294047d49SGordon Ross uint32_t dt_magic; 6394047d49SGordon Ross void *dt_object; 6494047d49SGordon Ross smb_dtorproc_t dt_proc; 6594047d49SGordon Ross } smb_dtor_t; 6694047d49SGordon Ross 6794047d49SGordon Ross typedef struct smb_llist { 6894047d49SGordon Ross krwlock_t ll_lock; 6994047d49SGordon Ross list_t ll_list; 7094047d49SGordon Ross uint32_t ll_count; 7194047d49SGordon Ross uint64_t ll_wrop; 7294047d49SGordon Ross kmutex_t ll_mutex; 7394047d49SGordon Ross list_t ll_deleteq; 7494047d49SGordon Ross uint32_t ll_deleteq_count; 7594047d49SGordon Ross boolean_t ll_flushing; 7694047d49SGordon Ross } smb_llist_t; 7794047d49SGordon Ross 7894047d49SGordon Ross /* 7994047d49SGordon Ross * Per smb_node oplock state 8094047d49SGordon Ross */ 8194047d49SGordon Ross typedef struct smb_oplock { 8294047d49SGordon Ross kmutex_t ol_mutex; 8394047d49SGordon Ross boolean_t ol_fem; /* fem monitor installed? */ 8494047d49SGordon Ross struct smb_ofile *excl_open; 8594047d49SGordon Ross uint32_t ol_state; 8694047d49SGordon Ross int32_t cnt_II; 8794047d49SGordon Ross int32_t cnt_R; 8894047d49SGordon Ross int32_t cnt_RH; 8994047d49SGordon Ross int32_t cnt_RHBQ; 9094047d49SGordon Ross int32_t waiters; 9194047d49SGordon Ross kcondvar_t WaitingOpenCV; 9294047d49SGordon Ross } smb_oplock_t; 9394047d49SGordon Ross 9494047d49SGordon Ross /* 9594047d49SGordon Ross * Per smb_ofile oplock state 9694047d49SGordon Ross */ 9794047d49SGordon Ross typedef struct smb_oplock_grant { 9894047d49SGordon Ross /* smb protocol-level state */ 99*7f6a299eSGordon Ross uint32_t og_state; /* what client has now */ 100*7f6a299eSGordon Ross uint32_t og_breakto; /* level breaking to */ 101*7f6a299eSGordon Ross boolean_t og_breaking; 10294047d49SGordon Ross uint16_t og_dialect; /* how to send breaks */ 103*7f6a299eSGordon Ross kcondvar_t og_ack_cv; /* Wait for ACK */ 10494047d49SGordon Ross /* File-system level state */ 10594047d49SGordon Ross uint8_t onlist_II; 10694047d49SGordon Ross uint8_t onlist_R; 10794047d49SGordon Ross uint8_t onlist_RH; 10894047d49SGordon Ross uint8_t onlist_RHBQ; 10994047d49SGordon Ross uint8_t BreakingToRead; 11094047d49SGordon Ross } smb_oplock_grant_t; 11194047d49SGordon Ross 11294047d49SGordon Ross #define SMB_LEASE_KEY_SZ 16 11394047d49SGordon Ross 114*7f6a299eSGordon Ross struct smb_lease; 115*7f6a299eSGordon Ross 11694047d49SGordon Ross #define SMB_NODE_MAGIC 0x4E4F4445 /* 'NODE' */ 11794047d49SGordon Ross #define SMB_NODE_VALID(p) ASSERT((p)->n_magic == SMB_NODE_MAGIC) 11894047d49SGordon Ross 11994047d49SGordon Ross typedef enum { 12094047d49SGordon Ross SMB_NODE_STATE_AVAILABLE = 0, 12194047d49SGordon Ross SMB_NODE_STATE_DESTROYING 12294047d49SGordon Ross } smb_node_state_t; 12394047d49SGordon Ross 12494047d49SGordon Ross /* 12594047d49SGordon Ross * waiting_event # of clients requesting FCN 12694047d49SGordon Ross * n_timestamps cached timestamps 12794047d49SGordon Ross * n_allocsz cached file allocation size 12894047d49SGordon Ross * n_dnode directory node 12994047d49SGordon Ross * n_unode unnamed stream node 13094047d49SGordon Ross * delete_on_close_cred credentials for delayed delete 13194047d49SGordon Ross */ 13294047d49SGordon Ross typedef struct smb_node { 13394047d49SGordon Ross list_node_t n_lnd; 13494047d49SGordon Ross uint32_t n_magic; 13594047d49SGordon Ross krwlock_t n_lock; 13694047d49SGordon Ross kmutex_t n_mutex; 13794047d49SGordon Ross smb_node_state_t n_state; 13894047d49SGordon Ross uint32_t n_refcnt; 13994047d49SGordon Ross uint32_t n_open_count; 14094047d49SGordon Ross volatile int flags; 14194047d49SGordon Ross 14294047d49SGordon Ross smb_llist_t n_ofile_list; 14394047d49SGordon Ross smb_oplock_t n_oplock; 14494047d49SGordon Ross } smb_node_t; 14594047d49SGordon Ross 14694047d49SGordon Ross #define NODE_FLAGS_WRITE_THROUGH 0x00100000 14794047d49SGordon Ross #define NODE_FLAGS_DELETE_COMMITTED 0x20000000 14894047d49SGordon Ross #define NODE_FLAGS_DELETE_ON_CLOSE 0x40000000 14994047d49SGordon Ross 15094047d49SGordon Ross /* 15194047d49SGordon Ross * Some flags for ofile structure 15294047d49SGordon Ross * 15394047d49SGordon Ross * SMB_OFLAGS_SET_DELETE_ON_CLOSE 15494047d49SGordon Ross * Set this flag when the corresponding open operation whose 15594047d49SGordon Ross * DELETE_ON_CLOSE bit of the CreateOptions is set. If any 15694047d49SGordon Ross * open file instance has this bit set, the NODE_FLAGS_DELETE_ON_CLOSE 15794047d49SGordon Ross * will be set for the file node upon close. 15894047d49SGordon Ross */ 15994047d49SGordon Ross 16094047d49SGordon Ross /* SMB_OFLAGS_READONLY 0x0001 (obsolete) */ 16194047d49SGordon Ross #define SMB_OFLAGS_EXECONLY 0x0002 16294047d49SGordon Ross #define SMB_OFLAGS_SET_DELETE_ON_CLOSE 0x0004 16394047d49SGordon Ross #define SMB_OFLAGS_LLF_POS_VALID 0x0008 16494047d49SGordon Ross 16594047d49SGordon Ross #define SMB_OFILE_MAGIC 0x4F464C45 /* 'OFLE' */ 16694047d49SGordon Ross #define SMB_OFILE_VALID(p) \ 16794047d49SGordon Ross ASSERT((p != NULL) && ((p)->f_magic == SMB_OFILE_MAGIC)) 16894047d49SGordon Ross 16994047d49SGordon Ross /* 17094047d49SGordon Ross * This is the size of the per-handle "Lock Sequence" array. 17194047d49SGordon Ross * See LockSequenceIndex in [MS-SMB2] 2.2.26, and smb2_lock.c 17294047d49SGordon Ross */ 17394047d49SGordon Ross #define SMB_OFILE_LSEQ_MAX 64 17494047d49SGordon Ross 17594047d49SGordon Ross /* {arg_open,ofile}->dh_vers values */ 17694047d49SGordon Ross typedef enum { 17794047d49SGordon Ross SMB2_NOT_DURABLE = 0, 17894047d49SGordon Ross SMB2_DURABLE_V1, 17994047d49SGordon Ross SMB2_DURABLE_V2, 18094047d49SGordon Ross SMB2_RESILIENT, 18194047d49SGordon Ross } smb_dh_vers_t; 18294047d49SGordon Ross 18394047d49SGordon Ross /* 18494047d49SGordon Ross * See the long "Ofile State Machine" comment in smb_ofile.c 18594047d49SGordon Ross */ 18694047d49SGordon Ross typedef enum { 18794047d49SGordon Ross SMB_OFILE_STATE_ALLOC = 0, 18894047d49SGordon Ross SMB_OFILE_STATE_OPEN, 18994047d49SGordon Ross SMB_OFILE_STATE_SAVE_DH, 19094047d49SGordon Ross SMB_OFILE_STATE_SAVING, 19194047d49SGordon Ross SMB_OFILE_STATE_CLOSING, 19294047d49SGordon Ross SMB_OFILE_STATE_CLOSED, 19394047d49SGordon Ross SMB_OFILE_STATE_ORPHANED, 19494047d49SGordon Ross SMB_OFILE_STATE_RECONNECT, 19594047d49SGordon Ross SMB_OFILE_STATE_EXPIRED, 19694047d49SGordon Ross SMB_OFILE_STATE_SENTINEL 19794047d49SGordon Ross } smb_ofile_state_t; 19894047d49SGordon Ross 19994047d49SGordon Ross typedef struct smb_ofile { 20094047d49SGordon Ross list_node_t f_tree_lnd; /* t_ofile_list */ 20194047d49SGordon Ross list_node_t f_node_lnd; /* n_ofile_list */ 20294047d49SGordon Ross list_node_t f_dh_lnd; /* sv_persistid_ht */ 20394047d49SGordon Ross uint32_t f_magic; 20494047d49SGordon Ross kmutex_t f_mutex; 20594047d49SGordon Ross smb_ofile_state_t f_state; 20694047d49SGordon Ross 20794047d49SGordon Ross uint16_t f_fid; 20894047d49SGordon Ross uint16_t f_ftype; 20994047d49SGordon Ross uint32_t f_refcnt; 21094047d49SGordon Ross uint32_t f_granted_access; 21194047d49SGordon Ross uint32_t f_share_access; 21294047d49SGordon Ross 21394047d49SGordon Ross smb_node_t *f_node; 21494047d49SGordon Ross 21594047d49SGordon Ross smb_oplock_grant_t f_oplock; 2166f8336c5SGordon Ross boolean_t f_oplock_closing; 21794047d49SGordon Ross uint8_t TargetOplockKey[SMB_LEASE_KEY_SZ]; 21894047d49SGordon Ross uint8_t ParentOplockKey[SMB_LEASE_KEY_SZ]; 21994047d49SGordon Ross struct smb_lease *f_lease; 22094047d49SGordon Ross 22194047d49SGordon Ross } smb_ofile_t; 22294047d49SGordon Ross 22394047d49SGordon Ross typedef struct smb_request { 22494047d49SGordon Ross list_node_t sr_session_lnd; 22594047d49SGordon Ross uint32_t sr_magic; 22694047d49SGordon Ross kmutex_t sr_mutex; 22794047d49SGordon Ross } smb_request_t; 22894047d49SGordon Ross 22994047d49SGordon Ross #ifdef __cplusplus 23094047d49SGordon Ross } 23194047d49SGordon Ross #endif 23294047d49SGordon Ross 23394047d49SGordon Ross #endif /* _SMB_KTYPES_H */ 234