ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / fs / cifs / cifsglob.h
1 /*
2  *   fs/cifs/cifsglob.h
3  *
4  *   Copyright (C) International Business Machines  Corp., 2002,2003
5  *   Author(s): Steve French (sfrench@us.ibm.com)
6  *
7  *   This library is free software; you can redistribute it and/or modify
8  *   it under the terms of the GNU Lesser General Public License as published
9  *   by the Free Software Foundation; either version 2.1 of the License, or
10  *   (at your option) any later version.
11  *
12  *   This library is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15  *   the GNU Lesser General Public License for more details.
16  * 
17  */
18 #include <linux/in.h>
19 #include <linux/in6.h>
20 #include "cifs_fs_sb.h"
21 /*
22  * The sizes of various internal tables and strings
23  */
24 #define MAX_UID_INFO 16
25 #define MAX_SES_INFO 2
26 #define MAX_TCON_INFO 4
27
28 #define MAX_TREE_SIZE 2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1
29 #define MAX_SERVER_SIZE 15
30 #define MAX_SHARE_SIZE  64      /* used to be 20 - this should still be enough */
31 #define MAX_USERNAME_SIZE 32    /* 32 is to allow for 15 char names + null
32                                    termination then *2 for unicode versions */
33 #define MAX_PASSWORD_SIZE 16
34
35 /*
36  * MAX_REQ is the maximum number of requests that WE will send
37  * on one NetBIOS handle concurently.
38  */
39 #define MAX_REQ (10)
40
41 #define SERVER_NAME_LENGTH 15
42 #define SERVER_NAME_LEN_WITH_NULL     (SERVER_NAME_LENGTH + 1)
43
44 /* used to define string lengths for reversing unicode strings */
45 /*         (256+1)*2 = 514                                     */
46 /*           (max path length + 1 for null) * 2 for unicode    */
47 #define MAX_NAME 514
48
49 #include "cifspdu.h"
50
51 #ifndef FALSE
52 #define FALSE 0
53 #endif
54
55 #ifndef TRUE
56 #define TRUE 1
57 #endif
58
59 #ifndef XATTR_DOS_ATTRIB
60 #define XATTR_DOS_ATTRIB "user.DOSATTRIB"
61 #endif
62
63 /*
64  * This information is kept on every Server we know about.
65  *
66  * Some things to note:
67  *
68  */
69 #define SERVER_NAME_LEN_WITH_NULL       (SERVER_NAME_LENGTH + 1)
70
71 /*
72  * CIFS vfs client Status information (based on what we know.)
73  */
74
75  /* associated with each tcp and smb session */
76 enum statusEnum {
77         CifsNew = 0,
78         CifsGood,
79         CifsExiting,
80         CifsNeedReconnect
81 };
82
83 enum securityEnum {
84         NTLM = 0,               /* Legacy NTLM012 auth with NTLM hash */
85         NTLMv2,                 /* Legacy NTLM auth with NTLMv2 hash */
86         RawNTLMSSP,             /* NTLMSSP without SPNEGO */
87         NTLMSSP,                /* NTLMSSP via SPNEGO */
88         Kerberos                /* Kerberos via SPNEGO */
89 };
90
91 enum protocolEnum {
92         IPV4 = 0,
93         IPV6,
94         SCTP
95         /* Netbios frames protocol not supported at this time */
96 };
97
98 /*
99  *****************************************************************
100  * Except the CIFS PDUs themselves all the
101  * globally interesting structs should go here
102  *****************************************************************
103  */
104
105 struct TCP_Server_Info {
106         char server_Name[SERVER_NAME_LEN_WITH_NULL];    /* 15 chars + X'20'in 16th */
107         char unicode_server_Name[SERVER_NAME_LEN_WITH_NULL * 2];        /* Unicode version of server_Name */
108         struct socket *ssocket;
109         union {
110                 struct sockaddr_in sockAddr;
111                 struct sockaddr_in6 sockAddr6;
112         } addr;
113         wait_queue_head_t response_q;
114         struct list_head pending_mid_q;
115         void *Server_NlsInfo;   /* BB - placeholder for future NLS info  */
116         unsigned short server_codepage; /* codepage for the server    */
117         unsigned long ip_address;       /* IP addr for the server if known     */
118         enum protocolEnum protocolType; 
119         char versionMajor;
120         char versionMinor;
121         int svlocal:1;          /* local server or remote */
122         atomic_t socketUseCount;        /* indicates if the server has any open cifs sessions */
123         enum statusEnum tcpStatus; /* what we think the status is */
124         struct semaphore tcpSem;
125         struct task_struct *tsk;
126         char server_GUID[16];
127         char secMode;
128         enum securityEnum secType;
129         unsigned int maxReq;    /* Clients should submit no more */
130         /* than maxReq distinct unanswered SMBs to the server when using  */
131         /* multiplexed reads or writes */
132         unsigned int maxBuf;    /* maxBuf specifies the maximum */
133         /* message size the server can send or receive for non-raw SMBs */
134         unsigned int maxRw;     /* maxRw specifies the maximum */
135         /* message size the server can send or receive for */
136         /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
137         char sessid[4];         /* unique token id for this session */
138         /* (returned on Negotiate */
139         int capabilities; /* allow selective disabling of caps by smb sess */
140         __u16 timeZone;
141         char cryptKey[CIFS_CRYPTO_KEY_SIZE];
142         char workstation_RFC1001_name[16]; /* 16th byte is always zero */
143 };
144
145 /*
146  * The following is our shortcut to user information.  We surface the uid,
147  * and name. We always get the password on the fly in case it
148  * has changed. We also hang a list of sessions owned by this user off here. 
149  */
150 struct cifsUidInfo {
151         struct list_head userList;
152         struct list_head sessionList; /* SMB sessions for this user */
153         uid_t linux_uid;
154         char user[MAX_USERNAME_SIZE + 1];       /* ascii name of user */
155         /* BB may need ptr or callback for PAM or WinBind info */
156 };
157
158 /*
159  * Session structure.  One of these for each uid session with a particular host
160  */
161 struct cifsSesInfo {
162         struct list_head cifsSessionList;
163         struct semaphore sesSem;
164         struct cifsUidInfo *uidInfo;    /* pointer to user info */
165         struct TCP_Server_Info *server; /* pointer to server info */
166         atomic_t inUse;         /* # of CURRENT users of this ses */
167         enum statusEnum status;
168         __u32 sequence_number;  /* needed for CIFS PDU signature */
169         __u16 ipc_tid;          /* special tid for connection to IPC share */
170         char mac_signing_key[CIFS_SESSION_KEY_SIZE + 16];       
171         char *serverOS;         /* name of operating system underlying the server */
172         char *serverNOS;        /* name of network operating system that the server is running */
173         char *serverDomain;     /* security realm of server */
174         int Suid;               /* remote smb uid  */
175         uid_t linux_uid;        /* local Linux uid */
176         int capabilities;
177         char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for tcp names - will ipv6 and sctp addresses fit here?? */
178         char userName[MAX_USERNAME_SIZE + 1];
179         char domainName[MAX_USERNAME_SIZE + 1];
180         char * password;
181 };
182
183 /*
184  * there is one of these for each connection to a resource on a particular
185  * session 
186  */
187 struct cifsTconInfo {
188         struct list_head cifsConnectionList;
189         struct list_head openFileList;
190         struct semaphore tconSem;
191         struct cifsSesInfo *ses;        /* pointer to session associated with */
192         char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource (in ASCII not UTF) */
193         char *nativeFileSystem;
194         __u16 tid;              /* The 2 byte tree id */
195         __u16 Flags;            /* optional support bits */
196         enum statusEnum tidStatus;
197         atomic_t useCount;      /* how many mounts (explicit or implicit) to this share */
198         FILE_SYSTEM_DEVICE_INFO fsDevInfo;
199         FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo;  /* ok if file system name truncated */
200         FILE_SYSTEM_UNIX_INFO fsUnixInfo;
201         int retry:1;
202         /* BB add field for back pointer to sb struct? */
203 };
204
205 /*
206  * This info hangs off the cifsFileInfo structure.  This is used to track
207  * byte stream locks on the file
208  */
209 struct cifsLockInfo {
210         struct cifsLockInfo *next;
211         int start;
212         int length;
213         int type;
214 };
215
216 /*
217  * One of these for each open instance of a file
218  */
219 struct cifsFileInfo {
220         struct list_head tlist; /* pointer to next fid owned by tcon */
221         struct list_head flist; /* next fid (file instance) for this inode */
222         unsigned int uid;       /* allows finding which FileInfo structure */
223         __u32 pid;              /* process id who opened file */
224         __u16 netfid;           /* file id from remote */
225         /* BB add lock scope info here if needed */ ;
226         /* lock scope id (0 if none) */
227         struct file * pfile; /* needed for writepage */
228         struct inode * pInode; /* needed for oplock break */
229         int endOfSearch:1;      /* we have reached end of search */
230         int closePend:1;        /* file is marked to close */
231         int emptyDir:1;
232         int invalidHandle:1;  /* file closed via session abend */
233         struct semaphore fh_sem; /* prevents reopen race after dead ses*/
234         char * search_resume_name;
235         unsigned int resume_name_length;
236         __u32 resume_key;
237 };
238
239 /*
240  * One of these for each file inode
241  */
242
243 struct cifsInodeInfo {
244         struct list_head lockList;
245         /* BB add in lists for dirty pages - i.e. write caching info for oplock */
246         struct list_head openFileList;
247         int write_behind_rc;
248         __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
249         atomic_t inUse;  /* num concurrent users (local openers cifs) of file*/
250         unsigned long time;     /* jiffies of last update/check of inode */
251         int clientCanCacheRead:1; /* read oplock */
252         int clientCanCacheAll:1;  /* read and writebehind oplock */
253         int oplockPending:1;
254         struct inode vfs_inode;
255 };
256
257 static inline struct cifsInodeInfo *
258 CIFS_I(struct inode *inode)
259 {
260         return container_of(inode, struct cifsInodeInfo, vfs_inode);
261 }
262
263 static inline struct cifs_sb_info *
264 CIFS_SB(struct super_block *sb)
265 {
266         return sb->s_fs_info;
267 }
268
269
270 /* one of these for every pending CIFS request to the server */
271 struct mid_q_entry {
272         struct list_head qhead; /* mids waiting on reply from this server */
273         __u16 mid;              /* multiplex id */
274         __u16 pid;              /* process id */
275         __u32 sequence_number;  /* for CIFS signing */
276         __u16 command;          /* smb command code */
277         struct timeval when_sent;       /* time when smb sent */
278         struct cifsSesInfo *ses;        /* smb was sent to this server */
279         struct task_struct *tsk;        /* task waiting for response */
280         struct smb_hdr *resp_buf;       /* response buffer */
281         int midState;   /* wish this were enum but can not pass to wait_event */
282 };
283
284 struct oplock_q_entry {
285         struct list_head qhead;
286         struct inode * pinode;
287         struct cifsTconInfo * tcon; 
288         __u16 netfid;
289 };
290
291 #define   MID_FREE 0
292 #define   MID_REQUEST_ALLOCATED 1
293 #define   MID_REQUEST_SUBMITTED 2
294 #define   MID_RESPONSE_RECEIVED 4
295 #define   MID_RETRY_NEEDED      8 /* session closed while this request out */
296
297 struct servers_not_supported { /* @z4a */
298         struct servers_not_supported *next1;  /* @z4a */
299         char server_Name[SERVER_NAME_LEN_WITH_NULL]; /* @z4a */
300         /* Server Names in SMB protocol are 15 chars + X'20'  */
301         /*   in 16th byte...                      @z4a        */
302 };
303
304 /*
305  *****************************************************************
306  * All constants go here
307  *****************************************************************
308  */
309
310 #define UID_HASH (16)
311
312 /*
313  * Note that ONE module should define _DECLARE_GLOBALS_HERE to cause the
314  * following to be declared.
315  */
316
317 /****************************************************************************
318  *  Locking notes.  All updates to global variables and lists should be
319  *                  protected by spinlocks or semaphores.
320  *
321  *  Spinlocks
322  *  ---------
323  *  GlobalMid_Lock protects:
324  *      list operations on pending_mid_q and oplockQ
325  *      updates to XID counters, multiplex id  and SMB sequence numbers
326  *  GlobalSMBSesLock protects:
327  *      list operations on tcp and SMB session lists and tCon lists
328  *  f_owner.lock protects certain per file struct operations
329  *  mapping->page_lock protects certain per page operations
330  *
331  *  Semaphores
332  *  ----------
333  *  sesSem     operations on smb session
334  *  tconSem    operations on tree connection
335  *  fh_sem      file handle reconnection operations 
336  *
337  ****************************************************************************/
338
339 #ifdef DECLARE_GLOBALS_HERE
340 #define GLOBAL_EXTERN
341 #else
342 #define GLOBAL_EXTERN extern
343 #endif
344
345 /*
346  * The list of servers that did not respond with NT LM 0.12.
347  * This list helps improve performance and eliminate the messages indicating
348  * that we had a communications error talking to the server in this list. 
349  */
350 GLOBAL_EXTERN struct servers_not_supported *NotSuppList;        /*@z4a */
351
352 /*
353  * The following is a hash table of all the users we know about.
354  */
355 GLOBAL_EXTERN struct smbUidInfo *GlobalUidList[UID_HASH];
356
357 GLOBAL_EXTERN struct list_head GlobalServerList; /* BB not implemented yet */
358 GLOBAL_EXTERN struct list_head GlobalSMBSessionList;
359 GLOBAL_EXTERN struct list_head GlobalTreeConnectionList;
360 GLOBAL_EXTERN rwlock_t GlobalSMBSeslock;  /* protects list inserts on 3 above */
361
362 GLOBAL_EXTERN struct list_head GlobalOplock_Q;
363
364 /*
365  * Global transaction id (XID) information
366  */
367 GLOBAL_EXTERN unsigned int GlobalCurrentXid;    /* protected by GlobalMid_Sem */
368 GLOBAL_EXTERN unsigned int GlobalTotalActiveXid;        /* prot by GlobalMid_Sem */
369 GLOBAL_EXTERN unsigned int GlobalMaxActiveXid;  /* prot by GlobalMid_Sem */
370 GLOBAL_EXTERN spinlock_t GlobalMid_Lock;  /* protects above and list operations */
371                                         /* on midQ entries */
372 GLOBAL_EXTERN char Local_System_Name[15];
373
374 /*
375  *  Global counters, updated atomically
376  */
377 GLOBAL_EXTERN atomic_t sesInfoAllocCount;
378 GLOBAL_EXTERN atomic_t tconInfoAllocCount;
379
380 GLOBAL_EXTERN atomic_t tcpSesReconnectCount;
381 GLOBAL_EXTERN atomic_t tconInfoReconnectCount;
382
383 /* Various Debug counters to remove someday (BB) */
384 GLOBAL_EXTERN atomic_t bufAllocCount;
385 GLOBAL_EXTERN atomic_t midCount;
386
387 /* Misc globals */
388 GLOBAL_EXTERN unsigned int multiuser_mount;     /* if enabled allows new sessions
389                                 to be established on existing mount if we
390                                 have the uid/password or Kerberos credential 
391                                 or equivalent for current user */
392 GLOBAL_EXTERN unsigned int oplockEnabled;
393 GLOBAL_EXTERN unsigned int quotaEnabled;
394 GLOBAL_EXTERN unsigned int lookupCacheEnabled;
395 GLOBAL_EXTERN unsigned int extended_security;   /* if on, session setup sent 
396                                 with more secure ntlmssp2 challenge/resp */
397 GLOBAL_EXTERN unsigned int ntlmv2_support;  /* better optional password hash */
398 GLOBAL_EXTERN unsigned int sign_CIFS_PDUs;  /* enable smb packet signing */
399 GLOBAL_EXTERN unsigned int linuxExtEnabled;  /* enable Linux/Unix CIFS extensions */
400
401