Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: LGPL-2.1 */
2/*
3 *
4 * Copyright (C) International Business Machines Corp., 2002,2008
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 * Jeremy Allison (jra@samba.org)
7 *
8 */
9#ifndef _CIFS_GLOB_H
10#define _CIFS_GLOB_H
11
12#include <linux/in.h>
13#include <linux/in6.h>
14#include <linux/inet.h>
15#include <linux/slab.h>
16#include <linux/scatterlist.h>
17#include <linux/mm.h>
18#include <linux/mempool.h>
19#include <linux/workqueue.h>
20#include <linux/utsname.h>
21#include <linux/sched/mm.h>
22#include <linux/netfs.h>
23#include "cifs_fs_sb.h"
24#include "cifsacl.h"
25#include <crypto/internal/hash.h>
26#include <uapi/linux/cifs/cifs_mount.h>
27#include "../common/smb2pdu.h"
28#include "smb2pdu.h"
29#include <linux/filelock.h>
30
31#define SMB_PATH_MAX 260
32#define CIFS_PORT 445
33#define RFC1001_PORT 139
34
35/*
36 * The sizes of various internal tables and strings
37 */
38#define MAX_UID_INFO 16
39#define MAX_SES_INFO 2
40#define MAX_TCON_INFO 4
41
42#define MAX_TREE_SIZE (2 + CIFS_NI_MAXHOST + 1 + CIFS_MAX_SHARE_LEN + 1)
43
44#define CIFS_MIN_RCV_POOL 4
45
46#define MAX_REOPEN_ATT 5 /* these many maximum attempts to reopen a file */
47/*
48 * default attribute cache timeout (jiffies)
49 */
50#define CIFS_DEF_ACTIMEO (1 * HZ)
51
52/*
53 * max sleep time before retry to server
54 */
55#define CIFS_MAX_SLEEP 2000
56
57/*
58 * max attribute cache timeout (jiffies) - 2^30
59 */
60#define CIFS_MAX_ACTIMEO (1 << 30)
61
62/*
63 * Max persistent and resilient handle timeout (milliseconds).
64 * Windows durable max was 960000 (16 minutes)
65 */
66#define SMB3_MAX_HANDLE_TIMEOUT 960000
67
68/*
69 * MAX_REQ is the maximum number of requests that WE will send
70 * on one socket concurrently.
71 */
72#define CIFS_MAX_REQ 32767
73
74#define RFC1001_NAME_LEN 15
75#define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)
76
77/* maximum length of ip addr as a string (including ipv6 and sctp) */
78#define SERVER_NAME_LENGTH 80
79#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
80
81/* echo interval in seconds */
82#define SMB_ECHO_INTERVAL_MIN 1
83#define SMB_ECHO_INTERVAL_MAX 600
84#define SMB_ECHO_INTERVAL_DEFAULT 60
85
86/* smb multichannel query server interfaces interval in seconds */
87#define SMB_INTERFACE_POLL_INTERVAL 600
88
89/* maximum number of PDUs in one compound */
90#define MAX_COMPOUND 5
91
92/*
93 * Default number of credits to keep available for SMB3.
94 * This value is chosen somewhat arbitrarily. The Windows client
95 * defaults to 128 credits, the Windows server allows clients up to
96 * 512 credits (or 8K for later versions), and the NetApp server
97 * does not limit clients at all. Choose a high enough default value
98 * such that the client shouldn't limit performance, but allow mount
99 * to override (until you approach 64K, where we limit credits to 65000
100 * to reduce possibility of seeing more server credit overflow bugs.
101 */
102#define SMB2_MAX_CREDITS_AVAILABLE 32000
103
104#include "cifspdu.h"
105
106#ifndef XATTR_DOS_ATTRIB
107#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
108#endif
109
110#define CIFS_MAX_WORKSTATION_LEN (__NEW_UTS_LEN + 1) /* reasonable max for client */
111
112#define CIFS_DFS_ROOT_SES(ses) ((ses)->dfs_root_ses ?: (ses))
113
114/*
115 * CIFS vfs client Status information (based on what we know.)
116 */
117
118/* associated with each connection */
119enum statusEnum {
120 CifsNew = 0,
121 CifsGood,
122 CifsExiting,
123 CifsNeedReconnect,
124 CifsNeedNegotiate,
125 CifsInNegotiate,
126};
127
128/* associated with each smb session */
129enum ses_status_enum {
130 SES_NEW = 0,
131 SES_GOOD,
132 SES_EXITING,
133 SES_NEED_RECON,
134 SES_IN_SETUP
135};
136
137/* associated with each tree connection to the server */
138enum tid_status_enum {
139 TID_NEW = 0,
140 TID_GOOD,
141 TID_EXITING,
142 TID_NEED_RECON,
143 TID_NEED_TCON,
144 TID_IN_TCON,
145 TID_NEED_FILES_INVALIDATE, /* currently unused */
146 TID_IN_FILES_INVALIDATE
147};
148
149enum securityEnum {
150 Unspecified = 0, /* not specified */
151 NTLMv2, /* Legacy NTLM auth with NTLMv2 hash */
152 RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */
153 Kerberos, /* Kerberos via SPNEGO */
154};
155
156struct session_key {
157 unsigned int len;
158 char *response;
159};
160
161/* crypto hashing related structure/fields, not specific to a sec mech */
162struct cifs_secmech {
163 struct shash_desc *hmacmd5; /* hmacmd5 hash function, for NTLMv2/CR1 hashes */
164 struct shash_desc *md5; /* md5 hash function, for CIFS/SMB1 signatures */
165 struct shash_desc *hmacsha256; /* hmac-sha256 hash function, for SMB2 signatures */
166 struct shash_desc *sha512; /* sha512 hash function, for SMB3.1.1 preauth hash */
167 struct shash_desc *aes_cmac; /* block-cipher based MAC function, for SMB3 signatures */
168
169 struct crypto_aead *enc; /* smb3 encryption AEAD TFM (AES-CCM and AES-GCM) */
170 struct crypto_aead *dec; /* smb3 decryption AEAD TFM (AES-CCM and AES-GCM) */
171};
172
173/* per smb session structure/fields */
174struct ntlmssp_auth {
175 bool sesskey_per_smbsess; /* whether session key is per smb session */
176 __u32 client_flags; /* sent by client in type 1 ntlmsssp exchange */
177 __u32 server_flags; /* sent by server in type 2 ntlmssp exchange */
178 unsigned char ciphertext[CIFS_CPHTXT_SIZE]; /* sent to server */
179 char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlmssp */
180};
181
182struct cifs_cred {
183 int uid;
184 int gid;
185 int mode;
186 int cecount;
187 struct cifs_sid osid;
188 struct cifs_sid gsid;
189 struct cifs_ntace *ntaces;
190 struct cifs_ace *aces;
191};
192
193struct cifs_open_info_data {
194 bool adjust_tz;
195 union {
196 bool reparse_point;
197 bool symlink;
198 };
199 struct {
200 /* ioctl response buffer */
201 struct {
202 int buftype;
203 struct kvec iov;
204 } io;
205 __u32 tag;
206 union {
207 struct reparse_data_buffer *buf;
208 struct reparse_posix_data *posix;
209 };
210 } reparse;
211 char *symlink_target;
212 struct cifs_sid posix_owner;
213 struct cifs_sid posix_group;
214 union {
215 struct smb2_file_all_info fi;
216 struct smb311_posix_qinfo posix_fi;
217 };
218};
219
220static inline bool cifs_open_data_reparse(struct cifs_open_info_data *data)
221{
222 struct smb2_file_all_info *fi = &data->fi;
223 u32 attrs = le32_to_cpu(fi->Attributes);
224 bool ret;
225
226 ret = data->reparse_point || (attrs & ATTR_REPARSE);
227 if (ret)
228 attrs |= ATTR_REPARSE;
229 fi->Attributes = cpu_to_le32(attrs);
230 return ret;
231}
232
233/*
234 *****************************************************************
235 * Except the CIFS PDUs themselves all the
236 * globally interesting structs should go here
237 *****************************************************************
238 */
239
240/*
241 * A smb_rqst represents a complete request to be issued to a server. It's
242 * formed by a kvec array, followed by an array of pages. Page data is assumed
243 * to start at the beginning of the first page.
244 */
245struct smb_rqst {
246 struct kvec *rq_iov; /* array of kvecs */
247 unsigned int rq_nvec; /* number of kvecs in array */
248 size_t rq_iter_size; /* Amount of data in ->rq_iter */
249 struct iov_iter rq_iter; /* Data iterator */
250 struct xarray rq_buffer; /* Page buffer for encryption */
251};
252
253struct mid_q_entry;
254struct TCP_Server_Info;
255struct cifsFileInfo;
256struct cifs_ses;
257struct cifs_tcon;
258struct dfs_info3_param;
259struct cifs_fattr;
260struct smb3_fs_context;
261struct cifs_fid;
262struct cifs_readdata;
263struct cifs_writedata;
264struct cifs_io_parms;
265struct cifs_search_info;
266struct cifsInodeInfo;
267struct cifs_open_parms;
268struct cifs_credits;
269
270struct smb_version_operations {
271 int (*send_cancel)(struct TCP_Server_Info *, struct smb_rqst *,
272 struct mid_q_entry *);
273 bool (*compare_fids)(struct cifsFileInfo *, struct cifsFileInfo *);
274 /* setup request: allocate mid, sign message */
275 struct mid_q_entry *(*setup_request)(struct cifs_ses *,
276 struct TCP_Server_Info *,
277 struct smb_rqst *);
278 /* setup async request: allocate mid, sign message */
279 struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *,
280 struct smb_rqst *);
281 /* check response: verify signature, map error */
282 int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *,
283 bool);
284 void (*add_credits)(struct TCP_Server_Info *server,
285 const struct cifs_credits *credits,
286 const int optype);
287 void (*set_credits)(struct TCP_Server_Info *, const int);
288 int * (*get_credits_field)(struct TCP_Server_Info *, const int);
289 unsigned int (*get_credits)(struct mid_q_entry *);
290 __u64 (*get_next_mid)(struct TCP_Server_Info *);
291 void (*revert_current_mid)(struct TCP_Server_Info *server,
292 const unsigned int val);
293 /* data offset from read response message */
294 unsigned int (*read_data_offset)(char *);
295 /*
296 * Data length from read response message
297 * When in_remaining is true, the returned data length is in
298 * message field DataRemaining for out-of-band data read (e.g through
299 * Memory Registration RDMA write in SMBD).
300 * Otherwise, the returned data length is in message field DataLength.
301 */
302 unsigned int (*read_data_length)(char *, bool in_remaining);
303 /* map smb to linux error */
304 int (*map_error)(char *, bool);
305 /* find mid corresponding to the response message */
306 struct mid_q_entry * (*find_mid)(struct TCP_Server_Info *, char *);
307 void (*dump_detail)(void *buf, struct TCP_Server_Info *ptcp_info);
308 void (*clear_stats)(struct cifs_tcon *);
309 void (*print_stats)(struct seq_file *m, struct cifs_tcon *);
310 void (*dump_share_caps)(struct seq_file *, struct cifs_tcon *);
311 /* verify the message */
312 int (*check_message)(char *, unsigned int, struct TCP_Server_Info *);
313 bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
314 int (*handle_cancelled_mid)(struct mid_q_entry *, struct TCP_Server_Info *);
315 void (*downgrade_oplock)(struct TCP_Server_Info *server,
316 struct cifsInodeInfo *cinode, __u32 oplock,
317 unsigned int epoch, bool *purge_cache);
318 /* process transaction2 response */
319 bool (*check_trans2)(struct mid_q_entry *, struct TCP_Server_Info *,
320 char *, int);
321 /* check if we need to negotiate */
322 bool (*need_neg)(struct TCP_Server_Info *);
323 /* negotiate to the server */
324 int (*negotiate)(const unsigned int xid,
325 struct cifs_ses *ses,
326 struct TCP_Server_Info *server);
327 /* set negotiated write size */
328 unsigned int (*negotiate_wsize)(struct cifs_tcon *tcon, struct smb3_fs_context *ctx);
329 /* set negotiated read size */
330 unsigned int (*negotiate_rsize)(struct cifs_tcon *tcon, struct smb3_fs_context *ctx);
331 /* setup smb sessionn */
332 int (*sess_setup)(const unsigned int, struct cifs_ses *,
333 struct TCP_Server_Info *server,
334 const struct nls_table *);
335 /* close smb session */
336 int (*logoff)(const unsigned int, struct cifs_ses *);
337 /* connect to a server share */
338 int (*tree_connect)(const unsigned int, struct cifs_ses *, const char *,
339 struct cifs_tcon *, const struct nls_table *);
340 /* close tree connecion */
341 int (*tree_disconnect)(const unsigned int, struct cifs_tcon *);
342 /* get DFS referrals */
343 int (*get_dfs_refer)(const unsigned int, struct cifs_ses *,
344 const char *, struct dfs_info3_param **,
345 unsigned int *, const struct nls_table *, int);
346 /* informational QFS call */
347 void (*qfs_tcon)(const unsigned int, struct cifs_tcon *,
348 struct cifs_sb_info *);
349 /* check if a path is accessible or not */
350 int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
351 struct cifs_sb_info *, const char *);
352 /* query path data from the server */
353 int (*query_path_info)(const unsigned int xid,
354 struct cifs_tcon *tcon,
355 struct cifs_sb_info *cifs_sb,
356 const char *full_path,
357 struct cifs_open_info_data *data);
358 /* query file data from the server */
359 int (*query_file_info)(const unsigned int xid, struct cifs_tcon *tcon,
360 struct cifsFileInfo *cfile, struct cifs_open_info_data *data);
361 /* query reparse point to determine which type of special file */
362 int (*query_reparse_point)(const unsigned int xid,
363 struct cifs_tcon *tcon,
364 struct cifs_sb_info *cifs_sb,
365 const char *full_path,
366 u32 *tag, struct kvec *rsp,
367 int *rsp_buftype);
368 /* get server index number */
369 int (*get_srv_inum)(const unsigned int xid, struct cifs_tcon *tcon,
370 struct cifs_sb_info *cifs_sb, const char *full_path, u64 *uniqueid,
371 struct cifs_open_info_data *data);
372 /* set size by path */
373 int (*set_path_size)(const unsigned int, struct cifs_tcon *,
374 const char *, __u64, struct cifs_sb_info *, bool);
375 /* set size by file handle */
376 int (*set_file_size)(const unsigned int, struct cifs_tcon *,
377 struct cifsFileInfo *, __u64, bool);
378 /* set attributes */
379 int (*set_file_info)(struct inode *, const char *, FILE_BASIC_INFO *,
380 const unsigned int);
381 int (*set_compression)(const unsigned int, struct cifs_tcon *,
382 struct cifsFileInfo *);
383 /* check if we can send an echo or nor */
384 bool (*can_echo)(struct TCP_Server_Info *);
385 /* send echo request */
386 int (*echo)(struct TCP_Server_Info *);
387 /* create directory */
388 int (*posix_mkdir)(const unsigned int xid, struct inode *inode,
389 umode_t mode, struct cifs_tcon *tcon,
390 const char *full_path,
391 struct cifs_sb_info *cifs_sb);
392 int (*mkdir)(const unsigned int xid, struct inode *inode, umode_t mode,
393 struct cifs_tcon *tcon, const char *name,
394 struct cifs_sb_info *sb);
395 /* set info on created directory */
396 void (*mkdir_setinfo)(struct inode *, const char *,
397 struct cifs_sb_info *, struct cifs_tcon *,
398 const unsigned int);
399 /* remove directory */
400 int (*rmdir)(const unsigned int, struct cifs_tcon *, const char *,
401 struct cifs_sb_info *);
402 /* unlink file */
403 int (*unlink)(const unsigned int, struct cifs_tcon *, const char *,
404 struct cifs_sb_info *);
405 /* open, rename and delete file */
406 int (*rename_pending_delete)(const char *, struct dentry *,
407 const unsigned int);
408 /* send rename request */
409 int (*rename)(const unsigned int xid,
410 struct cifs_tcon *tcon,
411 struct dentry *source_dentry,
412 const char *from_name, const char *to_name,
413 struct cifs_sb_info *cifs_sb);
414 /* send create hardlink request */
415 int (*create_hardlink)(const unsigned int xid,
416 struct cifs_tcon *tcon,
417 struct dentry *source_dentry,
418 const char *from_name, const char *to_name,
419 struct cifs_sb_info *cifs_sb);
420 /* query symlink target */
421 int (*query_symlink)(const unsigned int xid,
422 struct cifs_tcon *tcon,
423 struct cifs_sb_info *cifs_sb,
424 const char *full_path,
425 char **target_path);
426 /* open a file for non-posix mounts */
427 int (*open)(const unsigned int xid, struct cifs_open_parms *oparms, __u32 *oplock,
428 void *buf);
429 /* set fid protocol-specific info */
430 void (*set_fid)(struct cifsFileInfo *, struct cifs_fid *, __u32);
431 /* close a file */
432 void (*close)(const unsigned int, struct cifs_tcon *,
433 struct cifs_fid *);
434 /* close a file, returning file attributes and timestamps */
435 void (*close_getattr)(const unsigned int xid, struct cifs_tcon *tcon,
436 struct cifsFileInfo *pfile_info);
437 /* send a flush request to the server */
438 int (*flush)(const unsigned int, struct cifs_tcon *, struct cifs_fid *);
439 /* async read from the server */
440 int (*async_readv)(struct cifs_readdata *);
441 /* async write to the server */
442 int (*async_writev)(struct cifs_writedata *,
443 void (*release)(struct kref *));
444 /* sync read from the server */
445 int (*sync_read)(const unsigned int, struct cifs_fid *,
446 struct cifs_io_parms *, unsigned int *, char **,
447 int *);
448 /* sync write to the server */
449 int (*sync_write)(const unsigned int, struct cifs_fid *,
450 struct cifs_io_parms *, unsigned int *, struct kvec *,
451 unsigned long);
452 /* open dir, start readdir */
453 int (*query_dir_first)(const unsigned int, struct cifs_tcon *,
454 const char *, struct cifs_sb_info *,
455 struct cifs_fid *, __u16,
456 struct cifs_search_info *);
457 /* continue readdir */
458 int (*query_dir_next)(const unsigned int, struct cifs_tcon *,
459 struct cifs_fid *,
460 __u16, struct cifs_search_info *srch_inf);
461 /* close dir */
462 int (*close_dir)(const unsigned int, struct cifs_tcon *,
463 struct cifs_fid *);
464 /* calculate a size of SMB message */
465 unsigned int (*calc_smb_size)(void *buf);
466 /* check for STATUS_PENDING and process the response if yes */
467 bool (*is_status_pending)(char *buf, struct TCP_Server_Info *server);
468 /* check for STATUS_NETWORK_SESSION_EXPIRED */
469 bool (*is_session_expired)(char *);
470 /* send oplock break response */
471 int (*oplock_response)(struct cifs_tcon *tcon, __u64 persistent_fid, __u64 volatile_fid,
472 __u16 net_fid, struct cifsInodeInfo *cifs_inode);
473 /* query remote filesystem */
474 int (*queryfs)(const unsigned int, struct cifs_tcon *,
475 struct cifs_sb_info *, struct kstatfs *);
476 /* send mandatory brlock to the server */
477 int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
478 __u64, __u32, int, int, bool);
479 /* unlock range of mandatory locks */
480 int (*mand_unlock_range)(struct cifsFileInfo *, struct file_lock *,
481 const unsigned int);
482 /* push brlocks from the cache to the server */
483 int (*push_mand_locks)(struct cifsFileInfo *);
484 /* get lease key of the inode */
485 void (*get_lease_key)(struct inode *, struct cifs_fid *);
486 /* set lease key of the inode */
487 void (*set_lease_key)(struct inode *, struct cifs_fid *);
488 /* generate new lease key */
489 void (*new_lease_key)(struct cifs_fid *);
490 int (*generate_signingkey)(struct cifs_ses *ses,
491 struct TCP_Server_Info *server);
492 int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *,
493 bool allocate_crypto);
494 int (*set_integrity)(const unsigned int, struct cifs_tcon *tcon,
495 struct cifsFileInfo *src_file);
496 int (*enum_snapshots)(const unsigned int xid, struct cifs_tcon *tcon,
497 struct cifsFileInfo *src_file, void __user *);
498 int (*notify)(const unsigned int xid, struct file *pfile,
499 void __user *pbuf, bool return_changes);
500 int (*query_mf_symlink)(unsigned int, struct cifs_tcon *,
501 struct cifs_sb_info *, const unsigned char *,
502 char *, unsigned int *);
503 int (*create_mf_symlink)(unsigned int, struct cifs_tcon *,
504 struct cifs_sb_info *, const unsigned char *,
505 char *, unsigned int *);
506 /* if we can do cache read operations */
507 bool (*is_read_op)(__u32);
508 /* set oplock level for the inode */
509 void (*set_oplock_level)(struct cifsInodeInfo *, __u32, unsigned int,
510 bool *);
511 /* create lease context buffer for CREATE request */
512 char * (*create_lease_buf)(u8 *lease_key, u8 oplock);
513 /* parse lease context buffer and return oplock/epoch info */
514 __u8 (*parse_lease_buf)(void *buf, unsigned int *epoch, char *lkey);
515 ssize_t (*copychunk_range)(const unsigned int,
516 struct cifsFileInfo *src_file,
517 struct cifsFileInfo *target_file,
518 u64 src_off, u64 len, u64 dest_off);
519 int (*duplicate_extents)(const unsigned int, struct cifsFileInfo *src,
520 struct cifsFileInfo *target_file, u64 src_off, u64 len,
521 u64 dest_off);
522 int (*validate_negotiate)(const unsigned int, struct cifs_tcon *);
523 ssize_t (*query_all_EAs)(const unsigned int, struct cifs_tcon *,
524 const unsigned char *, const unsigned char *, char *,
525 size_t, struct cifs_sb_info *);
526 int (*set_EA)(const unsigned int, struct cifs_tcon *, const char *,
527 const char *, const void *, const __u16,
528 const struct nls_table *, struct cifs_sb_info *);
529 struct cifs_ntsd * (*get_acl)(struct cifs_sb_info *, struct inode *,
530 const char *, u32 *, u32);
531 struct cifs_ntsd * (*get_acl_by_fid)(struct cifs_sb_info *,
532 const struct cifs_fid *, u32 *, u32);
533 int (*set_acl)(struct cifs_ntsd *, __u32, struct inode *, const char *,
534 int);
535 /* writepages retry size */
536 unsigned int (*wp_retry_size)(struct inode *);
537 /* get mtu credits */
538 int (*wait_mtu_credits)(struct TCP_Server_Info *, unsigned int,
539 unsigned int *, struct cifs_credits *);
540 /* adjust previously taken mtu credits to request size */
541 int (*adjust_credits)(struct TCP_Server_Info *server,
542 struct cifs_credits *credits,
543 const unsigned int payload_size);
544 /* check if we need to issue closedir */
545 bool (*dir_needs_close)(struct cifsFileInfo *);
546 long (*fallocate)(struct file *, struct cifs_tcon *, int, loff_t,
547 loff_t);
548 /* init transform request - used for encryption for now */
549 int (*init_transform_rq)(struct TCP_Server_Info *, int num_rqst,
550 struct smb_rqst *, struct smb_rqst *);
551 int (*is_transform_hdr)(void *buf);
552 int (*receive_transform)(struct TCP_Server_Info *,
553 struct mid_q_entry **, char **, int *);
554 enum securityEnum (*select_sectype)(struct TCP_Server_Info *,
555 enum securityEnum);
556 int (*next_header)(struct TCP_Server_Info *server, char *buf,
557 unsigned int *noff);
558 /* ioctl passthrough for query_info */
559 int (*ioctl_query_info)(const unsigned int xid,
560 struct cifs_tcon *tcon,
561 struct cifs_sb_info *cifs_sb,
562 __le16 *path, int is_dir,
563 unsigned long p);
564 /* make unix special files (block, char, fifo, socket) */
565 int (*make_node)(unsigned int xid,
566 struct inode *inode,
567 struct dentry *dentry,
568 struct cifs_tcon *tcon,
569 const char *full_path,
570 umode_t mode,
571 dev_t device_number);
572 /* version specific fiemap implementation */
573 int (*fiemap)(struct cifs_tcon *tcon, struct cifsFileInfo *,
574 struct fiemap_extent_info *, u64, u64);
575 /* version specific llseek implementation */
576 loff_t (*llseek)(struct file *, struct cifs_tcon *, loff_t, int);
577 /* Check for STATUS_IO_TIMEOUT */
578 bool (*is_status_io_timeout)(char *buf);
579 /* Check for STATUS_NETWORK_NAME_DELETED */
580 bool (*is_network_name_deleted)(char *buf, struct TCP_Server_Info *srv);
581 int (*parse_reparse_point)(struct cifs_sb_info *cifs_sb,
582 struct kvec *rsp_iov,
583 struct cifs_open_info_data *data);
584 int (*create_reparse_symlink)(const unsigned int xid,
585 struct inode *inode,
586 struct dentry *dentry,
587 struct cifs_tcon *tcon,
588 const char *full_path,
589 const char *symname);
590};
591
592struct smb_version_values {
593 char *version_string;
594 __u16 protocol_id;
595 __u32 req_capabilities;
596 __u32 large_lock_type;
597 __u32 exclusive_lock_type;
598 __u32 shared_lock_type;
599 __u32 unlock_lock_type;
600 size_t header_preamble_size;
601 size_t header_size;
602 size_t max_header_size;
603 size_t read_rsp_size;
604 __le16 lock_cmd;
605 unsigned int cap_unix;
606 unsigned int cap_nt_find;
607 unsigned int cap_large_files;
608 __u16 signing_enabled;
609 __u16 signing_required;
610 size_t create_lease_size;
611};
612
613#define HEADER_SIZE(server) (server->vals->header_size)
614#define MAX_HEADER_SIZE(server) (server->vals->max_header_size)
615#define HEADER_PREAMBLE_SIZE(server) (server->vals->header_preamble_size)
616#define MID_HEADER_SIZE(server) (HEADER_SIZE(server) - 1 - HEADER_PREAMBLE_SIZE(server))
617
618/**
619 * CIFS superblock mount flags (mnt_cifs_flags) to consider when
620 * trying to reuse existing superblock for a new mount
621 */
622#define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID | \
623 CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | \
624 CIFS_MOUNT_NO_XATTR | CIFS_MOUNT_MAP_SPECIAL_CHR | \
625 CIFS_MOUNT_MAP_SFM_CHR | \
626 CIFS_MOUNT_UNX_EMUL | CIFS_MOUNT_NO_BRL | \
627 CIFS_MOUNT_CIFS_ACL | CIFS_MOUNT_OVERR_UID | \
628 CIFS_MOUNT_OVERR_GID | CIFS_MOUNT_DYNPERM | \
629 CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC | \
630 CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | \
631 CIFS_MOUNT_MULTIUSER | CIFS_MOUNT_STRICT_IO | \
632 CIFS_MOUNT_CIFS_BACKUPUID | CIFS_MOUNT_CIFS_BACKUPGID | \
633 CIFS_MOUNT_UID_FROM_ACL | CIFS_MOUNT_NO_HANDLE_CACHE | \
634 CIFS_MOUNT_NO_DFS | CIFS_MOUNT_MODE_FROM_SID | \
635 CIFS_MOUNT_RO_CACHE | CIFS_MOUNT_RW_CACHE)
636
637/**
638 * Generic VFS superblock mount flags (s_flags) to consider when
639 * trying to reuse existing superblock for a new mount
640 */
641#define CIFS_MS_MASK (SB_RDONLY | SB_MANDLOCK | SB_NOEXEC | SB_NOSUID | \
642 SB_NODEV | SB_SYNCHRONOUS)
643
644struct cifs_mnt_data {
645 struct cifs_sb_info *cifs_sb;
646 struct smb3_fs_context *ctx;
647 int flags;
648};
649
650static inline unsigned int
651get_rfc1002_length(void *buf)
652{
653 return be32_to_cpu(*((__be32 *)buf)) & 0xffffff;
654}
655
656static inline void
657inc_rfc1001_len(void *buf, int count)
658{
659 be32_add_cpu((__be32 *)buf, count);
660}
661
662struct TCP_Server_Info {
663 struct list_head tcp_ses_list;
664 struct list_head smb_ses_list;
665 spinlock_t srv_lock; /* protect anything here that is not protected */
666 __u64 conn_id; /* connection identifier (useful for debugging) */
667 int srv_count; /* reference counter */
668 /* 15 character server name + 0x20 16th byte indicating type = srv */
669 char server_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
670 struct smb_version_operations *ops;
671 struct smb_version_values *vals;
672 /* updates to tcpStatus protected by cifs_tcp_ses_lock */
673 enum statusEnum tcpStatus; /* what we think the status is */
674 char *hostname; /* hostname portion of UNC string */
675 struct socket *ssocket;
676 struct sockaddr_storage dstaddr;
677 struct sockaddr_storage srcaddr; /* locally bind to this IP */
678#ifdef CONFIG_NET_NS
679 struct net *net;
680#endif
681 wait_queue_head_t response_q;
682 wait_queue_head_t request_q; /* if more than maxmpx to srvr must block*/
683 spinlock_t mid_lock; /* protect mid queue and it's entries */
684 struct list_head pending_mid_q;
685 bool noblocksnd; /* use blocking sendmsg */
686 bool noautotune; /* do not autotune send buf sizes */
687 bool nosharesock;
688 bool tcp_nodelay;
689 bool terminate;
690 unsigned int credits; /* send no more requests at once */
691 unsigned int max_credits; /* can override large 32000 default at mnt */
692 unsigned int in_flight; /* number of requests on the wire to server */
693 unsigned int max_in_flight; /* max number of requests that were on wire */
694 spinlock_t req_lock; /* protect the two values above */
695 struct mutex _srv_mutex;
696 unsigned int nofs_flag;
697 struct task_struct *tsk;
698 char server_GUID[16];
699 __u16 sec_mode;
700 bool sign; /* is signing enabled on this connection? */
701 bool ignore_signature:1; /* skip validation of signatures in SMB2/3 rsp */
702 bool session_estab; /* mark when very first sess is established */
703 int echo_credits; /* echo reserved slots */
704 int oplock_credits; /* oplock break reserved slots */
705 bool echoes:1; /* enable echoes */
706 __u8 client_guid[SMB2_CLIENT_GUID_SIZE]; /* Client GUID */
707 u16 dialect; /* dialect index that server chose */
708 bool oplocks:1; /* enable oplocks */
709 unsigned int maxReq; /* Clients should submit no more */
710 /* than maxReq distinct unanswered SMBs to the server when using */
711 /* multiplexed reads or writes (for SMB1/CIFS only, not SMB2/SMB3) */
712 unsigned int maxBuf; /* maxBuf specifies the maximum */
713 /* message size the server can send or receive for non-raw SMBs */
714 /* maxBuf is returned by SMB NegotiateProtocol so maxBuf is only 0 */
715 /* when socket is setup (and during reconnect) before NegProt sent */
716 unsigned int max_rw; /* maxRw specifies the maximum */
717 /* message size the server can send or receive for */
718 /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
719 unsigned int capabilities; /* selective disabling of caps by smb sess */
720 int timeAdj; /* Adjust for difference in server time zone in sec */
721 __u64 CurrentMid; /* multiplex id - rotating counter, protected by GlobalMid_Lock */
722 char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlm, ntlmv2 etc */
723 /* 16th byte of RFC1001 workstation name is always null */
724 char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
725 __u32 sequence_number; /* for signing, protected by srv_mutex */
726 __u32 reconnect_instance; /* incremented on each reconnect */
727 struct session_key session_key;
728 unsigned long lstrp; /* when we got last response from this server */
729 struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */
730#define CIFS_NEGFLAVOR_UNENCAP 1 /* wct == 17, but no ext_sec */
731#define CIFS_NEGFLAVOR_EXTENDED 2 /* wct == 17, ext_sec bit set */
732 char negflavor; /* NEGOTIATE response flavor */
733 /* extended security flavors that server supports */
734 bool sec_ntlmssp; /* supports NTLMSSP */
735 bool sec_kerberosu2u; /* supports U2U Kerberos */
736 bool sec_kerberos; /* supports plain Kerberos */
737 bool sec_mskerberos; /* supports legacy MS Kerberos */
738 bool large_buf; /* is current buffer large? */
739 /* use SMBD connection instead of socket */
740 bool rdma;
741 /* point to the SMBD connection if RDMA is used instead of socket */
742 struct smbd_connection *smbd_conn;
743 struct delayed_work echo; /* echo ping workqueue job */
744 char *smallbuf; /* pointer to current "small" buffer */
745 char *bigbuf; /* pointer to current "big" buffer */
746 /* Total size of this PDU. Only valid from cifs_demultiplex_thread */
747 unsigned int pdu_size;
748 unsigned int total_read; /* total amount of data read in this pass */
749 atomic_t in_send; /* requests trying to send */
750 atomic_t num_waiters; /* blocked waiting to get in sendrecv */
751#ifdef CONFIG_CIFS_STATS2
752 atomic_t num_cmds[NUMBER_OF_SMB2_COMMANDS]; /* total requests by cmd */
753 atomic_t smb2slowcmd[NUMBER_OF_SMB2_COMMANDS]; /* count resps > 1 sec */
754 __u64 time_per_cmd[NUMBER_OF_SMB2_COMMANDS]; /* total time per cmd */
755 __u32 slowest_cmd[NUMBER_OF_SMB2_COMMANDS];
756 __u32 fastest_cmd[NUMBER_OF_SMB2_COMMANDS];
757#endif /* STATS2 */
758 unsigned int max_read;
759 unsigned int max_write;
760 unsigned int min_offload;
761 unsigned int retrans;
762 __le16 compress_algorithm;
763 __u16 signing_algorithm;
764 __le16 cipher_type;
765 /* save initital negprot hash */
766 __u8 preauth_sha_hash[SMB2_PREAUTH_HASH_SIZE];
767 bool signing_negotiated; /* true if valid signing context rcvd from server */
768 bool posix_ext_supported;
769 struct delayed_work reconnect; /* reconnect workqueue job */
770 struct mutex reconnect_mutex; /* prevent simultaneous reconnects */
771 unsigned long echo_interval;
772
773 /*
774 * Number of targets available for reconnect. The more targets
775 * the more tasks have to wait to let the demultiplex thread
776 * reconnect.
777 */
778 int nr_targets;
779 bool noblockcnt; /* use non-blocking connect() */
780
781 /*
782 * If this is a session channel,
783 * primary_server holds the ref-counted
784 * pointer to primary channel connection for the session.
785 */
786#define SERVER_IS_CHAN(server) (!!(server)->primary_server)
787 struct TCP_Server_Info *primary_server;
788 __u16 channel_sequence_num; /* incremented on primary channel on each chan reconnect */
789
790#ifdef CONFIG_CIFS_SWN_UPCALL
791 bool use_swn_dstaddr;
792 struct sockaddr_storage swn_dstaddr;
793#endif
794 struct mutex refpath_lock; /* protects leaf_fullpath */
795 /*
796 * leaf_fullpath: Canonical DFS referral path related to this
797 * connection.
798 * It is used in DFS cache refresher, reconnect and may
799 * change due to nested DFS links.
800 *
801 * Protected by @refpath_lock and @srv_lock. The @refpath_lock is
802 * mostly used for not requiring a copy of @leaf_fullpath when getting
803 * cached or new DFS referrals (which might also sleep during I/O).
804 * While @srv_lock is held for making string and NULL comparions against
805 * both fields as in mount(2) and cache refresh.
806 *
807 * format: \\HOST\SHARE[\OPTIONAL PATH]
808 */
809 char *leaf_fullpath;
810};
811
812static inline bool is_smb1(struct TCP_Server_Info *server)
813{
814 return HEADER_PREAMBLE_SIZE(server) != 0;
815}
816
817static inline void cifs_server_lock(struct TCP_Server_Info *server)
818{
819 unsigned int nofs_flag = memalloc_nofs_save();
820
821 mutex_lock(&server->_srv_mutex);
822 server->nofs_flag = nofs_flag;
823}
824
825static inline void cifs_server_unlock(struct TCP_Server_Info *server)
826{
827 unsigned int nofs_flag = server->nofs_flag;
828
829 mutex_unlock(&server->_srv_mutex);
830 memalloc_nofs_restore(nofs_flag);
831}
832
833struct cifs_credits {
834 unsigned int value;
835 unsigned int instance;
836};
837
838static inline unsigned int
839in_flight(struct TCP_Server_Info *server)
840{
841 unsigned int num;
842
843 spin_lock(&server->req_lock);
844 num = server->in_flight;
845 spin_unlock(&server->req_lock);
846 return num;
847}
848
849static inline bool
850has_credits(struct TCP_Server_Info *server, int *credits, int num_credits)
851{
852 int num;
853
854 spin_lock(&server->req_lock);
855 num = *credits;
856 spin_unlock(&server->req_lock);
857 return num >= num_credits;
858}
859
860static inline void
861add_credits(struct TCP_Server_Info *server, const struct cifs_credits *credits,
862 const int optype)
863{
864 server->ops->add_credits(server, credits, optype);
865}
866
867static inline void
868add_credits_and_wake_if(struct TCP_Server_Info *server,
869 const struct cifs_credits *credits, const int optype)
870{
871 if (credits->value) {
872 server->ops->add_credits(server, credits, optype);
873 wake_up(&server->request_q);
874 }
875}
876
877static inline void
878set_credits(struct TCP_Server_Info *server, const int val)
879{
880 server->ops->set_credits(server, val);
881}
882
883static inline int
884adjust_credits(struct TCP_Server_Info *server, struct cifs_credits *credits,
885 const unsigned int payload_size)
886{
887 return server->ops->adjust_credits ?
888 server->ops->adjust_credits(server, credits, payload_size) : 0;
889}
890
891static inline __le64
892get_next_mid64(struct TCP_Server_Info *server)
893{
894 return cpu_to_le64(server->ops->get_next_mid(server));
895}
896
897static inline __le16
898get_next_mid(struct TCP_Server_Info *server)
899{
900 __u16 mid = server->ops->get_next_mid(server);
901 /*
902 * The value in the SMB header should be little endian for easy
903 * on-the-wire decoding.
904 */
905 return cpu_to_le16(mid);
906}
907
908static inline void
909revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
910{
911 if (server->ops->revert_current_mid)
912 server->ops->revert_current_mid(server, val);
913}
914
915static inline void
916revert_current_mid_from_hdr(struct TCP_Server_Info *server,
917 const struct smb2_hdr *shdr)
918{
919 unsigned int num = le16_to_cpu(shdr->CreditCharge);
920
921 return revert_current_mid(server, num > 0 ? num : 1);
922}
923
924static inline __u16
925get_mid(const struct smb_hdr *smb)
926{
927 return le16_to_cpu(smb->Mid);
928}
929
930static inline bool
931compare_mid(__u16 mid, const struct smb_hdr *smb)
932{
933 return mid == le16_to_cpu(smb->Mid);
934}
935
936/*
937 * When the server supports very large reads and writes via POSIX extensions,
938 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
939 * including the RFC1001 length.
940 *
941 * Note that this might make for "interesting" allocation problems during
942 * writeback however as we have to allocate an array of pointers for the
943 * pages. A 16M write means ~32kb page array with PAGE_SIZE == 4096.
944 *
945 * For reads, there is a similar problem as we need to allocate an array
946 * of kvecs to handle the receive, though that should only need to be done
947 * once.
948 */
949#define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
950#define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
951
952/*
953 * When the server doesn't allow large posix writes, only allow a rsize/wsize
954 * of 2^17-1 minus the size of the call header. That allows for a read or
955 * write up to the maximum size described by RFC1002.
956 */
957#define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
958#define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
959
960#define CIFS_DEFAULT_IOSIZE (1024 * 1024)
961
962/*
963 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
964 * those values when posix extensions aren't in force. In actuality here, we
965 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
966 * to be ok with the extra byte even though Windows doesn't send writes that
967 * are that large.
968 *
969 * Citation:
970 *
971 * https://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
972 */
973#define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
974#define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
975
976/*
977 * Macros to allow the TCP_Server_Info->net field and related code to drop out
978 * when CONFIG_NET_NS isn't set.
979 */
980
981#ifdef CONFIG_NET_NS
982
983static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
984{
985 return srv->net;
986}
987
988static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
989{
990 srv->net = net;
991}
992
993#else
994
995static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
996{
997 return &init_net;
998}
999
1000static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
1001{
1002}
1003
1004#endif
1005
1006struct cifs_server_iface {
1007 struct list_head iface_head;
1008 struct kref refcount;
1009 size_t speed;
1010 size_t weight_fulfilled;
1011 unsigned int num_channels;
1012 unsigned int rdma_capable : 1;
1013 unsigned int rss_capable : 1;
1014 unsigned int is_active : 1; /* unset if non existent */
1015 struct sockaddr_storage sockaddr;
1016};
1017
1018/* release iface when last ref is dropped */
1019static inline void
1020release_iface(struct kref *ref)
1021{
1022 struct cifs_server_iface *iface = container_of(ref,
1023 struct cifs_server_iface,
1024 refcount);
1025 kfree(iface);
1026}
1027
1028struct cifs_chan {
1029 unsigned int in_reconnect : 1; /* if session setup in progress for this channel */
1030 struct TCP_Server_Info *server;
1031 struct cifs_server_iface *iface; /* interface in use */
1032 __u8 signkey[SMB3_SIGN_KEY_SIZE];
1033};
1034
1035/*
1036 * Session structure. One of these for each uid session with a particular host
1037 */
1038struct cifs_ses {
1039 struct list_head smb_ses_list;
1040 struct list_head rlist; /* reconnect list */
1041 struct list_head tcon_list;
1042 struct cifs_tcon *tcon_ipc;
1043 spinlock_t ses_lock; /* protect anything here that is not protected */
1044 struct mutex session_mutex;
1045 struct TCP_Server_Info *server; /* pointer to server info */
1046 int ses_count; /* reference counter */
1047 enum ses_status_enum ses_status; /* updates protected by cifs_tcp_ses_lock */
1048 unsigned int overrideSecFlg; /* if non-zero override global sec flags */
1049 char *serverOS; /* name of operating system underlying server */
1050 char *serverNOS; /* name of network operating system of server */
1051 char *serverDomain; /* security realm of server */
1052 __u64 Suid; /* remote smb uid */
1053 kuid_t linux_uid; /* overriding owner of files on the mount */
1054 kuid_t cred_uid; /* owner of credentials */
1055 unsigned int capabilities;
1056 char ip_addr[INET6_ADDRSTRLEN + 1]; /* Max ipv6 (or v4) addr string len */
1057 char *user_name; /* must not be null except during init of sess
1058 and after mount option parsing we fill it */
1059 char *domainName;
1060 char *password;
1061 char workstation_name[CIFS_MAX_WORKSTATION_LEN];
1062 struct session_key auth_key;
1063 struct ntlmssp_auth *ntlmssp; /* ciphertext, flags, server challenge */
1064 enum securityEnum sectype; /* what security flavor was specified? */
1065 bool sign; /* is signing required? */
1066 bool domainAuto:1;
1067 __u16 session_flags;
1068 __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE];
1069 __u8 smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE];
1070 __u8 smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE];
1071 __u8 preauth_sha_hash[SMB2_PREAUTH_HASH_SIZE];
1072
1073 /*
1074 * Network interfaces available on the server this session is
1075 * connected to.
1076 *
1077 * Other channels can be opened by connecting and binding this
1078 * session to interfaces from this list.
1079 *
1080 * iface_lock should be taken when accessing any of these fields
1081 */
1082 spinlock_t iface_lock;
1083 /* ========= begin: protected by iface_lock ======== */
1084 struct list_head iface_list;
1085 size_t iface_count;
1086 unsigned long iface_last_update; /* jiffies */
1087 /* ========= end: protected by iface_lock ======== */
1088
1089 spinlock_t chan_lock;
1090 /* ========= begin: protected by chan_lock ======== */
1091#define CIFS_MAX_CHANNELS 16
1092#define CIFS_INVAL_CHAN_INDEX (-1)
1093#define CIFS_ALL_CHANNELS_SET(ses) \
1094 ((1UL << (ses)->chan_count) - 1)
1095#define CIFS_ALL_CHANS_GOOD(ses) \
1096 (!(ses)->chans_need_reconnect)
1097#define CIFS_ALL_CHANS_NEED_RECONNECT(ses) \
1098 ((ses)->chans_need_reconnect == CIFS_ALL_CHANNELS_SET(ses))
1099#define CIFS_SET_ALL_CHANS_NEED_RECONNECT(ses) \
1100 ((ses)->chans_need_reconnect = CIFS_ALL_CHANNELS_SET(ses))
1101#define CIFS_CHAN_NEEDS_RECONNECT(ses, index) \
1102 test_bit((index), &(ses)->chans_need_reconnect)
1103#define CIFS_CHAN_IN_RECONNECT(ses, index) \
1104 ((ses)->chans[(index)].in_reconnect)
1105
1106 struct cifs_chan chans[CIFS_MAX_CHANNELS];
1107 size_t chan_count;
1108 size_t chan_max;
1109 atomic_t chan_seq; /* round robin state */
1110
1111 /*
1112 * chans_need_reconnect is a bitmap indicating which of the channels
1113 * under this smb session needs to be reconnected.
1114 * If not multichannel session, only one bit will be used.
1115 *
1116 * We will ask for sess and tcon reconnection only if all the
1117 * channels are marked for needing reconnection. This will
1118 * enable the sessions on top to continue to live till any
1119 * of the channels below are active.
1120 */
1121 unsigned long chans_need_reconnect;
1122 /* ========= end: protected by chan_lock ======== */
1123 struct cifs_ses *dfs_root_ses;
1124 struct nls_table *local_nls;
1125};
1126
1127static inline bool
1128cap_unix(struct cifs_ses *ses)
1129{
1130 return ses->server->vals->cap_unix & ses->capabilities;
1131}
1132
1133/*
1134 * common struct for holding inode info when searching for or updating an
1135 * inode with new info
1136 */
1137
1138#define CIFS_FATTR_JUNCTION 0x1
1139#define CIFS_FATTR_DELETE_PENDING 0x2
1140#define CIFS_FATTR_NEED_REVAL 0x4
1141#define CIFS_FATTR_INO_COLLISION 0x8
1142#define CIFS_FATTR_UNKNOWN_NLINK 0x10
1143#define CIFS_FATTR_FAKE_ROOT_INO 0x20
1144
1145struct cifs_fattr {
1146 u32 cf_flags;
1147 u32 cf_cifsattrs;
1148 u64 cf_uniqueid;
1149 u64 cf_eof;
1150 u64 cf_bytes;
1151 u64 cf_createtime;
1152 kuid_t cf_uid;
1153 kgid_t cf_gid;
1154 umode_t cf_mode;
1155 dev_t cf_rdev;
1156 unsigned int cf_nlink;
1157 unsigned int cf_dtype;
1158 struct timespec64 cf_atime;
1159 struct timespec64 cf_mtime;
1160 struct timespec64 cf_ctime;
1161 u32 cf_cifstag;
1162 char *cf_symlink_target;
1163};
1164
1165/*
1166 * there is one of these for each connection to a resource on a particular
1167 * session
1168 */
1169struct cifs_tcon {
1170 struct list_head tcon_list;
1171 int tc_count;
1172 struct list_head rlist; /* reconnect list */
1173 spinlock_t tc_lock; /* protect anything here that is not protected */
1174 atomic_t num_local_opens; /* num of all opens including disconnected */
1175 atomic_t num_remote_opens; /* num of all network opens on server */
1176 struct list_head openFileList;
1177 spinlock_t open_file_lock; /* protects list above */
1178 struct cifs_ses *ses; /* pointer to session associated with */
1179 char tree_name[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
1180 char *nativeFileSystem;
1181 char *password; /* for share-level security */
1182 __u32 tid; /* The 4 byte tree id */
1183 __u16 Flags; /* optional support bits */
1184 enum tid_status_enum status;
1185 atomic_t num_smbs_sent;
1186 union {
1187 struct {
1188 atomic_t num_writes;
1189 atomic_t num_reads;
1190 atomic_t num_flushes;
1191 atomic_t num_oplock_brks;
1192 atomic_t num_opens;
1193 atomic_t num_closes;
1194 atomic_t num_deletes;
1195 atomic_t num_mkdirs;
1196 atomic_t num_posixopens;
1197 atomic_t num_posixmkdirs;
1198 atomic_t num_rmdirs;
1199 atomic_t num_renames;
1200 atomic_t num_t2renames;
1201 atomic_t num_ffirst;
1202 atomic_t num_fnext;
1203 atomic_t num_fclose;
1204 atomic_t num_hardlinks;
1205 atomic_t num_symlinks;
1206 atomic_t num_locks;
1207 atomic_t num_acl_get;
1208 atomic_t num_acl_set;
1209 } cifs_stats;
1210 struct {
1211 atomic_t smb2_com_sent[NUMBER_OF_SMB2_COMMANDS];
1212 atomic_t smb2_com_failed[NUMBER_OF_SMB2_COMMANDS];
1213 } smb2_stats;
1214 } stats;
1215 __u64 bytes_read;
1216 __u64 bytes_written;
1217 spinlock_t stat_lock; /* protects the two fields above */
1218 time64_t stats_from_time;
1219 FILE_SYSTEM_DEVICE_INFO fsDevInfo;
1220 FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */
1221 FILE_SYSTEM_UNIX_INFO fsUnixInfo;
1222 bool ipc:1; /* set if connection to IPC$ share (always also pipe) */
1223 bool pipe:1; /* set if connection to pipe share */
1224 bool print:1; /* set if connection to printer share */
1225 bool retry:1;
1226 bool nocase:1;
1227 bool nohandlecache:1; /* if strange server resource prob can turn off */
1228 bool nodelete:1;
1229 bool seal:1; /* transport encryption for this mounted share */
1230 bool unix_ext:1; /* if false disable Linux extensions to CIFS protocol
1231 for this mount even if server would support */
1232 bool posix_extensions; /* if true SMB3.11 posix extensions enabled */
1233 bool local_lease:1; /* check leases (only) on local system not remote */
1234 bool broken_posix_open; /* e.g. Samba server versions < 3.3.2, 3.2.9 */
1235 bool broken_sparse_sup; /* if server or share does not support sparse */
1236 bool need_reconnect:1; /* connection reset, tid now invalid */
1237 bool need_reopen_files:1; /* need to reopen tcon file handles */
1238 bool use_resilient:1; /* use resilient instead of durable handles */
1239 bool use_persistent:1; /* use persistent instead of durable handles */
1240 bool no_lease:1; /* Do not request leases on files or directories */
1241 bool use_witness:1; /* use witness protocol */
1242 __le32 capabilities;
1243 __u32 share_flags;
1244 __u32 maximal_access;
1245 __u32 vol_serial_number;
1246 __le64 vol_create_time;
1247 __u64 snapshot_time; /* for timewarp tokens - timestamp of snapshot */
1248 __u32 handle_timeout; /* persistent and durable handle timeout in ms */
1249 __u32 ss_flags; /* sector size flags */
1250 __u32 perf_sector_size; /* best sector size for perf */
1251 __u32 max_chunks;
1252 __u32 max_bytes_chunk;
1253 __u32 max_bytes_copy;
1254 __u32 max_cached_dirs;
1255#ifdef CONFIG_CIFS_FSCACHE
1256 u64 resource_id; /* server resource id */
1257 struct fscache_volume *fscache; /* cookie for share */
1258#endif
1259 struct list_head pending_opens; /* list of incomplete opens */
1260 struct cached_fids *cfids;
1261 /* BB add field for back pointer to sb struct(s)? */
1262#ifdef CONFIG_CIFS_DFS_UPCALL
1263 struct list_head dfs_ses_list;
1264 struct delayed_work dfs_cache_work;
1265#endif
1266 struct delayed_work query_interfaces; /* query interfaces workqueue job */
1267 char *origin_fullpath; /* canonical copy of smb3_fs_context::source */
1268};
1269
1270/*
1271 * This is a refcounted and timestamped container for a tcon pointer. The
1272 * container holds a tcon reference. It is considered safe to free one of
1273 * these when the tl_count goes to 0. The tl_time is the time of the last
1274 * "get" on the container.
1275 */
1276struct tcon_link {
1277 struct rb_node tl_rbnode;
1278 kuid_t tl_uid;
1279 unsigned long tl_flags;
1280#define TCON_LINK_MASTER 0
1281#define TCON_LINK_PENDING 1
1282#define TCON_LINK_IN_TREE 2
1283 unsigned long tl_time;
1284 atomic_t tl_count;
1285 struct cifs_tcon *tl_tcon;
1286};
1287
1288extern struct tcon_link *cifs_sb_tlink(struct cifs_sb_info *cifs_sb);
1289extern void smb3_free_compound_rqst(int num_rqst, struct smb_rqst *rqst);
1290
1291static inline struct cifs_tcon *
1292tlink_tcon(struct tcon_link *tlink)
1293{
1294 return tlink->tl_tcon;
1295}
1296
1297static inline struct tcon_link *
1298cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
1299{
1300 return cifs_sb->master_tlink;
1301}
1302
1303extern void cifs_put_tlink(struct tcon_link *tlink);
1304
1305static inline struct tcon_link *
1306cifs_get_tlink(struct tcon_link *tlink)
1307{
1308 if (tlink && !IS_ERR(tlink))
1309 atomic_inc(&tlink->tl_count);
1310 return tlink;
1311}
1312
1313/* This function is always expected to succeed */
1314extern struct cifs_tcon *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
1315
1316#define CIFS_OPLOCK_NO_CHANGE 0xfe
1317
1318struct cifs_pending_open {
1319 struct list_head olist;
1320 struct tcon_link *tlink;
1321 __u8 lease_key[16];
1322 __u32 oplock;
1323};
1324
1325struct cifs_deferred_close {
1326 struct list_head dlist;
1327 struct tcon_link *tlink;
1328 __u16 netfid;
1329 __u64 persistent_fid;
1330 __u64 volatile_fid;
1331};
1332
1333/*
1334 * This info hangs off the cifsFileInfo structure, pointed to by llist.
1335 * This is used to track byte stream locks on the file
1336 */
1337struct cifsLockInfo {
1338 struct list_head llist; /* pointer to next cifsLockInfo */
1339 struct list_head blist; /* pointer to locks blocked on this */
1340 wait_queue_head_t block_q;
1341 __u64 offset;
1342 __u64 length;
1343 __u32 pid;
1344 __u16 type;
1345 __u16 flags;
1346};
1347
1348/*
1349 * One of these for each open instance of a file
1350 */
1351struct cifs_search_info {
1352 loff_t index_of_last_entry;
1353 __u16 entries_in_buffer;
1354 __u16 info_level;
1355 __u32 resume_key;
1356 char *ntwrk_buf_start;
1357 char *srch_entries_start;
1358 char *last_entry;
1359 const char *presume_name;
1360 unsigned int resume_name_len;
1361 bool endOfSearch:1;
1362 bool emptyDir:1;
1363 bool unicode:1;
1364 bool smallBuf:1; /* so we know which buf_release function to call */
1365};
1366
1367#define ACL_NO_MODE ((umode_t)(-1))
1368struct cifs_open_parms {
1369 struct cifs_tcon *tcon;
1370 struct cifs_sb_info *cifs_sb;
1371 int disposition;
1372 int desired_access;
1373 int create_options;
1374 const char *path;
1375 struct cifs_fid *fid;
1376 umode_t mode;
1377 bool reconnect:1;
1378};
1379
1380struct cifs_fid {
1381 __u16 netfid;
1382 __u64 persistent_fid; /* persist file id for smb2 */
1383 __u64 volatile_fid; /* volatile file id for smb2 */
1384 __u8 lease_key[SMB2_LEASE_KEY_SIZE]; /* lease key for smb2 */
1385 __u8 create_guid[16];
1386 __u32 access;
1387 struct cifs_pending_open *pending_open;
1388 unsigned int epoch;
1389#ifdef CONFIG_CIFS_DEBUG2
1390 __u64 mid;
1391#endif /* CIFS_DEBUG2 */
1392 bool purge_cache;
1393};
1394
1395struct cifs_fid_locks {
1396 struct list_head llist;
1397 struct cifsFileInfo *cfile; /* fid that owns locks */
1398 struct list_head locks; /* locks held by fid above */
1399};
1400
1401struct cifsFileInfo {
1402 /* following two lists are protected by tcon->open_file_lock */
1403 struct list_head tlist; /* pointer to next fid owned by tcon */
1404 struct list_head flist; /* next fid (file instance) for this inode */
1405 /* lock list below protected by cifsi->lock_sem */
1406 struct cifs_fid_locks *llist; /* brlocks held by this fid */
1407 kuid_t uid; /* allows finding which FileInfo structure */
1408 __u32 pid; /* process id who opened file */
1409 struct cifs_fid fid; /* file id from remote */
1410 struct list_head rlist; /* reconnect list */
1411 /* BB add lock scope info here if needed */
1412 /* lock scope id (0 if none) */
1413 struct dentry *dentry;
1414 struct tcon_link *tlink;
1415 unsigned int f_flags;
1416 bool invalidHandle:1; /* file closed via session abend */
1417 bool swapfile:1;
1418 bool oplock_break_cancelled:1;
1419 unsigned int oplock_epoch; /* epoch from the lease break */
1420 __u32 oplock_level; /* oplock/lease level from the lease break */
1421 int count;
1422 spinlock_t file_info_lock; /* protects four flag/count fields above */
1423 struct mutex fh_mutex; /* prevents reopen race after dead ses*/
1424 struct cifs_search_info srch_inf;
1425 struct work_struct oplock_break; /* work for oplock breaks */
1426 struct work_struct put; /* work for the final part of _put */
1427 struct delayed_work deferred;
1428 bool deferred_close_scheduled; /* Flag to indicate close is scheduled */
1429 char *symlink_target;
1430};
1431
1432struct cifs_io_parms {
1433 __u16 netfid;
1434 __u64 persistent_fid; /* persist file id for smb2 */
1435 __u64 volatile_fid; /* volatile file id for smb2 */
1436 __u32 pid;
1437 __u64 offset;
1438 unsigned int length;
1439 struct cifs_tcon *tcon;
1440 struct TCP_Server_Info *server;
1441};
1442
1443struct cifs_aio_ctx {
1444 struct kref refcount;
1445 struct list_head list;
1446 struct mutex aio_mutex;
1447 struct completion done;
1448 struct iov_iter iter;
1449 struct kiocb *iocb;
1450 struct cifsFileInfo *cfile;
1451 struct bio_vec *bv;
1452 loff_t pos;
1453 unsigned int nr_pinned_pages;
1454 ssize_t rc;
1455 unsigned int len;
1456 unsigned int total_len;
1457 unsigned int bv_need_unpin; /* If ->bv[] needs unpinning */
1458 bool should_dirty;
1459 /*
1460 * Indicates if this aio_ctx is for direct_io,
1461 * If yes, iter is a copy of the user passed iov_iter
1462 */
1463 bool direct_io;
1464};
1465
1466/* asynchronous read support */
1467struct cifs_readdata {
1468 struct kref refcount;
1469 struct list_head list;
1470 struct completion done;
1471 struct cifsFileInfo *cfile;
1472 struct address_space *mapping;
1473 struct cifs_aio_ctx *ctx;
1474 __u64 offset;
1475 ssize_t got_bytes;
1476 unsigned int bytes;
1477 pid_t pid;
1478 int result;
1479 struct work_struct work;
1480 struct iov_iter iter;
1481 struct kvec iov[2];
1482 struct TCP_Server_Info *server;
1483#ifdef CONFIG_CIFS_SMB_DIRECT
1484 struct smbd_mr *mr;
1485#endif
1486 struct cifs_credits credits;
1487};
1488
1489/* asynchronous write support */
1490struct cifs_writedata {
1491 struct kref refcount;
1492 struct list_head list;
1493 struct completion done;
1494 enum writeback_sync_modes sync_mode;
1495 struct work_struct work;
1496 struct cifsFileInfo *cfile;
1497 struct cifs_aio_ctx *ctx;
1498 struct iov_iter iter;
1499 struct bio_vec *bv;
1500 __u64 offset;
1501 pid_t pid;
1502 unsigned int bytes;
1503 int result;
1504 struct TCP_Server_Info *server;
1505#ifdef CONFIG_CIFS_SMB_DIRECT
1506 struct smbd_mr *mr;
1507#endif
1508 struct cifs_credits credits;
1509 bool replay;
1510};
1511
1512/*
1513 * Take a reference on the file private data. Must be called with
1514 * cfile->file_info_lock held.
1515 */
1516static inline void
1517cifsFileInfo_get_locked(struct cifsFileInfo *cifs_file)
1518{
1519 ++cifs_file->count;
1520}
1521
1522struct cifsFileInfo *cifsFileInfo_get(struct cifsFileInfo *cifs_file);
1523void _cifsFileInfo_put(struct cifsFileInfo *cifs_file, bool wait_oplock_hdlr,
1524 bool offload);
1525void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
1526
1527#define CIFS_CACHE_READ_FLG 1
1528#define CIFS_CACHE_HANDLE_FLG 2
1529#define CIFS_CACHE_RH_FLG (CIFS_CACHE_READ_FLG | CIFS_CACHE_HANDLE_FLG)
1530#define CIFS_CACHE_WRITE_FLG 4
1531#define CIFS_CACHE_RW_FLG (CIFS_CACHE_READ_FLG | CIFS_CACHE_WRITE_FLG)
1532#define CIFS_CACHE_RHW_FLG (CIFS_CACHE_RW_FLG | CIFS_CACHE_HANDLE_FLG)
1533
1534#define CIFS_CACHE_READ(cinode) ((cinode->oplock & CIFS_CACHE_READ_FLG) || (CIFS_SB(cinode->netfs.inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE))
1535#define CIFS_CACHE_HANDLE(cinode) (cinode->oplock & CIFS_CACHE_HANDLE_FLG)
1536#define CIFS_CACHE_WRITE(cinode) ((cinode->oplock & CIFS_CACHE_WRITE_FLG) || (CIFS_SB(cinode->netfs.inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE))
1537
1538/*
1539 * One of these for each file inode
1540 */
1541
1542struct cifsInodeInfo {
1543 struct netfs_inode netfs; /* Netfslib context and vfs inode */
1544 bool can_cache_brlcks;
1545 struct list_head llist; /* locks helb by this inode */
1546 /*
1547 * NOTE: Some code paths call down_read(lock_sem) twice, so
1548 * we must always use cifs_down_write() instead of down_write()
1549 * for this semaphore to avoid deadlocks.
1550 */
1551 struct rw_semaphore lock_sem; /* protect the fields above */
1552 /* BB add in lists for dirty pages i.e. write caching info for oplock */
1553 struct list_head openFileList;
1554 spinlock_t open_file_lock; /* protects openFileList */
1555 __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
1556 unsigned int oplock; /* oplock/lease level we have */
1557 unsigned int epoch; /* used to track lease state changes */
1558#define CIFS_INODE_PENDING_OPLOCK_BREAK (0) /* oplock break in progress */
1559#define CIFS_INODE_PENDING_WRITERS (1) /* Writes in progress */
1560#define CIFS_INODE_FLAG_UNUSED (2) /* Unused flag */
1561#define CIFS_INO_DELETE_PENDING (3) /* delete pending on server */
1562#define CIFS_INO_INVALID_MAPPING (4) /* pagecache is invalid */
1563#define CIFS_INO_LOCK (5) /* lock bit for synchronization */
1564#define CIFS_INO_MODIFIED_ATTR (6) /* Indicate change in mtime/ctime */
1565#define CIFS_INO_CLOSE_ON_LOCK (7) /* Not to defer the close when lock is set */
1566 unsigned long flags;
1567 spinlock_t writers_lock;
1568 unsigned int writers; /* Number of writers on this inode */
1569 unsigned long time; /* jiffies of last update of inode */
1570 u64 uniqueid; /* server inode number */
1571 u64 createtime; /* creation time on server */
1572 __u8 lease_key[SMB2_LEASE_KEY_SIZE]; /* lease key for this inode */
1573 struct list_head deferred_closes; /* list of deferred closes */
1574 spinlock_t deferred_lock; /* protection on deferred list */
1575 bool lease_granted; /* Flag to indicate whether lease or oplock is granted. */
1576 char *symlink_target;
1577 __u32 reparse_tag;
1578};
1579
1580static inline struct cifsInodeInfo *
1581CIFS_I(struct inode *inode)
1582{
1583 return container_of(inode, struct cifsInodeInfo, netfs.inode);
1584}
1585
1586static inline struct cifs_sb_info *
1587CIFS_SB(struct super_block *sb)
1588{
1589 return sb->s_fs_info;
1590}
1591
1592static inline struct cifs_sb_info *
1593CIFS_FILE_SB(struct file *file)
1594{
1595 return CIFS_SB(file_inode(file)->i_sb);
1596}
1597
1598static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
1599{
1600 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
1601 return '/';
1602 else
1603 return '\\';
1604}
1605
1606static inline void
1607convert_delimiter(char *path, char delim)
1608{
1609 char old_delim, *pos;
1610
1611 if (delim == '/')
1612 old_delim = '\\';
1613 else
1614 old_delim = '/';
1615
1616 pos = path;
1617 while ((pos = strchr(pos, old_delim)))
1618 *pos = delim;
1619}
1620
1621#define cifs_stats_inc atomic_inc
1622
1623static inline void cifs_stats_bytes_written(struct cifs_tcon *tcon,
1624 unsigned int bytes)
1625{
1626 if (bytes) {
1627 spin_lock(&tcon->stat_lock);
1628 tcon->bytes_written += bytes;
1629 spin_unlock(&tcon->stat_lock);
1630 }
1631}
1632
1633static inline void cifs_stats_bytes_read(struct cifs_tcon *tcon,
1634 unsigned int bytes)
1635{
1636 spin_lock(&tcon->stat_lock);
1637 tcon->bytes_read += bytes;
1638 spin_unlock(&tcon->stat_lock);
1639}
1640
1641
1642/*
1643 * This is the prototype for the mid receive function. This function is for
1644 * receiving the rest of the SMB frame, starting with the WordCount (which is
1645 * just after the MID in struct smb_hdr). Note:
1646 *
1647 * - This will be called by cifsd, with no locks held.
1648 * - The mid will still be on the pending_mid_q.
1649 * - mid->resp_buf will point to the current buffer.
1650 *
1651 * Returns zero on a successful receive, or an error. The receive state in
1652 * the TCP_Server_Info will also be updated.
1653 */
1654typedef int (mid_receive_t)(struct TCP_Server_Info *server,
1655 struct mid_q_entry *mid);
1656
1657/*
1658 * This is the prototype for the mid callback function. This is called once the
1659 * mid has been received off of the socket. When creating one, take special
1660 * care to avoid deadlocks. Things to bear in mind:
1661 *
1662 * - it will be called by cifsd, with no locks held
1663 * - the mid will be removed from any lists
1664 */
1665typedef void (mid_callback_t)(struct mid_q_entry *mid);
1666
1667/*
1668 * This is the protopyte for mid handle function. This is called once the mid
1669 * has been recognized after decryption of the message.
1670 */
1671typedef int (mid_handle_t)(struct TCP_Server_Info *server,
1672 struct mid_q_entry *mid);
1673
1674/* one of these for every pending CIFS request to the server */
1675struct mid_q_entry {
1676 struct list_head qhead; /* mids waiting on reply from this server */
1677 struct kref refcount;
1678 struct TCP_Server_Info *server; /* server corresponding to this mid */
1679 __u64 mid; /* multiplex id */
1680 __u16 credits; /* number of credits consumed by this mid */
1681 __u16 credits_received; /* number of credits from the response */
1682 __u32 pid; /* process id */
1683 __u32 sequence_number; /* for CIFS signing */
1684 unsigned long when_alloc; /* when mid was created */
1685#ifdef CONFIG_CIFS_STATS2
1686 unsigned long when_sent; /* time when smb send finished */
1687 unsigned long when_received; /* when demux complete (taken off wire) */
1688#endif
1689 mid_receive_t *receive; /* call receive callback */
1690 mid_callback_t *callback; /* call completion callback */
1691 mid_handle_t *handle; /* call handle mid callback */
1692 void *callback_data; /* general purpose pointer for callback */
1693 struct task_struct *creator;
1694 void *resp_buf; /* pointer to received SMB header */
1695 unsigned int resp_buf_size;
1696 int mid_state; /* wish this were enum but can not pass to wait_event */
1697 unsigned int mid_flags;
1698 __le16 command; /* smb command code */
1699 unsigned int optype; /* operation type */
1700 bool large_buf:1; /* if valid response, is pointer to large buf */
1701 bool multiRsp:1; /* multiple trans2 responses for one request */
1702 bool multiEnd:1; /* both received */
1703 bool decrypted:1; /* decrypted entry */
1704};
1705
1706struct close_cancelled_open {
1707 struct cifs_fid fid;
1708 struct cifs_tcon *tcon;
1709 struct work_struct work;
1710 __u64 mid;
1711 __u16 cmd;
1712};
1713
1714/* Make code in transport.c a little cleaner by moving
1715 update of optional stats into function below */
1716static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
1717{
1718 atomic_inc(&server->in_send);
1719}
1720
1721static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
1722{
1723 atomic_dec(&server->in_send);
1724}
1725
1726static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
1727{
1728 atomic_inc(&server->num_waiters);
1729}
1730
1731static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
1732{
1733 atomic_dec(&server->num_waiters);
1734}
1735
1736#ifdef CONFIG_CIFS_STATS2
1737static inline void cifs_save_when_sent(struct mid_q_entry *mid)
1738{
1739 mid->when_sent = jiffies;
1740}
1741#else
1742static inline void cifs_save_when_sent(struct mid_q_entry *mid)
1743{
1744}
1745#endif
1746
1747/* for pending dnotify requests */
1748struct dir_notify_req {
1749 struct list_head lhead;
1750 __le16 Pid;
1751 __le16 PidHigh;
1752 __u16 Mid;
1753 __u16 Tid;
1754 __u16 Uid;
1755 __u16 netfid;
1756 __u32 filter; /* CompletionFilter (for multishot) */
1757 int multishot;
1758 struct file *pfile;
1759};
1760
1761struct dfs_info3_param {
1762 int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/
1763 int path_consumed;
1764 int server_type;
1765 int ref_flag;
1766 char *path_name;
1767 char *node_name;
1768 int ttl;
1769};
1770
1771struct file_list {
1772 struct list_head list;
1773 struct cifsFileInfo *cfile;
1774};
1775
1776struct cifs_mount_ctx {
1777 struct cifs_sb_info *cifs_sb;
1778 struct smb3_fs_context *fs_ctx;
1779 unsigned int xid;
1780 struct TCP_Server_Info *server;
1781 struct cifs_ses *ses;
1782 struct cifs_tcon *tcon;
1783 struct list_head dfs_ses_list;
1784};
1785
1786static inline void __free_dfs_info_param(struct dfs_info3_param *param)
1787{
1788 kfree(param->path_name);
1789 kfree(param->node_name);
1790}
1791
1792static inline void free_dfs_info_param(struct dfs_info3_param *param)
1793{
1794 if (param)
1795 __free_dfs_info_param(param);
1796}
1797
1798static inline void zfree_dfs_info_param(struct dfs_info3_param *param)
1799{
1800 if (param) {
1801 __free_dfs_info_param(param);
1802 memset(param, 0, sizeof(*param));
1803 }
1804}
1805
1806static inline void free_dfs_info_array(struct dfs_info3_param *param,
1807 int number_of_items)
1808{
1809 int i;
1810
1811 if ((number_of_items == 0) || (param == NULL))
1812 return;
1813 for (i = 0; i < number_of_items; i++) {
1814 kfree(param[i].path_name);
1815 kfree(param[i].node_name);
1816 }
1817 kfree(param);
1818}
1819
1820static inline bool is_interrupt_error(int error)
1821{
1822 switch (error) {
1823 case -EINTR:
1824 case -ERESTARTSYS:
1825 case -ERESTARTNOHAND:
1826 case -ERESTARTNOINTR:
1827 return true;
1828 }
1829 return false;
1830}
1831
1832static inline bool is_retryable_error(int error)
1833{
1834 if (is_interrupt_error(error) || error == -EAGAIN)
1835 return true;
1836 return false;
1837}
1838
1839static inline bool is_replayable_error(int error)
1840{
1841 if (error == -EAGAIN || error == -ECONNABORTED)
1842 return true;
1843 return false;
1844}
1845
1846
1847/* cifs_get_writable_file() flags */
1848#define FIND_WR_ANY 0
1849#define FIND_WR_FSUID_ONLY 1
1850#define FIND_WR_WITH_DELETE 2
1851
1852#define MID_FREE 0
1853#define MID_REQUEST_ALLOCATED 1
1854#define MID_REQUEST_SUBMITTED 2
1855#define MID_RESPONSE_RECEIVED 4
1856#define MID_RETRY_NEEDED 8 /* session closed while this request out */
1857#define MID_RESPONSE_MALFORMED 0x10
1858#define MID_SHUTDOWN 0x20
1859#define MID_RESPONSE_READY 0x40 /* ready for other process handle the rsp */
1860
1861/* Flags */
1862#define MID_WAIT_CANCELLED 1 /* Cancelled while waiting for response */
1863#define MID_DELETED 2 /* Mid has been dequeued/deleted */
1864
1865/* Types of response buffer returned from SendReceive2 */
1866#define CIFS_NO_BUFFER 0 /* Response buffer not returned */
1867#define CIFS_SMALL_BUFFER 1
1868#define CIFS_LARGE_BUFFER 2
1869#define CIFS_IOVEC 4 /* array of response buffers */
1870
1871/* Type of Request to SendReceive2 */
1872#define CIFS_BLOCKING_OP 1 /* operation can block */
1873#define CIFS_NON_BLOCKING 2 /* do not block waiting for credits */
1874#define CIFS_TIMEOUT_MASK 0x003 /* only one of above set in req */
1875#define CIFS_LOG_ERROR 0x010 /* log NT STATUS if non-zero */
1876#define CIFS_LARGE_BUF_OP 0x020 /* large request buffer */
1877#define CIFS_NO_RSP_BUF 0x040 /* no response buffer required */
1878
1879/* Type of request operation */
1880#define CIFS_ECHO_OP 0x080 /* echo request */
1881#define CIFS_OBREAK_OP 0x0100 /* oplock break request */
1882#define CIFS_NEG_OP 0x0200 /* negotiate request */
1883#define CIFS_CP_CREATE_CLOSE_OP 0x0400 /* compound create+close request */
1884/* Lower bitmask values are reserved by others below. */
1885#define CIFS_SESS_OP 0x2000 /* session setup request */
1886#define CIFS_OP_MASK 0x2780 /* mask request type */
1887
1888#define CIFS_HAS_CREDITS 0x0400 /* already has credits */
1889#define CIFS_TRANSFORM_REQ 0x0800 /* transform request before sending */
1890#define CIFS_NO_SRV_RSP 0x1000 /* there is no server response */
1891
1892/* Security Flags: indicate type of session setup needed */
1893#define CIFSSEC_MAY_SIGN 0x00001
1894#define CIFSSEC_MAY_NTLMV2 0x00004
1895#define CIFSSEC_MAY_KRB5 0x00008
1896#define CIFSSEC_MAY_SEAL 0x00040 /* not supported yet */
1897#define CIFSSEC_MAY_NTLMSSP 0x00080 /* raw ntlmssp with ntlmv2 */
1898
1899#define CIFSSEC_MUST_SIGN 0x01001
1900/* note that only one of the following can be set so the
1901result of setting MUST flags more than once will be to
1902require use of the stronger protocol */
1903#define CIFSSEC_MUST_NTLMV2 0x04004
1904#define CIFSSEC_MUST_KRB5 0x08008
1905#ifdef CONFIG_CIFS_UPCALL
1906#define CIFSSEC_MASK 0x8F08F /* flags supported if no weak allowed */
1907#else
1908#define CIFSSEC_MASK 0x87087 /* flags supported if no weak allowed */
1909#endif /* UPCALL */
1910#define CIFSSEC_MUST_SEAL 0x40040 /* not supported yet */
1911#define CIFSSEC_MUST_NTLMSSP 0x80080 /* raw ntlmssp with ntlmv2 */
1912
1913#define CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_NTLMSSP)
1914#define CIFSSEC_MAX (CIFSSEC_MUST_NTLMV2)
1915#define CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_NTLMSSP)
1916/*
1917 *****************************************************************
1918 * All constants go here
1919 *****************************************************************
1920 */
1921
1922#define UID_HASH (16)
1923
1924/*
1925 * Note that ONE module should define _DECLARE_GLOBALS_HERE to cause the
1926 * following to be declared.
1927 */
1928
1929/****************************************************************************
1930 * Here are all the locks (spinlock, mutex, semaphore) in cifs.ko, arranged according
1931 * to the locking order. i.e. if two locks are to be held together, the lock that
1932 * appears higher in this list needs to be taken before the other.
1933 *
1934 * If you hold a lock that is lower in this list, and you need to take a higher lock
1935 * (or if you think that one of the functions that you're calling may need to), first
1936 * drop the lock you hold, pick up the higher lock, then the lower one. This will
1937 * ensure that locks are picked up only in one direction in the below table
1938 * (top to bottom).
1939 *
1940 * Also, if you expect a function to be called with a lock held, explicitly document
1941 * this in the comments on top of your function definition.
1942 *
1943 * And also, try to keep the critical sections (lock hold time) to be as minimal as
1944 * possible. Blocking / calling other functions with a lock held always increase
1945 * the risk of a possible deadlock.
1946 *
1947 * Following this rule will avoid unnecessary deadlocks, which can get really hard to
1948 * debug. Also, any new lock that you introduce, please add to this list in the correct
1949 * order.
1950 *
1951 * Please populate this list whenever you introduce new locks in your changes. Or in
1952 * case I've missed some existing locks. Please ensure that it's added in the list
1953 * based on the locking order expected.
1954 *
1955 * =====================================================================================
1956 * Lock Protects Initialization fn
1957 * =====================================================================================
1958 * vol_list_lock
1959 * vol_info->ctx_lock vol_info->ctx
1960 * cifs_sb_info->tlink_tree_lock cifs_sb_info->tlink_tree cifs_setup_cifs_sb
1961 * TCP_Server_Info-> TCP_Server_Info cifs_get_tcp_session
1962 * reconnect_mutex
1963 * TCP_Server_Info->srv_mutex TCP_Server_Info cifs_get_tcp_session
1964 * cifs_ses->session_mutex cifs_ses sesInfoAlloc
1965 * cifs_tcon
1966 * cifs_tcon->open_file_lock cifs_tcon->openFileList tconInfoAlloc
1967 * cifs_tcon->pending_opens
1968 * cifs_tcon->stat_lock cifs_tcon->bytes_read tconInfoAlloc
1969 * cifs_tcon->bytes_written
1970 * cifs_tcp_ses_lock cifs_tcp_ses_list sesInfoAlloc
1971 * GlobalMid_Lock GlobalMaxActiveXid init_cifs
1972 * GlobalCurrentXid
1973 * GlobalTotalActiveXid
1974 * TCP_Server_Info->srv_lock (anything in struct not protected by another lock and can change)
1975 * TCP_Server_Info->mid_lock TCP_Server_Info->pending_mid_q cifs_get_tcp_session
1976 * ->CurrentMid
1977 * (any changes in mid_q_entry fields)
1978 * TCP_Server_Info->req_lock TCP_Server_Info->in_flight cifs_get_tcp_session
1979 * ->credits
1980 * ->echo_credits
1981 * ->oplock_credits
1982 * ->reconnect_instance
1983 * cifs_ses->ses_lock (anything that is not protected by another lock and can change)
1984 * cifs_ses->iface_lock cifs_ses->iface_list sesInfoAlloc
1985 * ->iface_count
1986 * ->iface_last_update
1987 * cifs_ses->chan_lock cifs_ses->chans
1988 * ->chans_need_reconnect
1989 * ->chans_in_reconnect
1990 * cifs_tcon->tc_lock (anything that is not protected by another lock and can change)
1991 * cifsInodeInfo->open_file_lock cifsInodeInfo->openFileList cifs_alloc_inode
1992 * cifsInodeInfo->writers_lock cifsInodeInfo->writers cifsInodeInfo_alloc
1993 * cifsInodeInfo->lock_sem cifsInodeInfo->llist cifs_init_once
1994 * ->can_cache_brlcks
1995 * cifsInodeInfo->deferred_lock cifsInodeInfo->deferred_closes cifsInodeInfo_alloc
1996 * cached_fid->fid_mutex cifs_tcon->crfid tcon_info_alloc
1997 * cifsFileInfo->fh_mutex cifsFileInfo cifs_new_fileinfo
1998 * cifsFileInfo->file_info_lock cifsFileInfo->count cifs_new_fileinfo
1999 * ->invalidHandle initiate_cifs_search
2000 * ->oplock_break_cancelled
2001 * cifs_aio_ctx->aio_mutex cifs_aio_ctx cifs_aio_ctx_alloc
2002 ****************************************************************************/
2003
2004#ifdef DECLARE_GLOBALS_HERE
2005#define GLOBAL_EXTERN
2006#else
2007#define GLOBAL_EXTERN extern
2008#endif
2009
2010/*
2011 * the list of TCP_Server_Info structures, ie each of the sockets
2012 * connecting our client to a distinct server (ip address), is
2013 * chained together by cifs_tcp_ses_list. The list of all our SMB
2014 * sessions (and from that the tree connections) can be found
2015 * by iterating over cifs_tcp_ses_list
2016 */
2017extern struct list_head cifs_tcp_ses_list;
2018
2019/*
2020 * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
2021 * tcp session, and the list of tcon's per smb session. It also protects
2022 * the reference counters for the server, smb session, and tcon.
2023 * generally the locks should be taken in order tcp_ses_lock before
2024 * tcon->open_file_lock and that before file->file_info_lock since the
2025 * structure order is cifs_socket-->cifs_ses-->cifs_tcon-->cifs_file
2026 */
2027extern spinlock_t cifs_tcp_ses_lock;
2028
2029/*
2030 * Global transaction id (XID) information
2031 */
2032extern unsigned int GlobalCurrentXid; /* protected by GlobalMid_Sem */
2033extern unsigned int GlobalTotalActiveXid; /* prot by GlobalMid_Sem */
2034extern unsigned int GlobalMaxActiveXid; /* prot by GlobalMid_Sem */
2035extern spinlock_t GlobalMid_Lock; /* protects above & list operations on midQ entries */
2036
2037/*
2038 * Global counters, updated atomically
2039 */
2040extern atomic_t sesInfoAllocCount;
2041extern atomic_t tconInfoAllocCount;
2042extern atomic_t tcpSesNextId;
2043extern atomic_t tcpSesAllocCount;
2044extern atomic_t tcpSesReconnectCount;
2045extern atomic_t tconInfoReconnectCount;
2046
2047/* Various Debug counters */
2048extern atomic_t buf_alloc_count; /* current number allocated */
2049extern atomic_t small_buf_alloc_count;
2050#ifdef CONFIG_CIFS_STATS2
2051extern atomic_t total_buf_alloc_count; /* total allocated over all time */
2052extern atomic_t total_small_buf_alloc_count;
2053extern unsigned int slow_rsp_threshold; /* number of secs before logging */
2054#endif
2055
2056/* Misc globals */
2057extern bool enable_oplocks; /* enable or disable oplocks */
2058extern bool lookupCacheEnabled;
2059extern unsigned int global_secflags; /* if on, session setup sent
2060 with more secure ntlmssp2 challenge/resp */
2061extern unsigned int sign_CIFS_PDUs; /* enable smb packet signing */
2062extern bool enable_gcm_256; /* allow optional negotiate of strongest signing (aes-gcm-256) */
2063extern bool require_gcm_256; /* require use of strongest signing (aes-gcm-256) */
2064extern bool enable_negotiate_signing; /* request use of faster (GMAC) signing if available */
2065extern bool linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/
2066extern unsigned int CIFSMaxBufSize; /* max size not including hdr */
2067extern unsigned int cifs_min_rcv; /* min size of big ntwrk buf pool */
2068extern unsigned int cifs_min_small; /* min size of small buf pool */
2069extern unsigned int cifs_max_pending; /* MAX requests at once to server*/
2070extern unsigned int dir_cache_timeout; /* max time for directory lease caching of dir */
2071extern bool disable_legacy_dialects; /* forbid vers=1.0 and vers=2.0 mounts */
2072extern atomic_t mid_count;
2073
2074void cifs_oplock_break(struct work_struct *work);
2075void cifs_queue_oplock_break(struct cifsFileInfo *cfile);
2076void smb2_deferred_work_close(struct work_struct *work);
2077
2078extern const struct slow_work_ops cifs_oplock_break_ops;
2079extern struct workqueue_struct *cifsiod_wq;
2080extern struct workqueue_struct *decrypt_wq;
2081extern struct workqueue_struct *fileinfo_put_wq;
2082extern struct workqueue_struct *cifsoplockd_wq;
2083extern struct workqueue_struct *deferredclose_wq;
2084extern __u32 cifs_lock_secret;
2085
2086extern mempool_t *cifs_mid_poolp;
2087
2088/* Operations for different SMB versions */
2089#define SMB1_VERSION_STRING "1.0"
2090#define SMB20_VERSION_STRING "2.0"
2091#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
2092extern struct smb_version_operations smb1_operations;
2093extern struct smb_version_values smb1_values;
2094extern struct smb_version_operations smb20_operations;
2095extern struct smb_version_values smb20_values;
2096#endif /* CIFS_ALLOW_INSECURE_LEGACY */
2097#define SMB21_VERSION_STRING "2.1"
2098extern struct smb_version_operations smb21_operations;
2099extern struct smb_version_values smb21_values;
2100#define SMBDEFAULT_VERSION_STRING "default"
2101extern struct smb_version_values smbdefault_values;
2102#define SMB3ANY_VERSION_STRING "3"
2103extern struct smb_version_values smb3any_values;
2104#define SMB30_VERSION_STRING "3.0"
2105extern struct smb_version_operations smb30_operations;
2106extern struct smb_version_values smb30_values;
2107#define SMB302_VERSION_STRING "3.02"
2108#define ALT_SMB302_VERSION_STRING "3.0.2"
2109/*extern struct smb_version_operations smb302_operations;*/ /* not needed yet */
2110extern struct smb_version_values smb302_values;
2111#define SMB311_VERSION_STRING "3.1.1"
2112#define ALT_SMB311_VERSION_STRING "3.11"
2113extern struct smb_version_operations smb311_operations;
2114extern struct smb_version_values smb311_values;
2115
2116static inline char *get_security_type_str(enum securityEnum sectype)
2117{
2118 switch (sectype) {
2119 case RawNTLMSSP:
2120 return "RawNTLMSSP";
2121 case Kerberos:
2122 return "Kerberos";
2123 case NTLMv2:
2124 return "NTLMv2";
2125 default:
2126 return "Unknown";
2127 }
2128}
2129
2130static inline bool is_smb1_server(struct TCP_Server_Info *server)
2131{
2132 return strcmp(server->vals->version_string, SMB1_VERSION_STRING) == 0;
2133}
2134
2135static inline bool is_tcon_dfs(struct cifs_tcon *tcon)
2136{
2137 /*
2138 * For SMB1, see MS-CIFS 2.4.55 SMB_COM_TREE_CONNECT_ANDX (0x75) and MS-CIFS 3.3.4.4 DFS
2139 * Subsystem Notifies That a Share Is a DFS Share.
2140 *
2141 * For SMB2+, see MS-SMB2 2.2.10 SMB2 TREE_CONNECT Response and MS-SMB2 3.3.4.14 Server
2142 * Application Updates a Share.
2143 */
2144 if (!tcon || !tcon->ses || !tcon->ses->server)
2145 return false;
2146 return is_smb1_server(tcon->ses->server) ? tcon->Flags & SMB_SHARE_IS_IN_DFS :
2147 tcon->share_flags & (SHI1005_FLAGS_DFS | SHI1005_FLAGS_DFS_ROOT);
2148}
2149
2150static inline bool cifs_is_referral_server(struct cifs_tcon *tcon,
2151 const struct dfs_info3_param *ref)
2152{
2153 /*
2154 * Check if all targets are capable of handling DFS referrals as per
2155 * MS-DFSC 2.2.4 RESP_GET_DFS_REFERRAL.
2156 */
2157 return is_tcon_dfs(tcon) || (ref && (ref->flags & DFSREF_REFERRAL_SERVER));
2158}
2159
2160static inline u64 cifs_flock_len(const struct file_lock *fl)
2161{
2162 return (u64)fl->fl_end - fl->fl_start + 1;
2163}
2164
2165static inline size_t ntlmssp_workstation_name_size(const struct cifs_ses *ses)
2166{
2167 if (WARN_ON_ONCE(!ses || !ses->server))
2168 return 0;
2169 /*
2170 * Make workstation name no more than 15 chars when using insecure dialects as some legacy
2171 * servers do require it during NTLMSSP.
2172 */
2173 if (ses->server->dialect <= SMB20_PROT_ID)
2174 return min_t(size_t, sizeof(ses->workstation_name), RFC1001_NAME_LEN_WITH_NULL);
2175 return sizeof(ses->workstation_name);
2176}
2177
2178static inline void move_cifs_info_to_smb2(struct smb2_file_all_info *dst, const FILE_ALL_INFO *src)
2179{
2180 memcpy(dst, src, (size_t)((u8 *)&src->AccessFlags - (u8 *)src));
2181 dst->AccessFlags = src->AccessFlags;
2182 dst->CurrentByteOffset = src->CurrentByteOffset;
2183 dst->Mode = src->Mode;
2184 dst->AlignmentRequirement = src->AlignmentRequirement;
2185 dst->FileNameLength = src->FileNameLength;
2186}
2187
2188static inline int cifs_get_num_sgs(const struct smb_rqst *rqst,
2189 int num_rqst,
2190 const u8 *sig)
2191{
2192 unsigned int len, skip;
2193 unsigned int nents = 0;
2194 unsigned long addr;
2195 size_t data_size;
2196 int i, j;
2197
2198 /*
2199 * The first rqst has a transform header where the first 20 bytes are
2200 * not part of the encrypted blob.
2201 */
2202 skip = 20;
2203
2204 /* Assumes the first rqst has a transform header as the first iov.
2205 * I.e.
2206 * rqst[0].rq_iov[0] is transform header
2207 * rqst[0].rq_iov[1+] data to be encrypted/decrypted
2208 * rqst[1+].rq_iov[0+] data to be encrypted/decrypted
2209 */
2210 for (i = 0; i < num_rqst; i++) {
2211 data_size = iov_iter_count(&rqst[i].rq_iter);
2212
2213 /* We really don't want a mixture of pinned and unpinned pages
2214 * in the sglist. It's hard to keep track of which is what.
2215 * Instead, we convert to a BVEC-type iterator higher up.
2216 */
2217 if (data_size &&
2218 WARN_ON_ONCE(user_backed_iter(&rqst[i].rq_iter)))
2219 return -EIO;
2220
2221 /* We also don't want to have any extra refs or pins to clean
2222 * up in the sglist.
2223 */
2224 if (data_size &&
2225 WARN_ON_ONCE(iov_iter_extract_will_pin(&rqst[i].rq_iter)))
2226 return -EIO;
2227
2228 for (j = 0; j < rqst[i].rq_nvec; j++) {
2229 struct kvec *iov = &rqst[i].rq_iov[j];
2230
2231 addr = (unsigned long)iov->iov_base + skip;
2232 if (unlikely(is_vmalloc_addr((void *)addr))) {
2233 len = iov->iov_len - skip;
2234 nents += DIV_ROUND_UP(offset_in_page(addr) + len,
2235 PAGE_SIZE);
2236 } else {
2237 nents++;
2238 }
2239 skip = 0;
2240 }
2241 if (data_size)
2242 nents += iov_iter_npages(&rqst[i].rq_iter, INT_MAX);
2243 }
2244 nents += DIV_ROUND_UP(offset_in_page(sig) + SMB2_SIGNATURE_SIZE, PAGE_SIZE);
2245 return nents;
2246}
2247
2248/* We can not use the normal sg_set_buf() as we will sometimes pass a
2249 * stack object as buf.
2250 */
2251static inline void cifs_sg_set_buf(struct sg_table *sgtable,
2252 const void *buf,
2253 unsigned int buflen)
2254{
2255 unsigned long addr = (unsigned long)buf;
2256 unsigned int off = offset_in_page(addr);
2257
2258 addr &= PAGE_MASK;
2259 if (unlikely(is_vmalloc_addr((void *)addr))) {
2260 do {
2261 unsigned int len = min_t(unsigned int, buflen, PAGE_SIZE - off);
2262
2263 sg_set_page(&sgtable->sgl[sgtable->nents++],
2264 vmalloc_to_page((void *)addr), len, off);
2265
2266 off = 0;
2267 addr += PAGE_SIZE;
2268 buflen -= len;
2269 } while (buflen);
2270 } else {
2271 sg_set_page(&sgtable->sgl[sgtable->nents++],
2272 virt_to_page((void *)addr), buflen, off);
2273 }
2274}
2275
2276struct smb2_compound_vars {
2277 struct cifs_open_parms oparms;
2278 struct kvec rsp_iov[MAX_COMPOUND];
2279 struct smb_rqst rqst[MAX_COMPOUND];
2280 struct kvec open_iov[SMB2_CREATE_IOV_SIZE];
2281 struct kvec qi_iov;
2282 struct kvec io_iov[SMB2_IOCTL_IOV_SIZE];
2283 struct kvec si_iov[SMB2_SET_INFO_IOV_SIZE];
2284 struct kvec close_iov;
2285 struct smb2_file_rename_info rename_info;
2286 struct smb2_file_link_info link_info;
2287};
2288
2289#endif /* _CIFS_GLOB_H */