1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef _CIFS_GLOB_H
20#define _CIFS_GLOB_H
21
22#include <linux/in.h>
23#include <linux/in6.h>
24#include <linux/slab.h>
25#include <linux/mempool.h>
26#include <linux/workqueue.h>
27#include "cifs_fs_sb.h"
28#include "cifsacl.h"
29#include <crypto/internal/hash.h>
30#include <linux/scatterlist.h>
31#ifdef CONFIG_CIFS_SMB2
32#include "smb2pdu.h"
33#endif
34
35#define CIFS_MAGIC_NUMBER 0xFF534D42
36
37
38
39
40#define MAX_UID_INFO 16
41#define MAX_SES_INFO 2
42#define MAX_TCON_INFO 4
43
44#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
45#define MAX_SERVER_SIZE 15
46#define MAX_SHARE_SIZE 80
47#define MAX_USERNAME_SIZE 256
48#define MAX_PASSWORD_SIZE 512
49
50#define CIFS_MIN_RCV_POOL 4
51
52#define MAX_REOPEN_ATT 5
53
54
55
56#define CIFS_DEF_ACTIMEO (1 * HZ)
57
58
59
60
61#define CIFS_MAX_ACTIMEO (1 << 30)
62
63
64
65
66
67#define CIFS_MAX_REQ 32767
68
69#define RFC1001_NAME_LEN 15
70#define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)
71
72
73#define SERVER_NAME_LENGTH 40
74#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
75
76
77
78
79#define MAX_NAME 514
80
81
82#define SMB_ECHO_INTERVAL (60 * HZ)
83
84#include "cifspdu.h"
85
86#ifndef XATTR_DOS_ATTRIB
87#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
88#endif
89
90
91
92
93
94
95enum statusEnum {
96 CifsNew = 0,
97 CifsGood,
98 CifsExiting,
99 CifsNeedReconnect,
100 CifsNeedNegotiate
101};
102
103enum securityEnum {
104 LANMAN = 0,
105 NTLM,
106 NTLMv2,
107 RawNTLMSSP,
108
109 Kerberos,
110};
111
112enum protocolEnum {
113 TCP = 0,
114 SCTP
115
116};
117
118struct session_key {
119 unsigned int len;
120 char *response;
121};
122
123
124struct sdesc {
125 struct shash_desc shash;
126 char ctx[];
127};
128
129
130struct cifs_secmech {
131 struct crypto_shash *hmacmd5;
132 struct crypto_shash *md5;
133 struct crypto_shash *hmacsha256;
134 struct sdesc *sdeschmacmd5;
135 struct sdesc *sdescmd5;
136 struct sdesc *sdeschmacsha256;
137};
138
139
140struct ntlmssp_auth {
141 __u32 client_flags;
142 __u32 server_flags;
143 unsigned char ciphertext[CIFS_CPHTXT_SIZE];
144 char cryptkey[CIFS_CRYPTO_KEY_SIZE];
145};
146
147struct cifs_cred {
148 int uid;
149 int gid;
150 int mode;
151 int cecount;
152 struct cifs_sid osid;
153 struct cifs_sid gsid;
154 struct cifs_ntace *ntaces;
155 struct cifs_ace *aces;
156};
157
158
159
160
161
162
163
164
165
166
167
168
169
170struct smb_rqst {
171 struct kvec *rq_iov;
172 unsigned int rq_nvec;
173 struct page **rq_pages;
174 unsigned int rq_npages;
175 unsigned int rq_pagesz;
176 unsigned int rq_tailsz;
177};
178
179enum smb_version {
180 Smb_1 = 1,
181 Smb_21,
182 Smb_30,
183};
184
185struct mid_q_entry;
186struct TCP_Server_Info;
187struct cifsFileInfo;
188struct cifs_ses;
189struct cifs_tcon;
190struct dfs_info3_param;
191struct cifs_fattr;
192struct smb_vol;
193struct cifs_fid;
194struct cifs_readdata;
195struct cifs_writedata;
196struct cifs_io_parms;
197struct cifs_search_info;
198struct cifsInodeInfo;
199
200struct smb_version_operations {
201 int (*send_cancel)(struct TCP_Server_Info *, void *,
202 struct mid_q_entry *);
203 bool (*compare_fids)(struct cifsFileInfo *, struct cifsFileInfo *);
204
205 struct mid_q_entry *(*setup_request)(struct cifs_ses *,
206 struct smb_rqst *);
207
208 struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *,
209 struct smb_rqst *);
210
211 int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *,
212 bool);
213 void (*add_credits)(struct TCP_Server_Info *, const unsigned int,
214 const int);
215 void (*set_credits)(struct TCP_Server_Info *, const int);
216 int * (*get_credits_field)(struct TCP_Server_Info *, const int);
217 unsigned int (*get_credits)(struct mid_q_entry *);
218 __u64 (*get_next_mid)(struct TCP_Server_Info *);
219
220 unsigned int (*read_data_offset)(char *);
221
222 unsigned int (*read_data_length)(char *);
223
224 int (*map_error)(char *, bool);
225
226 struct mid_q_entry * (*find_mid)(struct TCP_Server_Info *, char *);
227 void (*dump_detail)(void *);
228 void (*clear_stats)(struct cifs_tcon *);
229 void (*print_stats)(struct seq_file *m, struct cifs_tcon *);
230
231 int (*check_message)(char *, unsigned int);
232 bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
233
234 bool (*check_trans2)(struct mid_q_entry *, struct TCP_Server_Info *,
235 char *, int);
236
237 bool (*need_neg)(struct TCP_Server_Info *);
238
239 int (*negotiate)(const unsigned int, struct cifs_ses *);
240
241 unsigned int (*negotiate_wsize)(struct cifs_tcon *, struct smb_vol *);
242
243 unsigned int (*negotiate_rsize)(struct cifs_tcon *, struct smb_vol *);
244
245 int (*sess_setup)(const unsigned int, struct cifs_ses *,
246 const struct nls_table *);
247
248 int (*logoff)(const unsigned int, struct cifs_ses *);
249
250 int (*tree_connect)(const unsigned int, struct cifs_ses *, const char *,
251 struct cifs_tcon *, const struct nls_table *);
252
253 int (*tree_disconnect)(const unsigned int, struct cifs_tcon *);
254
255 int (*get_dfs_refer)(const unsigned int, struct cifs_ses *,
256 const char *, struct dfs_info3_param **,
257 unsigned int *, const struct nls_table *, int);
258
259 void (*qfs_tcon)(const unsigned int, struct cifs_tcon *);
260
261 int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
262 struct cifs_sb_info *, const char *);
263
264 int (*query_path_info)(const unsigned int, struct cifs_tcon *,
265 struct cifs_sb_info *, const char *,
266 FILE_ALL_INFO *, bool *);
267
268 int (*query_file_info)(const unsigned int, struct cifs_tcon *,
269 struct cifs_fid *, FILE_ALL_INFO *);
270
271 int (*get_srv_inum)(const unsigned int, struct cifs_tcon *,
272 struct cifs_sb_info *, const char *,
273 u64 *uniqueid, FILE_ALL_INFO *);
274
275 int (*set_path_size)(const unsigned int, struct cifs_tcon *,
276 const char *, __u64, struct cifs_sb_info *, bool);
277
278 int (*set_file_size)(const unsigned int, struct cifs_tcon *,
279 struct cifsFileInfo *, __u64, bool);
280
281 int (*set_file_info)(struct inode *, const char *, FILE_BASIC_INFO *,
282 const unsigned int);
283
284 char * (*build_path_to_root)(struct smb_vol *, struct cifs_sb_info *,
285 struct cifs_tcon *);
286
287 bool (*can_echo)(struct TCP_Server_Info *);
288
289 int (*echo)(struct TCP_Server_Info *);
290
291 int (*mkdir)(const unsigned int, struct cifs_tcon *, const char *,
292 struct cifs_sb_info *);
293
294 void (*mkdir_setinfo)(struct inode *, const char *,
295 struct cifs_sb_info *, struct cifs_tcon *,
296 const unsigned int);
297
298 int (*rmdir)(const unsigned int, struct cifs_tcon *, const char *,
299 struct cifs_sb_info *);
300
301 int (*unlink)(const unsigned int, struct cifs_tcon *, const char *,
302 struct cifs_sb_info *);
303
304 int (*rename_pending_delete)(const char *, struct dentry *,
305 const unsigned int);
306
307 int (*rename)(const unsigned int, struct cifs_tcon *, const char *,
308 const char *, struct cifs_sb_info *);
309
310 int (*create_hardlink)(const unsigned int, struct cifs_tcon *,
311 const char *, const char *,
312 struct cifs_sb_info *);
313
314 int (*open)(const unsigned int, struct cifs_tcon *, const char *, int,
315 int, int, struct cifs_fid *, __u32 *, FILE_ALL_INFO *,
316 struct cifs_sb_info *);
317
318 void (*set_fid)(struct cifsFileInfo *, struct cifs_fid *, __u32);
319
320 void (*close)(const unsigned int, struct cifs_tcon *,
321 struct cifs_fid *);
322
323 int (*flush)(const unsigned int, struct cifs_tcon *, struct cifs_fid *);
324
325 int (*async_readv)(struct cifs_readdata *);
326
327 int (*async_writev)(struct cifs_writedata *);
328
329 int (*sync_read)(const unsigned int, struct cifsFileInfo *,
330 struct cifs_io_parms *, unsigned int *, char **,
331 int *);
332
333 int (*sync_write)(const unsigned int, struct cifsFileInfo *,
334 struct cifs_io_parms *, unsigned int *, struct kvec *,
335 unsigned long);
336
337 int (*query_dir_first)(const unsigned int, struct cifs_tcon *,
338 const char *, struct cifs_sb_info *,
339 struct cifs_fid *, __u16,
340 struct cifs_search_info *);
341
342 int (*query_dir_next)(const unsigned int, struct cifs_tcon *,
343 struct cifs_fid *,
344 __u16, struct cifs_search_info *srch_inf);
345
346 int (*close_dir)(const unsigned int, struct cifs_tcon *,
347 struct cifs_fid *);
348
349 unsigned int (*calc_smb_size)(void *);
350
351 bool (*is_status_pending)(char *, struct TCP_Server_Info *, int);
352
353 int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *,
354 struct cifsInodeInfo *);
355
356 int (*queryfs)(const unsigned int, struct cifs_tcon *,
357 struct kstatfs *);
358
359 int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
360 __u64, __u32, int, int, bool);
361
362 int (*mand_unlock_range)(struct cifsFileInfo *, struct file_lock *,
363 const unsigned int);
364
365 int (*push_mand_locks)(struct cifsFileInfo *);
366
367 void (*get_lease_key)(struct inode *, struct cifs_fid *fid);
368
369 void (*set_lease_key)(struct inode *, struct cifs_fid *fid);
370
371 void (*new_lease_key)(struct cifs_fid *fid);
372};
373
374struct smb_version_values {
375 char *version_string;
376 __u16 protocol_id;
377 __u32 req_capabilities;
378 __u32 large_lock_type;
379 __u32 exclusive_lock_type;
380 __u32 shared_lock_type;
381 __u32 unlock_lock_type;
382 size_t header_size;
383 size_t max_header_size;
384 size_t read_rsp_size;
385 __le16 lock_cmd;
386 unsigned int cap_unix;
387 unsigned int cap_nt_find;
388 unsigned int cap_large_files;
389};
390
391#define HEADER_SIZE(server) (server->vals->header_size)
392#define MAX_HEADER_SIZE(server) (server->vals->max_header_size)
393
394struct smb_vol {
395 char *username;
396 char *password;
397 char *domainname;
398 char *UNC;
399 char *UNCip;
400 char *iocharset;
401 char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL];
402 char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL];
403 uid_t cred_uid;
404 uid_t linux_uid;
405 gid_t linux_gid;
406 uid_t backupuid;
407 gid_t backupgid;
408 umode_t file_mode;
409 umode_t dir_mode;
410 unsigned secFlg;
411 bool retry:1;
412 bool intr:1;
413 bool setuids:1;
414 bool override_uid:1;
415 bool override_gid:1;
416 bool dynperm:1;
417 bool noperm:1;
418 bool no_psx_acl:1;
419 bool cifs_acl:1;
420 bool backupuid_specified;
421 bool backupgid_specified;
422 bool no_xattr:1;
423 bool server_ino:1;
424 bool direct_io:1;
425 bool strict_io:1;
426 bool remap:1;
427 bool posix_paths:1;
428 bool no_linux_ext:1;
429 bool sfu_emul:1;
430 bool nullauth:1;
431 bool nocase:1;
432 bool nobrl:1;
433 bool mand_lock:1;
434 bool seal:1;
435 bool nodfs:1;
436 bool local_lease:1;
437 bool noblocksnd:1;
438 bool noautotune:1;
439 bool nostrictsync:1;
440 bool fsc:1;
441 bool mfsymlinks:1;
442 bool multiuser:1;
443 bool rwpidforward:1;
444 unsigned int rsize;
445 unsigned int wsize;
446 bool sockopt_tcp_nodelay:1;
447 unsigned short int port;
448 unsigned long actimeo;
449 struct smb_version_operations *ops;
450 struct smb_version_values *vals;
451 char *prepath;
452 struct sockaddr_storage srcaddr;
453 struct nls_table *local_nls;
454};
455
456#define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID | \
457 CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | \
458 CIFS_MOUNT_NO_XATTR | CIFS_MOUNT_MAP_SPECIAL_CHR | \
459 CIFS_MOUNT_UNX_EMUL | CIFS_MOUNT_NO_BRL | \
460 CIFS_MOUNT_CIFS_ACL | CIFS_MOUNT_OVERR_UID | \
461 CIFS_MOUNT_OVERR_GID | CIFS_MOUNT_DYNPERM | \
462 CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC | \
463 CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | \
464 CIFS_MOUNT_MULTIUSER | CIFS_MOUNT_STRICT_IO | \
465 CIFS_MOUNT_CIFS_BACKUPUID | CIFS_MOUNT_CIFS_BACKUPGID)
466
467#define CIFS_MS_MASK (MS_RDONLY | MS_MANDLOCK | MS_NOEXEC | MS_NOSUID | \
468 MS_NODEV | MS_SYNCHRONOUS)
469
470struct cifs_mnt_data {
471 struct cifs_sb_info *cifs_sb;
472 struct smb_vol *vol;
473 int flags;
474};
475
476static inline unsigned int
477get_rfc1002_length(void *buf)
478{
479 return be32_to_cpu(*((__be32 *)buf));
480}
481
482static inline void
483inc_rfc1001_len(void *buf, int count)
484{
485 be32_add_cpu((__be32 *)buf, count);
486}
487
488struct TCP_Server_Info {
489 struct list_head tcp_ses_list;
490 struct list_head smb_ses_list;
491 int srv_count;
492
493 char server_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
494 struct smb_version_operations *ops;
495 struct smb_version_values *vals;
496 enum statusEnum tcpStatus;
497 char *hostname;
498 struct socket *ssocket;
499 struct sockaddr_storage dstaddr;
500 struct sockaddr_storage srcaddr;
501#ifdef CONFIG_NET_NS
502 struct net *net;
503#endif
504 wait_queue_head_t response_q;
505 wait_queue_head_t request_q;
506 struct list_head pending_mid_q;
507 bool noblocksnd;
508 bool noautotune;
509 bool tcp_nodelay;
510 int credits;
511 unsigned int in_flight;
512 spinlock_t req_lock;
513 struct mutex srv_mutex;
514 struct task_struct *tsk;
515 char server_GUID[16];
516 __u16 sec_mode;
517 bool session_estab;
518#ifdef CONFIG_CIFS_SMB2
519 int echo_credits;
520 int oplock_credits;
521 bool echoes:1;
522#endif
523 u16 dialect;
524 enum securityEnum secType;
525 bool oplocks:1;
526 unsigned int maxReq;
527
528
529 unsigned int maxBuf;
530
531
532
533 unsigned int max_rw;
534
535
536 unsigned int max_vcs;
537
538
539 unsigned int capabilities;
540 int timeAdj;
541 __u64 CurrentMid;
542 char cryptkey[CIFS_CRYPTO_KEY_SIZE];
543
544 char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
545 __u32 sequence_number;
546 struct session_key session_key;
547 unsigned long lstrp;
548 struct cifs_secmech secmech;
549
550 bool sec_ntlmssp;
551 bool sec_kerberosu2u;
552 bool sec_kerberos;
553 bool sec_mskerberos;
554 bool large_buf;
555 struct delayed_work echo;
556 struct kvec *iov;
557 unsigned int nr_iov;
558 char *smallbuf;
559 char *bigbuf;
560 unsigned int total_read;
561#ifdef CONFIG_CIFS_FSCACHE
562 struct fscache_cookie *fscache;
563#endif
564#ifdef CONFIG_CIFS_STATS2
565 atomic_t in_send;
566 atomic_t num_waiters;
567#endif
568#ifdef CONFIG_CIFS_SMB2
569 unsigned int max_read;
570 unsigned int max_write;
571#endif
572};
573
574static inline unsigned int
575in_flight(struct TCP_Server_Info *server)
576{
577 unsigned int num;
578 spin_lock(&server->req_lock);
579 num = server->in_flight;
580 spin_unlock(&server->req_lock);
581 return num;
582}
583
584static inline bool
585has_credits(struct TCP_Server_Info *server, int *credits)
586{
587 int num;
588 spin_lock(&server->req_lock);
589 num = *credits;
590 spin_unlock(&server->req_lock);
591 return num > 0;
592}
593
594static inline void
595add_credits(struct TCP_Server_Info *server, const unsigned int add,
596 const int optype)
597{
598 server->ops->add_credits(server, add, optype);
599}
600
601static inline void
602set_credits(struct TCP_Server_Info *server, const int val)
603{
604 server->ops->set_credits(server, val);
605}
606
607static inline __u64
608get_next_mid(struct TCP_Server_Info *server)
609{
610 return server->ops->get_next_mid(server);
611}
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626#define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
627#define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
628
629
630
631
632
633
634#define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
635#define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
636
637
638
639
640
641
642#define CIFS_DEFAULT_IOSIZE (1024 * 1024)
643
644
645
646
647
648
649
650
651
652
653
654
655#define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
656#define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
657
658
659
660
661
662
663#ifdef CONFIG_NET_NS
664
665static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
666{
667 return srv->net;
668}
669
670static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
671{
672 srv->net = net;
673}
674
675#else
676
677static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
678{
679 return &init_net;
680}
681
682static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
683{
684}
685
686#endif
687
688
689
690
691struct cifs_ses {
692 struct list_head smb_ses_list;
693 struct list_head tcon_list;
694 struct mutex session_mutex;
695 struct TCP_Server_Info *server;
696 int ses_count;
697 enum statusEnum status;
698 unsigned overrideSecFlg;
699 __u16 ipc_tid;
700 __u16 flags;
701 __u16 vcnum;
702 char *serverOS;
703 char *serverNOS;
704 char *serverDomain;
705 __u64 Suid;
706 uid_t linux_uid;
707 uid_t cred_uid;
708 unsigned int capabilities;
709 char serverName[SERVER_NAME_LEN_WITH_NULL * 2];
710
711 char *user_name;
712
713 char *domainName;
714 char *password;
715 struct session_key auth_key;
716 struct ntlmssp_auth *ntlmssp;
717 bool need_reconnect:1;
718#ifdef CONFIG_CIFS_SMB2
719 __u16 session_flags;
720#endif
721};
722
723
724#define CIFS_SES_NT4 1
725#define CIFS_SES_OS2 2
726#define CIFS_SES_W9X 4
727
728
729
730#define CIFS_SES_LANMAN 8
731
732static inline bool
733cap_unix(struct cifs_ses *ses)
734{
735 return ses->server->vals->cap_unix & ses->capabilities;
736}
737
738
739
740
741
742struct cifs_tcon {
743 struct list_head tcon_list;
744 int tc_count;
745 struct list_head openFileList;
746 struct cifs_ses *ses;
747 char treeName[MAX_TREE_SIZE + 1];
748 char *nativeFileSystem;
749 char *password;
750 __u32 tid;
751 __u16 Flags;
752 enum statusEnum tidStatus;
753#ifdef CONFIG_CIFS_STATS
754 atomic_t num_smbs_sent;
755 union {
756 struct {
757 atomic_t num_writes;
758 atomic_t num_reads;
759 atomic_t num_flushes;
760 atomic_t num_oplock_brks;
761 atomic_t num_opens;
762 atomic_t num_closes;
763 atomic_t num_deletes;
764 atomic_t num_mkdirs;
765 atomic_t num_posixopens;
766 atomic_t num_posixmkdirs;
767 atomic_t num_rmdirs;
768 atomic_t num_renames;
769 atomic_t num_t2renames;
770 atomic_t num_ffirst;
771 atomic_t num_fnext;
772 atomic_t num_fclose;
773 atomic_t num_hardlinks;
774 atomic_t num_symlinks;
775 atomic_t num_locks;
776 atomic_t num_acl_get;
777 atomic_t num_acl_set;
778 } cifs_stats;
779#ifdef CONFIG_CIFS_SMB2
780 struct {
781 atomic_t smb2_com_sent[NUMBER_OF_SMB2_COMMANDS];
782 atomic_t smb2_com_failed[NUMBER_OF_SMB2_COMMANDS];
783 } smb2_stats;
784#endif
785 } stats;
786#ifdef CONFIG_CIFS_STATS2
787 unsigned long long time_writes;
788 unsigned long long time_reads;
789 unsigned long long time_opens;
790 unsigned long long time_deletes;
791 unsigned long long time_closes;
792 unsigned long long time_mkdirs;
793 unsigned long long time_rmdirs;
794 unsigned long long time_renames;
795 unsigned long long time_t2renames;
796 unsigned long long time_ffirst;
797 unsigned long long time_fnext;
798 unsigned long long time_fclose;
799#endif
800 __u64 bytes_read;
801 __u64 bytes_written;
802 spinlock_t stat_lock;
803#endif
804 FILE_SYSTEM_DEVICE_INFO fsDevInfo;
805 FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo;
806 FILE_SYSTEM_UNIX_INFO fsUnixInfo;
807 bool ipc:1;
808 bool retry:1;
809 bool nocase:1;
810 bool seal:1;
811 bool unix_ext:1;
812
813 bool local_lease:1;
814 bool broken_posix_open;
815 bool need_reconnect:1;
816#ifdef CONFIG_CIFS_SMB2
817 bool print:1;
818 bool bad_network_name:1;
819 __u32 capabilities;
820 __u32 share_flags;
821 __u32 maximal_access;
822 __u32 vol_serial_number;
823 __le64 vol_create_time;
824#endif
825#ifdef CONFIG_CIFS_FSCACHE
826 u64 resource_id;
827 struct fscache_cookie *fscache;
828#endif
829 struct list_head pending_opens;
830
831};
832
833
834
835
836
837
838
839struct tcon_link {
840 struct rb_node tl_rbnode;
841 uid_t tl_uid;
842 unsigned long tl_flags;
843#define TCON_LINK_MASTER 0
844#define TCON_LINK_PENDING 1
845#define TCON_LINK_IN_TREE 2
846 unsigned long tl_time;
847 atomic_t tl_count;
848 struct cifs_tcon *tl_tcon;
849};
850
851extern struct tcon_link *cifs_sb_tlink(struct cifs_sb_info *cifs_sb);
852
853static inline struct cifs_tcon *
854tlink_tcon(struct tcon_link *tlink)
855{
856 return tlink->tl_tcon;
857}
858
859extern void cifs_put_tlink(struct tcon_link *tlink);
860
861static inline struct tcon_link *
862cifs_get_tlink(struct tcon_link *tlink)
863{
864 if (tlink && !IS_ERR(tlink))
865 atomic_inc(&tlink->tl_count);
866 return tlink;
867}
868
869
870extern struct cifs_tcon *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
871
872#define CIFS_OPLOCK_NO_CHANGE 0xfe
873
874struct cifs_pending_open {
875 struct list_head olist;
876 struct tcon_link *tlink;
877 __u8 lease_key[16];
878 __u32 oplock;
879};
880
881
882
883
884
885struct cifsLockInfo {
886 struct list_head llist;
887 struct list_head blist;
888 wait_queue_head_t block_q;
889 __u64 offset;
890 __u64 length;
891 __u32 pid;
892 __u32 type;
893};
894
895
896
897
898struct cifs_search_info {
899 loff_t index_of_last_entry;
900 __u16 entries_in_buffer;
901 __u16 info_level;
902 __u32 resume_key;
903 char *ntwrk_buf_start;
904 char *srch_entries_start;
905 char *last_entry;
906 const char *presume_name;
907 unsigned int resume_name_len;
908 bool endOfSearch:1;
909 bool emptyDir:1;
910 bool unicode:1;
911 bool smallBuf:1;
912};
913
914struct cifs_fid {
915 __u16 netfid;
916#ifdef CONFIG_CIFS_SMB2
917 __u64 persistent_fid;
918 __u64 volatile_fid;
919 __u8 lease_key[SMB2_LEASE_KEY_SIZE];
920#endif
921 struct cifs_pending_open *pending_open;
922};
923
924struct cifs_fid_locks {
925 struct list_head llist;
926 struct cifsFileInfo *cfile;
927 struct list_head locks;
928};
929
930struct cifsFileInfo {
931 struct list_head tlist;
932 struct list_head flist;
933 struct cifs_fid_locks *llist;
934 unsigned int uid;
935 __u32 pid;
936 struct cifs_fid fid;
937 ;
938
939 struct dentry *dentry;
940 unsigned int f_flags;
941 struct tcon_link *tlink;
942 bool invalidHandle:1;
943 bool oplock_break_cancelled:1;
944 int count;
945 struct mutex fh_mutex;
946 struct cifs_search_info srch_inf;
947 struct work_struct oplock_break;
948};
949
950struct cifs_io_parms {
951 __u16 netfid;
952#ifdef CONFIG_CIFS_SMB2
953 __u64 persistent_fid;
954 __u64 volatile_fid;
955#endif
956 __u32 pid;
957 __u64 offset;
958 unsigned int length;
959 struct cifs_tcon *tcon;
960};
961
962struct cifs_readdata;
963
964
965struct cifs_readdata {
966 struct kref refcount;
967 struct list_head list;
968 struct completion done;
969 struct cifsFileInfo *cfile;
970 struct address_space *mapping;
971 __u64 offset;
972 unsigned int bytes;
973 pid_t pid;
974 int result;
975 struct work_struct work;
976 int (*read_into_pages)(struct TCP_Server_Info *server,
977 struct cifs_readdata *rdata,
978 unsigned int len);
979 struct kvec iov;
980 unsigned int pagesz;
981 unsigned int tailsz;
982 unsigned int nr_pages;
983 struct page *pages[];
984};
985
986struct cifs_writedata;
987
988
989struct cifs_writedata {
990 struct kref refcount;
991 struct list_head list;
992 struct completion done;
993 enum writeback_sync_modes sync_mode;
994 struct work_struct work;
995 struct cifsFileInfo *cfile;
996 __u64 offset;
997 pid_t pid;
998 unsigned int bytes;
999 int result;
1000 unsigned int pagesz;
1001 unsigned int tailsz;
1002 unsigned int nr_pages;
1003 struct page *pages[1];
1004};
1005
1006
1007
1008
1009
1010static inline void
1011cifsFileInfo_get_locked(struct cifsFileInfo *cifs_file)
1012{
1013 ++cifs_file->count;
1014}
1015
1016struct cifsFileInfo *cifsFileInfo_get(struct cifsFileInfo *cifs_file);
1017void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
1018
1019
1020
1021
1022
1023struct cifsInodeInfo {
1024 bool can_cache_brlcks;
1025 struct list_head llist;
1026 struct rw_semaphore lock_sem;
1027
1028 struct list_head openFileList;
1029 __u32 cifsAttrs;
1030 bool clientCanCacheRead;
1031 bool clientCanCacheAll;
1032 bool delete_pending;
1033 bool invalid_mapping;
1034 unsigned long time;
1035 u64 server_eof;
1036 u64 uniqueid;
1037 u64 createtime;
1038#ifdef CONFIG_CIFS_SMB2
1039 __u8 lease_key[SMB2_LEASE_KEY_SIZE];
1040#endif
1041#ifdef CONFIG_CIFS_FSCACHE
1042 struct fscache_cookie *fscache;
1043#endif
1044 struct inode vfs_inode;
1045};
1046
1047static inline struct cifsInodeInfo *
1048CIFS_I(struct inode *inode)
1049{
1050 return container_of(inode, struct cifsInodeInfo, vfs_inode);
1051}
1052
1053static inline struct cifs_sb_info *
1054CIFS_SB(struct super_block *sb)
1055{
1056 return sb->s_fs_info;
1057}
1058
1059static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
1060{
1061 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
1062 return '/';
1063 else
1064 return '\\';
1065}
1066
1067static inline void
1068convert_delimiter(char *path, char delim)
1069{
1070 int i;
1071 char old_delim;
1072
1073 if (path == NULL)
1074 return;
1075
1076 if (delim == '/')
1077 old_delim = '\\';
1078 else
1079 old_delim = '/';
1080
1081 for (i = 0; path[i] != '\0'; i++) {
1082 if (path[i] == old_delim)
1083 path[i] = delim;
1084 }
1085}
1086
1087static inline char *
1088build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
1089 struct cifs_tcon *tcon)
1090{
1091 if (!vol->ops->build_path_to_root)
1092 return NULL;
1093 return vol->ops->build_path_to_root(vol, cifs_sb, tcon);
1094}
1095
1096#ifdef CONFIG_CIFS_STATS
1097#define cifs_stats_inc atomic_inc
1098
1099static inline void cifs_stats_bytes_written(struct cifs_tcon *tcon,
1100 unsigned int bytes)
1101{
1102 if (bytes) {
1103 spin_lock(&tcon->stat_lock);
1104 tcon->bytes_written += bytes;
1105 spin_unlock(&tcon->stat_lock);
1106 }
1107}
1108
1109static inline void cifs_stats_bytes_read(struct cifs_tcon *tcon,
1110 unsigned int bytes)
1111{
1112 spin_lock(&tcon->stat_lock);
1113 tcon->bytes_read += bytes;
1114 spin_unlock(&tcon->stat_lock);
1115}
1116#else
1117
1118#define cifs_stats_inc(field) do {} while (0)
1119#define cifs_stats_bytes_written(tcon, bytes) do {} while (0)
1120#define cifs_stats_bytes_read(tcon, bytes) do {} while (0)
1121
1122#endif
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137typedef int (mid_receive_t)(struct TCP_Server_Info *server,
1138 struct mid_q_entry *mid);
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148typedef void (mid_callback_t)(struct mid_q_entry *mid);
1149
1150
1151struct mid_q_entry {
1152 struct list_head qhead;
1153 struct TCP_Server_Info *server;
1154 __u64 mid;
1155 __u32 pid;
1156 __u32 sequence_number;
1157 unsigned long when_alloc;
1158#ifdef CONFIG_CIFS_STATS2
1159 unsigned long when_sent;
1160 unsigned long when_received;
1161#endif
1162 mid_receive_t *receive;
1163 mid_callback_t *callback;
1164 void *callback_data;
1165 void *resp_buf;
1166 int mid_state;
1167 __le16 command;
1168 bool large_buf:1;
1169 bool multiRsp:1;
1170 bool multiEnd:1;
1171};
1172
1173
1174
1175#ifdef CONFIG_CIFS_STATS2
1176
1177static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
1178{
1179 atomic_inc(&server->in_send);
1180}
1181
1182static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
1183{
1184 atomic_dec(&server->in_send);
1185}
1186
1187static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
1188{
1189 atomic_inc(&server->num_waiters);
1190}
1191
1192static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
1193{
1194 atomic_dec(&server->num_waiters);
1195}
1196
1197static inline void cifs_save_when_sent(struct mid_q_entry *mid)
1198{
1199 mid->when_sent = jiffies;
1200}
1201#else
1202static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
1203{
1204}
1205static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
1206{
1207}
1208
1209static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
1210{
1211}
1212
1213static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
1214{
1215}
1216
1217static inline void cifs_save_when_sent(struct mid_q_entry *mid)
1218{
1219}
1220#endif
1221
1222
1223struct dir_notify_req {
1224 struct list_head lhead;
1225 __le16 Pid;
1226 __le16 PidHigh;
1227 __u16 Mid;
1228 __u16 Tid;
1229 __u16 Uid;
1230 __u16 netfid;
1231 __u32 filter;
1232 int multishot;
1233 struct file *pfile;
1234};
1235
1236struct dfs_info3_param {
1237 int flags;
1238 int path_consumed;
1239 int server_type;
1240 int ref_flag;
1241 char *path_name;
1242 char *node_name;
1243};
1244
1245
1246
1247
1248
1249
1250#define CIFS_FATTR_DFS_REFERRAL 0x1
1251#define CIFS_FATTR_DELETE_PENDING 0x2
1252#define CIFS_FATTR_NEED_REVAL 0x4
1253#define CIFS_FATTR_INO_COLLISION 0x8
1254
1255struct cifs_fattr {
1256 u32 cf_flags;
1257 u32 cf_cifsattrs;
1258 u64 cf_uniqueid;
1259 u64 cf_eof;
1260 u64 cf_bytes;
1261 u64 cf_createtime;
1262 uid_t cf_uid;
1263 gid_t cf_gid;
1264 umode_t cf_mode;
1265 dev_t cf_rdev;
1266 unsigned int cf_nlink;
1267 unsigned int cf_dtype;
1268 struct timespec cf_atime;
1269 struct timespec cf_mtime;
1270 struct timespec cf_ctime;
1271};
1272
1273static inline void free_dfs_info_param(struct dfs_info3_param *param)
1274{
1275 if (param) {
1276 kfree(param->path_name);
1277 kfree(param->node_name);
1278 kfree(param);
1279 }
1280}
1281
1282static inline void free_dfs_info_array(struct dfs_info3_param *param,
1283 int number_of_items)
1284{
1285 int i;
1286 if ((number_of_items == 0) || (param == NULL))
1287 return;
1288 for (i = 0; i < number_of_items; i++) {
1289 kfree(param[i].path_name);
1290 kfree(param[i].node_name);
1291 }
1292 kfree(param);
1293}
1294
1295#define MID_FREE 0
1296#define MID_REQUEST_ALLOCATED 1
1297#define MID_REQUEST_SUBMITTED 2
1298#define MID_RESPONSE_RECEIVED 4
1299#define MID_RETRY_NEEDED 8
1300#define MID_RESPONSE_MALFORMED 0x10
1301#define MID_SHUTDOWN 0x20
1302
1303
1304#define CIFS_NO_BUFFER 0
1305#define CIFS_SMALL_BUFFER 1
1306#define CIFS_LARGE_BUFFER 2
1307#define CIFS_IOVEC 4
1308
1309
1310#define CIFS_BLOCKING_OP 1
1311#define CIFS_ASYNC_OP 2
1312#define CIFS_TIMEOUT_MASK 0x003
1313#define CIFS_LOG_ERROR 0x010
1314#define CIFS_LARGE_BUF_OP 0x020
1315#define CIFS_NO_RESP 0x040
1316
1317
1318#define CIFS_ECHO_OP 0x080
1319#define CIFS_OBREAK_OP 0x0100
1320#define CIFS_NEG_OP 0x0200
1321#define CIFS_OP_MASK 0x0380
1322
1323
1324#define CIFSSEC_MAY_SIGN 0x00001
1325#define CIFSSEC_MAY_NTLM 0x00002
1326#define CIFSSEC_MAY_NTLMV2 0x00004
1327#define CIFSSEC_MAY_KRB5 0x00008
1328#ifdef CONFIG_CIFS_WEAK_PW_HASH
1329#define CIFSSEC_MAY_LANMAN 0x00010
1330#define CIFSSEC_MAY_PLNTXT 0x00020
1331#else
1332#define CIFSSEC_MAY_LANMAN 0
1333#define CIFSSEC_MAY_PLNTXT 0
1334#endif
1335#define CIFSSEC_MAY_SEAL 0x00040
1336#define CIFSSEC_MAY_NTLMSSP 0x00080
1337
1338#define CIFSSEC_MUST_SIGN 0x01001
1339
1340
1341
1342#define CIFSSEC_MUST_NTLM 0x02002
1343#define CIFSSEC_MUST_NTLMV2 0x04004
1344#define CIFSSEC_MUST_KRB5 0x08008
1345#ifdef CONFIG_CIFS_WEAK_PW_HASH
1346#define CIFSSEC_MUST_LANMAN 0x10010
1347#define CIFSSEC_MUST_PLNTXT 0x20020
1348#ifdef CONFIG_CIFS_UPCALL
1349#define CIFSSEC_MASK 0xBF0BF
1350#else
1351#define CIFSSEC_MASK 0xB70B7
1352#endif
1353#else
1354#define CIFSSEC_MUST_LANMAN 0
1355#define CIFSSEC_MUST_PLNTXT 0
1356#ifdef CONFIG_CIFS_UPCALL
1357#define CIFSSEC_MASK 0x8F08F
1358#else
1359#define CIFSSEC_MASK 0x87087
1360#endif
1361#endif
1362#define CIFSSEC_MUST_SEAL 0x40040
1363#define CIFSSEC_MUST_NTLMSSP 0x80080
1364
1365#define CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_NTLMSSP)
1366#define CIFSSEC_MAX (CIFSSEC_MUST_SIGN | CIFSSEC_MUST_NTLMV2)
1367#define CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_LANMAN | CIFSSEC_MAY_PLNTXT | CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_NTLMSSP)
1368
1369
1370
1371
1372
1373
1374#define UID_HASH (16)
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403#ifdef DECLARE_GLOBALS_HERE
1404#define GLOBAL_EXTERN
1405#else
1406#define GLOBAL_EXTERN extern
1407#endif
1408
1409
1410
1411
1412
1413
1414
1415
1416GLOBAL_EXTERN struct list_head cifs_tcp_ses_list;
1417
1418
1419
1420
1421
1422
1423
1424GLOBAL_EXTERN spinlock_t cifs_tcp_ses_lock;
1425
1426
1427
1428
1429
1430
1431
1432
1433GLOBAL_EXTERN spinlock_t cifs_file_list_lock;
1434
1435#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL
1436
1437GLOBAL_EXTERN struct list_head GlobalDnotifyReqList;
1438
1439GLOBAL_EXTERN struct list_head GlobalDnotifyRsp_Q;
1440#endif
1441
1442
1443
1444
1445GLOBAL_EXTERN unsigned int GlobalCurrentXid;
1446GLOBAL_EXTERN unsigned int GlobalTotalActiveXid;
1447GLOBAL_EXTERN unsigned int GlobalMaxActiveXid;
1448GLOBAL_EXTERN spinlock_t GlobalMid_Lock;
1449
1450
1451
1452
1453GLOBAL_EXTERN atomic_t sesInfoAllocCount;
1454GLOBAL_EXTERN atomic_t tconInfoAllocCount;
1455GLOBAL_EXTERN atomic_t tcpSesAllocCount;
1456GLOBAL_EXTERN atomic_t tcpSesReconnectCount;
1457GLOBAL_EXTERN atomic_t tconInfoReconnectCount;
1458
1459
1460GLOBAL_EXTERN atomic_t bufAllocCount;
1461#ifdef CONFIG_CIFS_STATS2
1462GLOBAL_EXTERN atomic_t totBufAllocCount;
1463GLOBAL_EXTERN atomic_t totSmBufAllocCount;
1464#endif
1465GLOBAL_EXTERN atomic_t smBufAllocCount;
1466GLOBAL_EXTERN atomic_t midCount;
1467
1468
1469GLOBAL_EXTERN bool enable_oplocks;
1470GLOBAL_EXTERN unsigned int lookupCacheEnabled;
1471GLOBAL_EXTERN unsigned int global_secflags;
1472
1473GLOBAL_EXTERN unsigned int sign_CIFS_PDUs;
1474GLOBAL_EXTERN unsigned int linuxExtEnabled;
1475GLOBAL_EXTERN unsigned int CIFSMaxBufSize;
1476GLOBAL_EXTERN unsigned int cifs_min_rcv;
1477GLOBAL_EXTERN unsigned int cifs_min_small;
1478GLOBAL_EXTERN unsigned int cifs_max_pending;
1479
1480#ifdef CONFIG_CIFS_ACL
1481GLOBAL_EXTERN struct rb_root uidtree;
1482GLOBAL_EXTERN struct rb_root gidtree;
1483GLOBAL_EXTERN spinlock_t siduidlock;
1484GLOBAL_EXTERN spinlock_t sidgidlock;
1485GLOBAL_EXTERN struct rb_root siduidtree;
1486GLOBAL_EXTERN struct rb_root sidgidtree;
1487GLOBAL_EXTERN spinlock_t uidsidlock;
1488GLOBAL_EXTERN spinlock_t gidsidlock;
1489#endif
1490
1491void cifs_oplock_break(struct work_struct *work);
1492
1493extern const struct slow_work_ops cifs_oplock_break_ops;
1494extern struct workqueue_struct *cifsiod_wq;
1495
1496extern mempool_t *cifs_mid_poolp;
1497
1498
1499#define SMB1_VERSION_STRING "1.0"
1500extern struct smb_version_operations smb1_operations;
1501extern struct smb_version_values smb1_values;
1502#define SMB20_VERSION_STRING "2.0"
1503
1504extern struct smb_version_values smb20_values;
1505#define SMB21_VERSION_STRING "2.1"
1506extern struct smb_version_operations smb21_operations;
1507extern struct smb_version_values smb21_values;
1508#define SMB30_VERSION_STRING "3.0"
1509
1510extern struct smb_version_values smb30_values;
1511#endif
1512