2005-04-17 02:20:36 +04:00
/*
* fs / cifs / cifsglob . h
*
2008-01-25 13:12:41 +03:00
* Copyright ( C ) International Business Machines Corp . , 2002 , 2008
2005-04-17 02:20:36 +04:00
* Author ( s ) : Steve French ( sfrench @ us . ibm . com )
2006-08-03 01:56:33 +04:00
* Jeremy Allison ( jra @ samba . org )
2005-04-17 02:20:36 +04:00
*
* This library is free software ; you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation ; either version 2.1 of the License , or
* ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See
* the GNU Lesser General Public License for more details .
2007-06-28 23:44:13 +04:00
*
2005-04-17 02:20:36 +04:00
*/
# include <linux/in.h>
# include <linux/in6.h>
# include "cifs_fs_sb.h"
2007-09-25 00:25:46 +04:00
# include "cifsacl.h"
2005-04-17 02:20:36 +04:00
/*
* The sizes of various internal tables and strings
*/
# define MAX_UID_INFO 16
# define MAX_SES_INFO 2
# define MAX_TCON_INFO 4
2008-07-24 19:56:05 +04:00
# define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
2005-04-17 02:20:36 +04:00
# define MAX_SERVER_SIZE 15
2007-06-28 23:44:13 +04:00
# define MAX_SHARE_SIZE 64 /* used to be 20, this should still be enough */
2005-04-17 02:20:36 +04:00
# define MAX_USERNAME_SIZE 32 / * 32 is to allow for 15 char names + null
termination then * 2 for unicode versions */
# define MAX_PASSWORD_SIZE 16
# define CIFS_MIN_RCV_POOL 4
/*
* MAX_REQ is the maximum number of requests that WE will send
* on one socket concurently . It also matches the most common
2007-06-28 23:44:13 +04:00
* value of max multiplex returned by servers . We may
2005-04-17 02:20:36 +04:00
* eventually want to use the negotiated value ( in case
* future servers can handle more ) when we are more confident that
* we will not have problems oveloading the socket with pending
* write data .
*/
2007-06-28 23:44:13 +04:00
# define CIFS_MAX_REQ 50
2005-04-17 02:20:36 +04:00
# define SERVER_NAME_LENGTH 15
# define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
/* used to define string lengths for reversing unicode strings */
/* (256+1)*2 = 514 */
/* (max path length + 1 for null) * 2 for unicode */
# define MAX_NAME 514
# include "cifspdu.h"
# ifndef XATTR_DOS_ATTRIB
# define XATTR_DOS_ATTRIB "user.DOSATTRIB"
# endif
/*
* CIFS vfs client Status information ( based on what we know . )
*/
/* associated with each tcp and smb session */
enum statusEnum {
CifsNew = 0 ,
CifsGood ,
CifsExiting ,
CifsNeedReconnect
} ;
enum securityEnum {
2007-10-05 00:05:09 +04:00
PLAINTXT = 0 , /* Legacy with Plaintext passwords */
LANMAN , /* Legacy LANMAN auth */
2006-06-01 02:40:51 +04:00
NTLM , /* Legacy NTLM012 auth with NTLM hash */
2005-04-17 02:20:36 +04:00
NTLMv2 , /* Legacy NTLM auth with NTLMv2 hash */
RawNTLMSSP , /* NTLMSSP without SPNEGO */
NTLMSSP , /* NTLMSSP via SPNEGO */
2008-08-19 23:35:33 +04:00
Kerberos , /* Kerberos via SPNEGO */
MSKerberos , /* MS Kerberos via SPNEGO */
2005-04-17 02:20:36 +04:00
} ;
enum protocolEnum {
IPV4 = 0 ,
IPV6 ,
SCTP
/* Netbios frames protocol not supported at this time */
} ;
2007-07-09 11:55:14 +04:00
struct mac_key {
unsigned int len ;
union {
char ntlm [ CIFS_SESS_KEY_SIZE + 16 ] ;
2007-11-17 02:37:35 +03:00
char krb5 [ CIFS_SESS_KEY_SIZE + 16 ] ; /* BB: length correct? */
2007-07-09 11:55:14 +04:00
struct {
char key [ 16 ] ;
struct ntlmv2_resp resp ;
} ntlmv2 ;
} data ;
} ;
2007-09-25 00:25:46 +04:00
struct cifs_cred {
int uid ;
int gid ;
int mode ;
int cecount ;
struct cifs_sid osid ;
struct cifs_sid gsid ;
struct cifs_ntace * ntaces ;
struct cifs_ace * aces ;
} ;
2005-04-17 02:20:36 +04:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Except the CIFS PDUs themselves all the
* globally interesting structs should go here
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
struct TCP_Server_Info {
2005-08-23 08:38:31 +04:00
/* 15 character server name + 0x20 16th byte indicating type = srv */
char server_RFC1001_name [ SERVER_NAME_LEN_WITH_NULL ] ;
2005-08-19 22:04:29 +04:00
char unicode_server_Name [ SERVER_NAME_LEN_WITH_NULL * 2 ] ;
2007-11-17 01:22:06 +03:00
char * hostname ; /* hostname portion of UNC string */
2005-04-17 02:20:36 +04:00
struct socket * ssocket ;
union {
struct sockaddr_in sockAddr ;
struct sockaddr_in6 sockAddr6 ;
} addr ;
2007-06-28 23:44:13 +04:00
wait_queue_head_t response_q ;
2005-04-17 02:20:36 +04:00
wait_queue_head_t request_q ; /* if more than maxmpx to srvr must block*/
struct list_head pending_mid_q ;
void * Server_NlsInfo ; /* BB - placeholder for future NLS info */
unsigned short server_codepage ; /* codepage for the server */
2005-10-07 20:51:05 +04:00
unsigned long ip_address ; /* IP addr for the server if known */
2007-06-28 23:44:13 +04:00
enum protocolEnum protocolType ;
2005-04-17 02:20:36 +04:00
char versionMajor ;
char versionMinor ;
2008-04-29 04:06:05 +04:00
bool svlocal : 1 ; /* local server or remote */
2005-04-17 02:20:36 +04:00
atomic_t socketUseCount ; /* number of open cifs sessions on socket */
atomic_t inFlight ; /* number of requests on the wire to server */
2005-10-07 20:51:05 +04:00
# ifdef CONFIG_CIFS_STATS2
atomic_t inSend ; /* requests trying to send */
atomic_t num_waiters ; /* blocked waiting to get in sendrecv */
# endif
2005-04-17 02:20:36 +04:00
enum statusEnum tcpStatus ; /* what we think the status is */
struct semaphore tcpSem ;
struct task_struct * tsk ;
char server_GUID [ 16 ] ;
char secMode ;
enum securityEnum secType ;
unsigned int maxReq ; /* Clients should submit no more */
/* than maxReq distinct unanswered SMBs to the server when using */
/* multiplexed reads or writes */
unsigned int maxBuf ; /* maxBuf specifies the maximum */
/* message size the server can send or receive for non-raw SMBs */
unsigned int maxRw ; /* maxRw specifies the maximum */
/* message size the server can send or receive for */
/* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
char sessid [ 4 ] ; /* unique token id for this session */
/* (returned on Negotiate */
int capabilities ; /* allow selective disabling of caps by smb sess */
2006-09-30 17:25:52 +04:00
int timeAdj ; /* Adjust for difference in server time zone in sec */
2005-08-17 23:38:22 +04:00
__u16 CurrentMid ; /* multiplex id - rotating counter */
2005-04-17 02:20:36 +04:00
char cryptKey [ CIFS_CRYPTO_KEY_SIZE ] ;
2005-08-23 08:38:31 +04:00
/* 16th byte of RFC1001 workstation name is always null */
char workstation_RFC1001_name [ SERVER_NAME_LEN_WITH_NULL ] ;
2005-04-29 09:41:05 +04:00
__u32 sequence_number ; /* needed for CIFS PDU signature */
2007-07-09 11:55:14 +04:00
struct mac_key mac_signing_key ;
char ntlmv2_hash [ 16 ] ;
2006-07-15 02:37:11 +04:00
unsigned long lstrp ; /* when we got last response from this server */
2005-04-17 02:20:36 +04:00
} ;
/*
* The following is our shortcut to user information . We surface the uid ,
* and name . We always get the password on the fly in case it
2007-06-28 23:44:13 +04:00
* has changed . We also hang a list of sessions owned by this user off here .
2005-04-17 02:20:36 +04:00
*/
struct cifsUidInfo {
struct list_head userList ;
struct list_head sessionList ; /* SMB sessions for this user */
uid_t linux_uid ;
char user [ MAX_USERNAME_SIZE + 1 ] ; /* ascii name of user */
/* BB may need ptr or callback for PAM or WinBind info */
} ;
/*
* Session structure . One of these for each uid session with a particular host
*/
struct cifsSesInfo {
struct list_head cifsSessionList ;
struct semaphore sesSem ;
2006-06-01 02:40:51 +04:00
#if 0
2005-04-17 02:20:36 +04:00
struct cifsUidInfo * uidInfo ; /* pointer to user info */
2006-06-01 02:40:51 +04:00
# endif
2005-04-17 02:20:36 +04:00
struct TCP_Server_Info * server ; /* pointer to server info */
atomic_t inUse ; /* # of mounts (tree connections) on this ses */
enum statusEnum status ;
2006-06-27 10:28:30 +04:00
unsigned overrideSecFlg ; /* if non-zero override global sec flags */
2005-04-17 02:20:36 +04:00
__u16 ipc_tid ; /* special tid for connection to IPC share */
__u16 flags ;
2005-04-29 09:41:05 +04:00
char * serverOS ; /* name of operating system underlying server */
char * serverNOS ; /* name of network operating system of server */
2005-04-17 02:20:36 +04:00
char * serverDomain ; /* security realm of server */
int Suid ; /* remote smb uid */
uid_t linux_uid ; /* local Linux uid */
int capabilities ;
2007-06-28 23:44:13 +04:00
char serverName [ SERVER_NAME_LEN_WITH_NULL * 2 ] ; /* BB make bigger for
2005-04-29 09:41:05 +04:00
TCP names - will ipv6 and sctp addresses fit ? */
2005-04-17 02:20:36 +04:00
char userName [ MAX_USERNAME_SIZE + 1 ] ;
2007-06-28 23:44:13 +04:00
char * domainName ;
char * password ;
2005-04-17 02:20:36 +04:00
} ;
2006-09-30 08:13:17 +04:00
/* no more than one of the following three session flags may be set */
2005-04-17 02:20:36 +04:00
# define CIFS_SES_NT4 1
2006-09-30 08:13:17 +04:00
# define CIFS_SES_OS2 2
# define CIFS_SES_W9X 4
/* following flag is set for old servers such as OS2 (and Win95?)
which do not negotiate NTLM or POSIX dialects , but instead
negotiate one of the older LANMAN dialects */
# define CIFS_SES_LANMAN 8
2005-04-17 02:20:36 +04:00
/*
* there is one of these for each connection to a resource on a particular
2007-06-28 23:44:13 +04:00
* session
2005-04-17 02:20:36 +04:00
*/
struct cifsTconInfo {
struct list_head cifsConnectionList ;
struct list_head openFileList ;
struct semaphore tconSem ;
struct cifsSesInfo * ses ; /* pointer to session associated with */
2006-06-04 09:53:15 +04:00
char treeName [ MAX_TREE_SIZE + 1 ] ; /* UNC name of resource in ASCII */
2005-04-17 02:20:36 +04:00
char * nativeFileSystem ;
__u16 tid ; /* The 2 byte tree id */
__u16 Flags ; /* optional support bits */
enum statusEnum tidStatus ;
2006-06-04 09:53:15 +04:00
atomic_t useCount ; /* how many explicit/implicit mounts to share */
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_CIFS_STATS
atomic_t num_smbs_sent ;
atomic_t num_writes ;
atomic_t num_reads ;
atomic_t num_oplock_brks ;
atomic_t num_opens ;
2005-08-21 08:42:53 +04:00
atomic_t num_closes ;
2005-04-17 02:20:36 +04:00
atomic_t num_deletes ;
atomic_t num_mkdirs ;
atomic_t num_rmdirs ;
atomic_t num_renames ;
atomic_t num_t2renames ;
2005-06-23 04:13:47 +04:00
atomic_t num_ffirst ;
atomic_t num_fnext ;
atomic_t num_fclose ;
2005-08-21 08:42:53 +04:00
atomic_t num_hardlinks ;
atomic_t num_symlinks ;
atomic_t num_locks ;
2006-01-13 02:44:21 +03:00
atomic_t num_acl_get ;
atomic_t num_acl_set ;
2005-08-21 08:42:53 +04:00
# ifdef CONFIG_CIFS_STATS2
unsigned long long time_writes ;
unsigned long long time_reads ;
unsigned long long time_opens ;
unsigned long long time_deletes ;
unsigned long long time_closes ;
unsigned long long time_mkdirs ;
unsigned long long time_rmdirs ;
unsigned long long time_renames ;
unsigned long long time_t2renames ;
unsigned long long time_ffirst ;
unsigned long long time_fnext ;
unsigned long long time_fclose ;
# endif /* CONFIG_CIFS_STATS2 */
2005-04-17 02:20:36 +04:00
__u64 bytes_read ;
__u64 bytes_written ;
spinlock_t stat_lock ;
2005-08-21 08:42:53 +04:00
# endif /* CONFIG_CIFS_STATS */
2005-04-17 02:20:36 +04:00
FILE_SYSTEM_DEVICE_INFO fsDevInfo ;
2006-06-04 09:53:15 +04:00
FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo ; /* ok if fs name truncated */
2005-04-17 02:20:36 +04:00
FILE_SYSTEM_UNIX_INFO fsUnixInfo ;
2008-04-29 04:06:05 +04:00
bool ipc : 1 ; /* set if connection to IPC$ eg for RPC/PIPES */
bool retry : 1 ;
bool nocase : 1 ;
2008-05-15 20:44:38 +04:00
bool seal : 1 ; /* transport encryption for this mounted share */
2008-04-29 04:06:05 +04:00
bool unix_ext : 1 ; /* if false disable Linux extensions to CIFS protocol
2007-07-19 03:21:09 +04:00
for this mount even if server would support */
/* BB add field for back pointer to sb struct(s)? */
2005-04-17 02:20:36 +04:00
} ;
/*
2006-08-03 01:56:33 +04:00
* This info hangs off the cifsFileInfo structure , pointed to by llist .
* This is used to track byte stream locks on the file
2005-04-17 02:20:36 +04:00
*/
struct cifsLockInfo {
2006-08-03 01:56:33 +04:00
struct list_head llist ; /* pointer to next cifsLockInfo */
__u64 offset ;
__u64 length ;
__u8 type ;
2005-04-17 02:20:36 +04:00
} ;
/*
* One of these for each open instance of a file
*/
struct cifs_search_info {
loff_t index_of_last_entry ;
__u16 entries_in_buffer ;
__u16 info_level ;
__u32 resume_key ;
2007-06-28 23:44:13 +04:00
char * ntwrk_buf_start ;
char * srch_entries_start ;
2008-10-08 00:03:33 +04:00
char * last_entry ;
2007-06-28 23:44:13 +04:00
char * presume_name ;
2005-04-17 02:20:36 +04:00
unsigned int resume_name_len ;
2008-04-29 04:06:05 +04:00
bool endOfSearch : 1 ;
bool emptyDir : 1 ;
bool unicode : 1 ;
bool smallBuf : 1 ; /* so we know which buf_release function to call */
2005-04-17 02:20:36 +04:00
} ;
struct cifsFileInfo {
struct list_head tlist ; /* pointer to next fid owned by tcon */
struct list_head flist ; /* next fid (file instance) for this inode */
unsigned int uid ; /* allows finding which FileInfo structure */
__u32 pid ; /* process id who opened file */
__u16 netfid ; /* file id from remote */
/* BB add lock scope info here if needed */ ;
/* lock scope id (0 if none) */
2007-06-28 23:44:13 +04:00
struct file * pfile ; /* needed for writepage */
struct inode * pInode ; /* needed for oplock break */
2007-05-03 08:33:45 +04:00
struct mutex lock_mutex ;
2006-08-03 01:56:33 +04:00
struct list_head llist ; /* list of byte range locks we have. */
2008-04-29 04:06:05 +04:00
bool closePend : 1 ; /* file is marked to close */
bool invalidHandle : 1 ; /* file closed via session abend */
bool messageMode : 1 ; /* for pipes: message vs byte mode */
2005-10-21 00:44:56 +04:00
atomic_t wrtPending ; /* handle in use - defer close */
2005-04-17 02:20:36 +04:00
struct semaphore fh_sem ; /* prevents reopen race after dead ses*/
struct cifs_search_info srch_inf ;
} ;
/*
* One of these for each file inode
*/
struct cifsInodeInfo {
struct list_head lockList ;
2007-06-28 23:44:13 +04:00
/* BB add in lists for dirty pages i.e. write caching info for oplock */
2005-04-17 02:20:36 +04:00
struct list_head openFileList ;
int write_behind_rc ;
__u32 cifsAttrs ; /* e.g. DOS archive bit, sparse, compressed, system */
atomic_t inUse ; /* num concurrent users (local openers cifs) of file*/
unsigned long time ; /* jiffies of last update/check of inode */
2008-04-29 04:06:05 +04:00
bool clientCanCacheRead : 1 ; /* read oplock */
bool clientCanCacheAll : 1 ; /* read and writebehind oplock */
bool oplockPending : 1 ;
2008-10-18 05:03:20 +04:00
bool delete_pending : 1 ; /* DELETE_ON_CLOSE is set */
2005-04-17 02:20:36 +04:00
struct inode vfs_inode ;
} ;
static inline struct cifsInodeInfo *
CIFS_I ( struct inode * inode )
{
return container_of ( inode , struct cifsInodeInfo , vfs_inode ) ;
}
static inline struct cifs_sb_info *
CIFS_SB ( struct super_block * sb )
{
return sb - > s_fs_info ;
}
2005-09-16 07:44:50 +04:00
static inline char CIFS_DIR_SEP ( const struct cifs_sb_info * cifs_sb )
2005-06-23 04:26:35 +04:00
{
if ( cifs_sb - > mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS )
return ' / ' ;
else
return ' \\ ' ;
}
2005-04-17 02:20:36 +04:00
2005-08-25 00:59:35 +04:00
# ifdef CONFIG_CIFS_STATS
# define cifs_stats_inc atomic_inc
static inline void cifs_stats_bytes_written ( struct cifsTconInfo * tcon ,
unsigned int bytes )
{
if ( bytes ) {
spin_lock ( & tcon - > stat_lock ) ;
tcon - > bytes_written + = bytes ;
spin_unlock ( & tcon - > stat_lock ) ;
}
}
static inline void cifs_stats_bytes_read ( struct cifsTconInfo * tcon ,
unsigned int bytes )
{
spin_lock ( & tcon - > stat_lock ) ;
tcon - > bytes_read + = bytes ;
spin_unlock ( & tcon - > stat_lock ) ;
}
# else
2007-06-28 23:44:13 +04:00
# define cifs_stats_inc(field) do {} while (0)
# define cifs_stats_bytes_written(tcon, bytes) do {} while (0)
# define cifs_stats_bytes_read(tcon, bytes) do {} while (0)
2005-08-25 00:59:35 +04:00
# endif
2005-04-17 02:20:36 +04:00
/* one of these for every pending CIFS request to the server */
struct mid_q_entry {
struct list_head qhead ; /* mids waiting on reply from this server */
__u16 mid ; /* multiplex id */
__u16 pid ; /* process id */
__u32 sequence_number ; /* for CIFS signing */
2005-10-12 06:58:06 +04:00
unsigned long when_alloc ; /* when mid was created */
# ifdef CONFIG_CIFS_STATS2
unsigned long when_sent ; /* time when smb send finished */
unsigned long when_received ; /* when demux complete (taken off wire) */
# endif
2005-04-17 02:20:36 +04:00
struct cifsSesInfo * ses ; /* smb was sent to this server */
struct task_struct * tsk ; /* task waiting for response */
struct smb_hdr * resp_buf ; /* response buffer */
int midState ; /* wish this were enum but can not pass to wait_event */
2005-04-29 09:41:07 +04:00
__u8 command ; /* smb command code */
2008-04-29 04:06:05 +04:00
bool largeBuf : 1 ; /* if valid response, is pointer to large buf */
bool multiRsp : 1 ; /* multiple trans2 responses for one request */
bool multiEnd : 1 ; /* both received */
2005-04-17 02:20:36 +04:00
} ;
struct oplock_q_entry {
struct list_head qhead ;
2007-06-28 23:44:13 +04:00
struct inode * pinode ;
struct cifsTconInfo * tcon ;
2005-04-17 02:20:36 +04:00
__u16 netfid ;
} ;
2005-08-25 04:10:36 +04:00
/* for pending dnotify requests */
struct dir_notify_req {
struct list_head lhead ;
__le16 Pid ;
__le16 PidHigh ;
__u16 Mid ;
__u16 Tid ;
__u16 Uid ;
__u16 netfid ;
__u32 filter ; /* CompletionFilter (for multishot) */
int multishot ;
2007-06-28 23:44:13 +04:00
struct file * pfile ;
2005-08-25 04:10:36 +04:00
} ;
2008-01-25 13:12:41 +03:00
struct dfs_info3_param {
int flags ; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/
2008-02-15 21:21:49 +03:00
int path_consumed ;
2008-01-25 13:12:41 +03:00
int server_type ;
int ref_flag ;
char * path_name ;
char * node_name ;
} ;
static inline void free_dfs_info_param ( struct dfs_info3_param * param )
{
if ( param ) {
kfree ( param - > path_name ) ;
kfree ( param - > node_name ) ;
kfree ( param ) ;
}
}
static inline void free_dfs_info_array ( struct dfs_info3_param * param ,
int number_of_items )
{
int i ;
if ( ( number_of_items = = 0 ) | | ( param = = NULL ) )
return ;
for ( i = 0 ; i < number_of_items ; i + + ) {
kfree ( param [ i ] . path_name ) ;
kfree ( param [ i ] . node_name ) ;
}
kfree ( param ) ;
}
2005-04-17 02:20:36 +04:00
# define MID_FREE 0
# define MID_REQUEST_ALLOCATED 1
# define MID_REQUEST_SUBMITTED 2
# define MID_RESPONSE_RECEIVED 4
# define MID_RETRY_NEEDED 8 /* session closed while this request out */
# define MID_NO_RESP_NEEDED 0x10
2005-12-13 07:53:18 +03:00
/* Types of response buffer returned from SendReceive2 */
# define CIFS_NO_BUFFER 0 /* Response buffer not returned */
# define CIFS_SMALL_BUFFER 1
# define CIFS_LARGE_BUFFER 2
# define CIFS_IOVEC 4 /* array of response buffers */
2005-04-17 02:20:36 +04:00
2007-11-14 01:41:37 +03:00
/* Type of Request to SendReceive2 */
# define CIFS_STD_OP 0 /* normal request timeout */
# define CIFS_LONG_OP 1 /* long op (up to 45 sec, oplock time) */
# define CIFS_VLONG_OP 2 /* sloow op - can take up to 180 seconds */
# define CIFS_BLOCKING_OP 4 /* operation can block */
# define CIFS_ASYNC_OP 8 /* do not wait for response */
# define CIFS_TIMEOUT_MASK 0x00F /* only one of 5 above set in req */
# define CIFS_LOG_ERROR 0x010 /* log NT STATUS if non-zero */
# define CIFS_LARGE_BUF_OP 0x020 /* large request buffer */
# define CIFS_NO_RESP 0x040 /* no response buffer required */
2006-06-01 02:40:51 +04:00
/* Security Flags: indicate type of session setup needed */
# define CIFSSEC_MAY_SIGN 0x00001
# define CIFSSEC_MAY_NTLM 0x00002
# define CIFSSEC_MAY_NTLMV2 0x00004
# define CIFSSEC_MAY_KRB5 0x00008
# ifdef CONFIG_CIFS_WEAK_PW_HASH
# define CIFSSEC_MAY_LANMAN 0x00010
# define CIFSSEC_MAY_PLNTXT 0x00020
2007-10-12 23:24:06 +04:00
# else
# define CIFSSEC_MAY_LANMAN 0
# define CIFSSEC_MAY_PLNTXT 0
2006-06-01 02:40:51 +04:00
# endif /* weak passwords */
# define CIFSSEC_MAY_SEAL 0x00040 /* not supported yet */
# define CIFSSEC_MUST_SIGN 0x01001
/* note that only one of the following can be set so the
result of setting MUST flags more than once will be to
require use of the stronger protocol */
# define CIFSSEC_MUST_NTLM 0x02002
# define CIFSSEC_MUST_NTLMV2 0x04004
# define CIFSSEC_MUST_KRB5 0x08008
# ifdef CONFIG_CIFS_WEAK_PW_HASH
# define CIFSSEC_MUST_LANMAN 0x10010
# define CIFSSEC_MUST_PLNTXT 0x20020
2007-10-16 21:32:19 +04:00
# ifdef CONFIG_CIFS_UPCALL
# define CIFSSEC_MASK 0x3F03F /* allows weak security but also krb5 */
# else
2006-06-01 02:40:51 +04:00
# define CIFSSEC_MASK 0x37037 /* current flags supported if weak */
2007-10-16 22:10:10 +04:00
# endif /* UPCALL */
2007-10-16 21:32:19 +04:00
# else /* do not allow weak pw hash */
# ifdef CONFIG_CIFS_UPCALL
# define CIFSSEC_MASK 0x0F00F /* flags supported if no weak allowed */
2007-06-28 23:44:13 +04:00
# else
2007-10-16 21:32:19 +04:00
# define CIFSSEC_MASK 0x07007 /* flags supported if no weak allowed */
2007-10-16 22:10:10 +04:00
# endif /* UPCALL */
2006-06-01 02:40:51 +04:00
# endif /* WEAK_PW_HASH */
# define CIFSSEC_MUST_SEAL 0x40040 /* not supported yet */
2008-07-24 19:56:05 +04:00
# define CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2)
# define CIFSSEC_MAX (CIFSSEC_MUST_SIGN | CIFSSEC_MUST_NTLMV2)
2007-10-05 00:05:09 +04:00
# define CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_LANMAN | CIFSSEC_MAY_PLNTXT | CIFSSEC_MAY_KRB5)
2005-04-17 02:20:36 +04:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* All constants go here
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
# define UID_HASH (16)
/*
* Note that ONE module should define _DECLARE_GLOBALS_HERE to cause the
* following to be declared .
*/
/****************************************************************************
* Locking notes . All updates to global variables and lists should be
* protected by spinlocks or semaphores .
*
* Spinlocks
* - - - - - - - - -
* GlobalMid_Lock protects :
* list operations on pending_mid_q and oplockQ
* updates to XID counters , multiplex id and SMB sequence numbers
* GlobalSMBSesLock protects :
* list operations on tcp and SMB session lists and tCon lists
* f_owner . lock protects certain per file struct operations
* mapping - > page_lock protects certain per page operations
*
* Semaphores
* - - - - - - - - - -
* sesSem operations on smb session
* tconSem operations on tree connection
2007-06-28 23:44:13 +04:00
* fh_sem file handle reconnection operations
2005-04-17 02:20:36 +04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifdef DECLARE_GLOBALS_HERE
# define GLOBAL_EXTERN
# else
# define GLOBAL_EXTERN extern
# endif
/*
* The list of servers that did not respond with NT LM 0.12 .
* This list helps improve performance and eliminate the messages indicating
2007-06-28 23:44:13 +04:00
* that we had a communications error talking to the server in this list .
2005-04-17 02:20:36 +04:00
*/
2006-09-28 23:43:08 +04:00
/* Feature not supported */
/* GLOBAL_EXTERN struct servers_not_supported *NotSuppList; */
2005-04-17 02:20:36 +04:00
/*
* The following is a hash table of all the users we know about .
*/
GLOBAL_EXTERN struct smbUidInfo * GlobalUidList [ UID_HASH ] ;
2007-02-27 08:35:17 +03:00
/* GLOBAL_EXTERN struct list_head GlobalServerList; BB not implemented yet */
2005-04-17 02:20:36 +04:00
GLOBAL_EXTERN struct list_head GlobalSMBSessionList ;
GLOBAL_EXTERN struct list_head GlobalTreeConnectionList ;
GLOBAL_EXTERN rwlock_t GlobalSMBSeslock ; /* protects list inserts on 3 above */
GLOBAL_EXTERN struct list_head GlobalOplock_Q ;
2007-02-27 08:35:17 +03:00
/* Outstanding dir notify requests */
GLOBAL_EXTERN struct list_head GlobalDnotifyReqList ;
/* DirNotify response queue */
GLOBAL_EXTERN struct list_head GlobalDnotifyRsp_Q ;
2005-08-25 04:10:36 +04:00
2005-04-17 02:20:36 +04:00
/*
* Global transaction id ( XID ) information
*/
GLOBAL_EXTERN unsigned int GlobalCurrentXid ; /* protected by GlobalMid_Sem */
2006-06-04 09:53:15 +04:00
GLOBAL_EXTERN unsigned int GlobalTotalActiveXid ; /* prot by GlobalMid_Sem */
2005-04-17 02:20:36 +04:00
GLOBAL_EXTERN unsigned int GlobalMaxActiveXid ; /* prot by GlobalMid_Sem */
2006-06-04 09:53:15 +04:00
GLOBAL_EXTERN spinlock_t GlobalMid_Lock ; /* protects above & list operations */
/* on midQ entries */
2005-04-17 02:20:36 +04:00
GLOBAL_EXTERN char Local_System_Name [ 15 ] ;
/*
* Global counters , updated atomically
*/
GLOBAL_EXTERN atomic_t sesInfoAllocCount ;
GLOBAL_EXTERN atomic_t tconInfoAllocCount ;
GLOBAL_EXTERN atomic_t tcpSesAllocCount ;
GLOBAL_EXTERN atomic_t tcpSesReconnectCount ;
GLOBAL_EXTERN atomic_t tconInfoReconnectCount ;
2008-05-23 21:38:32 +04:00
/* Various Debug counters */
2005-12-04 00:58:57 +03:00
GLOBAL_EXTERN atomic_t bufAllocCount ; /* current number allocated */
# ifdef CONFIG_CIFS_STATS2
GLOBAL_EXTERN atomic_t totBufAllocCount ; /* total allocated over all time */
GLOBAL_EXTERN atomic_t totSmBufAllocCount ;
# endif
GLOBAL_EXTERN atomic_t smBufAllocCount ;
2005-04-17 02:20:36 +04:00
GLOBAL_EXTERN atomic_t midCount ;
/* Misc globals */
2006-06-04 09:53:15 +04:00
GLOBAL_EXTERN unsigned int multiuser_mount ; /* if enabled allows new sessions
2005-04-17 02:20:36 +04:00
to be established on existing mount if we
2007-06-28 23:44:13 +04:00
have the uid / password or Kerberos credential
2005-04-17 02:20:36 +04:00
or equivalent for current user */
GLOBAL_EXTERN unsigned int oplockEnabled ;
GLOBAL_EXTERN unsigned int experimEnabled ;
GLOBAL_EXTERN unsigned int lookupCacheEnabled ;
2007-06-28 23:44:13 +04:00
GLOBAL_EXTERN unsigned int extended_security ; /* if on, session setup sent
2005-04-17 02:20:36 +04:00
with more secure ntlmssp2 challenge / resp */
GLOBAL_EXTERN unsigned int sign_CIFS_PDUs ; /* enable smb packet signing */
GLOBAL_EXTERN unsigned int linuxExtEnabled ; /*enable Linux/Unix CIFS extensions*/
GLOBAL_EXTERN unsigned int CIFSMaxBufSize ; /* max size not including hdr */
GLOBAL_EXTERN unsigned int cifs_min_rcv ; /* min size of big ntwrk buf pool */
GLOBAL_EXTERN unsigned int cifs_min_small ; /* min size of small buf pool */
GLOBAL_EXTERN unsigned int cifs_max_pending ; /* MAX requests at once to server*/