1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/in.h>
20#include <linux/in6.h>
21#include "cifs_fs_sb.h"
22#include "cifsacl.h"
23
24
25
26#define MAX_UID_INFO 16
27#define MAX_SES_INFO 2
28#define MAX_TCON_INFO 4
29
30#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
31#define MAX_SERVER_SIZE 15
32#define MAX_SHARE_SIZE 64
33#define MAX_USERNAME_SIZE 32
34
35#define MAX_PASSWORD_SIZE 16
36
37#define CIFS_MIN_RCV_POOL 4
38
39
40
41
42
43
44
45
46
47
48#define CIFS_MAX_REQ 50
49
50#define RFC1001_NAME_LEN 15
51#define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)
52
53
54#define SERVER_NAME_LENGTH 40
55#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
56
57
58
59
60#define MAX_NAME 514
61
62#include "cifspdu.h"
63
64#ifndef XATTR_DOS_ATTRIB
65#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
66#endif
67
68
69
70
71
72
73enum statusEnum {
74 CifsNew = 0,
75 CifsGood,
76 CifsExiting,
77 CifsNeedReconnect
78};
79
80enum securityEnum {
81 PLAINTXT = 0,
82 LANMAN,
83 NTLM,
84 NTLMv2,
85 RawNTLMSSP,
86
87 Kerberos,
88 MSKerberos,
89};
90
91enum protocolEnum {
92 TCP = 0,
93 SCTP
94
95};
96
97struct mac_key {
98 unsigned int len;
99 union {
100 char ntlm[CIFS_SESS_KEY_SIZE + 16];
101 char krb5[CIFS_SESS_KEY_SIZE + 16];
102 struct {
103 char key[16];
104 struct ntlmv2_resp resp;
105 } ntlmv2;
106 } data;
107};
108
109struct cifs_cred {
110 int uid;
111 int gid;
112 int mode;
113 int cecount;
114 struct cifs_sid osid;
115 struct cifs_sid gsid;
116 struct cifs_ntace *ntaces;
117 struct cifs_ace *aces;
118};
119
120
121
122
123
124
125
126
127struct TCP_Server_Info {
128 struct list_head tcp_ses_list;
129 struct list_head smb_ses_list;
130 int srv_count;
131
132 char server_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
133 char *hostname;
134 struct socket *ssocket;
135 union {
136 struct sockaddr_in sockAddr;
137 struct sockaddr_in6 sockAddr6;
138 } addr;
139 wait_queue_head_t response_q;
140 wait_queue_head_t request_q;
141 struct list_head pending_mid_q;
142 void *Server_NlsInfo;
143 unsigned short server_codepage;
144 unsigned long ip_address;
145 enum protocolEnum protocolType;
146 char versionMajor;
147 char versionMinor;
148 bool svlocal:1;
149 bool noblocksnd;
150 bool noautotune;
151 atomic_t inFlight;
152#ifdef CONFIG_CIFS_STATS2
153 atomic_t inSend;
154 atomic_t num_waiters;
155#endif
156 enum statusEnum tcpStatus;
157 struct mutex srv_mutex;
158 struct task_struct *tsk;
159 char server_GUID[16];
160 char secMode;
161 enum securityEnum secType;
162 unsigned int maxReq;
163
164
165 unsigned int maxBuf;
166
167 unsigned int max_rw;
168
169
170 unsigned int max_vcs;
171
172
173 char sessid[4];
174
175 int capabilities;
176 int timeAdj;
177 __u16 CurrentMid;
178 char cryptKey[CIFS_CRYPTO_KEY_SIZE];
179
180 char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
181 __u32 sequence_number;
182 struct mac_key mac_signing_key;
183 char ntlmv2_hash[16];
184 unsigned long lstrp;
185};
186
187
188
189
190
191
192struct cifsUidInfo {
193 struct list_head userList;
194 struct list_head sessionList;
195 uid_t linux_uid;
196 char user[MAX_USERNAME_SIZE + 1];
197
198};
199
200
201
202
203struct cifsSesInfo {
204 struct list_head smb_ses_list;
205 struct list_head tcon_list;
206 struct semaphore sesSem;
207#if 0
208 struct cifsUidInfo *uidInfo;
209#endif
210 struct TCP_Server_Info *server;
211 int ses_count;
212 enum statusEnum status;
213 unsigned overrideSecFlg;
214 __u16 ipc_tid;
215 __u16 flags;
216 __u16 vcnum;
217 char *serverOS;
218 char *serverNOS;
219 char *serverDomain;
220 int Suid;
221 uid_t linux_uid;
222 int capabilities;
223 char serverName[SERVER_NAME_LEN_WITH_NULL * 2];
224
225 char userName[MAX_USERNAME_SIZE + 1];
226 char *domainName;
227 char *password;
228 bool need_reconnect:1;
229};
230
231#define CIFS_SES_NT4 1
232#define CIFS_SES_OS2 2
233#define CIFS_SES_W9X 4
234
235
236
237#define CIFS_SES_LANMAN 8
238
239
240
241
242struct cifsTconInfo {
243 struct list_head tcon_list;
244 int tc_count;
245 struct list_head openFileList;
246 struct cifsSesInfo *ses;
247 char treeName[MAX_TREE_SIZE + 1];
248 char *nativeFileSystem;
249 char *password;
250 __u16 tid;
251 __u16 Flags;
252 enum statusEnum tidStatus;
253#ifdef CONFIG_CIFS_STATS
254 atomic_t num_smbs_sent;
255 atomic_t num_writes;
256 atomic_t num_reads;
257 atomic_t num_flushes;
258 atomic_t num_oplock_brks;
259 atomic_t num_opens;
260 atomic_t num_closes;
261 atomic_t num_deletes;
262 atomic_t num_mkdirs;
263 atomic_t num_posixopens;
264 atomic_t num_posixmkdirs;
265 atomic_t num_rmdirs;
266 atomic_t num_renames;
267 atomic_t num_t2renames;
268 atomic_t num_ffirst;
269 atomic_t num_fnext;
270 atomic_t num_fclose;
271 atomic_t num_hardlinks;
272 atomic_t num_symlinks;
273 atomic_t num_locks;
274 atomic_t num_acl_get;
275 atomic_t num_acl_set;
276#ifdef CONFIG_CIFS_STATS2
277 unsigned long long time_writes;
278 unsigned long long time_reads;
279 unsigned long long time_opens;
280 unsigned long long time_deletes;
281 unsigned long long time_closes;
282 unsigned long long time_mkdirs;
283 unsigned long long time_rmdirs;
284 unsigned long long time_renames;
285 unsigned long long time_t2renames;
286 unsigned long long time_ffirst;
287 unsigned long long time_fnext;
288 unsigned long long time_fclose;
289#endif
290 __u64 bytes_read;
291 __u64 bytes_written;
292 spinlock_t stat_lock;
293#endif
294 FILE_SYSTEM_DEVICE_INFO fsDevInfo;
295 FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo;
296 FILE_SYSTEM_UNIX_INFO fsUnixInfo;
297 bool ipc:1;
298 bool retry:1;
299 bool nocase:1;
300 bool seal:1;
301 bool unix_ext:1;
302
303 bool local_lease:1;
304 bool broken_posix_open;
305 bool need_reconnect:1;
306
307};
308
309
310
311
312
313struct cifsLockInfo {
314 struct list_head llist;
315 __u64 offset;
316 __u64 length;
317 __u8 type;
318};
319
320
321
322
323struct cifs_search_info {
324 loff_t index_of_last_entry;
325 __u16 entries_in_buffer;
326 __u16 info_level;
327 __u32 resume_key;
328 char *ntwrk_buf_start;
329 char *srch_entries_start;
330 char *last_entry;
331 char *presume_name;
332 unsigned int resume_name_len;
333 bool endOfSearch:1;
334 bool emptyDir:1;
335 bool unicode:1;
336 bool smallBuf:1;
337};
338
339struct cifsFileInfo {
340 struct list_head tlist;
341 struct list_head flist;
342 unsigned int uid;
343 __u32 pid;
344 __u16 netfid;
345 ;
346
347 struct file *pfile;
348 struct inode *pInode;
349 struct mutex lock_mutex;
350 struct list_head llist;
351 bool closePend:1;
352 bool invalidHandle:1;
353 bool messageMode:1;
354 atomic_t wrtPending;
355 struct mutex fh_mutex;
356 struct cifs_search_info srch_inf;
357};
358
359
360
361
362
363struct cifsInodeInfo {
364 struct list_head lockList;
365
366 struct list_head openFileList;
367 int write_behind_rc;
368 __u32 cifsAttrs;
369 unsigned long time;
370 bool clientCanCacheRead:1;
371 bool clientCanCacheAll:1;
372 bool oplockPending:1;
373 bool delete_pending:1;
374 u64 server_eof;
375 u64 uniqueid;
376 struct inode vfs_inode;
377};
378
379static inline struct cifsInodeInfo *
380CIFS_I(struct inode *inode)
381{
382 return container_of(inode, struct cifsInodeInfo, vfs_inode);
383}
384
385static inline struct cifs_sb_info *
386CIFS_SB(struct super_block *sb)
387{
388 return sb->s_fs_info;
389}
390
391static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
392{
393 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
394 return '/';
395 else
396 return '\\';
397}
398
399#ifdef CONFIG_CIFS_STATS
400#define cifs_stats_inc atomic_inc
401
402static inline void cifs_stats_bytes_written(struct cifsTconInfo *tcon,
403 unsigned int bytes)
404{
405 if (bytes) {
406 spin_lock(&tcon->stat_lock);
407 tcon->bytes_written += bytes;
408 spin_unlock(&tcon->stat_lock);
409 }
410}
411
412static inline void cifs_stats_bytes_read(struct cifsTconInfo *tcon,
413 unsigned int bytes)
414{
415 spin_lock(&tcon->stat_lock);
416 tcon->bytes_read += bytes;
417 spin_unlock(&tcon->stat_lock);
418}
419#else
420
421#define cifs_stats_inc(field) do {} while (0)
422#define cifs_stats_bytes_written(tcon, bytes) do {} while (0)
423#define cifs_stats_bytes_read(tcon, bytes) do {} while (0)
424
425#endif
426
427
428struct mid_q_entry {
429 struct list_head qhead;
430 __u16 mid;
431 __u16 pid;
432 __u32 sequence_number;
433 unsigned long when_alloc;
434#ifdef CONFIG_CIFS_STATS2
435 unsigned long when_sent;
436 unsigned long when_received;
437#endif
438 struct task_struct *tsk;
439 struct smb_hdr *resp_buf;
440 int midState;
441 __u8 command;
442 bool largeBuf:1;
443 bool multiRsp:1;
444 bool multiEnd:1;
445};
446
447struct oplock_q_entry {
448 struct list_head qhead;
449 struct inode *pinode;
450 struct cifsTconInfo *tcon;
451 __u16 netfid;
452};
453
454
455struct dir_notify_req {
456 struct list_head lhead;
457 __le16 Pid;
458 __le16 PidHigh;
459 __u16 Mid;
460 __u16 Tid;
461 __u16 Uid;
462 __u16 netfid;
463 __u32 filter;
464 int multishot;
465 struct file *pfile;
466};
467
468struct dfs_info3_param {
469 int flags;
470 int path_consumed;
471 int server_type;
472 int ref_flag;
473 char *path_name;
474 char *node_name;
475};
476
477
478
479
480
481
482#define CIFS_FATTR_DFS_REFERRAL 0x1
483#define CIFS_FATTR_DELETE_PENDING 0x2
484#define CIFS_FATTR_NEED_REVAL 0x4
485
486struct cifs_fattr {
487 u32 cf_flags;
488 u32 cf_cifsattrs;
489 u64 cf_uniqueid;
490 u64 cf_eof;
491 u64 cf_bytes;
492 uid_t cf_uid;
493 gid_t cf_gid;
494 umode_t cf_mode;
495 dev_t cf_rdev;
496 unsigned int cf_nlink;
497 unsigned int cf_dtype;
498 struct timespec cf_atime;
499 struct timespec cf_mtime;
500 struct timespec cf_ctime;
501};
502
503static inline void free_dfs_info_param(struct dfs_info3_param *param)
504{
505 if (param) {
506 kfree(param->path_name);
507 kfree(param->node_name);
508 kfree(param);
509 }
510}
511
512static inline void free_dfs_info_array(struct dfs_info3_param *param,
513 int number_of_items)
514{
515 int i;
516 if ((number_of_items == 0) || (param == NULL))
517 return;
518 for (i = 0; i < number_of_items; i++) {
519 kfree(param[i].path_name);
520 kfree(param[i].node_name);
521 }
522 kfree(param);
523}
524
525#define MID_FREE 0
526#define MID_REQUEST_ALLOCATED 1
527#define MID_REQUEST_SUBMITTED 2
528#define MID_RESPONSE_RECEIVED 4
529#define MID_RETRY_NEEDED 8
530#define MID_NO_RESP_NEEDED 0x10
531
532
533#define CIFS_NO_BUFFER 0
534#define CIFS_SMALL_BUFFER 1
535#define CIFS_LARGE_BUFFER 2
536#define CIFS_IOVEC 4
537
538
539#define CIFS_STD_OP 0
540#define CIFS_LONG_OP 1
541#define CIFS_VLONG_OP 2
542#define CIFS_BLOCKING_OP 4
543#define CIFS_ASYNC_OP 8
544#define CIFS_TIMEOUT_MASK 0x00F
545#define CIFS_LOG_ERROR 0x010
546#define CIFS_LARGE_BUF_OP 0x020
547#define CIFS_NO_RESP 0x040
548
549
550#define CIFSSEC_MAY_SIGN 0x00001
551#define CIFSSEC_MAY_NTLM 0x00002
552#define CIFSSEC_MAY_NTLMV2 0x00004
553#define CIFSSEC_MAY_KRB5 0x00008
554#ifdef CONFIG_CIFS_WEAK_PW_HASH
555#define CIFSSEC_MAY_LANMAN 0x00010
556#define CIFSSEC_MAY_PLNTXT 0x00020
557#else
558#define CIFSSEC_MAY_LANMAN 0
559#define CIFSSEC_MAY_PLNTXT 0
560#endif
561#define CIFSSEC_MAY_SEAL 0x00040
562#define CIFSSEC_MAY_NTLMSSP 0x00080
563
564#define CIFSSEC_MUST_SIGN 0x01001
565
566
567
568#define CIFSSEC_MUST_NTLM 0x02002
569#define CIFSSEC_MUST_NTLMV2 0x04004
570#define CIFSSEC_MUST_KRB5 0x08008
571#ifdef CONFIG_CIFS_WEAK_PW_HASH
572#define CIFSSEC_MUST_LANMAN 0x10010
573#define CIFSSEC_MUST_PLNTXT 0x20020
574#ifdef CONFIG_CIFS_UPCALL
575#define CIFSSEC_MASK 0xAF0AF
576#else
577#define CIFSSEC_MASK 0xA70A7
578#endif
579#else
580#ifdef CONFIG_CIFS_UPCALL
581#define CIFSSEC_MASK 0x8F08F
582#else
583#define CIFSSEC_MASK 0x87087
584#endif
585#endif
586#define CIFSSEC_MUST_SEAL 0x40040
587#define CIFSSEC_MUST_NTLMSSP 0x80080
588
589#define CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2)
590#define CIFSSEC_MAX (CIFSSEC_MUST_SIGN | CIFSSEC_MUST_NTLMV2)
591#define CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_LANMAN | CIFSSEC_MAY_PLNTXT | CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_NTLMSSP)
592
593
594
595
596
597
598#define UID_HASH (16)
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627#ifdef DECLARE_GLOBALS_HERE
628#define GLOBAL_EXTERN
629#else
630#define GLOBAL_EXTERN extern
631#endif
632
633
634
635
636
637
638
639
640GLOBAL_EXTERN struct list_head cifs_tcp_ses_list;
641
642
643
644
645
646
647
648GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock;
649
650
651
652
653
654
655
656
657GLOBAL_EXTERN rwlock_t GlobalSMBSeslock;
658
659GLOBAL_EXTERN struct list_head GlobalOplock_Q;
660
661
662GLOBAL_EXTERN struct list_head GlobalDnotifyReqList;
663
664GLOBAL_EXTERN struct list_head GlobalDnotifyRsp_Q;
665
666
667
668
669GLOBAL_EXTERN unsigned int GlobalCurrentXid;
670GLOBAL_EXTERN unsigned int GlobalTotalActiveXid;
671GLOBAL_EXTERN unsigned int GlobalMaxActiveXid;
672GLOBAL_EXTERN spinlock_t GlobalMid_Lock;
673
674GLOBAL_EXTERN char Local_System_Name[15];
675
676
677
678
679GLOBAL_EXTERN atomic_t sesInfoAllocCount;
680GLOBAL_EXTERN atomic_t tconInfoAllocCount;
681GLOBAL_EXTERN atomic_t tcpSesAllocCount;
682GLOBAL_EXTERN atomic_t tcpSesReconnectCount;
683GLOBAL_EXTERN atomic_t tconInfoReconnectCount;
684
685
686GLOBAL_EXTERN atomic_t bufAllocCount;
687#ifdef CONFIG_CIFS_STATS2
688GLOBAL_EXTERN atomic_t totBufAllocCount;
689GLOBAL_EXTERN atomic_t totSmBufAllocCount;
690#endif
691GLOBAL_EXTERN atomic_t smBufAllocCount;
692GLOBAL_EXTERN atomic_t midCount;
693
694
695GLOBAL_EXTERN unsigned int multiuser_mount;
696
697
698
699GLOBAL_EXTERN unsigned int oplockEnabled;
700GLOBAL_EXTERN unsigned int experimEnabled;
701GLOBAL_EXTERN unsigned int lookupCacheEnabled;
702GLOBAL_EXTERN unsigned int extended_security;
703
704GLOBAL_EXTERN unsigned int sign_CIFS_PDUs;
705GLOBAL_EXTERN unsigned int linuxExtEnabled;
706GLOBAL_EXTERN unsigned int CIFSMaxBufSize;
707GLOBAL_EXTERN unsigned int cifs_min_rcv;
708GLOBAL_EXTERN unsigned int cifs_min_small;
709GLOBAL_EXTERN unsigned int cifs_max_pending;
710
711