CIFS: Map SMB2 status codes to POSIX errors
[deliverable/linux.git] / fs / cifs / cifsglob.h
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/cifsglob.h
3 *
366781c1 4 * Copyright (C) International Business Machines Corp., 2002,2008
1da177e4 5 * Author(s): Steve French (sfrench@us.ibm.com)
7ee1af76 6 * Jeremy Allison (jra@samba.org)
1da177e4
LT
7 *
8 * This library is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser General Public License as published
10 * by the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
16 * the GNU Lesser General Public License for more details.
d38d8c74 17 *
1da177e4 18 */
abd2e44d
SJ
19#ifndef _CIFS_GLOB_H
20#define _CIFS_GLOB_H
21
1da177e4
LT
22#include <linux/in.h>
23#include <linux/in6.h>
5a0e3ad6 24#include <linux/slab.h>
9b646972 25#include <linux/workqueue.h>
1da177e4 26#include "cifs_fs_sb.h"
442aa310 27#include "cifsacl.h"
d2b91521
SP
28#include <crypto/internal/hash.h>
29#include <linux/scatterlist.h>
30
1da177e4
LT
31/*
32 * The sizes of various internal tables and strings
33 */
34#define MAX_UID_INFO 16
35#define MAX_SES_INFO 2
36#define MAX_TCON_INFO 4
37
ef571cad 38#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
1da177e4 39#define MAX_SERVER_SIZE 15
2e325d59 40#define MAX_SHARE_SIZE 80
8727c8a8
SF
41#define MAX_USERNAME_SIZE 256 /* reasonable maximum for current servers */
42#define MAX_PASSWORD_SIZE 512 /* max for windows seems to be 256 wide chars */
1da177e4
LT
43
44#define CIFS_MIN_RCV_POOL 4
45
2c0c2a08 46#define MAX_REOPEN_ATT 5 /* these many maximum attempts to reopen a file */
6d20e840
SJ
47/*
48 * default attribute cache timeout (jiffies)
49 */
50#define CIFS_DEF_ACTIMEO (1 * HZ)
51
52/*
53 * max attribute cache timeout (jiffies) - 2^30
54 */
55#define CIFS_MAX_ACTIMEO (1 << 30)
56
1da177e4
LT
57/*
58 * MAX_REQ is the maximum number of requests that WE will send
10b9b98e 59 * on one socket concurrently.
1da177e4 60 */
10b9b98e 61#define CIFS_MAX_REQ 32767
1da177e4 62
8ecaf67a
JL
63#define RFC1001_NAME_LEN 15
64#define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)
65
66/* currently length of NIP6_FMT */
67#define SERVER_NAME_LENGTH 40
1da177e4
LT
68#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
69
70/* used to define string lengths for reversing unicode strings */
71/* (256+1)*2 = 514 */
72/* (max path length + 1 for null) * 2 for unicode */
73#define MAX_NAME 514
74
75#include "cifspdu.h"
76
1da177e4
LT
77#ifndef XATTR_DOS_ATTRIB
78#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
79#endif
80
1da177e4
LT
81/*
82 * CIFS vfs client Status information (based on what we know.)
83 */
84
6c0f6218 85/* associated with each tcp and smb session */
1da177e4
LT
86enum statusEnum {
87 CifsNew = 0,
88 CifsGood,
89 CifsExiting,
fd88ce93
SF
90 CifsNeedReconnect,
91 CifsNeedNegotiate
1da177e4
LT
92};
93
94enum securityEnum {
daf5b0b6 95 LANMAN = 0, /* Legacy LANMAN auth */
3979877e 96 NTLM, /* Legacy NTLM012 auth with NTLM hash */
1da177e4 97 NTLMv2, /* Legacy NTLM auth with NTLMv2 hash */
ac683924 98 RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */
f46c7234 99/* NTLMSSP, */ /* can use rawNTLMSSP instead of NTLMSSP via SPNEGO */
c16fefa5 100 Kerberos, /* Kerberos via SPNEGO */
1da177e4
LT
101};
102
103enum protocolEnum {
3ec332ef 104 TCP = 0,
1da177e4
LT
105 SCTP
106 /* Netbios frames protocol not supported at this time */
107};
108
5f98ca9a 109struct session_key {
b609f06a 110 unsigned int len;
21e73393 111 char *response;
b609f06a
SF
112};
113
d2b91521
SP
114/* crypto security descriptor definition */
115struct sdesc {
116 struct shash_desc shash;
117 char ctx[];
118};
119
f7c5445a 120/* crypto hashing related structure/fields, not specific to a sec mech */
d2b91521
SP
121struct cifs_secmech {
122 struct crypto_shash *hmacmd5; /* hmac-md5 hash function */
123 struct crypto_shash *md5; /* md5 hash function */
124 struct sdesc *sdeschmacmd5; /* ctxt to generate ntlmv2 hash, CR1 */
125 struct sdesc *sdescmd5; /* ctxt to generate cifs/smb signature */
126};
127
d3686d54 128/* per smb session structure/fields */
d2b91521
SP
129struct ntlmssp_auth {
130 __u32 client_flags; /* sent by client in type 1 ntlmsssp exchange */
131 __u32 server_flags; /* sent by server in type 2 ntlmssp exchange */
132 unsigned char ciphertext[CIFS_CPHTXT_SIZE]; /* sent to server */
d3686d54 133 char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlmssp */
d2b91521
SP
134};
135
442aa310
SF
136struct cifs_cred {
137 int uid;
138 int gid;
139 int mode;
140 int cecount;
141 struct cifs_sid osid;
142 struct cifs_sid gsid;
143 struct cifs_ntace *ntaces;
144 struct cifs_ace *aces;
145};
146
1da177e4
LT
147/*
148 *****************************************************************
149 * Except the CIFS PDUs themselves all the
150 * globally interesting structs should go here
151 *****************************************************************
152 */
153
23db65f5
JL
154enum smb_version {
155 Smb_1 = 1,
1080ef75 156 Smb_21,
23db65f5
JL
157};
158
121b046a
JL
159struct mid_q_entry;
160struct TCP_Server_Info;
55157dfb 161struct cifsFileInfo;
082d0642 162struct cifs_ses;
2e6e02ab 163struct cifs_tcon;
121b046a 164
23db65f5 165struct smb_version_operations {
121b046a
JL
166 int (*send_cancel)(struct TCP_Server_Info *, void *,
167 struct mid_q_entry *);
55157dfb 168 bool (*compare_fids)(struct cifsFileInfo *, struct cifsFileInfo *);
082d0642
PS
169 /* setup request: allocate mid, sign message */
170 int (*setup_request)(struct cifs_ses *, struct kvec *, unsigned int,
171 struct mid_q_entry **);
172 /* check response: verify signature, map error */
173 int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *,
174 bool);
a891f0f8
PS
175 void (*add_credits)(struct TCP_Server_Info *, const unsigned int,
176 const int);
45275789 177 void (*set_credits)(struct TCP_Server_Info *, const int);
a891f0f8
PS
178 int * (*get_credits_field)(struct TCP_Server_Info *, const int);
179 unsigned int (*get_credits)(struct mid_q_entry *);
88257360 180 __u64 (*get_next_mid)(struct TCP_Server_Info *);
eb378711
PS
181 /* data offset from read response message */
182 unsigned int (*read_data_offset)(char *);
183 /* data length from read response message */
184 unsigned int (*read_data_length)(char *);
185 /* map smb to linux error */
186 int (*map_error)(char *, bool);
8aa26f3e
PS
187 /* find mid corresponding to the response message */
188 struct mid_q_entry * (*find_mid)(struct TCP_Server_Info *, char *);
189 void (*dump_detail)(void *);
190 /* verify the message */
191 int (*check_message)(char *, unsigned int);
192 bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
316cf94a
PS
193 /* process transaction2 response */
194 bool (*check_trans2)(struct mid_q_entry *, struct TCP_Server_Info *,
195 char *, int);
286170aa
PS
196 /* check if we need to negotiate */
197 bool (*need_neg)(struct TCP_Server_Info *);
198 /* negotiate to the server */
199 int (*negotiate)(const unsigned int, struct cifs_ses *);
58c45c58
PS
200 /* setup smb sessionn */
201 int (*sess_setup)(const unsigned int, struct cifs_ses *,
202 const struct nls_table *);
203 /* close smb session */
204 int (*logoff)(const unsigned int, struct cifs_ses *);
2e6e02ab
PS
205 /* connect to a server share */
206 int (*tree_connect)(const unsigned int, struct cifs_ses *, const char *,
207 struct cifs_tcon *, const struct nls_table *);
208 /* close tree connecion */
209 int (*tree_disconnect)(const unsigned int, struct cifs_tcon *);
23db65f5
JL
210};
211
212struct smb_version_values {
213 char *version_string;
106dc538
PS
214 __u32 large_lock_type;
215 __u32 exclusive_lock_type;
216 __u32 shared_lock_type;
217 __u32 unlock_lock_type;
1887f601
PS
218 size_t header_size;
219 size_t max_header_size;
eb378711 220 size_t read_rsp_size;
23db65f5
JL
221};
222
1887f601
PS
223#define HEADER_SIZE(server) (server->vals->header_size)
224#define MAX_HEADER_SIZE(server) (server->vals->max_header_size)
225
f87d39d9
SF
226struct smb_vol {
227 char *username;
228 char *password;
229 char *domainname;
230 char *UNC;
231 char *UNCip;
232 char *iocharset; /* local code page for mapping to and from Unicode */
233 char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */
234 char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */
235 uid_t cred_uid;
236 uid_t linux_uid;
237 gid_t linux_gid;
3d3ea8e6
SP
238 uid_t backupuid;
239 gid_t backupgid;
5206efd6
AV
240 umode_t file_mode;
241 umode_t dir_mode;
f87d39d9
SF
242 unsigned secFlg;
243 bool retry:1;
244 bool intr:1;
245 bool setuids:1;
246 bool override_uid:1;
247 bool override_gid:1;
248 bool dynperm:1;
249 bool noperm:1;
250 bool no_psx_acl:1; /* set if posix acl support should be disabled */
251 bool cifs_acl:1;
3d3ea8e6
SP
252 bool backupuid_specified; /* mount option backupuid is specified */
253 bool backupgid_specified; /* mount option backupgid is specified */
f87d39d9
SF
254 bool no_xattr:1; /* set if xattr (EA) support should be disabled*/
255 bool server_ino:1; /* use inode numbers from server ie UniqueId */
256 bool direct_io:1;
257 bool strict_io:1; /* strict cache behavior */
258 bool remap:1; /* set to remap seven reserved chars in filenames */
259 bool posix_paths:1; /* unset to not ask for posix pathnames. */
260 bool no_linux_ext:1;
261 bool sfu_emul:1;
262 bool nullauth:1; /* attempt to authenticate with null user */
263 bool nocase:1; /* request case insensitive filenames */
264 bool nobrl:1; /* disable sending byte range locks to srv */
265 bool mand_lock:1; /* send mandatory not posix byte range lock reqs */
266 bool seal:1; /* request transport encryption on share */
267 bool nodfs:1; /* Do not request DFS, even if available */
268 bool local_lease:1; /* check leases only on local system, not remote */
269 bool noblocksnd:1;
270 bool noautotune:1;
271 bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
272 bool fsc:1; /* enable fscache */
273 bool mfsymlinks:1; /* use Minshall+French Symlinks */
274 bool multiuser:1;
d4ffff1f 275 bool rwpidforward:1; /* pid forward for read/write operations */
f87d39d9
SF
276 unsigned int rsize;
277 unsigned int wsize;
278 bool sockopt_tcp_nodelay:1;
279 unsigned short int port;
280 unsigned long actimeo; /* attribute cache timeout (jiffies) */
23db65f5
JL
281 struct smb_version_operations *ops;
282 struct smb_version_values *vals;
f87d39d9
SF
283 char *prepath;
284 struct sockaddr_storage srcaddr; /* allow binding to a local IP */
285 struct nls_table *local_nls;
286};
287
25c7f41e
PS
288#define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID | \
289 CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | \
290 CIFS_MOUNT_NO_XATTR | CIFS_MOUNT_MAP_SPECIAL_CHR | \
291 CIFS_MOUNT_UNX_EMUL | CIFS_MOUNT_NO_BRL | \
292 CIFS_MOUNT_CIFS_ACL | CIFS_MOUNT_OVERR_UID | \
293 CIFS_MOUNT_OVERR_GID | CIFS_MOUNT_DYNPERM | \
294 CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC | \
295 CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | \
3d3ea8e6
SP
296 CIFS_MOUNT_MULTIUSER | CIFS_MOUNT_STRICT_IO | \
297 CIFS_MOUNT_CIFS_BACKUPUID | CIFS_MOUNT_CIFS_BACKUPGID)
25c7f41e
PS
298
299#define CIFS_MS_MASK (MS_RDONLY | MS_MANDLOCK | MS_NOEXEC | MS_NOSUID | \
300 MS_NODEV | MS_SYNCHRONOUS)
301
302struct cifs_mnt_data {
303 struct cifs_sb_info *cifs_sb;
304 struct smb_vol *vol;
305 int flags;
306};
307
792af7b0
PS
308static inline unsigned int
309get_rfc1002_length(void *buf)
310{
311 return be32_to_cpu(*((__be32 *)buf));
312}
313
1da177e4 314struct TCP_Server_Info {
3b795210
SF
315 struct list_head tcp_ses_list;
316 struct list_head smb_ses_list;
e7ddee90 317 int srv_count; /* reference counter */
a10faeb2 318 /* 15 character server name + 0x20 16th byte indicating type = srv */
8ecaf67a 319 char server_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
23db65f5
JL
320 struct smb_version_operations *ops;
321 struct smb_version_values *vals;
c3dccf48 322 enum statusEnum tcpStatus; /* what we think the status is */
c359cf3c 323 char *hostname; /* hostname portion of UNC string */
1da177e4 324 struct socket *ssocket;
a9f1b85e 325 struct sockaddr_storage dstaddr;
3eb9a889 326 struct sockaddr_storage srcaddr; /* locally bind to this IP */
f1d0c998
RL
327#ifdef CONFIG_NET_NS
328 struct net *net;
329#endif
d38d8c74 330 wait_queue_head_t response_q;
1da177e4
LT
331 wait_queue_head_t request_q; /* if more than maxmpx to srvr must block*/
332 struct list_head pending_mid_q;
edf1ae40
SF
333 bool noblocksnd; /* use blocking sendmsg */
334 bool noautotune; /* do not autotune send buf sizes */
6a5fa236 335 bool tcp_nodelay;
2d86dbc9 336 int credits; /* send no more requests at once */
fc40f9cf 337 unsigned int in_flight; /* number of requests on the wire to server */
2d86dbc9 338 spinlock_t req_lock; /* protect the two values above */
72ca545b 339 struct mutex srv_mutex;
1da177e4
LT
340 struct task_struct *tsk;
341 char server_GUID[16];
286170aa 342 __u16 sec_mode;
c3dccf48
JL
343 bool session_estab; /* mark when very first sess is established */
344 u16 dialect; /* dialect index that server chose */
1da177e4 345 enum securityEnum secType;
10b9b98e 346 bool oplocks:1; /* enable oplocks */
1da177e4
LT
347 unsigned int maxReq; /* Clients should submit no more */
348 /* than maxReq distinct unanswered SMBs to the server when using */
349 /* multiplexed reads or writes */
350 unsigned int maxBuf; /* maxBuf specifies the maximum */
351 /* message size the server can send or receive for non-raw SMBs */
7e90d705
SF
352 /* maxBuf is returned by SMB NegotiateProtocol so maxBuf is only 0 */
353 /* when socket is setup (and during reconnect) before NegProt sent */
eca6acf9 354 unsigned int max_rw; /* maxRw specifies the maximum */
1da177e4
LT
355 /* message size the server can send or receive for */
356 /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
eca6acf9
SF
357 unsigned int max_vcs; /* maximum number of smb sessions, at least
358 those that can be specified uniquely with
359 vcnumbers */
1da177e4 360 int capabilities; /* allow selective disabling of caps by smb sess */
de7ed55d 361 int timeAdj; /* Adjust for difference in server time zone in sec */
243d04b6 362 __u64 CurrentMid; /* multiplex id - rotating counter */
d3ba50b1 363 char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlm, ntlmv2 etc */
a10faeb2 364 /* 16th byte of RFC1001 workstation name is always null */
8ecaf67a 365 char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
a0f8b4fb 366 __u32 sequence_number; /* for signing, protected by srv_mutex */
5f98ca9a 367 struct session_key session_key;
3a5ff61c 368 unsigned long lstrp; /* when we got last response from this server */
d2b91521 369 struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */
26efa0ba 370 /* extended security flavors that server supports */
c3dccf48
JL
371 bool sec_ntlmssp; /* supports NTLMSSP */
372 bool sec_kerberosu2u; /* supports U2U Kerberos */
26efa0ba
JL
373 bool sec_kerberos; /* supports plain Kerberos */
374 bool sec_mskerberos; /* supports legacy MS Kerberos */
2a37ef94 375 bool large_buf; /* is current buffer large? */
c74093b6 376 struct delayed_work echo; /* echo ping workqueue job */
1041e3f9
JL
377 struct kvec *iov; /* reusable kvec array for receives */
378 unsigned int nr_iov; /* number of kvecs in array */
2a37ef94
JL
379 char *smallbuf; /* pointer to current "small" buffer */
380 char *bigbuf; /* pointer to current "big" buffer */
381 unsigned int total_read; /* total amount of data read in this pass */
488f1d2d
SJ
382#ifdef CONFIG_CIFS_FSCACHE
383 struct fscache_cookie *fscache; /* client index cache cookie */
384#endif
c3dccf48 385#ifdef CONFIG_CIFS_STATS2
789e6661 386 atomic_t in_send; /* requests trying to send */
c3dccf48
JL
387 atomic_t num_waiters; /* blocked waiting to get in sendrecv */
388#endif
1da177e4
LT
389};
390
fc40f9cf
PS
391static inline unsigned int
392in_flight(struct TCP_Server_Info *server)
393{
394 unsigned int num;
395 spin_lock(&server->req_lock);
396 num = server->in_flight;
397 spin_unlock(&server->req_lock);
398 return num;
399}
400
2d86dbc9 401static inline bool
bc205ed1 402has_credits(struct TCP_Server_Info *server, int *credits)
fc40f9cf 403{
2d86dbc9 404 int num;
fc40f9cf 405 spin_lock(&server->req_lock);
bc205ed1 406 num = *credits;
fc40f9cf 407 spin_unlock(&server->req_lock);
2d86dbc9 408 return num > 0;
fc40f9cf
PS
409}
410
45275789 411static inline void
a891f0f8
PS
412add_credits(struct TCP_Server_Info *server, const unsigned int add,
413 const int optype)
45275789 414{
a891f0f8 415 server->ops->add_credits(server, add, optype);
45275789
PS
416}
417
418static inline void
419set_credits(struct TCP_Server_Info *server, const int val)
420{
421 server->ops->set_credits(server, val);
422}
423
88257360
PS
424static inline __u64
425get_next_mid(struct TCP_Server_Info *server)
426{
427 return server->ops->get_next_mid(server);
428}
429
f1d0c998
RL
430/*
431 * Macros to allow the TCP_Server_Info->net field and related code to drop out
432 * when CONFIG_NET_NS isn't set.
433 */
434
435#ifdef CONFIG_NET_NS
436
437static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
438{
439 return srv->net;
440}
441
442static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
443{
444 srv->net = net;
445}
446
447#else
448
449static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
450{
451 return &init_net;
452}
453
454static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
455{
456}
457
458#endif
459
1da177e4
LT
460/*
461 * Session structure. One of these for each uid session with a particular host
462 */
96daf2b0 463struct cifs_ses {
14fbf50d 464 struct list_head smb_ses_list;
3b795210 465 struct list_head tcon_list;
d7b619cf 466 struct mutex session_mutex;
1da177e4 467 struct TCP_Server_Info *server; /* pointer to server info */
14fbf50d 468 int ses_count; /* reference counter */
1da177e4 469 enum statusEnum status;
750d1151 470 unsigned overrideSecFlg; /* if non-zero override global sec flags */
1da177e4
LT
471 __u16 ipc_tid; /* special tid for connection to IPC share */
472 __u16 flags;
eca6acf9 473 __u16 vcnum;
ad009ac9
SF
474 char *serverOS; /* name of operating system underlying server */
475 char *serverNOS; /* name of network operating system of server */
1da177e4 476 char *serverDomain; /* security realm of server */
286170aa 477 __u64 Suid; /* remote smb uid */
3e4b3e1f
JL
478 uid_t linux_uid; /* overriding owner of files on the mount */
479 uid_t cred_uid; /* owner of credentials */
1da177e4 480 int capabilities;
d38d8c74 481 char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for
ad009ac9 482 TCP names - will ipv6 and sctp addresses fit? */
34c87901
SF
483 char *user_name; /* must not be null except during init of sess
484 and after mount option parsing we fill it */
d38d8c74
SF
485 char *domainName;
486 char *password;
5d0d2882 487 struct session_key auth_key;
d3686d54 488 struct ntlmssp_auth *ntlmssp; /* ciphertext, flags, server challenge */
3b795210 489 bool need_reconnect:1; /* connection reset, uid now invalid */
1da177e4 490};
9ac00b7d 491/* no more than one of the following three session flags may be set */
1da177e4 492#define CIFS_SES_NT4 1
9ac00b7d
SF
493#define CIFS_SES_OS2 2
494#define CIFS_SES_W9X 4
495/* following flag is set for old servers such as OS2 (and Win95?)
496 which do not negotiate NTLM or POSIX dialects, but instead
497 negotiate one of the older LANMAN dialects */
498#define CIFS_SES_LANMAN 8
1da177e4
LT
499/*
500 * there is one of these for each connection to a resource on a particular
d38d8c74 501 * session
1da177e4 502 */
96daf2b0 503struct cifs_tcon {
f1987b44
JL
504 struct list_head tcon_list;
505 int tc_count;
1da177e4 506 struct list_head openFileList;
96daf2b0 507 struct cifs_ses *ses; /* pointer to session associated with */
254e55ed 508 char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
1da177e4 509 char *nativeFileSystem;
00e485b0 510 char *password; /* for share-level security */
1da177e4
LT
511 __u16 tid; /* The 2 byte tree id */
512 __u16 Flags; /* optional support bits */
513 enum statusEnum tidStatus;
1da177e4
LT
514#ifdef CONFIG_CIFS_STATS
515 atomic_t num_smbs_sent;
516 atomic_t num_writes;
517 atomic_t num_reads;
b298f223 518 atomic_t num_flushes;
1da177e4
LT
519 atomic_t num_oplock_brks;
520 atomic_t num_opens;
a5a2b489 521 atomic_t num_closes;
1da177e4
LT
522 atomic_t num_deletes;
523 atomic_t num_mkdirs;
65bc98b0
SF
524 atomic_t num_posixopens;
525 atomic_t num_posixmkdirs;
1da177e4
LT
526 atomic_t num_rmdirs;
527 atomic_t num_renames;
528 atomic_t num_t2renames;
dfb7533b
SF
529 atomic_t num_ffirst;
530 atomic_t num_fnext;
531 atomic_t num_fclose;
a5a2b489
SF
532 atomic_t num_hardlinks;
533 atomic_t num_symlinks;
534 atomic_t num_locks;
0a4b92c0
SF
535 atomic_t num_acl_get;
536 atomic_t num_acl_set;
a5a2b489
SF
537#ifdef CONFIG_CIFS_STATS2
538 unsigned long long time_writes;
539 unsigned long long time_reads;
540 unsigned long long time_opens;
541 unsigned long long time_deletes;
542 unsigned long long time_closes;
543 unsigned long long time_mkdirs;
544 unsigned long long time_rmdirs;
545 unsigned long long time_renames;
546 unsigned long long time_t2renames;
547 unsigned long long time_ffirst;
548 unsigned long long time_fnext;
549 unsigned long long time_fclose;
550#endif /* CONFIG_CIFS_STATS2 */
1da177e4
LT
551 __u64 bytes_read;
552 __u64 bytes_written;
553 spinlock_t stat_lock;
a5a2b489 554#endif /* CONFIG_CIFS_STATS */
1da177e4 555 FILE_SYSTEM_DEVICE_INFO fsDevInfo;
254e55ed 556 FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */
1da177e4 557 FILE_SYSTEM_UNIX_INFO fsUnixInfo;
4b18f2a9
SF
558 bool ipc:1; /* set if connection to IPC$ eg for RPC/PIPES */
559 bool retry:1;
560 bool nocase:1;
95b1cb90 561 bool seal:1; /* transport encryption for this mounted share */
4b18f2a9 562 bool unix_ext:1; /* if false disable Linux extensions to CIFS protocol
c18c842b 563 for this mount even if server would support */
84210e91 564 bool local_lease:1; /* check leases (only) on local system not remote */
64cc2c63 565 bool broken_posix_open; /* e.g. Samba server versions < 3.3.2, 3.2.9 */
3b795210 566 bool need_reconnect:1; /* connection reset, tid now invalid */
d03382ce
SJ
567#ifdef CONFIG_CIFS_FSCACHE
568 u64 resource_id; /* server resource id */
569 struct fscache_cookie *fscache; /* cookie for share */
570#endif
c18c842b 571 /* BB add field for back pointer to sb struct(s)? */
1da177e4
LT
572};
573
7ffec372
JL
574/*
575 * This is a refcounted and timestamped container for a tcon pointer. The
576 * container holds a tcon reference. It is considered safe to free one of
577 * these when the tl_count goes to 0. The tl_time is the time of the last
578 * "get" on the container.
579 */
580struct tcon_link {
b647c35f
JL
581 struct rb_node tl_rbnode;
582 uid_t tl_uid;
9d002df4
JL
583 unsigned long tl_flags;
584#define TCON_LINK_MASTER 0
585#define TCON_LINK_PENDING 1
586#define TCON_LINK_IN_TREE 2
587 unsigned long tl_time;
588 atomic_t tl_count;
96daf2b0 589 struct cifs_tcon *tl_tcon;
7ffec372
JL
590};
591
9d002df4 592extern struct tcon_link *cifs_sb_tlink(struct cifs_sb_info *cifs_sb);
7ffec372 593
96daf2b0 594static inline struct cifs_tcon *
7ffec372
JL
595tlink_tcon(struct tcon_link *tlink)
596{
9d002df4 597 return tlink->tl_tcon;
7ffec372
JL
598}
599
9d002df4 600extern void cifs_put_tlink(struct tcon_link *tlink);
7ffec372 601
13cfb733
JL
602static inline struct tcon_link *
603cifs_get_tlink(struct tcon_link *tlink)
604{
9d002df4
JL
605 if (tlink && !IS_ERR(tlink))
606 atomic_inc(&tlink->tl_count);
13cfb733
JL
607 return tlink;
608}
609
7ffec372 610/* This function is always expected to succeed */
96daf2b0 611extern struct cifs_tcon *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
7ffec372 612
1da177e4 613/*
7ee1af76
JA
614 * This info hangs off the cifsFileInfo structure, pointed to by llist.
615 * This is used to track byte stream locks on the file
1da177e4
LT
616 */
617struct cifsLockInfo {
7ee1af76 618 struct list_head llist; /* pointer to next cifsLockInfo */
85160e03
PS
619 struct list_head blist; /* pointer to locks blocked on this */
620 wait_queue_head_t block_q;
7ee1af76
JA
621 __u64 offset;
622 __u64 length;
03776f45 623 __u32 pid;
04a6aa8a 624 __u32 type;
1da177e4
LT
625};
626
627/*
628 * One of these for each open instance of a file
629 */
630struct cifs_search_info {
631 loff_t index_of_last_entry;
632 __u16 entries_in_buffer;
633 __u16 info_level;
634 __u32 resume_key;
d38d8c74
SF
635 char *ntwrk_buf_start;
636 char *srch_entries_start;
0752f152 637 char *last_entry;
eaf35b1e 638 const char *presume_name;
1da177e4 639 unsigned int resume_name_len;
4b18f2a9
SF
640 bool endOfSearch:1;
641 bool emptyDir:1;
642 bool unicode:1;
643 bool smallBuf:1; /* so we know which buf_release function to call */
1da177e4
LT
644};
645
646struct cifsFileInfo {
647 struct list_head tlist; /* pointer to next fid owned by tcon */
648 struct list_head flist; /* next fid (file instance) for this inode */
fbd35aca
PS
649 struct list_head llist; /*
650 * brlocks held by this fid, protected by
651 * lock_mutex from cifsInodeInfo structure
652 */
1da177e4
LT
653 unsigned int uid; /* allows finding which FileInfo structure */
654 __u32 pid; /* process id who opened file */
655 __u16 netfid; /* file id from remote */
656 /* BB add lock scope info here if needed */ ;
657 /* lock scope id (0 if none) */
a5e18bc3 658 struct dentry *dentry;
15886177 659 unsigned int f_flags;
13cfb733 660 struct tcon_link *tlink;
4b18f2a9 661 bool invalidHandle:1; /* file closed via session abend */
3bc303c2 662 bool oplock_break_cancelled:1;
6c0f6218 663 int count; /* refcount protected by cifs_file_list_lock */
a6ce4932 664 struct mutex fh_mutex; /* prevents reopen race after dead ses*/
1da177e4 665 struct cifs_search_info srch_inf;
9b646972 666 struct work_struct oplock_break; /* work for oplock breaks */
1da177e4
LT
667};
668
fa2989f4
PS
669struct cifs_io_parms {
670 __u16 netfid;
671 __u32 pid;
672 __u64 offset;
673 unsigned int length;
96daf2b0 674 struct cifs_tcon *tcon;
fa2989f4
PS
675};
676
5f6dbc9e
JL
677/*
678 * Take a reference on the file private data. Must be called with
679 * cifs_file_list_lock held.
680 */
35ebb415
JL
681static inline
682struct cifsFileInfo *cifsFileInfo_get(struct cifsFileInfo *cifs_file)
6ab409b5 683{
5f6dbc9e 684 ++cifs_file->count;
35ebb415 685 return cifs_file;
6ab409b5
DK
686}
687
b33879aa 688void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
6ab409b5 689
1da177e4
LT
690/*
691 * One of these for each file inode
692 */
693
694struct cifsInodeInfo {
d59dad2b 695 bool can_cache_brlcks;
fbd35aca
PS
696 struct mutex lock_mutex; /*
697 * protect the field above and llist
698 * from every cifsFileInfo structure
699 * from openFileList
700 */
d38d8c74 701 /* BB add in lists for dirty pages i.e. write caching info for oplock */
1da177e4 702 struct list_head openFileList;
1da177e4 703 __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
aae62fdb
JL
704 bool clientCanCacheRead; /* read oplock */
705 bool clientCanCacheAll; /* read and writebehind oplock */
706 bool delete_pending; /* DELETE_ON_CLOSE is set */
707 bool invalid_mapping; /* pagecache is invalid */
708 unsigned long time; /* jiffies of last update of inode */
597b027f 709 u64 server_eof; /* current file size on server -- protected by i_lock */
cc0bad75 710 u64 uniqueid; /* server inode number */
20054bd6 711 u64 createtime; /* creation time on server */
9451a9a5
SJ
712#ifdef CONFIG_CIFS_FSCACHE
713 struct fscache_cookie *fscache;
714#endif
1da177e4
LT
715 struct inode vfs_inode;
716};
717
718static inline struct cifsInodeInfo *
719CIFS_I(struct inode *inode)
720{
721 return container_of(inode, struct cifsInodeInfo, vfs_inode);
722}
723
724static inline struct cifs_sb_info *
725CIFS_SB(struct super_block *sb)
726{
727 return sb->s_fs_info;
728}
729
ab2f218f 730static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
ac67055e
JA
731{
732 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
733 return '/';
734 else
735 return '\\';
736}
1da177e4 737
f87d39d9
SF
738static inline void
739convert_delimiter(char *path, char delim)
740{
741 int i;
742 char old_delim;
743
744 if (path == NULL)
745 return;
746
747 if (delim == '/')
748 old_delim = '\\';
749 else
750 old_delim = '/';
751
752 for (i = 0; path[i] != '\0'; i++) {
753 if (path[i] == old_delim)
754 path[i] = delim;
755 }
756}
757
a4544347
SF
758#ifdef CONFIG_CIFS_STATS
759#define cifs_stats_inc atomic_inc
760
96daf2b0 761static inline void cifs_stats_bytes_written(struct cifs_tcon *tcon,
a4544347
SF
762 unsigned int bytes)
763{
764 if (bytes) {
765 spin_lock(&tcon->stat_lock);
766 tcon->bytes_written += bytes;
767 spin_unlock(&tcon->stat_lock);
768 }
769}
770
96daf2b0 771static inline void cifs_stats_bytes_read(struct cifs_tcon *tcon,
a4544347
SF
772 unsigned int bytes)
773{
774 spin_lock(&tcon->stat_lock);
775 tcon->bytes_read += bytes;
776 spin_unlock(&tcon->stat_lock);
777}
778#else
779
d38d8c74
SF
780#define cifs_stats_inc(field) do {} while (0)
781#define cifs_stats_bytes_written(tcon, bytes) do {} while (0)
782#define cifs_stats_bytes_read(tcon, bytes) do {} while (0)
a4544347
SF
783
784#endif
785
2b84a36c
JL
786
787/*
44d22d84
JL
788 * This is the prototype for the mid receive function. This function is for
789 * receiving the rest of the SMB frame, starting with the WordCount (which is
790 * just after the MID in struct smb_hdr). Note:
791 *
792 * - This will be called by cifsd, with no locks held.
793 * - The mid will still be on the pending_mid_q.
794 * - mid->resp_buf will point to the current buffer.
795 *
796 * Returns zero on a successful receive, or an error. The receive state in
797 * the TCP_Server_Info will also be updated.
798 */
799typedef int (mid_receive_t)(struct TCP_Server_Info *server,
800 struct mid_q_entry *mid);
801
802/*
803 * This is the prototype for the mid callback function. This is called once the
804 * mid has been received off of the socket. When creating one, take special
805 * care to avoid deadlocks. Things to bear in mind:
2b84a36c 806 *
3c1105df
JL
807 * - it will be called by cifsd, with no locks held
808 * - the mid will be removed from any lists
2b84a36c
JL
809 */
810typedef void (mid_callback_t)(struct mid_q_entry *mid);
811
1da177e4
LT
812/* one of these for every pending CIFS request to the server */
813struct mid_q_entry {
814 struct list_head qhead; /* mids waiting on reply from this server */
7c9421e1
PS
815 __u64 mid; /* multiplex id */
816 __u32 pid; /* process id */
1da177e4 817 __u32 sequence_number; /* for CIFS signing */
1047abc1
SF
818 unsigned long when_alloc; /* when mid was created */
819#ifdef CONFIG_CIFS_STATS2
820 unsigned long when_sent; /* time when smb send finished */
821 unsigned long when_received; /* when demux complete (taken off wire) */
822#endif
44d22d84 823 mid_receive_t *receive; /* call receive callback */
2b84a36c
JL
824 mid_callback_t *callback; /* call completion callback */
825 void *callback_data; /* general purpose pointer for callback */
d4e4854f 826 void *resp_buf; /* pointer to received SMB header */
7c9421e1
PS
827 int mid_state; /* wish this were enum but can not pass to wait_event */
828 __le16 command; /* smb command code */
829 bool large_buf:1; /* if valid response, is pointer to large buf */
4b18f2a9
SF
830 bool multiRsp:1; /* multiple trans2 responses for one request */
831 bool multiEnd:1; /* both received */
1da177e4
LT
832};
833
789e6661
SF
834/* Make code in transport.c a little cleaner by moving
835 update of optional stats into function below */
836#ifdef CONFIG_CIFS_STATS2
837
838static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
839{
840 atomic_inc(&server->in_send);
841}
842
843static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
844{
845 atomic_dec(&server->in_send);
846}
847
848static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
849{
850 atomic_inc(&server->num_waiters);
851}
852
853static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
854{
855 atomic_dec(&server->num_waiters);
856}
857
858static inline void cifs_save_when_sent(struct mid_q_entry *mid)
859{
860 mid->when_sent = jiffies;
861}
862#else
863static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
864{
865}
866static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
867{
868}
869
870static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
871{
872}
873
874static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
875{
876}
877
878static inline void cifs_save_when_sent(struct mid_q_entry *mid)
879{
880}
881#endif
1da177e4 882
ff5dbd9e
SF
883/* for pending dnotify requests */
884struct dir_notify_req {
13cd4b7f
SF
885 struct list_head lhead;
886 __le16 Pid;
887 __le16 PidHigh;
888 __u16 Mid;
889 __u16 Tid;
890 __u16 Uid;
891 __u16 netfid;
892 __u32 filter; /* CompletionFilter (for multishot) */
893 int multishot;
894 struct file *pfile;
ff5dbd9e
SF
895};
896
366781c1
SF
897struct dfs_info3_param {
898 int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/
8aad018b 899 int path_consumed;
366781c1
SF
900 int server_type;
901 int ref_flag;
902 char *path_name;
903 char *node_name;
904};
905
cc0bad75
JL
906/*
907 * common struct for holding inode info when searching for or updating an
908 * inode with new info
909 */
910
911#define CIFS_FATTR_DFS_REFERRAL 0x1
0b8f18e3
JL
912#define CIFS_FATTR_DELETE_PENDING 0x2
913#define CIFS_FATTR_NEED_REVAL 0x4
3d694380 914#define CIFS_FATTR_INO_COLLISION 0x8
cc0bad75
JL
915
916struct cifs_fattr {
917 u32 cf_flags;
918 u32 cf_cifsattrs;
919 u64 cf_uniqueid;
920 u64 cf_eof;
921 u64 cf_bytes;
20054bd6 922 u64 cf_createtime;
cc0bad75
JL
923 uid_t cf_uid;
924 gid_t cf_gid;
925 umode_t cf_mode;
926 dev_t cf_rdev;
927 unsigned int cf_nlink;
928 unsigned int cf_dtype;
929 struct timespec cf_atime;
930 struct timespec cf_mtime;
931 struct timespec cf_ctime;
932};
933
366781c1
SF
934static inline void free_dfs_info_param(struct dfs_info3_param *param)
935{
936 if (param) {
937 kfree(param->path_name);
938 kfree(param->node_name);
939 kfree(param);
940 }
941}
942
943static inline void free_dfs_info_array(struct dfs_info3_param *param,
944 int number_of_items)
945{
946 int i;
947 if ((number_of_items == 0) || (param == NULL))
948 return;
949 for (i = 0; i < number_of_items; i++) {
950 kfree(param[i].path_name);
951 kfree(param[i].node_name);
952 }
953 kfree(param);
954}
955
1da177e4
LT
956#define MID_FREE 0
957#define MID_REQUEST_ALLOCATED 1
958#define MID_REQUEST_SUBMITTED 2
959#define MID_RESPONSE_RECEIVED 4
960#define MID_RETRY_NEEDED 8 /* session closed while this request out */
71823baf 961#define MID_RESPONSE_MALFORMED 0x10
3c1105df 962#define MID_SHUTDOWN 0x20
ec637e3f
SF
963
964/* Types of response buffer returned from SendReceive2 */
965#define CIFS_NO_BUFFER 0 /* Response buffer not returned */
966#define CIFS_SMALL_BUFFER 1
967#define CIFS_LARGE_BUFFER 2
968#define CIFS_IOVEC 4 /* array of response buffers */
1da177e4 969
133672ef 970/* Type of Request to SendReceive2 */
7749981e
JL
971#define CIFS_BLOCKING_OP 1 /* operation can block */
972#define CIFS_ASYNC_OP 2 /* do not wait for response */
973#define CIFS_TIMEOUT_MASK 0x003 /* only one of above set in req */
133672ef
SF
974#define CIFS_LOG_ERROR 0x010 /* log NT STATUS if non-zero */
975#define CIFS_LARGE_BUF_OP 0x020 /* large request buffer */
976#define CIFS_NO_RESP 0x040 /* no response buffer required */
977
a891f0f8
PS
978/* Type of request operation */
979#define CIFS_ECHO_OP 0x080 /* echo request */
980#define CIFS_OBREAK_OP 0x0100 /* oplock break request */
981#define CIFS_OP_MASK 0x0180 /* mask request type */
982
3979877e
SF
983/* Security Flags: indicate type of session setup needed */
984#define CIFSSEC_MAY_SIGN 0x00001
985#define CIFSSEC_MAY_NTLM 0x00002
986#define CIFSSEC_MAY_NTLMV2 0x00004
987#define CIFSSEC_MAY_KRB5 0x00008
988#ifdef CONFIG_CIFS_WEAK_PW_HASH
989#define CIFSSEC_MAY_LANMAN 0x00010
990#define CIFSSEC_MAY_PLNTXT 0x00020
516897a2
SF
991#else
992#define CIFSSEC_MAY_LANMAN 0
993#define CIFSSEC_MAY_PLNTXT 0
3979877e
SF
994#endif /* weak passwords */
995#define CIFSSEC_MAY_SEAL 0x00040 /* not supported yet */
ac683924 996#define CIFSSEC_MAY_NTLMSSP 0x00080 /* raw ntlmssp with ntlmv2 */
3979877e
SF
997
998#define CIFSSEC_MUST_SIGN 0x01001
999/* note that only one of the following can be set so the
1000result of setting MUST flags more than once will be to
1001require use of the stronger protocol */
1002#define CIFSSEC_MUST_NTLM 0x02002
1003#define CIFSSEC_MUST_NTLMV2 0x04004
1004#define CIFSSEC_MUST_KRB5 0x08008
1005#ifdef CONFIG_CIFS_WEAK_PW_HASH
1006#define CIFSSEC_MUST_LANMAN 0x10010
1007#define CIFSSEC_MUST_PLNTXT 0x20020
0d3a01fa 1008#ifdef CONFIG_CIFS_UPCALL
20d1752f 1009#define CIFSSEC_MASK 0xBF0BF /* allows weak security but also krb5 */
0d3a01fa 1010#else
20d1752f 1011#define CIFSSEC_MASK 0xB70B7 /* current flags supported if weak */
016ec75f 1012#endif /* UPCALL */
0d3a01fa 1013#else /* do not allow weak pw hash */
88a4412b
SF
1014#define CIFSSEC_MUST_LANMAN 0
1015#define CIFSSEC_MUST_PLNTXT 0
0d3a01fa 1016#ifdef CONFIG_CIFS_UPCALL
ac683924 1017#define CIFSSEC_MASK 0x8F08F /* flags supported if no weak allowed */
d38d8c74 1018#else
ac683924 1019#define CIFSSEC_MASK 0x87087 /* flags supported if no weak allowed */
016ec75f 1020#endif /* UPCALL */
3979877e
SF
1021#endif /* WEAK_PW_HASH */
1022#define CIFSSEC_MUST_SEAL 0x40040 /* not supported yet */
ac683924 1023#define CIFSSEC_MUST_NTLMSSP 0x80080 /* raw ntlmssp with ntlmv2 */
3979877e 1024
ef571cad
SP
1025#define CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2)
1026#define CIFSSEC_MAX (CIFSSEC_MUST_SIGN | CIFSSEC_MUST_NTLMV2)
ac683924 1027#define CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_LANMAN | CIFSSEC_MAY_PLNTXT | CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_NTLMSSP)
1da177e4
LT
1028/*
1029 *****************************************************************
1030 * All constants go here
1031 *****************************************************************
1032 */
1033
1034#define UID_HASH (16)
1035
1036/*
1037 * Note that ONE module should define _DECLARE_GLOBALS_HERE to cause the
1038 * following to be declared.
1039 */
1040
1041/****************************************************************************
1042 * Locking notes. All updates to global variables and lists should be
1043 * protected by spinlocks or semaphores.
1044 *
1045 * Spinlocks
1046 * ---------
1047 * GlobalMid_Lock protects:
1048 * list operations on pending_mid_q and oplockQ
1049 * updates to XID counters, multiplex id and SMB sequence numbers
6573e9b7 1050 * cifs_file_list_lock protects:
1da177e4
LT
1051 * list operations on tcp and SMB session lists and tCon lists
1052 * f_owner.lock protects certain per file struct operations
1053 * mapping->page_lock protects certain per page operations
1054 *
1055 * Semaphores
1056 * ----------
1057 * sesSem operations on smb session
1058 * tconSem operations on tree connection
d38d8c74 1059 * fh_sem file handle reconnection operations
1da177e4
LT
1060 *
1061 ****************************************************************************/
1062
1063#ifdef DECLARE_GLOBALS_HERE
1064#define GLOBAL_EXTERN
1065#else
1066#define GLOBAL_EXTERN extern
1067#endif
1068
e7ddee90
JL
1069/*
1070 * the list of TCP_Server_Info structures, ie each of the sockets
fb396016 1071 * connecting our client to a distinct server (ip address), is
e7ddee90 1072 * chained together by cifs_tcp_ses_list. The list of all our SMB
fb396016 1073 * sessions (and from that the tree connections) can be found
e7ddee90
JL
1074 * by iterating over cifs_tcp_ses_list
1075 */
1076GLOBAL_EXTERN struct list_head cifs_tcp_ses_list;
1077
f1987b44
JL
1078/*
1079 * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
1080 * tcp session, and the list of tcon's per smb session. It also protects
1081 * the reference counters for the server, smb session, and tcon. Finally,
1082 * changes to the tcon->tidStatus should be done while holding this lock.
1083 */
3f9bcca7 1084GLOBAL_EXTERN spinlock_t cifs_tcp_ses_lock;
ddb4cbfc
SF
1085
1086/*
1087 * This lock protects the cifs_file->llist and cifs_file->flist
1088 * list operations, and updates to some flags (cifs_file->invalidHandle)
1089 * It will be moved to either use the tcon->stat_lock or equivalent later.
1090 * If cifs_tcp_ses_lock and the lock below are both needed to be held, then
1091 * the cifs_tcp_ses_lock must be grabbed first and released last.
1092 */
4477288a 1093GLOBAL_EXTERN spinlock_t cifs_file_list_lock;
1da177e4 1094
0eff0e26 1095#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
99ee4dbd
SF
1096/* Outstanding dir notify requests */
1097GLOBAL_EXTERN struct list_head GlobalDnotifyReqList;
1098/* DirNotify response queue */
1099GLOBAL_EXTERN struct list_head GlobalDnotifyRsp_Q;
0eff0e26 1100#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
ff5dbd9e 1101
1da177e4
LT
1102/*
1103 * Global transaction id (XID) information
1104 */
1105GLOBAL_EXTERN unsigned int GlobalCurrentXid; /* protected by GlobalMid_Sem */
254e55ed 1106GLOBAL_EXTERN unsigned int GlobalTotalActiveXid; /* prot by GlobalMid_Sem */
1da177e4 1107GLOBAL_EXTERN unsigned int GlobalMaxActiveXid; /* prot by GlobalMid_Sem */
254e55ed
SF
1108GLOBAL_EXTERN spinlock_t GlobalMid_Lock; /* protects above & list operations */
1109 /* on midQ entries */
1da177e4
LT
1110/*
1111 * Global counters, updated atomically
1112 */
1113GLOBAL_EXTERN atomic_t sesInfoAllocCount;
1114GLOBAL_EXTERN atomic_t tconInfoAllocCount;
1115GLOBAL_EXTERN atomic_t tcpSesAllocCount;
1116GLOBAL_EXTERN atomic_t tcpSesReconnectCount;
1117GLOBAL_EXTERN atomic_t tconInfoReconnectCount;
1118
aaa9bbe0 1119/* Various Debug counters */
4498eed5
SF
1120GLOBAL_EXTERN atomic_t bufAllocCount; /* current number allocated */
1121#ifdef CONFIG_CIFS_STATS2
1122GLOBAL_EXTERN atomic_t totBufAllocCount; /* total allocated over all time */
1123GLOBAL_EXTERN atomic_t totSmBufAllocCount;
1124#endif
1125GLOBAL_EXTERN atomic_t smBufAllocCount;
1da177e4
LT
1126GLOBAL_EXTERN atomic_t midCount;
1127
1128/* Misc globals */
5e500ed1 1129GLOBAL_EXTERN bool enable_oplocks; /* enable or disable oplocks */
1da177e4 1130GLOBAL_EXTERN unsigned int lookupCacheEnabled;
04912d6a 1131GLOBAL_EXTERN unsigned int global_secflags; /* if on, session setup sent
1da177e4 1132 with more secure ntlmssp2 challenge/resp */
1da177e4
LT
1133GLOBAL_EXTERN unsigned int sign_CIFS_PDUs; /* enable smb packet signing */
1134GLOBAL_EXTERN unsigned int linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/
1135GLOBAL_EXTERN unsigned int CIFSMaxBufSize; /* max size not including hdr */
1136GLOBAL_EXTERN unsigned int cifs_min_rcv; /* min size of big ntwrk buf pool */
1137GLOBAL_EXTERN unsigned int cifs_min_small; /* min size of small buf pool */
1138GLOBAL_EXTERN unsigned int cifs_max_pending; /* MAX requests at once to server*/
1139
21fed0d5 1140#ifdef CONFIG_CIFS_ACL
4d79dba0
SP
1141GLOBAL_EXTERN struct rb_root uidtree;
1142GLOBAL_EXTERN struct rb_root gidtree;
1143GLOBAL_EXTERN spinlock_t siduidlock;
1144GLOBAL_EXTERN spinlock_t sidgidlock;
21fed0d5
SP
1145GLOBAL_EXTERN struct rb_root siduidtree;
1146GLOBAL_EXTERN struct rb_root sidgidtree;
1147GLOBAL_EXTERN spinlock_t uidsidlock;
1148GLOBAL_EXTERN spinlock_t gidsidlock;
1149#endif /* CONFIG_CIFS_ACL */
4d79dba0 1150
9b646972 1151void cifs_oplock_break(struct work_struct *work);
3b7433b8 1152
3bc303c2 1153extern const struct slow_work_ops cifs_oplock_break_ops;
da472fc8 1154extern struct workqueue_struct *cifsiod_wq;
abd2e44d 1155
23db65f5
JL
1156/* Operations for different SMB versions */
1157#define SMB1_VERSION_STRING "1.0"
1158extern struct smb_version_operations smb1_operations;
1159extern struct smb_version_values smb1_values;
1080ef75
SF
1160#define SMB21_VERSION_STRING "2.1"
1161extern struct smb_version_operations smb21_operations;
1162extern struct smb_version_values smb21_values;
abd2e44d 1163#endif /* _CIFS_GLOB_H */
This page took 0.472913 seconds and 5 git commands to generate.