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