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