hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/fs/cifs/cifsglob.h
....@@ -22,6 +22,8 @@
2222 #include <linux/in.h>
2323 #include <linux/in6.h>
2424 #include <linux/slab.h>
25
+#include <linux/scatterlist.h>
26
+#include <linux/mm.h>
2527 #include <linux/mempool.h>
2628 #include <linux/workqueue.h>
2729 #include "cifs_fs_sb.h"
....@@ -30,9 +32,11 @@
3032 #include <linux/scatterlist.h>
3133 #include <uapi/linux/cifs/cifs_mount.h>
3234 #include "smb2pdu.h"
35
+#include "smb2glob.h"
3336
3437 #define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */
3538
39
+#define SMB_PATH_MAX 260
3640 #define CIFS_PORT 445
3741 #define RFC1001_PORT 139
3842
....@@ -57,6 +61,12 @@
5761 * max attribute cache timeout (jiffies) - 2^30
5862 */
5963 #define CIFS_MAX_ACTIMEO (1 << 30)
64
+
65
+/*
66
+ * Max persistent and resilient handle timeout (milliseconds).
67
+ * Windows durable max was 960000 (16 minutes)
68
+ */
69
+#define SMB3_MAX_HANDLE_TIMEOUT 960000
6070
6171 /*
6272 * MAX_REQ is the maximum number of requests that WE will send
....@@ -188,18 +198,6 @@
188198 unsigned int rq_tailsz; /* length of last page */
189199 };
190200
191
-enum smb_version {
192
- Smb_1 = 1,
193
- Smb_20,
194
- Smb_21,
195
- Smb_30,
196
- Smb_302,
197
- Smb_311,
198
- Smb_3any,
199
- Smb_default,
200
- Smb_version_err
201
-};
202
-
203201 struct mid_q_entry;
204202 struct TCP_Server_Info;
205203 struct cifsFileInfo;
....@@ -215,6 +213,7 @@
215213 struct cifs_search_info;
216214 struct cifsInodeInfo;
217215 struct cifs_open_parms;
216
+struct cifs_credits;
218217
219218 struct smb_version_operations {
220219 int (*send_cancel)(struct TCP_Server_Info *, struct smb_rqst *,
....@@ -222,15 +221,17 @@
222221 bool (*compare_fids)(struct cifsFileInfo *, struct cifsFileInfo *);
223222 /* setup request: allocate mid, sign message */
224223 struct mid_q_entry *(*setup_request)(struct cifs_ses *,
225
- struct smb_rqst *);
224
+ struct TCP_Server_Info *,
225
+ struct smb_rqst *);
226226 /* setup async request: allocate mid, sign message */
227227 struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *,
228228 struct smb_rqst *);
229229 /* check response: verify signature, map error */
230230 int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *,
231231 bool);
232
- void (*add_credits)(struct TCP_Server_Info *, const unsigned int,
233
- const int);
232
+ void (*add_credits)(struct TCP_Server_Info *server,
233
+ const struct cifs_credits *credits,
234
+ const int optype);
234235 void (*set_credits)(struct TCP_Server_Info *, const int);
235236 int * (*get_credits_field)(struct TCP_Server_Info *, const int);
236237 unsigned int (*get_credits)(struct mid_q_entry *);
....@@ -258,7 +259,7 @@
258259 /* verify the message */
259260 int (*check_message)(char *, unsigned int, struct TCP_Server_Info *);
260261 bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
261
- int (*handle_cancelled_mid)(char *, struct TCP_Server_Info *);
262
+ int (*handle_cancelled_mid)(struct mid_q_entry *, struct TCP_Server_Info *);
262263 void (*downgrade_oplock)(struct TCP_Server_Info *server,
263264 struct cifsInodeInfo *cinode, __u32 oplock,
264265 unsigned int epoch, bool *purge_cache);
....@@ -288,7 +289,8 @@
288289 const char *, struct dfs_info3_param **,
289290 unsigned int *, const struct nls_table *, int);
290291 /* informational QFS call */
291
- void (*qfs_tcon)(const unsigned int, struct cifs_tcon *);
292
+ void (*qfs_tcon)(const unsigned int, struct cifs_tcon *,
293
+ struct cifs_sb_info *);
292294 /* check if a path is accessible or not */
293295 int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
294296 struct cifs_sb_info *, const char *);
....@@ -299,6 +301,10 @@
299301 /* query file data from the server */
300302 int (*query_file_info)(const unsigned int, struct cifs_tcon *,
301303 struct cifs_fid *, FILE_ALL_INFO *);
304
+ /* query reparse tag from srv to determine which type of special file */
305
+ int (*query_reparse_tag)(const unsigned int xid, struct cifs_tcon *tcon,
306
+ struct cifs_sb_info *cifs_sb, const char *path,
307
+ __u32 *reparse_tag);
302308 /* get server index number */
303309 int (*get_srv_inum)(const unsigned int, struct cifs_tcon *,
304310 struct cifs_sb_info *, const char *,
....@@ -323,8 +329,9 @@
323329 umode_t mode, struct cifs_tcon *tcon,
324330 const char *full_path,
325331 struct cifs_sb_info *cifs_sb);
326
- int (*mkdir)(const unsigned int, struct cifs_tcon *, const char *,
327
- struct cifs_sb_info *);
332
+ int (*mkdir)(const unsigned int xid, struct inode *inode, umode_t mode,
333
+ struct cifs_tcon *tcon, const char *name,
334
+ struct cifs_sb_info *sb);
328335 /* set info on created directory */
329336 void (*mkdir_setinfo)(struct inode *, const char *,
330337 struct cifs_sb_info *, struct cifs_tcon *,
....@@ -347,7 +354,8 @@
347354 struct cifs_sb_info *);
348355 /* query symlink target */
349356 int (*query_symlink)(const unsigned int, struct cifs_tcon *,
350
- const char *, char **, struct cifs_sb_info *);
357
+ struct cifs_sb_info *, const char *,
358
+ char **, bool);
351359 /* open a file for non-posix mounts */
352360 int (*open)(const unsigned int, struct cifs_open_parms *,
353361 __u32 *, FILE_ALL_INFO *);
....@@ -356,6 +364,9 @@
356364 /* close a file */
357365 void (*close)(const unsigned int, struct cifs_tcon *,
358366 struct cifs_fid *);
367
+ /* close a file, returning file attributes and timestamps */
368
+ void (*close_getattr)(const unsigned int xid, struct cifs_tcon *tcon,
369
+ struct cifsFileInfo *pfile_info);
359370 /* send a flush request to the server */
360371 int (*flush)(const unsigned int, struct cifs_tcon *, struct cifs_fid *);
361372 /* async read from the server */
....@@ -385,8 +396,8 @@
385396 struct cifs_fid *);
386397 /* calculate a size of SMB message */
387398 unsigned int (*calc_smb_size)(void *buf, struct TCP_Server_Info *ptcpi);
388
- /* check for STATUS_PENDING and process it in a positive case */
389
- bool (*is_status_pending)(char *, struct TCP_Server_Info *, int);
399
+ /* check for STATUS_PENDING and process the response if yes */
400
+ bool (*is_status_pending)(char *buf, struct TCP_Server_Info *server);
390401 /* check for STATUS_NETWORK_SESSION_EXPIRED */
391402 bool (*is_session_expired)(char *);
392403 /* send oplock break response */
....@@ -394,7 +405,7 @@
394405 struct cifsInodeInfo *);
395406 /* query remote filesystem */
396407 int (*queryfs)(const unsigned int, struct cifs_tcon *,
397
- struct kstatfs *);
408
+ struct cifs_sb_info *, struct kstatfs *);
398409 /* send mandatory brlock to the server */
399410 int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
400411 __u64, __u32, int, int, bool);
....@@ -410,11 +421,14 @@
410421 /* generate new lease key */
411422 void (*new_lease_key)(struct cifs_fid *);
412423 int (*generate_signingkey)(struct cifs_ses *);
413
- int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *);
424
+ int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *,
425
+ bool allocate_crypto);
414426 int (*set_integrity)(const unsigned int, struct cifs_tcon *tcon,
415427 struct cifsFileInfo *src_file);
416428 int (*enum_snapshots)(const unsigned int xid, struct cifs_tcon *tcon,
417429 struct cifsFileInfo *src_file, void __user *);
430
+ int (*notify)(const unsigned int xid, struct file *pfile,
431
+ void __user *pbuf);
418432 int (*query_mf_symlink)(unsigned int, struct cifs_tcon *,
419433 struct cifs_sb_info *, const unsigned char *,
420434 char *, unsigned int *);
....@@ -454,7 +468,11 @@
454468 unsigned int (*wp_retry_size)(struct inode *);
455469 /* get mtu credits */
456470 int (*wait_mtu_credits)(struct TCP_Server_Info *, unsigned int,
457
- unsigned int *, unsigned int *);
471
+ unsigned int *, struct cifs_credits *);
472
+ /* adjust previously taken mtu credits to request size */
473
+ int (*adjust_credits)(struct TCP_Server_Info *server,
474
+ struct cifs_credits *credits,
475
+ const unsigned int payload_size);
458476 /* check if we need to issue closedir */
459477 bool (*dir_needs_close)(struct cifsFileInfo *);
460478 long (*fallocate)(struct file *, struct cifs_tcon *, int, loff_t,
....@@ -468,6 +486,27 @@
468486 enum securityEnum (*select_sectype)(struct TCP_Server_Info *,
469487 enum securityEnum);
470488 int (*next_header)(char *);
489
+ /* ioctl passthrough for query_info */
490
+ int (*ioctl_query_info)(const unsigned int xid,
491
+ struct cifs_tcon *tcon,
492
+ struct cifs_sb_info *cifs_sb,
493
+ __le16 *path, int is_dir,
494
+ unsigned long p);
495
+ /* make unix special files (block, char, fifo, socket) */
496
+ int (*make_node)(unsigned int xid,
497
+ struct inode *inode,
498
+ struct dentry *dentry,
499
+ struct cifs_tcon *tcon,
500
+ char *full_path,
501
+ umode_t mode,
502
+ dev_t device_number);
503
+ /* version specific fiemap implementation */
504
+ int (*fiemap)(struct cifs_tcon *tcon, struct cifsFileInfo *,
505
+ struct fiemap_extent_info *, u64, u64);
506
+ /* version specific llseek implementation */
507
+ loff_t (*llseek)(struct file *, struct cifs_tcon *, loff_t, int);
508
+ /* Check for STATUS_IO_TIMEOUT */
509
+ bool (*is_status_io_timeout)(char *buf);
471510 };
472511
473512 struct smb_version_values {
....@@ -511,6 +550,7 @@
511550 umode_t dir_mode;
512551 enum securityEnum sectype; /* sectype requested via mnt opts */
513552 bool sign; /* was signing requested via mnt opts? */
553
+ bool ignore_signature:1;
514554 bool retry:1;
515555 bool intr:1;
516556 bool setuids:1;
....@@ -519,6 +559,8 @@
519559 bool override_gid:1;
520560 bool dynperm:1;
521561 bool noperm:1;
562
+ bool nodelete:1;
563
+ bool mode_ace:1;
522564 bool no_psx_acl:1; /* set if posix acl support should be disabled */
523565 bool cifs_acl:1;
524566 bool backupuid_specified; /* mount option backupuid is specified */
....@@ -527,6 +569,8 @@
527569 bool server_ino:1; /* use inode numbers from server ie UniqueId */
528570 bool direct_io:1;
529571 bool strict_io:1; /* strict cache behavior */
572
+ bool cache_ro:1;
573
+ bool cache_rw:1;
530574 bool remap:1; /* set to remap seven reserved chars in filenames */
531575 bool sfu_remap:1; /* remap seven reserved chars ala SFU */
532576 bool posix_paths:1; /* unset to not ask for posix pathnames. */
....@@ -555,8 +599,14 @@
555599 bool resilient:1; /* noresilient not required since not fored for CA */
556600 bool domainauto:1;
557601 bool rdma:1;
602
+ bool multichannel:1;
603
+ bool use_client_guid:1;
604
+ /* reuse existing guid for multichannel */
605
+ u8 client_guid[SMB2_CLIENT_GUID_SIZE];
606
+ unsigned int bsize;
558607 unsigned int rsize;
559608 unsigned int wsize;
609
+ unsigned int min_offload;
560610 bool sockopt_tcp_nodelay:1;
561611 unsigned long actimeo; /* attribute cache timeout (jiffies) */
562612 struct smb_version_operations *ops;
....@@ -567,9 +617,17 @@
567617 struct nls_table *local_nls;
568618 unsigned int echo_interval; /* echo interval in secs */
569619 __u64 snapshot_time; /* needed for timewarp tokens */
620
+ __u32 handle_timeout; /* persistent and durable handle timeout in ms */
570621 unsigned int max_credits; /* smb3 max_credits 10 < credits < 60000 */
622
+ unsigned int max_channels;
623
+ __u16 compression; /* compression algorithm 0xFFFF default 0=disabled */
624
+ bool rootfs:1; /* if it's a SMB root file system */
571625 };
572626
627
+/**
628
+ * CIFS superblock mount flags (mnt_cifs_flags) to consider when
629
+ * trying to reuse existing superblock for a new mount
630
+ */
573631 #define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID | \
574632 CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | \
575633 CIFS_MOUNT_NO_XATTR | CIFS_MOUNT_MAP_SPECIAL_CHR | \
....@@ -580,8 +638,15 @@
580638 CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC | \
581639 CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | \
582640 CIFS_MOUNT_MULTIUSER | CIFS_MOUNT_STRICT_IO | \
583
- CIFS_MOUNT_CIFS_BACKUPUID | CIFS_MOUNT_CIFS_BACKUPGID)
641
+ CIFS_MOUNT_CIFS_BACKUPUID | CIFS_MOUNT_CIFS_BACKUPGID | \
642
+ CIFS_MOUNT_UID_FROM_ACL | CIFS_MOUNT_NO_HANDLE_CACHE | \
643
+ CIFS_MOUNT_NO_DFS | CIFS_MOUNT_MODE_FROM_SID | \
644
+ CIFS_MOUNT_RO_CACHE | CIFS_MOUNT_RW_CACHE)
584645
646
+/**
647
+ * Generic VFS superblock mount flags (s_flags) to consider when
648
+ * trying to reuse existing superblock for a new mount
649
+ */
585650 #define CIFS_MS_MASK (SB_RDONLY | SB_MANDLOCK | SB_NOEXEC | SB_NOSUID | \
586651 SB_NODEV | SB_SYNCHRONOUS)
587652
....@@ -628,12 +693,14 @@
628693 unsigned int credits; /* send no more requests at once */
629694 unsigned int max_credits; /* can override large 32000 default at mnt */
630695 unsigned int in_flight; /* number of requests on the wire to server */
696
+ unsigned int max_in_flight; /* max number of requests that were on wire */
631697 spinlock_t req_lock; /* protect the two values above */
632698 struct mutex srv_mutex;
633699 struct task_struct *tsk;
634700 char server_GUID[16];
635701 __u16 sec_mode;
636702 bool sign; /* is signing enabled on this connection? */
703
+ bool ignore_signature:1; /* skip validation of signatures in SMB2/3 rsp */
637704 bool session_estab; /* mark when very first sess is established */
638705 int echo_credits; /* echo reserved slots */
639706 int oplock_credits; /* oplock break reserved slots */
....@@ -658,6 +725,7 @@
658725 /* 16th byte of RFC1001 workstation name is always null */
659726 char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
660727 __u32 sequence_number; /* for signing, protected by srv_mutex */
728
+ __u32 reconnect_instance; /* incremented on each reconnect */
661729 struct session_key session_key;
662730 unsigned long lstrp; /* when we got last response from this server */
663731 struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */
....@@ -681,16 +749,22 @@
681749 /* Total size of this PDU. Only valid from cifs_demultiplex_thread */
682750 unsigned int pdu_size;
683751 unsigned int total_read; /* total amount of data read in this pass */
752
+ atomic_t in_send; /* requests trying to send */
753
+ atomic_t num_waiters; /* blocked waiting to get in sendrecv */
684754 #ifdef CONFIG_CIFS_FSCACHE
685755 struct fscache_cookie *fscache; /* client index cache cookie */
686756 #endif
687757 #ifdef CONFIG_CIFS_STATS2
688
- atomic_t in_send; /* requests trying to send */
689
- atomic_t num_waiters; /* blocked waiting to get in sendrecv */
758
+ atomic_t num_cmds[NUMBER_OF_SMB2_COMMANDS]; /* total requests by cmd */
690759 atomic_t smb2slowcmd[NUMBER_OF_SMB2_COMMANDS]; /* count resps > 1 sec */
760
+ __u64 time_per_cmd[NUMBER_OF_SMB2_COMMANDS]; /* total time per cmd */
761
+ __u32 slowest_cmd[NUMBER_OF_SMB2_COMMANDS];
762
+ __u32 fastest_cmd[NUMBER_OF_SMB2_COMMANDS];
691763 #endif /* STATS2 */
692764 unsigned int max_read;
693765 unsigned int max_write;
766
+ unsigned int min_offload;
767
+ __le16 compress_algorithm;
694768 __le16 cipher_type;
695769 /* save initital negprot hash */
696770 __u8 preauth_sha_hash[SMB2_PREAUTH_HASH_SIZE];
....@@ -698,6 +772,20 @@
698772 struct delayed_work reconnect; /* reconnect workqueue job */
699773 struct mutex reconnect_mutex; /* prevent simultaneous reconnects */
700774 unsigned long echo_interval;
775
+
776
+ /*
777
+ * Number of targets available for reconnect. The more targets
778
+ * the more tasks have to wait to let the demultiplex thread
779
+ * reconnect.
780
+ */
781
+ int nr_targets;
782
+ bool noblockcnt; /* use non-blocking connect() */
783
+ bool is_channel; /* if a session channel */
784
+};
785
+
786
+struct cifs_credits {
787
+ unsigned int value;
788
+ unsigned int instance;
701789 };
702790
703791 static inline unsigned int
....@@ -711,28 +799,28 @@
711799 }
712800
713801 static inline bool
714
-has_credits(struct TCP_Server_Info *server, int *credits)
802
+has_credits(struct TCP_Server_Info *server, int *credits, int num_credits)
715803 {
716804 int num;
717805 spin_lock(&server->req_lock);
718806 num = *credits;
719807 spin_unlock(&server->req_lock);
720
- return num > 0;
808
+ return num >= num_credits;
721809 }
722810
723811 static inline void
724
-add_credits(struct TCP_Server_Info *server, const unsigned int add,
812
+add_credits(struct TCP_Server_Info *server, const struct cifs_credits *credits,
725813 const int optype)
726814 {
727
- server->ops->add_credits(server, add, optype);
815
+ server->ops->add_credits(server, credits, optype);
728816 }
729817
730818 static inline void
731
-add_credits_and_wake_if(struct TCP_Server_Info *server, const unsigned int add,
732
- const int optype)
819
+add_credits_and_wake_if(struct TCP_Server_Info *server,
820
+ const struct cifs_credits *credits, const int optype)
733821 {
734
- if (add) {
735
- server->ops->add_credits(server, add, optype);
822
+ if (credits->value) {
823
+ server->ops->add_credits(server, credits, optype);
736824 wake_up(&server->request_q);
737825 }
738826 }
....@@ -741,6 +829,14 @@
741829 set_credits(struct TCP_Server_Info *server, const int val)
742830 {
743831 server->ops->set_credits(server, val);
832
+}
833
+
834
+static inline int
835
+adjust_credits(struct TCP_Server_Info *server, struct cifs_credits *credits,
836
+ const unsigned int payload_size)
837
+{
838
+ return server->ops->adjust_credits ?
839
+ server->ops->adjust_credits(server, credits, payload_size) : 0;
744840 }
745841
746842 static inline __le64
....@@ -818,6 +914,7 @@
818914 * a single wsize request with a single call.
819915 */
820916 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
917
+#define SMB3_DEFAULT_IOSIZE (4 * 1024 * 1024)
821918
822919 /*
823920 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
....@@ -828,7 +925,7 @@
828925 *
829926 * Citation:
830927 *
831
- * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
928
+ * https://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
832929 */
833930 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
834931 #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
....@@ -870,6 +967,11 @@
870967 struct sockaddr_storage sockaddr;
871968 };
872969
970
+struct cifs_chan {
971
+ struct TCP_Server_Info *server;
972
+ __u8 signkey[SMB3_SIGN_KEY_SIZE];
973
+};
974
+
873975 /*
874976 * Session structure. One of these for each uid session with a particular host
875977 */
....@@ -880,7 +982,7 @@
880982 struct mutex session_mutex;
881983 struct TCP_Server_Info *server; /* pointer to server info */
882984 int ses_count; /* reference counter */
883
- enum statusEnum status;
985
+ enum statusEnum status; /* updates protected by GlobalMid_Lock */
884986 unsigned overrideSecFlg; /* if non-zero override global sec flags */
885987 char *serverOS; /* name of operating system underlying server */
886988 char *serverNOS; /* name of network operating system of server */
....@@ -900,11 +1002,14 @@
9001002 bool sign; /* is signing required? */
9011003 bool need_reconnect:1; /* connection reset, uid now invalid */
9021004 bool domainAuto:1;
1005
+ bool binding:1; /* are we binding the session? */
9031006 __u16 session_flags;
9041007 __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE];
905
- __u8 smb3encryptionkey[SMB3_SIGN_KEY_SIZE];
906
- __u8 smb3decryptionkey[SMB3_SIGN_KEY_SIZE];
1008
+ __u8 smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE];
1009
+ __u8 smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE];
9071010 __u8 preauth_sha_hash[SMB2_PREAUTH_HASH_SIZE];
1011
+
1012
+ __u8 binding_preauth_sha_hash[SMB2_PREAUTH_HASH_SIZE];
9081013
9091014 /*
9101015 * Network interfaces available on the server this session is
....@@ -919,7 +1024,45 @@
9191024 struct cifs_server_iface *iface_list;
9201025 size_t iface_count;
9211026 unsigned long iface_last_update; /* jiffies */
1027
+
1028
+#define CIFS_MAX_CHANNELS 16
1029
+ struct cifs_chan chans[CIFS_MAX_CHANNELS];
1030
+ struct cifs_chan *binding_chan;
1031
+ size_t chan_count;
1032
+ size_t chan_max;
1033
+ atomic_t chan_seq; /* round robin state */
9221034 };
1035
+
1036
+/*
1037
+ * When binding a new channel, we need to access the channel which isn't fully
1038
+ * established yet.
1039
+ */
1040
+
1041
+static inline
1042
+struct cifs_chan *cifs_ses_binding_channel(struct cifs_ses *ses)
1043
+{
1044
+ if (ses->binding)
1045
+ return ses->binding_chan;
1046
+ else
1047
+ return NULL;
1048
+}
1049
+
1050
+/*
1051
+ * Returns the server pointer of the session. When binding a new
1052
+ * channel this returns the last channel which isn't fully established
1053
+ * yet.
1054
+ *
1055
+ * This function should be use for negprot/sess.setup codepaths. For
1056
+ * the other requests see cifs_pick_channel().
1057
+ */
1058
+static inline
1059
+struct TCP_Server_Info *cifs_ses_server(struct cifs_ses *ses)
1060
+{
1061
+ if (ses->binding)
1062
+ return ses->binding_chan->server;
1063
+ else
1064
+ return ses->server;
1065
+}
9231066
9241067 static inline bool
9251068 cap_unix(struct cifs_ses *ses)
....@@ -929,11 +1072,14 @@
9291072
9301073 struct cached_fid {
9311074 bool is_valid:1; /* Do we have a useable root fid */
1075
+ bool file_all_info_is_valid:1;
1076
+ bool has_lease:1;
9321077 struct kref refcount;
9331078 struct cifs_fid *fid;
9341079 struct mutex fid_mutex;
9351080 struct cifs_tcon *tcon;
9361081 struct work_struct lease_break;
1082
+ struct smb2_file_all_info file_all_info;
9371083 };
9381084
9391085 /*
....@@ -944,6 +1090,8 @@
9441090 struct list_head tcon_list;
9451091 int tc_count;
9461092 struct list_head rlist; /* reconnect list */
1093
+ atomic_t num_local_opens; /* num of all opens including disconnected */
1094
+ atomic_t num_remote_opens; /* num of all network opens on server */
9471095 struct list_head openFileList;
9481096 spinlock_t open_file_lock; /* protects list above */
9491097 struct cifs_ses *ses; /* pointer to session associated with */
....@@ -995,6 +1143,7 @@
9951143 bool retry:1;
9961144 bool nocase:1;
9971145 bool nohandlecache:1; /* if strange server resource prob can turn off */
1146
+ bool nodelete:1;
9981147 bool seal:1; /* transport encryption for this mounted share */
9991148 bool unix_ext:1; /* if false disable Linux extensions to CIFS protocol
10001149 for this mount even if server would support */
....@@ -1013,6 +1162,7 @@
10131162 __u32 vol_serial_number;
10141163 __le64 vol_create_time;
10151164 __u64 snapshot_time; /* for timewarp tokens - timestamp of snapshot */
1165
+ __u32 handle_timeout; /* persistent and durable handle timeout in ms */
10161166 __u32 ss_flags; /* sector size flags */
10171167 __u32 perf_sector_size; /* best sector size for perf */
10181168 __u32 max_chunks;
....@@ -1025,6 +1175,11 @@
10251175 struct list_head pending_opens; /* list of incomplete opens */
10261176 struct cached_fid crfid; /* Cached root fid */
10271177 /* BB add field for back pointer to sb struct(s)? */
1178
+#ifdef CONFIG_CIFS_DFS_UPCALL
1179
+ char *dfs_path;
1180
+ int remap:2;
1181
+ struct list_head ulist; /* cache update list */
1182
+#endif
10281183 };
10291184
10301185 /*
....@@ -1093,7 +1248,8 @@
10931248 __u64 offset;
10941249 __u64 length;
10951250 __u32 pid;
1096
- __u32 type;
1251
+ __u16 type;
1252
+ __u16 flags;
10971253 };
10981254
10991255 /*
....@@ -1115,6 +1271,7 @@
11151271 bool smallBuf:1; /* so we know which buf_release function to call */
11161272 };
11171273
1274
+#define ACL_NO_MODE ((umode_t)(-1))
11181275 struct cifs_open_parms {
11191276 struct cifs_tcon *tcon;
11201277 struct cifs_sb_info *cifs_sb;
....@@ -1133,8 +1290,12 @@
11331290 __u64 volatile_fid; /* volatile file id for smb2 */
11341291 __u8 lease_key[SMB2_LEASE_KEY_SIZE]; /* lease key for smb2 */
11351292 __u8 create_guid[16];
1293
+ __u32 access;
11361294 struct cifs_pending_open *pending_open;
11371295 unsigned int epoch;
1296
+#ifdef CONFIG_CIFS_DEBUG2
1297
+ __u64 mid;
1298
+#endif /* CIFS_DEBUG2 */
11381299 bool purge_cache;
11391300 };
11401301
....@@ -1160,6 +1321,7 @@
11601321 struct tcon_link *tlink;
11611322 unsigned int f_flags;
11621323 bool invalidHandle:1; /* file closed via session abend */
1324
+ bool swapfile:1;
11631325 bool oplock_break_cancelled:1;
11641326 unsigned int oplock_epoch; /* epoch from the lease break */
11651327 __u32 oplock_level; /* oplock/lease level from the lease break */
....@@ -1168,6 +1330,7 @@
11681330 struct mutex fh_mutex; /* prevents reopen race after dead ses*/
11691331 struct cifs_search_info srch_inf;
11701332 struct work_struct oplock_break; /* work for oplock breaks */
1333
+ struct work_struct put; /* work for the final part of _put */
11711334 };
11721335
11731336 struct cifs_io_parms {
....@@ -1178,6 +1341,7 @@
11781341 __u64 offset;
11791342 unsigned int length;
11801343 struct cifs_tcon *tcon;
1344
+ struct TCP_Server_Info *server;
11811345 };
11821346
11831347 struct cifs_aio_ctx {
....@@ -1195,6 +1359,11 @@
11951359 unsigned int len;
11961360 unsigned int total_len;
11971361 bool should_dirty;
1362
+ /*
1363
+ * Indicates if this aio_ctx is for direct_io,
1364
+ * If yes, iter is a copy of the user passed iov_iter
1365
+ */
1366
+ bool direct_io;
11981367 };
11991368
12001369 struct cifs_readdata;
....@@ -1220,13 +1389,14 @@
12201389 struct cifs_readdata *rdata,
12211390 struct iov_iter *iter);
12221391 struct kvec iov[2];
1392
+ struct TCP_Server_Info *server;
12231393 #ifdef CONFIG_CIFS_SMB_DIRECT
12241394 struct smbd_mr *mr;
12251395 #endif
12261396 unsigned int pagesz;
12271397 unsigned int page_offset;
12281398 unsigned int tailsz;
1229
- unsigned int credits;
1399
+ struct cifs_credits credits;
12301400 unsigned int nr_pages;
12311401 struct page **pages;
12321402 };
....@@ -1246,13 +1416,14 @@
12461416 pid_t pid;
12471417 unsigned int bytes;
12481418 int result;
1419
+ struct TCP_Server_Info *server;
12491420 #ifdef CONFIG_CIFS_SMB_DIRECT
12501421 struct smbd_mr *mr;
12511422 #endif
12521423 unsigned int pagesz;
12531424 unsigned int page_offset;
12541425 unsigned int tailsz;
1255
- unsigned int credits;
1426
+ struct cifs_credits credits;
12561427 unsigned int nr_pages;
12571428 struct page **pages;
12581429 };
....@@ -1268,7 +1439,8 @@
12681439 }
12691440
12701441 struct cifsFileInfo *cifsFileInfo_get(struct cifsFileInfo *cifs_file);
1271
-void _cifsFileInfo_put(struct cifsFileInfo *cifs_file, bool wait_oplock_hdlr);
1442
+void _cifsFileInfo_put(struct cifsFileInfo *cifs_file, bool wait_oplock_hdlr,
1443
+ bool offload);
12721444 void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
12731445
12741446 #define CIFS_CACHE_READ_FLG 1
....@@ -1278,9 +1450,9 @@
12781450 #define CIFS_CACHE_RW_FLG (CIFS_CACHE_READ_FLG | CIFS_CACHE_WRITE_FLG)
12791451 #define CIFS_CACHE_RHW_FLG (CIFS_CACHE_RW_FLG | CIFS_CACHE_HANDLE_FLG)
12801452
1281
-#define CIFS_CACHE_READ(cinode) (cinode->oplock & CIFS_CACHE_READ_FLG)
1453
+#define CIFS_CACHE_READ(cinode) ((cinode->oplock & CIFS_CACHE_READ_FLG) || (CIFS_SB(cinode->vfs_inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE))
12821454 #define CIFS_CACHE_HANDLE(cinode) (cinode->oplock & CIFS_CACHE_HANDLE_FLG)
1283
-#define CIFS_CACHE_WRITE(cinode) (cinode->oplock & CIFS_CACHE_WRITE_FLG)
1455
+#define CIFS_CACHE_WRITE(cinode) ((cinode->oplock & CIFS_CACHE_WRITE_FLG) || (CIFS_SB(cinode->vfs_inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE))
12841456
12851457 /*
12861458 * One of these for each file inode
....@@ -1291,7 +1463,7 @@
12911463 struct list_head llist; /* locks helb by this inode */
12921464 /*
12931465 * NOTE: Some code paths call down_read(lock_sem) twice, so
1294
- * we must always use use cifs_down_write() instead of down_write()
1466
+ * we must always use cifs_down_write() instead of down_write()
12951467 * for this semaphore to avoid deadlocks.
12961468 */
12971469 struct rw_semaphore lock_sem; /* protect the fields above */
....@@ -1422,6 +1594,7 @@
14221594 struct TCP_Server_Info *server; /* server corresponding to this mid */
14231595 __u64 mid; /* multiplex id */
14241596 __u16 credits; /* number of credits consumed by this mid */
1597
+ __u16 credits_received; /* number of credits from the response */
14251598 __u32 pid; /* process id */
14261599 __u32 sequence_number; /* for CIFS signing */
14271600 unsigned long when_alloc; /* when mid was created */
....@@ -1433,11 +1606,13 @@
14331606 mid_callback_t *callback; /* call completion callback */
14341607 mid_handle_t *handle; /* call handle mid callback */
14351608 void *callback_data; /* general purpose pointer for callback */
1609
+ struct task_struct *creator;
14361610 void *resp_buf; /* pointer to received SMB header */
14371611 unsigned int resp_buf_size;
14381612 int mid_state; /* wish this were enum but can not pass to wait_event */
14391613 unsigned int mid_flags;
14401614 __le16 command; /* smb command code */
1615
+ unsigned int optype; /* operation type */
14411616 bool large_buf:1; /* if valid response, is pointer to large buf */
14421617 bool multiRsp:1; /* multiple trans2 responses for one request */
14431618 bool multiEnd:1; /* both received */
....@@ -1448,12 +1623,12 @@
14481623 struct cifs_fid fid;
14491624 struct cifs_tcon *tcon;
14501625 struct work_struct work;
1626
+ __u64 mid;
1627
+ __u16 cmd;
14511628 };
14521629
14531630 /* Make code in transport.c a little cleaner by moving
14541631 update of optional stats into function below */
1455
-#ifdef CONFIG_CIFS_STATS2
1456
-
14571632 static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
14581633 {
14591634 atomic_inc(&server->in_send);
....@@ -1474,26 +1649,12 @@
14741649 atomic_dec(&server->num_waiters);
14751650 }
14761651
1652
+#ifdef CONFIG_CIFS_STATS2
14771653 static inline void cifs_save_when_sent(struct mid_q_entry *mid)
14781654 {
14791655 mid->when_sent = jiffies;
14801656 }
14811657 #else
1482
-static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
1483
-{
1484
-}
1485
-static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
1486
-{
1487
-}
1488
-
1489
-static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
1490
-{
1491
-}
1492
-
1493
-static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
1494
-{
1495
-}
1496
-
14971658 static inline void cifs_save_when_sent(struct mid_q_entry *mid)
14981659 {
14991660 }
....@@ -1520,6 +1681,7 @@
15201681 int ref_flag;
15211682 char *path_name;
15221683 char *node_name;
1684
+ int ttl;
15231685 };
15241686
15251687 /*
....@@ -1550,6 +1712,7 @@
15501712 struct timespec64 cf_atime;
15511713 struct timespec64 cf_mtime;
15521714 struct timespec64 cf_ctime;
1715
+ u32 cf_cifstag;
15531716 };
15541717
15551718 static inline void free_dfs_info_param(struct dfs_info3_param *param)
....@@ -1557,7 +1720,6 @@
15571720 if (param) {
15581721 kfree(param->path_name);
15591722 kfree(param->node_name);
1560
- kfree(param);
15611723 }
15621724 }
15631725
....@@ -1593,6 +1755,12 @@
15931755 return false;
15941756 }
15951757
1758
+
1759
+/* cifs_get_writable_file() flags */
1760
+#define FIND_WR_ANY 0
1761
+#define FIND_WR_FSUID_ONLY 1
1762
+#define FIND_WR_WITH_DELETE 2
1763
+
15961764 #define MID_FREE 0
15971765 #define MID_REQUEST_ALLOCATED 1
15981766 #define MID_REQUEST_SUBMITTED 2
....@@ -1613,20 +1781,22 @@
16131781
16141782 /* Type of Request to SendReceive2 */
16151783 #define CIFS_BLOCKING_OP 1 /* operation can block */
1616
-#define CIFS_ASYNC_OP 2 /* do not wait for response */
1784
+#define CIFS_NON_BLOCKING 2 /* do not block waiting for credits */
16171785 #define CIFS_TIMEOUT_MASK 0x003 /* only one of above set in req */
16181786 #define CIFS_LOG_ERROR 0x010 /* log NT STATUS if non-zero */
16191787 #define CIFS_LARGE_BUF_OP 0x020 /* large request buffer */
1620
-#define CIFS_NO_RESP 0x040 /* no response buffer required */
1788
+#define CIFS_NO_RSP_BUF 0x040 /* no response buffer required */
16211789
16221790 /* Type of request operation */
1623
-#define CIFS_ECHO_OP 0x080 /* echo request */
1624
-#define CIFS_OBREAK_OP 0x0100 /* oplock break request */
1625
-#define CIFS_NEG_OP 0x0200 /* negotiate request */
1626
-#define CIFS_OP_MASK 0x0380 /* mask request type */
1791
+#define CIFS_ECHO_OP 0x080 /* echo request */
1792
+#define CIFS_OBREAK_OP 0x0100 /* oplock break request */
1793
+#define CIFS_NEG_OP 0x0200 /* negotiate request */
1794
+#define CIFS_CP_CREATE_CLOSE_OP 0x0400 /* compound create+close request */
1795
+#define CIFS_OP_MASK 0x0780 /* mask request type */
16271796
16281797 #define CIFS_HAS_CREDITS 0x0400 /* already has credits */
16291798 #define CIFS_TRANSFORM_REQ 0x0800 /* transform request before sending */
1799
+#define CIFS_NO_SRV_RSP 0x1000 /* there is no server response */
16301800
16311801 /* Security Flags: indicate type of session setup needed */
16321802 #define CIFSSEC_MAY_SIGN 0x00001
....@@ -1695,6 +1865,8 @@
16951865 * GlobalMid_Lock protects:
16961866 * list operations on pending_mid_q and oplockQ
16971867 * updates to XID counters, multiplex id and SMB sequence numbers
1868
+ * list operations on global DnotifyReqList
1869
+ * updates to ses->status
16981870 * tcp_ses_lock protects:
16991871 * list operations on tcp and SMB session lists
17001872 * tcon->open_file_lock protects the list of open files hanging off the tcon
....@@ -1732,7 +1904,8 @@
17321904 /*
17331905 * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
17341906 * tcp session, and the list of tcon's per smb session. It also protects
1735
- * the reference counters for the server, smb session, and tcon. Finally,
1907
+ * the reference counters for the server, smb session, and tcon. It also
1908
+ * protects some fields in the TCP_Server_Info struct such as dstaddr. Finally,
17361909 * changes to the tcon->tidStatus should be done while holding this lock.
17371910 * generally the locks should be taken in order tcp_ses_lock before
17381911 * tcon->open_file_lock and that before file->file_info_lock since the
....@@ -1769,6 +1942,7 @@
17691942 #ifdef CONFIG_CIFS_STATS2
17701943 GLOBAL_EXTERN atomic_t totBufAllocCount; /* total allocated over all time */
17711944 GLOBAL_EXTERN atomic_t totSmBufAllocCount;
1945
+extern unsigned int slow_rsp_threshold; /* number of secs before logging */
17721946 #endif
17731947 GLOBAL_EXTERN atomic_t smBufAllocCount;
17741948 GLOBAL_EXTERN atomic_t midCount;
....@@ -1779,6 +1953,8 @@
17791953 extern unsigned int global_secflags; /* if on, session setup sent
17801954 with more secure ntlmssp2 challenge/resp */
17811955 extern unsigned int sign_CIFS_PDUs; /* enable smb packet signing */
1956
+extern bool enable_gcm_256; /* allow optional negotiate of strongest signing (aes-gcm-256) */
1957
+extern bool require_gcm_256; /* require use of strongest signing (aes-gcm-256) */
17821958 extern bool linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/
17831959 extern unsigned int CIFSMaxBufSize; /* max size not including hdr */
17841960 extern unsigned int cifs_min_rcv; /* min size of big ntwrk buf pool */
....@@ -1786,7 +1962,6 @@
17861962 extern unsigned int cifs_max_pending; /* MAX requests at once to server*/
17871963 extern bool disable_legacy_dialects; /* forbid vers=1.0 and vers=2.0 mounts */
17881964
1789
-#ifdef CONFIG_CIFS_ACL
17901965 GLOBAL_EXTERN struct rb_root uidtree;
17911966 GLOBAL_EXTERN struct rb_root gidtree;
17921967 GLOBAL_EXTERN spinlock_t siduidlock;
....@@ -1795,13 +1970,14 @@
17951970 GLOBAL_EXTERN struct rb_root sidgidtree;
17961971 GLOBAL_EXTERN spinlock_t uidsidlock;
17971972 GLOBAL_EXTERN spinlock_t gidsidlock;
1798
-#endif /* CONFIG_CIFS_ACL */
17991973
18001974 void cifs_oplock_break(struct work_struct *work);
18011975 void cifs_queue_oplock_break(struct cifsFileInfo *cfile);
18021976
18031977 extern const struct slow_work_ops cifs_oplock_break_ops;
18041978 extern struct workqueue_struct *cifsiod_wq;
1979
+extern struct workqueue_struct *decrypt_wq;
1980
+extern struct workqueue_struct *fileinfo_put_wq;
18051981 extern struct workqueue_struct *cifsoplockd_wq;
18061982 extern __u32 cifs_lock_secret;
18071983
....@@ -1809,11 +1985,13 @@
18091985
18101986 /* Operations for different SMB versions */
18111987 #define SMB1_VERSION_STRING "1.0"
1988
+#define SMB20_VERSION_STRING "2.0"
1989
+#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
18121990 extern struct smb_version_operations smb1_operations;
18131991 extern struct smb_version_values smb1_values;
1814
-#define SMB20_VERSION_STRING "2.0"
18151992 extern struct smb_version_operations smb20_operations;
18161993 extern struct smb_version_values smb20_values;
1994
+#endif /* CIFS_ALLOW_INSECURE_LEGACY */
18171995 #define SMB21_VERSION_STRING "2.1"
18181996 extern struct smb_version_operations smb21_operations;
18191997 extern struct smb_version_values smb21_values;
....@@ -1825,10 +2003,116 @@
18252003 extern struct smb_version_operations smb30_operations;
18262004 extern struct smb_version_values smb30_values;
18272005 #define SMB302_VERSION_STRING "3.02"
2006
+#define ALT_SMB302_VERSION_STRING "3.0.2"
18282007 /*extern struct smb_version_operations smb302_operations;*/ /* not needed yet */
18292008 extern struct smb_version_values smb302_values;
18302009 #define SMB311_VERSION_STRING "3.1.1"
18312010 #define ALT_SMB311_VERSION_STRING "3.11"
18322011 extern struct smb_version_operations smb311_operations;
18332012 extern struct smb_version_values smb311_values;
2013
+
2014
+static inline char *get_security_type_str(enum securityEnum sectype)
2015
+{
2016
+ switch (sectype) {
2017
+ case RawNTLMSSP:
2018
+ return "RawNTLMSSP";
2019
+ case Kerberos:
2020
+ return "Kerberos";
2021
+ case NTLMv2:
2022
+ return "NTLMv2";
2023
+ case NTLM:
2024
+ return "NTLM";
2025
+ case LANMAN:
2026
+ return "LANMAN";
2027
+ default:
2028
+ return "Unknown";
2029
+ }
2030
+}
2031
+
2032
+static inline bool is_smb1_server(struct TCP_Server_Info *server)
2033
+{
2034
+ return strcmp(server->vals->version_string, SMB1_VERSION_STRING) == 0;
2035
+}
2036
+
2037
+static inline bool is_tcon_dfs(struct cifs_tcon *tcon)
2038
+{
2039
+ /*
2040
+ * For SMB1, see MS-CIFS 2.4.55 SMB_COM_TREE_CONNECT_ANDX (0x75) and MS-CIFS 3.3.4.4 DFS
2041
+ * Subsystem Notifies That a Share Is a DFS Share.
2042
+ *
2043
+ * For SMB2+, see MS-SMB2 2.2.10 SMB2 TREE_CONNECT Response and MS-SMB2 3.3.4.14 Server
2044
+ * Application Updates a Share.
2045
+ */
2046
+ if (!tcon || !tcon->ses || !tcon->ses->server)
2047
+ return false;
2048
+ return is_smb1_server(tcon->ses->server) ? tcon->Flags & SMB_SHARE_IS_IN_DFS :
2049
+ tcon->share_flags & (SHI1005_FLAGS_DFS | SHI1005_FLAGS_DFS_ROOT);
2050
+}
2051
+
2052
+static inline unsigned int cifs_get_num_sgs(const struct smb_rqst *rqst,
2053
+ int num_rqst,
2054
+ const u8 *sig)
2055
+{
2056
+ unsigned int len, skip;
2057
+ unsigned int nents = 0;
2058
+ unsigned long addr;
2059
+ int i, j;
2060
+
2061
+ /* Assumes the first rqst has a transform header as the first iov.
2062
+ * I.e.
2063
+ * rqst[0].rq_iov[0] is transform header
2064
+ * rqst[0].rq_iov[1+] data to be encrypted/decrypted
2065
+ * rqst[1+].rq_iov[0+] data to be encrypted/decrypted
2066
+ */
2067
+ for (i = 0; i < num_rqst; i++) {
2068
+ /*
2069
+ * The first rqst has a transform header where the
2070
+ * first 20 bytes are not part of the encrypted blob.
2071
+ */
2072
+ for (j = 0; j < rqst[i].rq_nvec; j++) {
2073
+ struct kvec *iov = &rqst[i].rq_iov[j];
2074
+
2075
+ skip = (i == 0) && (j == 0) ? 20 : 0;
2076
+ addr = (unsigned long)iov->iov_base + skip;
2077
+ if (unlikely(is_vmalloc_addr((void *)addr))) {
2078
+ len = iov->iov_len - skip;
2079
+ nents += DIV_ROUND_UP(offset_in_page(addr) + len,
2080
+ PAGE_SIZE);
2081
+ } else {
2082
+ nents++;
2083
+ }
2084
+ }
2085
+ nents += rqst[i].rq_npages;
2086
+ }
2087
+ nents += DIV_ROUND_UP(offset_in_page(sig) + SMB2_SIGNATURE_SIZE, PAGE_SIZE);
2088
+ return nents;
2089
+}
2090
+
2091
+/* We can not use the normal sg_set_buf() as we will sometimes pass a
2092
+ * stack object as buf.
2093
+ */
2094
+static inline struct scatterlist *cifs_sg_set_buf(struct scatterlist *sg,
2095
+ const void *buf,
2096
+ unsigned int buflen)
2097
+{
2098
+ unsigned long addr = (unsigned long)buf;
2099
+ unsigned int off = offset_in_page(addr);
2100
+
2101
+ addr &= PAGE_MASK;
2102
+ if (unlikely(is_vmalloc_addr((void *)addr))) {
2103
+ do {
2104
+ unsigned int len = min_t(unsigned int, buflen, PAGE_SIZE - off);
2105
+
2106
+ sg_set_page(sg++, vmalloc_to_page((void *)addr), len, off);
2107
+
2108
+ off = 0;
2109
+ addr += PAGE_SIZE;
2110
+ buflen -= len;
2111
+ } while (buflen);
2112
+ } else {
2113
+ sg_set_page(sg++, virt_to_page(addr), buflen, off);
2114
+ }
2115
+ return sg;
2116
+}
2117
+
18342118 #endif /* _CIFS_GLOB_H */