cifsglob.h 26.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 *   fs/cifs/cifsglob.h
 *
S
Steve French 已提交
4
 *   Copyright (C) International Business Machines  Corp., 2002,2008
L
Linus Torvalds 已提交
5
 *   Author(s): Steve French (sfrench@us.ibm.com)
J
[CIFS]  
Jeremy Allison 已提交
6
 *              Jeremy Allison (jra@samba.org)
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16
 *
 *   This library is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Lesser General Public License as published
 *   by the Free Software Foundation; either version 2.1 of the License, or
 *   (at your option) any later version.
 *
 *   This library is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 *   the GNU Lesser General Public License for more details.
S
Steve French 已提交
17
 *
L
Linus Torvalds 已提交
18
 */
19 20 21
#ifndef _CIFS_GLOB_H
#define _CIFS_GLOB_H

L
Linus Torvalds 已提交
22 23
#include <linux/in.h>
#include <linux/in6.h>
24
#include <linux/slab.h>
25
#include <linux/workqueue.h>
L
Linus Torvalds 已提交
26
#include "cifs_fs_sb.h"
27
#include "cifsacl.h"
28 29 30
#include <crypto/internal/hash.h>
#include <linux/scatterlist.h>

L
Linus Torvalds 已提交
31 32 33 34 35 36 37
/*
 * The sizes of various internal tables and strings
 */
#define MAX_UID_INFO 16
#define MAX_SES_INFO 2
#define MAX_TCON_INFO 4

38
#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
L
Linus Torvalds 已提交
39
#define MAX_SERVER_SIZE 15
S
Steve French 已提交
40
#define MAX_SHARE_SIZE  64	/* used to be 20, this should still be enough */
L
Linus Torvalds 已提交
41 42
#define MAX_USERNAME_SIZE 32	/* 32 is to allow for 15 char names + null
				   termination then *2 for unicode versions */
43
#define MAX_PASSWORD_SIZE 512  /* max for windows seems to be 256 wide chars */
L
Linus Torvalds 已提交
44 45 46

#define CIFS_MIN_RCV_POOL 4

47 48 49 50 51 52 53 54 55 56
/*
 * default attribute cache timeout (jiffies)
 */
#define CIFS_DEF_ACTIMEO (1 * HZ)

/*
 * max attribute cache timeout (jiffies) - 2^30
 */
#define CIFS_MAX_ACTIMEO (1 << 30)

L
Linus Torvalds 已提交
57 58
/*
 * MAX_REQ is the maximum number of requests that WE will send
59
 * on one socket concurrently. It also matches the most common
S
Steve French 已提交
60
 * value of max multiplex returned by servers.  We may
L
Linus Torvalds 已提交
61 62 63 64 65
 * eventually want to use the negotiated value (in case
 * future servers can handle more) when we are more confident that
 * we will not have problems oveloading the socket with pending
 * write data.
 */
S
Steve French 已提交
66
#define CIFS_MAX_REQ 50
L
Linus Torvalds 已提交
67

68 69 70 71 72
#define RFC1001_NAME_LEN 15
#define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)

/* currently length of NIP6_FMT */
#define SERVER_NAME_LENGTH 40
L
Linus Torvalds 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
#define SERVER_NAME_LEN_WITH_NULL     (SERVER_NAME_LENGTH + 1)

/* used to define string lengths for reversing unicode strings */
/*         (256+1)*2 = 514                                     */
/*           (max path length + 1 for null) * 2 for unicode    */
#define MAX_NAME 514

#include "cifspdu.h"

#ifndef XATTR_DOS_ATTRIB
#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
#endif

/*
 * CIFS vfs client Status information (based on what we know.)
 */

90
/* associated with each tcp and smb session */
L
Linus Torvalds 已提交
91 92 93 94 95 96 97 98
enum statusEnum {
	CifsNew = 0,
	CifsGood,
	CifsExiting,
	CifsNeedReconnect
};

enum securityEnum {
99
	LANMAN = 0,			/* Legacy LANMAN auth */
100
	NTLM,			/* Legacy NTLM012 auth with NTLM hash */
L
Linus Torvalds 已提交
101
	NTLMv2,			/* Legacy NTLM auth with NTLMv2 hash */
102
	RawNTLMSSP,		/* NTLMSSP without SPNEGO, NTLMv2 hash */
103
/*	NTLMSSP, */ /* can use rawNTLMSSP instead of NTLMSSP via SPNEGO */
104
	Kerberos,		/* Kerberos via SPNEGO */
L
Linus Torvalds 已提交
105 106 107
};

enum protocolEnum {
108
	TCP = 0,
L
Linus Torvalds 已提交
109 110 111 112
	SCTP
	/* Netbios frames protocol not supported at this time */
};

113
struct session_key {
114
	unsigned int len;
115
	char *response;
116 117
};

118 119 120 121 122 123
/* crypto security descriptor definition */
struct sdesc {
	struct shash_desc shash;
	char ctx[];
};

124
/* crypto hashing related structure/fields, not specific to a sec mech */
125 126 127 128 129 130 131
struct cifs_secmech {
	struct crypto_shash *hmacmd5; /* hmac-md5 hash function */
	struct crypto_shash *md5; /* md5 hash function */
	struct sdesc *sdeschmacmd5;  /* ctxt to generate ntlmv2 hash, CR1 */
	struct sdesc *sdescmd5; /* ctxt to generate cifs/smb signature */
};

132
/* per smb session structure/fields */
133 134 135 136
struct ntlmssp_auth {
	__u32 client_flags; /* sent by client in type 1 ntlmsssp exchange */
	__u32 server_flags; /* sent by server in type 2 ntlmssp exchange */
	unsigned char ciphertext[CIFS_CPHTXT_SIZE]; /* sent to server */
137
	char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlmssp */
138 139
};

140 141 142 143 144 145 146 147 148 149 150
struct cifs_cred {
	int uid;
	int gid;
	int mode;
	int cecount;
	struct cifs_sid osid;
	struct cifs_sid gsid;
	struct cifs_ntace *ntaces;
	struct cifs_ace *aces;
};

L
Linus Torvalds 已提交
151 152 153 154 155 156 157 158
/*
 *****************************************************************
 * Except the CIFS PDUs themselves all the
 * globally interesting structs should go here
 *****************************************************************
 */

struct TCP_Server_Info {
S
Steve French 已提交
159 160
	struct list_head tcp_ses_list;
	struct list_head smb_ses_list;
161
	int srv_count; /* reference counter */
162
	/* 15 character server name + 0x20 16th byte indicating type = srv */
163
	char server_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
J
Jeff Layton 已提交
164
	enum statusEnum tcpStatus; /* what we think the status is */
165
	char *hostname; /* hostname portion of UNC string */
L
Linus Torvalds 已提交
166
	struct socket *ssocket;
167
	struct sockaddr_storage dstaddr;
168
	struct sockaddr_storage srcaddr; /* locally bind to this IP */
169 170 171
#ifdef CONFIG_NET_NS
	struct net *net;
#endif
S
Steve French 已提交
172
	wait_queue_head_t response_q;
L
Linus Torvalds 已提交
173 174
	wait_queue_head_t request_q; /* if more than maxmpx to srvr must block*/
	struct list_head pending_mid_q;
175 176
	bool noblocksnd;		/* use blocking sendmsg */
	bool noautotune;		/* do not autotune send buf sizes */
177
	bool tcp_nodelay;
L
Linus Torvalds 已提交
178
	atomic_t inFlight;  /* number of requests on the wire to server */
J
Jeff Layton 已提交
179
	struct mutex srv_mutex;
L
Linus Torvalds 已提交
180 181 182
	struct task_struct *tsk;
	char server_GUID[16];
	char secMode;
J
Jeff Layton 已提交
183 184
	bool session_estab; /* mark when very first sess is established */
	u16 dialect; /* dialect index that server chose */
L
Linus Torvalds 已提交
185 186 187 188 189 190
	enum securityEnum secType;
	unsigned int maxReq;	/* Clients should submit no more */
	/* than maxReq distinct unanswered SMBs to the server when using  */
	/* multiplexed reads or writes */
	unsigned int maxBuf;	/* maxBuf specifies the maximum */
	/* message size the server can send or receive for non-raw SMBs */
191
	unsigned int max_rw;	/* maxRw specifies the maximum */
L
Linus Torvalds 已提交
192 193
	/* message size the server can send or receive for */
	/* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
194 195 196
	unsigned int max_vcs;	/* maximum number of smb sessions, at least
				   those that can be specified uniquely with
				   vcnumbers */
L
Linus Torvalds 已提交
197
	int capabilities; /* allow selective disabling of caps by smb sess */
198
	int timeAdj;  /* Adjust for difference in server time zone in sec */
199
	__u16 CurrentMid;         /* multiplex id - rotating counter */
200
	char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlm, ntlmv2 etc */
201
	/* 16th byte of RFC1001 workstation name is always null */
202
	char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
203
	__u32 sequence_number; /* for signing, protected by srv_mutex */
204
	struct session_key session_key;
205
	unsigned long lstrp; /* when we got last response from this server */
206
	struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */
207
	/* extended security flavors that server supports */
J
Jeff Layton 已提交
208 209
	bool	sec_ntlmssp;		/* supports NTLMSSP */
	bool	sec_kerberosu2u;	/* supports U2U Kerberos */
210 211
	bool	sec_kerberos;		/* supports plain Kerberos */
	bool	sec_mskerberos;		/* supports legacy MS Kerberos */
212
	struct delayed_work	echo; /* echo ping workqueue job */
213 214 215
#ifdef CONFIG_CIFS_FSCACHE
	struct fscache_cookie   *fscache; /* client index cache cookie */
#endif
J
Jeff Layton 已提交
216 217 218 219
#ifdef CONFIG_CIFS_STATS2
	atomic_t inSend; /* requests trying to send */
	atomic_t num_waiters;   /* blocked waiting to get in sendrecv */
#endif
L
Linus Torvalds 已提交
220 221
};

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
/*
 * Macros to allow the TCP_Server_Info->net field and related code to drop out
 * when CONFIG_NET_NS isn't set.
 */

#ifdef CONFIG_NET_NS

static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
{
	return srv->net;
}

static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
{
	srv->net = net;
}

#else

static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
{
	return &init_net;
}

static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
{
}

#endif

L
Linus Torvalds 已提交
252 253 254 255
/*
 * Session structure.  One of these for each uid session with a particular host
 */
struct cifsSesInfo {
256
	struct list_head smb_ses_list;
S
Steve French 已提交
257
	struct list_head tcon_list;
258
	struct mutex session_mutex;
L
Linus Torvalds 已提交
259
	struct TCP_Server_Info *server;	/* pointer to server info */
260
	int ses_count;		/* reference counter */
L
Linus Torvalds 已提交
261
	enum statusEnum status;
262
	unsigned overrideSecFlg;  /* if non-zero override global sec flags */
L
Linus Torvalds 已提交
263 264
	__u16 ipc_tid;		/* special tid for connection to IPC share */
	__u16 flags;
265
	__u16 vcnum;
266 267
	char *serverOS;		/* name of operating system underlying server */
	char *serverNOS;	/* name of network operating system of server */
L
Linus Torvalds 已提交
268 269
	char *serverDomain;	/* security realm of server */
	int Suid;		/* remote smb uid  */
270 271
	uid_t linux_uid;        /* overriding owner of files on the mount */
	uid_t cred_uid;		/* owner of credentials */
L
Linus Torvalds 已提交
272
	int capabilities;
S
Steve French 已提交
273
	char serverName[SERVER_NAME_LEN_WITH_NULL * 2];	/* BB make bigger for
274
				TCP names - will ipv6 and sctp addresses fit? */
L
Linus Torvalds 已提交
275
	char userName[MAX_USERNAME_SIZE + 1];
S
Steve French 已提交
276 277
	char *domainName;
	char *password;
278
	struct session_key auth_key;
279
	struct ntlmssp_auth *ntlmssp; /* ciphertext, flags, server challenge */
S
Steve French 已提交
280
	bool need_reconnect:1; /* connection reset, uid now invalid */
L
Linus Torvalds 已提交
281
};
282
/* no more than one of the following three session flags may be set */
L
Linus Torvalds 已提交
283
#define CIFS_SES_NT4 1
284 285 286 287 288 289
#define CIFS_SES_OS2 2
#define CIFS_SES_W9X 4
/* following flag is set for old servers such as OS2 (and Win95?)
   which do not negotiate NTLM or POSIX dialects, but instead
   negotiate one of the older LANMAN dialects */
#define CIFS_SES_LANMAN 8
L
Linus Torvalds 已提交
290 291
/*
 * there is one of these for each connection to a resource on a particular
S
Steve French 已提交
292
 * session
L
Linus Torvalds 已提交
293 294
 */
struct cifsTconInfo {
295 296
	struct list_head tcon_list;
	int tc_count;
L
Linus Torvalds 已提交
297 298
	struct list_head openFileList;
	struct cifsSesInfo *ses;	/* pointer to session associated with */
299
	char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
L
Linus Torvalds 已提交
300
	char *nativeFileSystem;
J
Jeff Layton 已提交
301
	char *password;		/* for share-level security */
L
Linus Torvalds 已提交
302 303 304 305 306 307 308
	__u16 tid;		/* The 2 byte tree id */
	__u16 Flags;		/* optional support bits */
	enum statusEnum tidStatus;
#ifdef CONFIG_CIFS_STATS
	atomic_t num_smbs_sent;
	atomic_t num_writes;
	atomic_t num_reads;
309
	atomic_t num_flushes;
L
Linus Torvalds 已提交
310 311
	atomic_t num_oplock_brks;
	atomic_t num_opens;
312
	atomic_t num_closes;
L
Linus Torvalds 已提交
313 314
	atomic_t num_deletes;
	atomic_t num_mkdirs;
315 316
	atomic_t num_posixopens;
	atomic_t num_posixmkdirs;
L
Linus Torvalds 已提交
317 318 319
	atomic_t num_rmdirs;
	atomic_t num_renames;
	atomic_t num_t2renames;
320 321 322
	atomic_t num_ffirst;
	atomic_t num_fnext;
	atomic_t num_fclose;
323 324 325
	atomic_t num_hardlinks;
	atomic_t num_symlinks;
	atomic_t num_locks;
326 327
	atomic_t num_acl_get;
	atomic_t num_acl_set;
328 329 330 331 332 333 334 335 336 337 338 339 340 341
#ifdef CONFIG_CIFS_STATS2
	unsigned long long time_writes;
	unsigned long long time_reads;
	unsigned long long time_opens;
	unsigned long long time_deletes;
	unsigned long long time_closes;
	unsigned long long time_mkdirs;
	unsigned long long time_rmdirs;
	unsigned long long time_renames;
	unsigned long long time_t2renames;
	unsigned long long time_ffirst;
	unsigned long long time_fnext;
	unsigned long long time_fclose;
#endif /* CONFIG_CIFS_STATS2 */
L
Linus Torvalds 已提交
342 343 344
	__u64    bytes_read;
	__u64    bytes_written;
	spinlock_t stat_lock;
345
#endif /* CONFIG_CIFS_STATS */
L
Linus Torvalds 已提交
346
	FILE_SYSTEM_DEVICE_INFO fsDevInfo;
347
	FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */
L
Linus Torvalds 已提交
348
	FILE_SYSTEM_UNIX_INFO fsUnixInfo;
349 350 351
	bool ipc:1;		/* set if connection to IPC$ eg for RPC/PIPES */
	bool retry:1;
	bool nocase:1;
352
	bool seal:1;      /* transport encryption for this mounted share */
353
	bool unix_ext:1;  /* if false disable Linux extensions to CIFS protocol
354
				for this mount even if server would support */
S
Steve French 已提交
355
	bool local_lease:1; /* check leases (only) on local system not remote */
356
	bool broken_posix_open; /* e.g. Samba server versions < 3.3.2, 3.2.9 */
S
Steve French 已提交
357
	bool need_reconnect:1; /* connection reset, tid now invalid */
358 359 360 361
#ifdef CONFIG_CIFS_FSCACHE
	u64 resource_id;		/* server resource id */
	struct fscache_cookie *fscache;	/* cookie for share */
#endif
362
	/* BB add field for back pointer to sb struct(s)? */
L
Linus Torvalds 已提交
363 364
};

365 366 367 368 369 370 371
/*
 * This is a refcounted and timestamped container for a tcon pointer. The
 * container holds a tcon reference. It is considered safe to free one of
 * these when the tl_count goes to 0. The tl_time is the time of the last
 * "get" on the container.
 */
struct tcon_link {
J
Jeff Layton 已提交
372 373
	struct rb_node		tl_rbnode;
	uid_t			tl_uid;
374 375 376 377 378 379
	unsigned long		tl_flags;
#define TCON_LINK_MASTER	0
#define TCON_LINK_PENDING	1
#define TCON_LINK_IN_TREE	2
	unsigned long		tl_time;
	atomic_t		tl_count;
380 381 382
	struct cifsTconInfo	*tl_tcon;
};

383
extern struct tcon_link *cifs_sb_tlink(struct cifs_sb_info *cifs_sb);
384 385 386 387

static inline struct cifsTconInfo *
tlink_tcon(struct tcon_link *tlink)
{
388
	return tlink->tl_tcon;
389 390
}

391
extern void cifs_put_tlink(struct tcon_link *tlink);
392

393 394 395
static inline struct tcon_link *
cifs_get_tlink(struct tcon_link *tlink)
{
396 397
	if (tlink && !IS_ERR(tlink))
		atomic_inc(&tlink->tl_count);
398 399 400
	return tlink;
}

401
/* This function is always expected to succeed */
402
extern struct cifsTconInfo *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
403

L
Linus Torvalds 已提交
404
/*
J
[CIFS]  
Jeremy Allison 已提交
405 406
 * This info hangs off the cifsFileInfo structure, pointed to by llist.
 * This is used to track byte stream locks on the file
L
Linus Torvalds 已提交
407 408
 */
struct cifsLockInfo {
J
[CIFS]  
Jeremy Allison 已提交
409 410 411 412
	struct list_head llist;	/* pointer to next cifsLockInfo */
	__u64 offset;
	__u64 length;
	__u8 type;
L
Linus Torvalds 已提交
413 414 415 416 417 418 419 420 421 422
};

/*
 * One of these for each open instance of a file
 */
struct cifs_search_info {
	loff_t index_of_last_entry;
	__u16 entries_in_buffer;
	__u16 info_level;
	__u32 resume_key;
S
Steve French 已提交
423 424
	char *ntwrk_buf_start;
	char *srch_entries_start;
425
	char *last_entry;
S
Steve French 已提交
426
	char *presume_name;
L
Linus Torvalds 已提交
427
	unsigned int resume_name_len;
428 429 430 431
	bool endOfSearch:1;
	bool emptyDir:1;
	bool unicode:1;
	bool smallBuf:1; /* so we know which buf_release function to call */
L
Linus Torvalds 已提交
432 433 434 435 436 437 438 439 440 441
};

struct cifsFileInfo {
	struct list_head tlist;	/* pointer to next fid owned by tcon */
	struct list_head flist;	/* next fid (file instance) for this inode */
	unsigned int uid;	/* allows finding which FileInfo structure */
	__u32 pid;		/* process id who opened file */
	__u16 netfid;		/* file id from remote */
	/* BB add lock scope info here if needed */ ;
	/* lock scope id (0 if none) */
442
	struct dentry *dentry;
J
Jeff Layton 已提交
443
	unsigned int f_flags;
444
	struct tcon_link *tlink;
445
	struct mutex lock_mutex;
J
[CIFS]  
Jeremy Allison 已提交
446
	struct list_head llist; /* list of byte range locks we have. */
447
	bool invalidHandle:1;	/* file closed via session abend */
448
	bool oplock_break_cancelled:1;
449
	int count;		/* refcount protected by cifs_file_list_lock */
450
	struct mutex fh_mutex; /* prevents reopen race after dead ses*/
L
Linus Torvalds 已提交
451
	struct cifs_search_info srch_inf;
452
	struct work_struct oplock_break; /* work for oplock breaks */
L
Linus Torvalds 已提交
453 454
};

455 456 457 458
/*
 * Take a reference on the file private data. Must be called with
 * cifs_file_list_lock held.
 */
459 460
static inline void cifsFileInfo_get(struct cifsFileInfo *cifs_file)
{
461
	++cifs_file->count;
462 463
}

464
void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
465

L
Linus Torvalds 已提交
466 467 468 469 470 471
/*
 * One of these for each file inode
 */

struct cifsInodeInfo {
	struct list_head lockList;
S
Steve French 已提交
472
	/* BB add in lists for dirty pages i.e. write caching info for oplock */
L
Linus Torvalds 已提交
473 474
	struct list_head openFileList;
	__u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
475 476 477 478 479
	bool clientCanCacheRead;	/* read oplock */
	bool clientCanCacheAll;		/* read and writebehind oplock */
	bool delete_pending;		/* DELETE_ON_CLOSE is set */
	bool invalid_mapping;		/* pagecache is invalid */
	unsigned long time;		/* jiffies of last update of inode */
480
	u64  server_eof;		/* current file size on server */
481
	u64  uniqueid;			/* server inode number */
482
	u64  createtime;		/* creation time on server */
483 484 485
#ifdef CONFIG_CIFS_FSCACHE
	struct fscache_cookie *fscache;
#endif
L
Linus Torvalds 已提交
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
	struct inode vfs_inode;
};

static inline struct cifsInodeInfo *
CIFS_I(struct inode *inode)
{
	return container_of(inode, struct cifsInodeInfo, vfs_inode);
}

static inline struct cifs_sb_info *
CIFS_SB(struct super_block *sb)
{
	return sb->s_fs_info;
}

S
Steve French 已提交
501
static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
502 503 504 505 506 507
{
	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
		return '/';
	else
		return '\\';
}
L
Linus Torvalds 已提交
508

509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
#ifdef CONFIG_CIFS_STATS
#define cifs_stats_inc atomic_inc

static inline void cifs_stats_bytes_written(struct cifsTconInfo *tcon,
					    unsigned int bytes)
{
	if (bytes) {
		spin_lock(&tcon->stat_lock);
		tcon->bytes_written += bytes;
		spin_unlock(&tcon->stat_lock);
	}
}

static inline void cifs_stats_bytes_read(struct cifsTconInfo *tcon,
					 unsigned int bytes)
{
	spin_lock(&tcon->stat_lock);
	tcon->bytes_read += bytes;
	spin_unlock(&tcon->stat_lock);
}
#else

S
Steve French 已提交
531 532 533
#define  cifs_stats_inc(field) do {} while (0)
#define  cifs_stats_bytes_written(tcon, bytes) do {} while (0)
#define  cifs_stats_bytes_read(tcon, bytes) do {} while (0)
534 535 536

#endif

537 538 539 540 541 542 543 544 545 546 547 548
struct mid_q_entry;

/*
 * This is the prototype for the mid callback function. When creating one,
 * take special care to avoid deadlocks. Things to bear in mind:
 *
 * - it will be called by cifsd
 * - the GlobalMid_Lock will be held
 * - the mid will be removed from the pending_mid_q list
 */
typedef void (mid_callback_t)(struct mid_q_entry *mid);

L
Linus Torvalds 已提交
549 550 551 552 553 554
/* one of these for every pending CIFS request to the server */
struct mid_q_entry {
	struct list_head qhead;	/* mids waiting on reply from this server */
	__u16 mid;		/* multiplex id */
	__u16 pid;		/* process id */
	__u32 sequence_number;  /* for CIFS signing */
S
Steve French 已提交
555 556 557 558 559
	unsigned long when_alloc;  /* when mid was created */
#ifdef CONFIG_CIFS_STATS2
	unsigned long when_sent; /* time when smb send finished */
	unsigned long when_received; /* when demux complete (taken off wire) */
#endif
560 561
	mid_callback_t *callback; /* call completion callback */
	void *callback_data;	  /* general purpose pointer for callback */
L
Linus Torvalds 已提交
562 563
	struct smb_hdr *resp_buf;	/* response buffer */
	int midState;	/* wish this were enum but can not pass to wait_event */
564
	__u8 command;	/* smb command code */
565 566 567
	bool largeBuf:1;	/* if valid response, is pointer to large buf */
	bool multiRsp:1;	/* multiple trans2 responses for one request  */
	bool multiEnd:1;	/* both received */
L
Linus Torvalds 已提交
568 569 570 571
};

struct oplock_q_entry {
	struct list_head qhead;
S
Steve French 已提交
572 573
	struct inode *pinode;
	struct cifsTconInfo *tcon;
L
Linus Torvalds 已提交
574 575 576
	__u16 netfid;
};

577 578
/* for pending dnotify requests */
struct dir_notify_req {
579 580 581 582 583 584 585 586 587 588
	struct list_head lhead;
	__le16 Pid;
	__le16 PidHigh;
	__u16 Mid;
	__u16 Tid;
	__u16 Uid;
	__u16 netfid;
	__u32 filter; /* CompletionFilter (for multishot) */
	int multishot;
	struct file *pfile;
589 590
};

S
Steve French 已提交
591 592
struct dfs_info3_param {
	int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/
593
	int path_consumed;
S
Steve French 已提交
594 595 596 597 598 599
	int server_type;
	int ref_flag;
	char *path_name;
	char *node_name;
};

600 601 602 603 604 605
/*
 * common struct for holding inode info when searching for or updating an
 * inode with new info
 */

#define CIFS_FATTR_DFS_REFERRAL		0x1
606 607
#define CIFS_FATTR_DELETE_PENDING	0x2
#define CIFS_FATTR_NEED_REVAL		0x4
608
#define CIFS_FATTR_INO_COLLISION	0x8
609 610 611 612 613 614 615

struct cifs_fattr {
	u32		cf_flags;
	u32		cf_cifsattrs;
	u64		cf_uniqueid;
	u64		cf_eof;
	u64		cf_bytes;
616
	u64		cf_createtime;
617 618 619 620 621 622 623 624 625 626 627
	uid_t		cf_uid;
	gid_t		cf_gid;
	umode_t		cf_mode;
	dev_t		cf_rdev;
	unsigned int	cf_nlink;
	unsigned int	cf_dtype;
	struct timespec	cf_atime;
	struct timespec	cf_mtime;
	struct timespec	cf_ctime;
};

S
Steve French 已提交
628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
static inline void free_dfs_info_param(struct dfs_info3_param *param)
{
	if (param) {
		kfree(param->path_name);
		kfree(param->node_name);
		kfree(param);
	}
}

static inline void free_dfs_info_array(struct dfs_info3_param *param,
				       int number_of_items)
{
	int i;
	if ((number_of_items == 0) || (param == NULL))
		return;
	for (i = 0; i < number_of_items; i++) {
		kfree(param[i].path_name);
		kfree(param[i].node_name);
	}
	kfree(param);
}

L
Linus Torvalds 已提交
650 651 652 653 654 655
#define   MID_FREE 0
#define   MID_REQUEST_ALLOCATED 1
#define   MID_REQUEST_SUBMITTED 2
#define   MID_RESPONSE_RECEIVED 4
#define   MID_RETRY_NEEDED      8 /* session closed while this request out */
#define   MID_NO_RESP_NEEDED 0x10
656 657 658 659 660 661

/* Types of response buffer returned from SendReceive2 */
#define   CIFS_NO_BUFFER        0    /* Response buffer not returned */
#define   CIFS_SMALL_BUFFER     1
#define   CIFS_LARGE_BUFFER     2
#define   CIFS_IOVEC            4    /* array of response buffers */
L
Linus Torvalds 已提交
662

663
/* Type of Request to SendReceive2 */
664 665 666
#define   CIFS_BLOCKING_OP      1    /* operation can block */
#define   CIFS_ASYNC_OP         2    /* do not wait for response */
#define   CIFS_TIMEOUT_MASK 0x003    /* only one of above set in req */
667 668 669 670
#define   CIFS_LOG_ERROR    0x010    /* log NT STATUS if non-zero */
#define   CIFS_LARGE_BUF_OP 0x020    /* large request buffer */
#define   CIFS_NO_RESP      0x040    /* no response buffer required */

671 672 673 674 675 676 677 678
/* Security Flags: indicate type of session setup needed */
#define   CIFSSEC_MAY_SIGN	0x00001
#define   CIFSSEC_MAY_NTLM	0x00002
#define   CIFSSEC_MAY_NTLMV2	0x00004
#define   CIFSSEC_MAY_KRB5	0x00008
#ifdef CONFIG_CIFS_WEAK_PW_HASH
#define   CIFSSEC_MAY_LANMAN	0x00010
#define   CIFSSEC_MAY_PLNTXT	0x00020
679 680 681
#else
#define   CIFSSEC_MAY_LANMAN    0
#define   CIFSSEC_MAY_PLNTXT    0
682 683
#endif /* weak passwords */
#define   CIFSSEC_MAY_SEAL	0x00040 /* not supported yet */
684
#define   CIFSSEC_MAY_NTLMSSP	0x00080 /* raw ntlmssp with ntlmv2 */
685 686 687 688 689 690 691 692 693 694 695

#define   CIFSSEC_MUST_SIGN	0x01001
/* note that only one of the following can be set so the
result of setting MUST flags more than once will be to
require use of the stronger protocol */
#define   CIFSSEC_MUST_NTLM	0x02002
#define   CIFSSEC_MUST_NTLMV2	0x04004
#define   CIFSSEC_MUST_KRB5	0x08008
#ifdef CONFIG_CIFS_WEAK_PW_HASH
#define   CIFSSEC_MUST_LANMAN	0x10010
#define   CIFSSEC_MUST_PLNTXT	0x20020
696
#ifdef CONFIG_CIFS_UPCALL
C
Chuck Ebbert 已提交
697
#define   CIFSSEC_MASK          0xBF0BF /* allows weak security but also krb5 */
698
#else
C
Chuck Ebbert 已提交
699
#define   CIFSSEC_MASK          0xB70B7 /* current flags supported if weak */
700
#endif /* UPCALL */
701 702
#else /* do not allow weak pw hash */
#ifdef CONFIG_CIFS_UPCALL
703
#define   CIFSSEC_MASK          0x8F08F /* flags supported if no weak allowed */
S
Steve French 已提交
704
#else
705
#define	  CIFSSEC_MASK          0x87087 /* flags supported if no weak allowed */
706
#endif /* UPCALL */
707 708
#endif /* WEAK_PW_HASH */
#define   CIFSSEC_MUST_SEAL	0x40040 /* not supported yet */
709
#define   CIFSSEC_MUST_NTLMSSP	0x80080 /* raw ntlmssp with ntlmv2 */
710

711 712
#define   CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2)
#define   CIFSSEC_MAX (CIFSSEC_MUST_SIGN | CIFSSEC_MUST_NTLMV2)
713
#define   CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_LANMAN | CIFSSEC_MAY_PLNTXT | CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_NTLMSSP)
L
Linus Torvalds 已提交
714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
/*
 *****************************************************************
 * All constants go here
 *****************************************************************
 */

#define UID_HASH (16)

/*
 * Note that ONE module should define _DECLARE_GLOBALS_HERE to cause the
 * following to be declared.
 */

/****************************************************************************
 *  Locking notes.  All updates to global variables and lists should be
 *                  protected by spinlocks or semaphores.
 *
 *  Spinlocks
 *  ---------
 *  GlobalMid_Lock protects:
 *	list operations on pending_mid_q and oplockQ
 *      updates to XID counters, multiplex id  and SMB sequence numbers
736
 *  cifs_file_list_lock protects:
L
Linus Torvalds 已提交
737 738 739 740 741 742 743 744
 *	list operations on tcp and SMB session lists and tCon lists
 *  f_owner.lock protects certain per file struct operations
 *  mapping->page_lock protects certain per page operations
 *
 *  Semaphores
 *  ----------
 *  sesSem     operations on smb session
 *  tconSem    operations on tree connection
S
Steve French 已提交
745
 *  fh_sem      file handle reconnection operations
L
Linus Torvalds 已提交
746 747 748 749 750 751 752 753 754
 *
 ****************************************************************************/

#ifdef DECLARE_GLOBALS_HERE
#define GLOBAL_EXTERN
#else
#define GLOBAL_EXTERN extern
#endif

755 756
/*
 * the list of TCP_Server_Info structures, ie each of the sockets
757
 * connecting our client to a distinct server (ip address), is
758
 * chained together by cifs_tcp_ses_list. The list of all our SMB
759
 * sessions (and from that the tree connections) can be found
760 761 762 763
 * by iterating over cifs_tcp_ses_list
 */
GLOBAL_EXTERN struct list_head		cifs_tcp_ses_list;

764 765 766 767 768 769
/*
 * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
 * tcp session, and the list of tcon's per smb session. It also protects
 * the reference counters for the server, smb session, and tcon. Finally,
 * changes to the tcon->tidStatus should be done while holding this lock.
 */
770
GLOBAL_EXTERN spinlock_t		cifs_tcp_ses_lock;
771 772 773 774 775 776 777 778

/*
 * This lock protects the cifs_file->llist and cifs_file->flist
 * list operations, and updates to some flags (cifs_file->invalidHandle)
 * It will be moved to either use the tcon->stat_lock or equivalent later.
 * If cifs_tcp_ses_lock and the lock below are both needed to be held, then
 * the cifs_tcp_ses_lock must be grabbed first and released last.
 */
779
GLOBAL_EXTERN spinlock_t	cifs_file_list_lock;
L
Linus Torvalds 已提交
780

781 782 783 784
/* Outstanding dir notify requests */
GLOBAL_EXTERN struct list_head GlobalDnotifyReqList;
/* DirNotify response queue */
GLOBAL_EXTERN struct list_head GlobalDnotifyRsp_Q;
785

L
Linus Torvalds 已提交
786 787 788 789
/*
 * Global transaction id (XID) information
 */
GLOBAL_EXTERN unsigned int GlobalCurrentXid;	/* protected by GlobalMid_Sem */
790
GLOBAL_EXTERN unsigned int GlobalTotalActiveXid; /* prot by GlobalMid_Sem */
L
Linus Torvalds 已提交
791
GLOBAL_EXTERN unsigned int GlobalMaxActiveXid;	/* prot by GlobalMid_Sem */
792 793
GLOBAL_EXTERN spinlock_t GlobalMid_Lock;  /* protects above & list operations */
					  /* on midQ entries */
L
Linus Torvalds 已提交
794 795 796 797 798 799 800 801 802
/*
 *  Global counters, updated atomically
 */
GLOBAL_EXTERN atomic_t sesInfoAllocCount;
GLOBAL_EXTERN atomic_t tconInfoAllocCount;
GLOBAL_EXTERN atomic_t tcpSesAllocCount;
GLOBAL_EXTERN atomic_t tcpSesReconnectCount;
GLOBAL_EXTERN atomic_t tconInfoReconnectCount;

S
Steve French 已提交
803
/* Various Debug counters */
804 805 806 807 808 809
GLOBAL_EXTERN atomic_t bufAllocCount;    /* current number allocated  */
#ifdef CONFIG_CIFS_STATS2
GLOBAL_EXTERN atomic_t totBufAllocCount; /* total allocated over all time */
GLOBAL_EXTERN atomic_t totSmBufAllocCount;
#endif
GLOBAL_EXTERN atomic_t smBufAllocCount;
L
Linus Torvalds 已提交
810 811 812
GLOBAL_EXTERN atomic_t midCount;

/* Misc globals */
813
GLOBAL_EXTERN unsigned int multiuser_mount; /* if enabled allows new sessions
L
Linus Torvalds 已提交
814
				to be established on existing mount if we
S
Steve French 已提交
815
				have the uid/password or Kerberos credential
L
Linus Torvalds 已提交
816 817 818 819
				or equivalent for current user */
GLOBAL_EXTERN unsigned int oplockEnabled;
GLOBAL_EXTERN unsigned int experimEnabled;
GLOBAL_EXTERN unsigned int lookupCacheEnabled;
820
GLOBAL_EXTERN unsigned int global_secflags;	/* if on, session setup sent
L
Linus Torvalds 已提交
821 822 823 824 825 826 827 828
				with more secure ntlmssp2 challenge/resp */
GLOBAL_EXTERN unsigned int sign_CIFS_PDUs;  /* enable smb packet signing */
GLOBAL_EXTERN unsigned int linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/
GLOBAL_EXTERN unsigned int CIFSMaxBufSize;  /* max size not including hdr */
GLOBAL_EXTERN unsigned int cifs_min_rcv;    /* min size of big ntwrk buf pool */
GLOBAL_EXTERN unsigned int cifs_min_small;  /* min size of small buf pool */
GLOBAL_EXTERN unsigned int cifs_max_pending; /* MAX requests at once to server*/

829 830 831
/* reconnect after this many failed echo attempts */
GLOBAL_EXTERN unsigned short echo_retries;

832 833 834
void cifs_oplock_break(struct work_struct *work);
void cifs_oplock_break_get(struct cifsFileInfo *cfile);
void cifs_oplock_break_put(struct cifsFileInfo *cfile);
835

836
extern const struct slow_work_ops cifs_oplock_break_ops;
837 838

#endif	/* _CIFS_GLOB_H */