linux/fs/cifs/cifsglob.h
<<
>>
Prefs
   1/*
   2 *   fs/cifs/cifsglob.h
   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 *   This library is free software; you can redistribute it and/or modify
   9 *   it under the terms of the GNU Lesser General Public License as published
  10 *   by the Free Software Foundation; either version 2.1 of the License, or
  11 *   (at your option) any later version.
  12 *
  13 *   This library is distributed in the hope that it will be useful,
  14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  16 *   the GNU Lesser General Public License for more details.
  17 *
  18 */
  19#ifndef _CIFS_GLOB_H
  20#define _CIFS_GLOB_H
  21
  22#include <linux/in.h>
  23#include <linux/in6.h>
  24#include <linux/slab.h>
  25#include <linux/mempool.h>
  26#include <linux/workqueue.h>
  27#include "cifs_fs_sb.h"
  28#include "cifsacl.h"
  29#include <crypto/internal/hash.h>
  30#include <linux/scatterlist.h>
  31#include <uapi/linux/cifs/cifs_mount.h>
  32#ifdef CONFIG_CIFS_SMB2
  33#include "smb2pdu.h"
  34#endif
  35
  36#define CIFS_MAGIC_NUMBER 0xFF534D42      /* the first four bytes of SMB PDUs */
  37
  38/*
  39 * The sizes of various internal tables and strings
  40 */
  41#define MAX_UID_INFO 16
  42#define MAX_SES_INFO 2
  43#define MAX_TCON_INFO 4
  44
  45#define MAX_TREE_SIZE (2 + CIFS_NI_MAXHOST + 1 + CIFS_MAX_SHARE_LEN + 1)
  46
  47#define CIFS_MIN_RCV_POOL 4
  48
  49#define MAX_REOPEN_ATT  5 /* these many maximum attempts to reopen a file */
  50/*
  51 * default attribute cache timeout (jiffies)
  52 */
  53#define CIFS_DEF_ACTIMEO (1 * HZ)
  54
  55/*
  56 * max attribute cache timeout (jiffies) - 2^30
  57 */
  58#define CIFS_MAX_ACTIMEO (1 << 30)
  59
  60/*
  61 * MAX_REQ is the maximum number of requests that WE will send
  62 * on one socket concurrently.
  63 */
  64#define CIFS_MAX_REQ 32767
  65
  66#define RFC1001_NAME_LEN 15
  67#define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)
  68
  69/* currently length of NIP6_FMT */
  70#define SERVER_NAME_LENGTH 40
  71#define SERVER_NAME_LEN_WITH_NULL     (SERVER_NAME_LENGTH + 1)
  72
  73/* echo interval in seconds */
  74#define SMB_ECHO_INTERVAL_MIN 1
  75#define SMB_ECHO_INTERVAL_MAX 600
  76#define SMB_ECHO_INTERVAL_DEFAULT 60
  77
  78#include "cifspdu.h"
  79
  80#ifndef XATTR_DOS_ATTRIB
  81#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
  82#endif
  83
  84/*
  85 * CIFS vfs client Status information (based on what we know.)
  86 */
  87
  88/* associated with each tcp and smb session */
  89enum statusEnum {
  90        CifsNew = 0,
  91        CifsGood,
  92        CifsExiting,
  93        CifsNeedReconnect,
  94        CifsNeedNegotiate
  95};
  96
  97enum securityEnum {
  98        Unspecified = 0,        /* not specified */
  99        LANMAN,                 /* Legacy LANMAN auth */
 100        NTLM,                   /* Legacy NTLM012 auth with NTLM hash */
 101        NTLMv2,                 /* Legacy NTLM auth with NTLMv2 hash */
 102        RawNTLMSSP,             /* NTLMSSP without SPNEGO, NTLMv2 hash */
 103        Kerberos,               /* Kerberos via SPNEGO */
 104};
 105
 106struct session_key {
 107        unsigned int len;
 108        char *response;
 109};
 110
 111/* crypto security descriptor definition */
 112struct sdesc {
 113        struct shash_desc shash;
 114        char ctx[];
 115};
 116
 117/* crypto hashing related structure/fields, not specific to a sec mech */
 118struct cifs_secmech {
 119        struct crypto_shash *hmacmd5; /* hmac-md5 hash function */
 120        struct crypto_shash *md5; /* md5 hash function */
 121        struct crypto_shash *hmacsha256; /* hmac-sha256 hash function */
 122        struct crypto_shash *cmacaes; /* block-cipher based MAC function */
 123        struct sdesc *sdeschmacmd5;  /* ctxt to generate ntlmv2 hash, CR1 */
 124        struct sdesc *sdescmd5; /* ctxt to generate cifs/smb signature */
 125        struct sdesc *sdeschmacsha256;  /* ctxt to generate smb2 signature */
 126        struct sdesc *sdesccmacaes;  /* ctxt to generate smb3 signature */
 127};
 128
 129/* per smb session structure/fields */
 130struct ntlmssp_auth {
 131        bool sesskey_per_smbsess; /* whether session key is per smb session */
 132        __u32 client_flags; /* sent by client in type 1 ntlmsssp exchange */
 133        __u32 server_flags; /* sent by server in type 2 ntlmssp exchange */
 134        unsigned char ciphertext[CIFS_CPHTXT_SIZE]; /* sent to server */
 135        char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlmssp */
 136};
 137
 138struct cifs_cred {
 139        int uid;
 140        int gid;
 141        int mode;
 142        int cecount;
 143        struct cifs_sid osid;
 144        struct cifs_sid gsid;
 145        struct cifs_ntace *ntaces;
 146        struct cifs_ace *aces;
 147};
 148
 149/*
 150 *****************************************************************
 151 * Except the CIFS PDUs themselves all the
 152 * globally interesting structs should go here
 153 *****************************************************************
 154 */
 155
 156/*
 157 * A smb_rqst represents a complete request to be issued to a server. It's
 158 * formed by a kvec array, followed by an array of pages. Page data is assumed
 159 * to start at the beginning of the first page.
 160 */
 161struct smb_rqst {
 162        struct kvec     *rq_iov;        /* array of kvecs */
 163        unsigned int    rq_nvec;        /* number of kvecs in array */
 164        struct page     **rq_pages;     /* pointer to array of page ptrs */
 165        unsigned int    rq_npages;      /* number pages in array */
 166        unsigned int    rq_pagesz;      /* page size to use */
 167        unsigned int    rq_tailsz;      /* length of last page */
 168};
 169
 170enum smb_version {
 171        Smb_1 = 1,
 172        Smb_20,
 173        Smb_21,
 174        Smb_30,
 175        Smb_302,
 176#ifdef CONFIG_CIFS_SMB311
 177        Smb_311,
 178#endif /* SMB311 */
 179        Smb_version_err
 180};
 181
 182struct mid_q_entry;
 183struct TCP_Server_Info;
 184struct cifsFileInfo;
 185struct cifs_ses;
 186struct cifs_tcon;
 187struct dfs_info3_param;
 188struct cifs_fattr;
 189struct smb_vol;
 190struct cifs_fid;
 191struct cifs_readdata;
 192struct cifs_writedata;
 193struct cifs_io_parms;
 194struct cifs_search_info;
 195struct cifsInodeInfo;
 196struct cifs_open_parms;
 197
 198struct smb_version_operations {
 199        int (*send_cancel)(struct TCP_Server_Info *, void *,
 200                           struct mid_q_entry *);
 201        bool (*compare_fids)(struct cifsFileInfo *, struct cifsFileInfo *);
 202        /* setup request: allocate mid, sign message */
 203        struct mid_q_entry *(*setup_request)(struct cifs_ses *,
 204                                                struct smb_rqst *);
 205        /* setup async request: allocate mid, sign message */
 206        struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *,
 207                                                struct smb_rqst *);
 208        /* check response: verify signature, map error */
 209        int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *,
 210                             bool);
 211        void (*add_credits)(struct TCP_Server_Info *, const unsigned int,
 212                            const int);
 213        void (*set_credits)(struct TCP_Server_Info *, const int);
 214        int * (*get_credits_field)(struct TCP_Server_Info *, const int);
 215        unsigned int (*get_credits)(struct mid_q_entry *);
 216        __u64 (*get_next_mid)(struct TCP_Server_Info *);
 217        /* data offset from read response message */
 218        unsigned int (*read_data_offset)(char *);
 219        /* data length from read response message */
 220        unsigned int (*read_data_length)(char *);
 221        /* map smb to linux error */
 222        int (*map_error)(char *, bool);
 223        /* find mid corresponding to the response message */
 224        struct mid_q_entry * (*find_mid)(struct TCP_Server_Info *, char *);
 225        void (*dump_detail)(void *);
 226        void (*clear_stats)(struct cifs_tcon *);
 227        void (*print_stats)(struct seq_file *m, struct cifs_tcon *);
 228        void (*dump_share_caps)(struct seq_file *, struct cifs_tcon *);
 229        /* verify the message */
 230        int (*check_message)(char *, unsigned int, struct TCP_Server_Info *);
 231        bool (*is_oplock_break)(char *, struct TCP_Server_Info *);
 232        void (*downgrade_oplock)(struct TCP_Server_Info *,
 233                                        struct cifsInodeInfo *, bool);
 234        /* process transaction2 response */
 235        bool (*check_trans2)(struct mid_q_entry *, struct TCP_Server_Info *,
 236                             char *, int);
 237        /* check if we need to negotiate */
 238        bool (*need_neg)(struct TCP_Server_Info *);
 239        /* negotiate to the server */
 240        int (*negotiate)(const unsigned int, struct cifs_ses *);
 241        /* set negotiated write size */
 242        unsigned int (*negotiate_wsize)(struct cifs_tcon *, struct smb_vol *);
 243        /* set negotiated read size */
 244        unsigned int (*negotiate_rsize)(struct cifs_tcon *, struct smb_vol *);
 245        /* setup smb sessionn */
 246        int (*sess_setup)(const unsigned int, struct cifs_ses *,
 247                          const struct nls_table *);
 248        /* close smb session */
 249        int (*logoff)(const unsigned int, struct cifs_ses *);
 250        /* connect to a server share */
 251        int (*tree_connect)(const unsigned int, struct cifs_ses *, const char *,
 252                            struct cifs_tcon *, const struct nls_table *);
 253        /* close tree connecion */
 254        int (*tree_disconnect)(const unsigned int, struct cifs_tcon *);
 255        /* get DFS referrals */
 256        int (*get_dfs_refer)(const unsigned int, struct cifs_ses *,
 257                             const char *, struct dfs_info3_param **,
 258                             unsigned int *, const struct nls_table *, int);
 259        /* informational QFS call */
 260        void (*qfs_tcon)(const unsigned int, struct cifs_tcon *);
 261        /* check if a path is accessible or not */
 262        int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
 263                                  struct cifs_sb_info *, const char *);
 264        /* query path data from the server */
 265        int (*query_path_info)(const unsigned int, struct cifs_tcon *,
 266                               struct cifs_sb_info *, const char *,
 267                               FILE_ALL_INFO *, bool *, bool *);
 268        /* query file data from the server */
 269        int (*query_file_info)(const unsigned int, struct cifs_tcon *,
 270                               struct cifs_fid *, FILE_ALL_INFO *);
 271        /* get server index number */
 272        int (*get_srv_inum)(const unsigned int, struct cifs_tcon *,
 273                            struct cifs_sb_info *, const char *,
 274                            u64 *uniqueid, FILE_ALL_INFO *);
 275        /* set size by path */
 276        int (*set_path_size)(const unsigned int, struct cifs_tcon *,
 277                             const char *, __u64, struct cifs_sb_info *, bool);
 278        /* set size by file handle */
 279        int (*set_file_size)(const unsigned int, struct cifs_tcon *,
 280                             struct cifsFileInfo *, __u64, bool);
 281        /* set attributes */
 282        int (*set_file_info)(struct inode *, const char *, FILE_BASIC_INFO *,
 283                             const unsigned int);
 284        int (*set_compression)(const unsigned int, struct cifs_tcon *,
 285                               struct cifsFileInfo *);
 286        /* check if we can send an echo or nor */
 287        bool (*can_echo)(struct TCP_Server_Info *);
 288        /* send echo request */
 289        int (*echo)(struct TCP_Server_Info *);
 290        /* create directory */
 291        int (*mkdir)(const unsigned int, struct cifs_tcon *, const char *,
 292                     struct cifs_sb_info *);
 293        /* set info on created directory */
 294        void (*mkdir_setinfo)(struct inode *, const char *,
 295                              struct cifs_sb_info *, struct cifs_tcon *,
 296                              const unsigned int);
 297        /* remove directory */
 298        int (*rmdir)(const unsigned int, struct cifs_tcon *, const char *,
 299                     struct cifs_sb_info *);
 300        /* unlink file */
 301        int (*unlink)(const unsigned int, struct cifs_tcon *, const char *,
 302                      struct cifs_sb_info *);
 303        /* open, rename and delete file */
 304        int (*rename_pending_delete)(const char *, struct dentry *,
 305                                     const unsigned int);
 306        /* send rename request */
 307        int (*rename)(const unsigned int, struct cifs_tcon *, const char *,
 308                      const char *, struct cifs_sb_info *);
 309        /* send create hardlink request */
 310        int (*create_hardlink)(const unsigned int, struct cifs_tcon *,
 311                               const char *, const char *,
 312                               struct cifs_sb_info *);
 313        /* query symlink target */
 314        int (*query_symlink)(const unsigned int, struct cifs_tcon *,
 315                             const char *, char **, struct cifs_sb_info *);
 316        /* open a file for non-posix mounts */
 317        int (*open)(const unsigned int, struct cifs_open_parms *,
 318                    __u32 *, FILE_ALL_INFO *);
 319        /* set fid protocol-specific info */
 320        void (*set_fid)(struct cifsFileInfo *, struct cifs_fid *, __u32);
 321        /* close a file */
 322        void (*close)(const unsigned int, struct cifs_tcon *,
 323                      struct cifs_fid *);
 324        /* send a flush request to the server */
 325        int (*flush)(const unsigned int, struct cifs_tcon *, struct cifs_fid *);
 326        /* async read from the server */
 327        int (*async_readv)(struct cifs_readdata *);
 328        /* async write to the server */
 329        int (*async_writev)(struct cifs_writedata *,
 330                            void (*release)(struct kref *));
 331        /* sync read from the server */
 332        int (*sync_read)(const unsigned int, struct cifs_fid *,
 333                         struct cifs_io_parms *, unsigned int *, char **,
 334                         int *);
 335        /* sync write to the server */
 336        int (*sync_write)(const unsigned int, struct cifs_fid *,
 337                          struct cifs_io_parms *, unsigned int *, struct kvec *,
 338                          unsigned long);
 339        /* open dir, start readdir */
 340        int (*query_dir_first)(const unsigned int, struct cifs_tcon *,
 341                               const char *, struct cifs_sb_info *,
 342                               struct cifs_fid *, __u16,
 343                               struct cifs_search_info *);
 344        /* continue readdir */
 345        int (*query_dir_next)(const unsigned int, struct cifs_tcon *,
 346                              struct cifs_fid *,
 347                              __u16, struct cifs_search_info *srch_inf);
 348        /* close dir */
 349        int (*close_dir)(const unsigned int, struct cifs_tcon *,
 350                         struct cifs_fid *);
 351        /* calculate a size of SMB message */
 352        unsigned int (*calc_smb_size)(void *);
 353        /* check for STATUS_PENDING and process it in a positive case */
 354        bool (*is_status_pending)(char *, struct TCP_Server_Info *, int);
 355        /* send oplock break response */
 356        int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *,
 357                               struct cifsInodeInfo *);
 358        /* query remote filesystem */
 359        int (*queryfs)(const unsigned int, struct cifs_tcon *,
 360                       struct kstatfs *);
 361        /* send mandatory brlock to the server */
 362        int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
 363                         __u64, __u32, int, int, bool);
 364        /* unlock range of mandatory locks */
 365        int (*mand_unlock_range)(struct cifsFileInfo *, struct file_lock *,
 366                                 const unsigned int);
 367        /* push brlocks from the cache to the server */
 368        int (*push_mand_locks)(struct cifsFileInfo *);
 369        /* get lease key of the inode */
 370        void (*get_lease_key)(struct inode *, struct cifs_fid *);
 371        /* set lease key of the inode */
 372        void (*set_lease_key)(struct inode *, struct cifs_fid *);
 373        /* generate new lease key */
 374        void (*new_lease_key)(struct cifs_fid *);
 375        int (*generate_signingkey)(struct cifs_ses *);
 376        int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *);
 377        int (*set_integrity)(const unsigned int, struct cifs_tcon *tcon,
 378                             struct cifsFileInfo *src_file);
 379        int (*query_mf_symlink)(unsigned int, struct cifs_tcon *,
 380                                struct cifs_sb_info *, const unsigned char *,
 381                                char *, unsigned int *);
 382        int (*create_mf_symlink)(unsigned int, struct cifs_tcon *,
 383                                 struct cifs_sb_info *, const unsigned char *,
 384                                 char *, unsigned int *);
 385        /* if we can do cache read operations */
 386        bool (*is_read_op)(__u32);
 387        /* set oplock level for the inode */
 388        void (*set_oplock_level)(struct cifsInodeInfo *, __u32, unsigned int,
 389                                 bool *);
 390        /* create lease context buffer for CREATE request */
 391        char * (*create_lease_buf)(u8 *, u8);
 392        /* parse lease context buffer and return oplock/epoch info */
 393        __u8 (*parse_lease_buf)(void *, unsigned int *);
 394        int (*clone_range)(const unsigned int, struct cifsFileInfo *src_file,
 395                        struct cifsFileInfo *target_file, u64 src_off, u64 len,
 396                        u64 dest_off);
 397        int (*duplicate_extents)(const unsigned int, struct cifsFileInfo *src,
 398                        struct cifsFileInfo *target_file, u64 src_off, u64 len,
 399                        u64 dest_off);
 400        int (*validate_negotiate)(const unsigned int, struct cifs_tcon *);
 401        ssize_t (*query_all_EAs)(const unsigned int, struct cifs_tcon *,
 402                        const unsigned char *, const unsigned char *, char *,
 403                        size_t, const struct nls_table *, int);
 404        int (*set_EA)(const unsigned int, struct cifs_tcon *, const char *,
 405                        const char *, const void *, const __u16,
 406                        const struct nls_table *, int);
 407        struct cifs_ntsd * (*get_acl)(struct cifs_sb_info *, struct inode *,
 408                        const char *, u32 *);
 409        struct cifs_ntsd * (*get_acl_by_fid)(struct cifs_sb_info *,
 410                        const struct cifs_fid *, u32 *);
 411        int (*set_acl)(struct cifs_ntsd *, __u32, struct inode *, const char *,
 412                        int);
 413        /* writepages retry size */
 414        unsigned int (*wp_retry_size)(struct inode *);
 415        /* get mtu credits */
 416        int (*wait_mtu_credits)(struct TCP_Server_Info *, unsigned int,
 417                                unsigned int *, unsigned int *);
 418        /* check if we need to issue closedir */
 419        bool (*dir_needs_close)(struct cifsFileInfo *);
 420        long (*fallocate)(struct file *, struct cifs_tcon *, int, loff_t,
 421                          loff_t);
 422};
 423
 424struct smb_version_values {
 425        char            *version_string;
 426        __u16           protocol_id;
 427        __u32           req_capabilities;
 428        __u32           large_lock_type;
 429        __u32           exclusive_lock_type;
 430        __u32           shared_lock_type;
 431        __u32           unlock_lock_type;
 432        size_t          header_size;
 433        size_t          max_header_size;
 434        size_t          read_rsp_size;
 435        __le16          lock_cmd;
 436        unsigned int    cap_unix;
 437        unsigned int    cap_nt_find;
 438        unsigned int    cap_large_files;
 439        __u16           signing_enabled;
 440        __u16           signing_required;
 441        size_t          create_lease_size;
 442};
 443
 444#define HEADER_SIZE(server) (server->vals->header_size)
 445#define MAX_HEADER_SIZE(server) (server->vals->max_header_size)
 446
 447struct smb_vol {
 448        char *username;
 449        char *password;
 450        char *domainname;
 451        char *UNC;
 452        char *iocharset;  /* local code page for mapping to and from Unicode */
 453        char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */
 454        char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */
 455        kuid_t cred_uid;
 456        kuid_t linux_uid;
 457        kgid_t linux_gid;
 458        kuid_t backupuid;
 459        kgid_t backupgid;
 460        umode_t file_mode;
 461        umode_t dir_mode;
 462        enum securityEnum sectype; /* sectype requested via mnt opts */
 463        bool sign; /* was signing requested via mnt opts? */
 464        bool retry:1;
 465        bool intr:1;
 466        bool setuids:1;
 467        bool override_uid:1;
 468        bool override_gid:1;
 469        bool dynperm:1;
 470        bool noperm:1;
 471        bool no_psx_acl:1; /* set if posix acl support should be disabled */
 472        bool cifs_acl:1;
 473        bool backupuid_specified; /* mount option  backupuid  is specified */
 474        bool backupgid_specified; /* mount option  backupgid  is specified */
 475        bool no_xattr:1;   /* set if xattr (EA) support should be disabled*/
 476        bool server_ino:1; /* use inode numbers from server ie UniqueId */
 477        bool direct_io:1;
 478        bool strict_io:1; /* strict cache behavior */
 479        bool remap:1;      /* set to remap seven reserved chars in filenames */
 480        bool sfu_remap:1;  /* remap seven reserved chars ala SFU */
 481        bool posix_paths:1; /* unset to not ask for posix pathnames. */
 482        bool no_linux_ext:1;
 483        bool sfu_emul:1;
 484        bool nullauth:1;   /* attempt to authenticate with null user */
 485        bool nocase:1;     /* request case insensitive filenames */
 486        bool nobrl:1;      /* disable sending byte range locks to srv */
 487        bool mand_lock:1;  /* send mandatory not posix byte range lock reqs */
 488        bool seal:1;       /* request transport encryption on share */
 489        bool nodfs:1;      /* Do not request DFS, even if available */
 490        bool local_lease:1; /* check leases only on local system, not remote */
 491        bool noblocksnd:1;
 492        bool noautotune:1;
 493        bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
 494        bool fsc:1;     /* enable fscache */
 495        bool mfsymlinks:1; /* use Minshall+French Symlinks */
 496        bool multiuser:1;
 497        bool rwpidforward:1; /* pid forward for read/write operations */
 498        bool nosharesock:1;
 499        bool persistent:1;
 500        bool nopersistent:1;
 501        bool resilient:1; /* noresilient not required since not fored for CA */
 502        unsigned int rsize;
 503        unsigned int wsize;
 504        bool sockopt_tcp_nodelay:1;
 505        unsigned long actimeo; /* attribute cache timeout (jiffies) */
 506        struct smb_version_operations *ops;
 507        struct smb_version_values *vals;
 508        char *prepath;
 509        struct sockaddr_storage dstaddr; /* destination address */
 510        struct sockaddr_storage srcaddr; /* allow binding to a local IP */
 511        struct nls_table *local_nls;
 512        unsigned int echo_interval; /* echo interval in secs */
 513};
 514
 515#define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID | \
 516                         CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | \
 517                         CIFS_MOUNT_NO_XATTR | CIFS_MOUNT_MAP_SPECIAL_CHR | \
 518                         CIFS_MOUNT_MAP_SFM_CHR | \
 519                         CIFS_MOUNT_UNX_EMUL | CIFS_MOUNT_NO_BRL | \
 520                         CIFS_MOUNT_CIFS_ACL | CIFS_MOUNT_OVERR_UID | \
 521                         CIFS_MOUNT_OVERR_GID | CIFS_MOUNT_DYNPERM | \
 522                         CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC | \
 523                         CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | \
 524                         CIFS_MOUNT_MULTIUSER | CIFS_MOUNT_STRICT_IO | \
 525                         CIFS_MOUNT_CIFS_BACKUPUID | CIFS_MOUNT_CIFS_BACKUPGID)
 526
 527#define CIFS_MS_MASK (MS_RDONLY | MS_MANDLOCK | MS_NOEXEC | MS_NOSUID | \
 528                      MS_NODEV | MS_SYNCHRONOUS)
 529
 530struct cifs_mnt_data {
 531        struct cifs_sb_info *cifs_sb;
 532        struct smb_vol *vol;
 533        int flags;
 534};
 535
 536static inline unsigned int
 537get_rfc1002_length(void *buf)
 538{
 539        return be32_to_cpu(*((__be32 *)buf)) & 0xffffff;
 540}
 541
 542static inline void
 543inc_rfc1001_len(void *buf, int count)
 544{
 545        be32_add_cpu((__be32 *)buf, count);
 546}
 547
 548struct TCP_Server_Info {
 549        struct list_head tcp_ses_list;
 550        struct list_head smb_ses_list;
 551        int srv_count; /* reference counter */
 552        /* 15 character server name + 0x20 16th byte indicating type = srv */
 553        char server_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
 554        struct smb_version_operations   *ops;
 555        struct smb_version_values       *vals;
 556        enum statusEnum tcpStatus; /* what we think the status is */
 557        char *hostname; /* hostname portion of UNC string */
 558        struct socket *ssocket;
 559        struct sockaddr_storage dstaddr;
 560        struct sockaddr_storage srcaddr; /* locally bind to this IP */
 561#ifdef CONFIG_NET_NS
 562        struct net *net;
 563#endif
 564        wait_queue_head_t response_q;
 565        wait_queue_head_t request_q; /* if more than maxmpx to srvr must block*/
 566        struct list_head pending_mid_q;
 567        bool noblocksnd;                /* use blocking sendmsg */
 568        bool noautotune;                /* do not autotune send buf sizes */
 569        bool tcp_nodelay;
 570        int credits;  /* send no more requests at once */
 571        unsigned int in_flight;  /* number of requests on the wire to server */
 572        spinlock_t req_lock;  /* protect the two values above */
 573        struct mutex srv_mutex;
 574        struct task_struct *tsk;
 575        char server_GUID[16];
 576        __u16 sec_mode;
 577        bool sign; /* is signing enabled on this connection? */
 578        bool session_estab; /* mark when very first sess is established */
 579#ifdef CONFIG_CIFS_SMB2
 580        int echo_credits;  /* echo reserved slots */
 581        int oplock_credits;  /* oplock break reserved slots */
 582        bool echoes:1; /* enable echoes */
 583        __u8 client_guid[SMB2_CLIENT_GUID_SIZE]; /* Client GUID */
 584#endif
 585        u16 dialect; /* dialect index that server chose */
 586        bool oplocks:1; /* enable oplocks */
 587        unsigned int maxReq;    /* Clients should submit no more */
 588        /* than maxReq distinct unanswered SMBs to the server when using  */
 589        /* multiplexed reads or writes */
 590        unsigned int maxBuf;    /* maxBuf specifies the maximum */
 591        /* message size the server can send or receive for non-raw SMBs */
 592        /* maxBuf is returned by SMB NegotiateProtocol so maxBuf is only 0 */
 593        /* when socket is setup (and during reconnect) before NegProt sent */
 594        unsigned int max_rw;    /* maxRw specifies the maximum */
 595        /* message size the server can send or receive for */
 596        /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
 597        unsigned int capabilities; /* selective disabling of caps by smb sess */
 598        int timeAdj;  /* Adjust for difference in server time zone in sec */
 599        __u64 CurrentMid;         /* multiplex id - rotating counter */
 600        char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlm, ntlmv2 etc */
 601        /* 16th byte of RFC1001 workstation name is always null */
 602        char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
 603        __u32 sequence_number; /* for signing, protected by srv_mutex */
 604        struct session_key session_key;
 605        unsigned long lstrp; /* when we got last response from this server */
 606        struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */
 607#define CIFS_NEGFLAVOR_LANMAN   0       /* wct == 13, LANMAN */
 608#define CIFS_NEGFLAVOR_UNENCAP  1       /* wct == 17, but no ext_sec */
 609#define CIFS_NEGFLAVOR_EXTENDED 2       /* wct == 17, ext_sec bit set */
 610        char    negflavor;      /* NEGOTIATE response flavor */
 611        /* extended security flavors that server supports */
 612        bool    sec_ntlmssp;            /* supports NTLMSSP */
 613        bool    sec_kerberosu2u;        /* supports U2U Kerberos */
 614        bool    sec_kerberos;           /* supports plain Kerberos */
 615        bool    sec_mskerberos;         /* supports legacy MS Kerberos */
 616        bool    large_buf;              /* is current buffer large? */
 617        struct delayed_work     echo; /* echo ping workqueue job */
 618        struct kvec *iov;       /* reusable kvec array for receives */
 619        unsigned int nr_iov;    /* number of kvecs in array */
 620        char    *smallbuf;      /* pointer to current "small" buffer */
 621        char    *bigbuf;        /* pointer to current "big" buffer */
 622        unsigned int total_read; /* total amount of data read in this pass */
 623#ifdef CONFIG_CIFS_FSCACHE
 624        struct fscache_cookie   *fscache; /* client index cache cookie */
 625#endif
 626#ifdef CONFIG_CIFS_STATS2
 627        atomic_t in_send; /* requests trying to send */
 628        atomic_t num_waiters;   /* blocked waiting to get in sendrecv */
 629#endif
 630#ifdef CONFIG_CIFS_SMB2
 631        unsigned int    max_read;
 632        unsigned int    max_write;
 633        __u8            preauth_hash[512];
 634#endif /* CONFIG_CIFS_SMB2 */
 635        unsigned long echo_interval;
 636};
 637
 638static inline unsigned int
 639in_flight(struct TCP_Server_Info *server)
 640{
 641        unsigned int num;
 642        spin_lock(&server->req_lock);
 643        num = server->in_flight;
 644        spin_unlock(&server->req_lock);
 645        return num;
 646}
 647
 648static inline bool
 649has_credits(struct TCP_Server_Info *server, int *credits)
 650{
 651        int num;
 652        spin_lock(&server->req_lock);
 653        num = *credits;
 654        spin_unlock(&server->req_lock);
 655        return num > 0;
 656}
 657
 658static inline void
 659add_credits(struct TCP_Server_Info *server, const unsigned int add,
 660            const int optype)
 661{
 662        server->ops->add_credits(server, add, optype);
 663}
 664
 665static inline void
 666add_credits_and_wake_if(struct TCP_Server_Info *server, const unsigned int add,
 667                        const int optype)
 668{
 669        if (add) {
 670                server->ops->add_credits(server, add, optype);
 671                wake_up(&server->request_q);
 672        }
 673}
 674
 675static inline void
 676set_credits(struct TCP_Server_Info *server, const int val)
 677{
 678        server->ops->set_credits(server, val);
 679}
 680
 681static inline __le64
 682get_next_mid64(struct TCP_Server_Info *server)
 683{
 684        return cpu_to_le64(server->ops->get_next_mid(server));
 685}
 686
 687static inline __le16
 688get_next_mid(struct TCP_Server_Info *server)
 689{
 690        __u16 mid = server->ops->get_next_mid(server);
 691        /*
 692         * The value in the SMB header should be little endian for easy
 693         * on-the-wire decoding.
 694         */
 695        return cpu_to_le16(mid);
 696}
 697
 698static inline __u16
 699get_mid(const struct smb_hdr *smb)
 700{
 701        return le16_to_cpu(smb->Mid);
 702}
 703
 704static inline bool
 705compare_mid(__u16 mid, const struct smb_hdr *smb)
 706{
 707        return mid == le16_to_cpu(smb->Mid);
 708}
 709
 710/*
 711 * When the server supports very large reads and writes via POSIX extensions,
 712 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
 713 * including the RFC1001 length.
 714 *
 715 * Note that this might make for "interesting" allocation problems during
 716 * writeback however as we have to allocate an array of pointers for the
 717 * pages. A 16M write means ~32kb page array with PAGE_SIZE == 4096.
 718 *
 719 * For reads, there is a similar problem as we need to allocate an array
 720 * of kvecs to handle the receive, though that should only need to be done
 721 * once.
 722 */
 723#define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
 724#define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
 725
 726/*
 727 * When the server doesn't allow large posix writes, only allow a rsize/wsize
 728 * of 2^17-1 minus the size of the call header. That allows for a read or
 729 * write up to the maximum size described by RFC1002.
 730 */
 731#define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
 732#define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
 733
 734/*
 735 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
 736 * pages in a single call. With PAGE_SIZE == 4k, this means we can fill
 737 * a single wsize request with a single call.
 738 */
 739#define CIFS_DEFAULT_IOSIZE (1024 * 1024)
 740
 741/*
 742 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
 743 * those values when posix extensions aren't in force. In actuality here, we
 744 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
 745 * to be ok with the extra byte even though Windows doesn't send writes that
 746 * are that large.
 747 *
 748 * Citation:
 749 *
 750 * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
 751 */
 752#define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
 753#define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
 754
 755/*
 756 * Macros to allow the TCP_Server_Info->net field and related code to drop out
 757 * when CONFIG_NET_NS isn't set.
 758 */
 759
 760#ifdef CONFIG_NET_NS
 761
 762static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
 763{
 764        return srv->net;
 765}
 766
 767static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
 768{
 769        srv->net = net;
 770}
 771
 772#else
 773
 774static inline struct net *cifs_net_ns(struct TCP_Server_Info *srv)
 775{
 776        return &init_net;
 777}
 778
 779static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
 780{
 781}
 782
 783#endif
 784
 785/*
 786 * Session structure.  One of these for each uid session with a particular host
 787 */
 788struct cifs_ses {
 789        struct list_head smb_ses_list;
 790        struct list_head tcon_list;
 791        struct mutex session_mutex;
 792        struct TCP_Server_Info *server; /* pointer to server info */
 793        int ses_count;          /* reference counter */
 794        enum statusEnum status;
 795        unsigned overrideSecFlg;  /* if non-zero override global sec flags */
 796        __u16 ipc_tid;          /* special tid for connection to IPC share */
 797        char *serverOS;         /* name of operating system underlying server */
 798        char *serverNOS;        /* name of network operating system of server */
 799        char *serverDomain;     /* security realm of server */
 800        __u64 Suid;             /* remote smb uid  */
 801        kuid_t linux_uid;       /* overriding owner of files on the mount */
 802        kuid_t cred_uid;        /* owner of credentials */
 803        unsigned int capabilities;
 804        char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for
 805                                TCP names - will ipv6 and sctp addresses fit? */
 806        char *user_name;        /* must not be null except during init of sess
 807                                   and after mount option parsing we fill it */
 808        char *domainName;
 809        char *password;
 810        struct session_key auth_key;
 811        struct ntlmssp_auth *ntlmssp; /* ciphertext, flags, server challenge */
 812        enum securityEnum sectype; /* what security flavor was specified? */
 813        bool sign;              /* is signing required? */
 814        bool need_reconnect:1; /* connection reset, uid now invalid */
 815#ifdef CONFIG_CIFS_SMB2
 816        __u16 session_flags;
 817        __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE];
 818        __u8 smb3encryptionkey[SMB3_SIGN_KEY_SIZE];
 819        __u8 smb3decryptionkey[SMB3_SIGN_KEY_SIZE];
 820        __u8 preauth_hash[512];
 821#endif /* CONFIG_CIFS_SMB2 */
 822};
 823
 824static inline bool
 825cap_unix(struct cifs_ses *ses)
 826{
 827        return ses->server->vals->cap_unix & ses->capabilities;
 828}
 829
 830/*
 831 * there is one of these for each connection to a resource on a particular
 832 * session
 833 */
 834struct cifs_tcon {
 835        struct list_head tcon_list;
 836        int tc_count;
 837        struct list_head openFileList;
 838        struct cifs_ses *ses;   /* pointer to session associated with */
 839        char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
 840        char *nativeFileSystem;
 841        char *password;         /* for share-level security */
 842        __u32 tid;              /* The 4 byte tree id */
 843        __u16 Flags;            /* optional support bits */
 844        enum statusEnum tidStatus;
 845#ifdef CONFIG_CIFS_STATS
 846        atomic_t num_smbs_sent;
 847        union {
 848                struct {
 849                        atomic_t num_writes;
 850                        atomic_t num_reads;
 851                        atomic_t num_flushes;
 852                        atomic_t num_oplock_brks;
 853                        atomic_t num_opens;
 854                        atomic_t num_closes;
 855                        atomic_t num_deletes;
 856                        atomic_t num_mkdirs;
 857                        atomic_t num_posixopens;
 858                        atomic_t num_posixmkdirs;
 859                        atomic_t num_rmdirs;
 860                        atomic_t num_renames;
 861                        atomic_t num_t2renames;
 862                        atomic_t num_ffirst;
 863                        atomic_t num_fnext;
 864                        atomic_t num_fclose;
 865                        atomic_t num_hardlinks;
 866                        atomic_t num_symlinks;
 867                        atomic_t num_locks;
 868                        atomic_t num_acl_get;
 869                        atomic_t num_acl_set;
 870                } cifs_stats;
 871#ifdef CONFIG_CIFS_SMB2
 872                struct {
 873                        atomic_t smb2_com_sent[NUMBER_OF_SMB2_COMMANDS];
 874                        atomic_t smb2_com_failed[NUMBER_OF_SMB2_COMMANDS];
 875                } smb2_stats;
 876#endif /* CONFIG_CIFS_SMB2 */
 877        } stats;
 878#ifdef CONFIG_CIFS_STATS2
 879        unsigned long long time_writes;
 880        unsigned long long time_reads;
 881        unsigned long long time_opens;
 882        unsigned long long time_deletes;
 883        unsigned long long time_closes;
 884        unsigned long long time_mkdirs;
 885        unsigned long long time_rmdirs;
 886        unsigned long long time_renames;
 887        unsigned long long time_t2renames;
 888        unsigned long long time_ffirst;
 889        unsigned long long time_fnext;
 890        unsigned long long time_fclose;
 891#endif /* CONFIG_CIFS_STATS2 */
 892        __u64    bytes_read;
 893        __u64    bytes_written;
 894        spinlock_t stat_lock;
 895#endif /* CONFIG_CIFS_STATS */
 896        FILE_SYSTEM_DEVICE_INFO fsDevInfo;
 897        FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */
 898        FILE_SYSTEM_UNIX_INFO fsUnixInfo;
 899        bool ipc:1;             /* set if connection to IPC$ eg for RPC/PIPES */
 900        bool retry:1;
 901        bool nocase:1;
 902        bool seal:1;      /* transport encryption for this mounted share */
 903        bool unix_ext:1;  /* if false disable Linux extensions to CIFS protocol
 904                                for this mount even if server would support */
 905        bool local_lease:1; /* check leases (only) on local system not remote */
 906        bool broken_posix_open; /* e.g. Samba server versions < 3.3.2, 3.2.9 */
 907        bool broken_sparse_sup; /* if server or share does not support sparse */
 908        bool need_reconnect:1; /* connection reset, tid now invalid */
 909        bool use_resilient:1; /* use resilient instead of durable handles */
 910        bool use_persistent:1; /* use persistent instead of durable handles */
 911#ifdef CONFIG_CIFS_SMB2
 912        bool print:1;           /* set if connection to printer share */
 913        bool bad_network_name:1; /* set if ret status STATUS_BAD_NETWORK_NAME */
 914        __le32 capabilities;
 915        __u32 share_flags;
 916        __u32 maximal_access;
 917        __u32 vol_serial_number;
 918        __le64 vol_create_time;
 919        __u32 ss_flags;         /* sector size flags */
 920        __u32 perf_sector_size; /* best sector size for perf */
 921        __u32 max_chunks;
 922        __u32 max_bytes_chunk;
 923        __u32 max_bytes_copy;
 924#endif /* CONFIG_CIFS_SMB2 */
 925#ifdef CONFIG_CIFS_FSCACHE
 926        u64 resource_id;                /* server resource id */
 927        struct fscache_cookie *fscache; /* cookie for share */
 928#endif
 929        struct list_head pending_opens; /* list of incomplete opens */
 930        /* BB add field for back pointer to sb struct(s)? */
 931};
 932
 933/*
 934 * This is a refcounted and timestamped container for a tcon pointer. The
 935 * container holds a tcon reference. It is considered safe to free one of
 936 * these when the tl_count goes to 0. The tl_time is the time of the last
 937 * "get" on the container.
 938 */
 939struct tcon_link {
 940        struct rb_node          tl_rbnode;
 941        kuid_t                  tl_uid;
 942        unsigned long           tl_flags;
 943#define TCON_LINK_MASTER        0
 944#define TCON_LINK_PENDING       1
 945#define TCON_LINK_IN_TREE       2
 946        unsigned long           tl_time;
 947        atomic_t                tl_count;
 948        struct cifs_tcon        *tl_tcon;
 949};
 950
 951extern struct tcon_link *cifs_sb_tlink(struct cifs_sb_info *cifs_sb);
 952
 953static inline struct cifs_tcon *
 954tlink_tcon(struct tcon_link *tlink)
 955{
 956        return tlink->tl_tcon;
 957}
 958
 959extern void cifs_put_tlink(struct tcon_link *tlink);
 960
 961static inline struct tcon_link *
 962cifs_get_tlink(struct tcon_link *tlink)
 963{
 964        if (tlink && !IS_ERR(tlink))
 965                atomic_inc(&tlink->tl_count);
 966        return tlink;
 967}
 968
 969/* This function is always expected to succeed */
 970extern struct cifs_tcon *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
 971
 972#define CIFS_OPLOCK_NO_CHANGE 0xfe
 973
 974struct cifs_pending_open {
 975        struct list_head olist;
 976        struct tcon_link *tlink;
 977        __u8 lease_key[16];
 978        __u32 oplock;
 979};
 980
 981/*
 982 * This info hangs off the cifsFileInfo structure, pointed to by llist.
 983 * This is used to track byte stream locks on the file
 984 */
 985struct cifsLockInfo {
 986        struct list_head llist; /* pointer to next cifsLockInfo */
 987        struct list_head blist; /* pointer to locks blocked on this */
 988        wait_queue_head_t block_q;
 989        __u64 offset;
 990        __u64 length;
 991        __u32 pid;
 992        __u32 type;
 993};
 994
 995/*
 996 * One of these for each open instance of a file
 997 */
 998struct cifs_search_info {
 999        loff_t index_of_last_entry;
1000        __u16 entries_in_buffer;
1001        __u16 info_level;
1002        __u32 resume_key;
1003        char *ntwrk_buf_start;
1004        char *srch_entries_start;
1005        char *last_entry;
1006        const char *presume_name;
1007        unsigned int resume_name_len;
1008        bool endOfSearch:1;
1009        bool emptyDir:1;
1010        bool unicode:1;
1011        bool smallBuf:1; /* so we know which buf_release function to call */
1012};
1013
1014struct cifs_open_parms {
1015        struct cifs_tcon *tcon;
1016        struct cifs_sb_info *cifs_sb;
1017        int disposition;
1018        int desired_access;
1019        int create_options;
1020        const char *path;
1021        struct cifs_fid *fid;
1022        bool reconnect:1;
1023};
1024
1025struct cifs_fid {
1026        __u16 netfid;
1027#ifdef CONFIG_CIFS_SMB2
1028        __u64 persistent_fid;   /* persist file id for smb2 */
1029        __u64 volatile_fid;     /* volatile file id for smb2 */
1030        __u8 lease_key[SMB2_LEASE_KEY_SIZE];    /* lease key for smb2 */
1031        __u8 create_guid[16];
1032#endif
1033        struct cifs_pending_open *pending_open;
1034        unsigned int epoch;
1035        bool purge_cache;
1036};
1037
1038struct cifs_fid_locks {
1039        struct list_head llist;
1040        struct cifsFileInfo *cfile;     /* fid that owns locks */
1041        struct list_head locks;         /* locks held by fid above */
1042};
1043
1044struct cifsFileInfo {
1045        struct list_head tlist; /* pointer to next fid owned by tcon */
1046        struct list_head flist; /* next fid (file instance) for this inode */
1047        struct cifs_fid_locks *llist;   /* brlocks held by this fid */
1048        kuid_t uid;             /* allows finding which FileInfo structure */
1049        __u32 pid;              /* process id who opened file */
1050        struct cifs_fid fid;    /* file id from remote */
1051        /* BB add lock scope info here if needed */ ;
1052        /* lock scope id (0 if none) */
1053        struct dentry *dentry;
1054        unsigned int f_flags;
1055        struct tcon_link *tlink;
1056        bool invalidHandle:1;   /* file closed via session abend */
1057        bool oplock_break_cancelled:1;
1058        int count;              /* refcount protected by cifs_file_list_lock */
1059        struct mutex fh_mutex; /* prevents reopen race after dead ses*/
1060        struct cifs_search_info srch_inf;
1061        struct work_struct oplock_break; /* work for oplock breaks */
1062};
1063
1064struct cifs_io_parms {
1065        __u16 netfid;
1066#ifdef CONFIG_CIFS_SMB2
1067        __u64 persistent_fid;   /* persist file id for smb2 */
1068        __u64 volatile_fid;     /* volatile file id for smb2 */
1069#endif
1070        __u32 pid;
1071        __u64 offset;
1072        unsigned int length;
1073        struct cifs_tcon *tcon;
1074};
1075
1076struct cifs_readdata;
1077
1078/* asynchronous read support */
1079struct cifs_readdata {
1080        struct kref                     refcount;
1081        struct list_head                list;
1082        struct completion               done;
1083        struct cifsFileInfo             *cfile;
1084        struct address_space            *mapping;
1085        __u64                           offset;
1086        unsigned int                    bytes;
1087        unsigned int                    got_bytes;
1088        pid_t                           pid;
1089        int                             result;
1090        struct work_struct              work;
1091        int (*read_into_pages)(struct TCP_Server_Info *server,
1092                                struct cifs_readdata *rdata,
1093                                unsigned int len);
1094        struct kvec                     iov;
1095        unsigned int                    pagesz;
1096        unsigned int                    tailsz;
1097        unsigned int                    credits;
1098        unsigned int                    nr_pages;
1099        struct page                     *pages[];
1100};
1101
1102struct cifs_writedata;
1103
1104/* asynchronous write support */
1105struct cifs_writedata {
1106        struct kref                     refcount;
1107        struct list_head                list;
1108        struct completion               done;
1109        enum writeback_sync_modes       sync_mode;
1110        struct work_struct              work;
1111        struct cifsFileInfo             *cfile;
1112        __u64                           offset;
1113        pid_t                           pid;
1114        unsigned int                    bytes;
1115        int                             result;
1116        unsigned int                    pagesz;
1117        unsigned int                    tailsz;
1118        unsigned int                    credits;
1119        unsigned int                    nr_pages;
1120        struct page                     *pages[];
1121};
1122
1123/*
1124 * Take a reference on the file private data. Must be called with
1125 * cifs_file_list_lock held.
1126 */
1127static inline void
1128cifsFileInfo_get_locked(struct cifsFileInfo *cifs_file)
1129{
1130        ++cifs_file->count;
1131}
1132
1133struct cifsFileInfo *cifsFileInfo_get(struct cifsFileInfo *cifs_file);
1134void cifsFileInfo_put(struct cifsFileInfo *cifs_file);
1135
1136#define CIFS_CACHE_READ_FLG     1
1137#define CIFS_CACHE_HANDLE_FLG   2
1138#define CIFS_CACHE_RH_FLG       (CIFS_CACHE_READ_FLG | CIFS_CACHE_HANDLE_FLG)
1139#define CIFS_CACHE_WRITE_FLG    4
1140#define CIFS_CACHE_RW_FLG       (CIFS_CACHE_READ_FLG | CIFS_CACHE_WRITE_FLG)
1141#define CIFS_CACHE_RHW_FLG      (CIFS_CACHE_RW_FLG | CIFS_CACHE_HANDLE_FLG)
1142
1143#define CIFS_CACHE_READ(cinode) (cinode->oplock & CIFS_CACHE_READ_FLG)
1144#define CIFS_CACHE_HANDLE(cinode) (cinode->oplock & CIFS_CACHE_HANDLE_FLG)
1145#define CIFS_CACHE_WRITE(cinode) (cinode->oplock & CIFS_CACHE_WRITE_FLG)
1146
1147/*
1148 * One of these for each file inode
1149 */
1150
1151struct cifsInodeInfo {
1152        bool can_cache_brlcks;
1153        struct list_head llist; /* locks helb by this inode */
1154        struct rw_semaphore lock_sem;   /* protect the fields above */
1155        /* BB add in lists for dirty pages i.e. write caching info for oplock */
1156        struct list_head openFileList;
1157        __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
1158        unsigned int oplock;            /* oplock/lease level we have */
1159        unsigned int epoch;             /* used to track lease state changes */
1160#define CIFS_INODE_PENDING_OPLOCK_BREAK   (0) /* oplock break in progress */
1161#define CIFS_INODE_PENDING_WRITERS        (1) /* Writes in progress */
1162#define CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 (2) /* Downgrade oplock to L2 */
1163#define CIFS_INO_DELETE_PENDING           (3) /* delete pending on server */
1164#define CIFS_INO_INVALID_MAPPING          (4) /* pagecache is invalid */
1165#define CIFS_INO_LOCK                     (5) /* lock bit for synchronization */
1166        unsigned long flags;
1167        spinlock_t writers_lock;
1168        unsigned int writers;           /* Number of writers on this inode */
1169        unsigned long time;             /* jiffies of last update of inode */
1170        u64  server_eof;                /* current file size on server -- protected by i_lock */
1171        u64  uniqueid;                  /* server inode number */
1172        u64  createtime;                /* creation time on server */
1173#ifdef CONFIG_CIFS_SMB2
1174        __u8 lease_key[SMB2_LEASE_KEY_SIZE];    /* lease key for this inode */
1175#endif
1176#ifdef CONFIG_CIFS_FSCACHE
1177        struct fscache_cookie *fscache;
1178#endif
1179        struct inode vfs_inode;
1180};
1181
1182static inline struct cifsInodeInfo *
1183CIFS_I(struct inode *inode)
1184{
1185        return container_of(inode, struct cifsInodeInfo, vfs_inode);
1186}
1187
1188static inline struct cifs_sb_info *
1189CIFS_SB(struct super_block *sb)
1190{
1191        return sb->s_fs_info;
1192}
1193
1194static inline struct cifs_sb_info *
1195CIFS_FILE_SB(struct file *file)
1196{
1197        return CIFS_SB(file_inode(file)->i_sb);
1198}
1199
1200static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
1201{
1202        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
1203                return '/';
1204        else
1205                return '\\';
1206}
1207
1208static inline void
1209convert_delimiter(char *path, char delim)
1210{
1211        char old_delim, *pos;
1212
1213        if (delim == '/')
1214                old_delim = '\\';
1215        else
1216                old_delim = '/';
1217
1218        pos = path;
1219        while ((pos = strchr(pos, old_delim)))
1220                *pos = delim;
1221}
1222
1223#ifdef CONFIG_CIFS_STATS
1224#define cifs_stats_inc atomic_inc
1225
1226static inline void cifs_stats_bytes_written(struct cifs_tcon *tcon,
1227                                            unsigned int bytes)
1228{
1229        if (bytes) {
1230                spin_lock(&tcon->stat_lock);
1231                tcon->bytes_written += bytes;
1232                spin_unlock(&tcon->stat_lock);
1233        }
1234}
1235
1236static inline void cifs_stats_bytes_read(struct cifs_tcon *tcon,
1237                                         unsigned int bytes)
1238{
1239        spin_lock(&tcon->stat_lock);
1240        tcon->bytes_read += bytes;
1241        spin_unlock(&tcon->stat_lock);
1242}
1243#else
1244
1245#define  cifs_stats_inc(field) do {} while (0)
1246#define  cifs_stats_bytes_written(tcon, bytes) do {} while (0)
1247#define  cifs_stats_bytes_read(tcon, bytes) do {} while (0)
1248
1249#endif
1250
1251
1252/*
1253 * This is the prototype for the mid receive function. This function is for
1254 * receiving the rest of the SMB frame, starting with the WordCount (which is
1255 * just after the MID in struct smb_hdr). Note:
1256 *
1257 * - This will be called by cifsd, with no locks held.
1258 * - The mid will still be on the pending_mid_q.
1259 * - mid->resp_buf will point to the current buffer.
1260 *
1261 * Returns zero on a successful receive, or an error. The receive state in
1262 * the TCP_Server_Info will also be updated.
1263 */
1264typedef int (mid_receive_t)(struct TCP_Server_Info *server,
1265                            struct mid_q_entry *mid);
1266
1267/*
1268 * This is the prototype for the mid callback function. This is called once the
1269 * mid has been received off of the socket. When creating one, take special
1270 * care to avoid deadlocks. Things to bear in mind:
1271 *
1272 * - it will be called by cifsd, with no locks held
1273 * - the mid will be removed from any lists
1274 */
1275typedef void (mid_callback_t)(struct mid_q_entry *mid);
1276
1277/* one of these for every pending CIFS request to the server */
1278struct mid_q_entry {
1279        struct list_head qhead; /* mids waiting on reply from this server */
1280        struct TCP_Server_Info *server; /* server corresponding to this mid */
1281        __u64 mid;              /* multiplex id */
1282        __u32 pid;              /* process id */
1283        __u32 sequence_number;  /* for CIFS signing */
1284        unsigned long when_alloc;  /* when mid was created */
1285#ifdef CONFIG_CIFS_STATS2
1286        unsigned long when_sent; /* time when smb send finished */
1287        unsigned long when_received; /* when demux complete (taken off wire) */
1288#endif
1289        mid_receive_t *receive; /* call receive callback */
1290        mid_callback_t *callback; /* call completion callback */
1291        void *callback_data;      /* general purpose pointer for callback */
1292        void *resp_buf;         /* pointer to received SMB header */
1293        int mid_state;  /* wish this were enum but can not pass to wait_event */
1294        __le16 command;         /* smb command code */
1295        bool large_buf:1;       /* if valid response, is pointer to large buf */
1296        bool multiRsp:1;        /* multiple trans2 responses for one request  */
1297        bool multiEnd:1;        /* both received */
1298};
1299
1300/*      Make code in transport.c a little cleaner by moving
1301        update of optional stats into function below */
1302#ifdef CONFIG_CIFS_STATS2
1303
1304static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
1305{
1306        atomic_inc(&server->in_send);
1307}
1308
1309static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
1310{
1311        atomic_dec(&server->in_send);
1312}
1313
1314static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
1315{
1316        atomic_inc(&server->num_waiters);
1317}
1318
1319static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
1320{
1321        atomic_dec(&server->num_waiters);
1322}
1323
1324static inline void cifs_save_when_sent(struct mid_q_entry *mid)
1325{
1326        mid->when_sent = jiffies;
1327}
1328#else
1329static inline void cifs_in_send_inc(struct TCP_Server_Info *server)
1330{
1331}
1332static inline void cifs_in_send_dec(struct TCP_Server_Info *server)
1333{
1334}
1335
1336static inline void cifs_num_waiters_inc(struct TCP_Server_Info *server)
1337{
1338}
1339
1340static inline void cifs_num_waiters_dec(struct TCP_Server_Info *server)
1341{
1342}
1343
1344static inline void cifs_save_when_sent(struct mid_q_entry *mid)
1345{
1346}
1347#endif
1348
1349/* for pending dnotify requests */
1350struct dir_notify_req {
1351        struct list_head lhead;
1352        __le16 Pid;
1353        __le16 PidHigh;
1354        __u16 Mid;
1355        __u16 Tid;
1356        __u16 Uid;
1357        __u16 netfid;
1358        __u32 filter; /* CompletionFilter (for multishot) */
1359        int multishot;
1360        struct file *pfile;
1361};
1362
1363struct dfs_info3_param {
1364        int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/
1365        int path_consumed;
1366        int server_type;
1367        int ref_flag;
1368        char *path_name;
1369        char *node_name;
1370};
1371
1372/*
1373 * common struct for holding inode info when searching for or updating an
1374 * inode with new info
1375 */
1376
1377#define CIFS_FATTR_DFS_REFERRAL         0x1
1378#define CIFS_FATTR_DELETE_PENDING       0x2
1379#define CIFS_FATTR_NEED_REVAL           0x4
1380#define CIFS_FATTR_INO_COLLISION        0x8
1381#define CIFS_FATTR_UNKNOWN_NLINK        0x10
1382
1383struct cifs_fattr {
1384        u32             cf_flags;
1385        u32             cf_cifsattrs;
1386        u64             cf_uniqueid;
1387        u64             cf_eof;
1388        u64             cf_bytes;
1389        u64             cf_createtime;
1390        kuid_t          cf_uid;
1391        kgid_t          cf_gid;
1392        umode_t         cf_mode;
1393        dev_t           cf_rdev;
1394        unsigned int    cf_nlink;
1395        unsigned int    cf_dtype;
1396        struct timespec cf_atime;
1397        struct timespec cf_mtime;
1398        struct timespec cf_ctime;
1399};
1400
1401static inline void free_dfs_info_param(struct dfs_info3_param *param)
1402{
1403        if (param) {
1404                kfree(param->path_name);
1405                kfree(param->node_name);
1406                kfree(param);
1407        }
1408}
1409
1410static inline void free_dfs_info_array(struct dfs_info3_param *param,
1411                                       int number_of_items)
1412{
1413        int i;
1414        if ((number_of_items == 0) || (param == NULL))
1415                return;
1416        for (i = 0; i < number_of_items; i++) {
1417                kfree(param[i].path_name);
1418                kfree(param[i].node_name);
1419        }
1420        kfree(param);
1421}
1422
1423#define   MID_FREE 0
1424#define   MID_REQUEST_ALLOCATED 1
1425#define   MID_REQUEST_SUBMITTED 2
1426#define   MID_RESPONSE_RECEIVED 4
1427#define   MID_RETRY_NEEDED      8 /* session closed while this request out */
1428#define   MID_RESPONSE_MALFORMED 0x10
1429#define   MID_SHUTDOWN           0x20
1430
1431/* Types of response buffer returned from SendReceive2 */
1432#define   CIFS_NO_BUFFER        0    /* Response buffer not returned */
1433#define   CIFS_SMALL_BUFFER     1
1434#define   CIFS_LARGE_BUFFER     2
1435#define   CIFS_IOVEC            4    /* array of response buffers */
1436
1437/* Type of Request to SendReceive2 */
1438#define   CIFS_BLOCKING_OP      1    /* operation can block */
1439#define   CIFS_ASYNC_OP         2    /* do not wait for response */
1440#define   CIFS_TIMEOUT_MASK 0x003    /* only one of above set in req */
1441#define   CIFS_LOG_ERROR    0x010    /* log NT STATUS if non-zero */
1442#define   CIFS_LARGE_BUF_OP 0x020    /* large request buffer */
1443#define   CIFS_NO_RESP      0x040    /* no response buffer required */
1444
1445/* Type of request operation */
1446#define   CIFS_ECHO_OP      0x080    /* echo request */
1447#define   CIFS_OBREAK_OP   0x0100    /* oplock break request */
1448#define   CIFS_NEG_OP      0x0200    /* negotiate request */
1449#define   CIFS_OP_MASK     0x0380    /* mask request type */
1450#define   CIFS_HAS_CREDITS 0x0400    /* already has credits */
1451
1452/* Security Flags: indicate type of session setup needed */
1453#define   CIFSSEC_MAY_SIGN      0x00001
1454#define   CIFSSEC_MAY_NTLM      0x00002
1455#define   CIFSSEC_MAY_NTLMV2    0x00004
1456#define   CIFSSEC_MAY_KRB5      0x00008
1457#ifdef CONFIG_CIFS_WEAK_PW_HASH
1458#define   CIFSSEC_MAY_LANMAN    0x00010
1459#define   CIFSSEC_MAY_PLNTXT    0x00020
1460#else
1461#define   CIFSSEC_MAY_LANMAN    0
1462#define   CIFSSEC_MAY_PLNTXT    0
1463#endif /* weak passwords */
1464#define   CIFSSEC_MAY_SEAL      0x00040 /* not supported yet */
1465#define   CIFSSEC_MAY_NTLMSSP   0x00080 /* raw ntlmssp with ntlmv2 */
1466
1467#define   CIFSSEC_MUST_SIGN     0x01001
1468/* note that only one of the following can be set so the
1469result of setting MUST flags more than once will be to
1470require use of the stronger protocol */
1471#define   CIFSSEC_MUST_NTLM     0x02002
1472#define   CIFSSEC_MUST_NTLMV2   0x04004
1473#define   CIFSSEC_MUST_KRB5     0x08008
1474#ifdef CONFIG_CIFS_WEAK_PW_HASH
1475#define   CIFSSEC_MUST_LANMAN   0x10010
1476#define   CIFSSEC_MUST_PLNTXT   0x20020
1477#ifdef CONFIG_CIFS_UPCALL
1478#define   CIFSSEC_MASK          0xBF0BF /* allows weak security but also krb5 */
1479#else
1480#define   CIFSSEC_MASK          0xB70B7 /* current flags supported if weak */
1481#endif /* UPCALL */
1482#else /* do not allow weak pw hash */
1483#define   CIFSSEC_MUST_LANMAN   0
1484#define   CIFSSEC_MUST_PLNTXT   0
1485#ifdef CONFIG_CIFS_UPCALL
1486#define   CIFSSEC_MASK          0x8F08F /* flags supported if no weak allowed */
1487#else
1488#define   CIFSSEC_MASK          0x87087 /* flags supported if no weak allowed */
1489#endif /* UPCALL */
1490#endif /* WEAK_PW_HASH */
1491#define   CIFSSEC_MUST_SEAL     0x40040 /* not supported yet */
1492#define   CIFSSEC_MUST_NTLMSSP  0x80080 /* raw ntlmssp with ntlmv2 */
1493
1494#define   CIFSSEC_DEF (CIFSSEC_MAY_SIGN | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_NTLMSSP)
1495#define   CIFSSEC_MAX (CIFSSEC_MUST_SIGN | CIFSSEC_MUST_NTLMV2)
1496#define   CIFSSEC_AUTH_MASK (CIFSSEC_MAY_NTLM | CIFSSEC_MAY_NTLMV2 | CIFSSEC_MAY_LANMAN | CIFSSEC_MAY_PLNTXT | CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_NTLMSSP)
1497/*
1498 *****************************************************************
1499 * All constants go here
1500 *****************************************************************
1501 */
1502
1503#define UID_HASH (16)
1504
1505/*
1506 * Note that ONE module should define _DECLARE_GLOBALS_HERE to cause the
1507 * following to be declared.
1508 */
1509
1510/****************************************************************************
1511 *  Locking notes.  All updates to global variables and lists should be
1512 *                  protected by spinlocks or semaphores.
1513 *
1514 *  Spinlocks
1515 *  ---------
1516 *  GlobalMid_Lock protects:
1517 *      list operations on pending_mid_q and oplockQ
1518 *      updates to XID counters, multiplex id  and SMB sequence numbers
1519 *  cifs_file_list_lock protects:
1520 *      list operations on tcp and SMB session lists and tCon lists
1521 *  f_owner.lock protects certain per file struct operations
1522 *  mapping->page_lock protects certain per page operations
1523 *
1524 *  Semaphores
1525 *  ----------
1526 *  sesSem     operations on smb session
1527 *  tconSem    operations on tree connection
1528 *  fh_sem      file handle reconnection operations
1529 *
1530 ****************************************************************************/
1531
1532#ifdef DECLARE_GLOBALS_HERE
1533#define GLOBAL_EXTERN
1534#else
1535#define GLOBAL_EXTERN extern
1536#endif
1537
1538/*
1539 * the list of TCP_Server_Info structures, ie each of the sockets
1540 * connecting our client to a distinct server (ip address), is
1541 * chained together by cifs_tcp_ses_list. The list of all our SMB
1542 * sessions (and from that the tree connections) can be found
1543 * by iterating over cifs_tcp_ses_list
1544 */
1545GLOBAL_EXTERN struct list_head          cifs_tcp_ses_list;
1546
1547/*
1548 * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
1549 * tcp session, and the list of tcon's per smb session. It also protects
1550 * the reference counters for the server, smb session, and tcon. Finally,
1551 * changes to the tcon->tidStatus should be done while holding this lock.
1552 */
1553GLOBAL_EXTERN spinlock_t                cifs_tcp_ses_lock;
1554
1555/*
1556 * This lock protects the cifs_file->llist and cifs_file->flist
1557 * list operations, and updates to some flags (cifs_file->invalidHandle)
1558 * It will be moved to either use the tcon->stat_lock or equivalent later.
1559 * If cifs_tcp_ses_lock and the lock below are both needed to be held, then
1560 * the cifs_tcp_ses_lock must be grabbed first and released last.
1561 */
1562GLOBAL_EXTERN spinlock_t        cifs_file_list_lock;
1563
1564#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
1565/* Outstanding dir notify requests */
1566GLOBAL_EXTERN struct list_head GlobalDnotifyReqList;
1567/* DirNotify response queue */
1568GLOBAL_EXTERN struct list_head GlobalDnotifyRsp_Q;
1569#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1570
1571/*
1572 * Global transaction id (XID) information
1573 */
1574GLOBAL_EXTERN unsigned int GlobalCurrentXid;    /* protected by GlobalMid_Sem */
1575GLOBAL_EXTERN unsigned int GlobalTotalActiveXid; /* prot by GlobalMid_Sem */
1576GLOBAL_EXTERN unsigned int GlobalMaxActiveXid;  /* prot by GlobalMid_Sem */
1577GLOBAL_EXTERN spinlock_t GlobalMid_Lock;  /* protects above & list operations */
1578                                          /* on midQ entries */
1579/*
1580 *  Global counters, updated atomically
1581 */
1582GLOBAL_EXTERN atomic_t sesInfoAllocCount;
1583GLOBAL_EXTERN atomic_t tconInfoAllocCount;
1584GLOBAL_EXTERN atomic_t tcpSesAllocCount;
1585GLOBAL_EXTERN atomic_t tcpSesReconnectCount;
1586GLOBAL_EXTERN atomic_t tconInfoReconnectCount;
1587
1588/* Various Debug counters */
1589GLOBAL_EXTERN atomic_t bufAllocCount;    /* current number allocated  */
1590#ifdef CONFIG_CIFS_STATS2
1591GLOBAL_EXTERN atomic_t totBufAllocCount; /* total allocated over all time */
1592GLOBAL_EXTERN atomic_t totSmBufAllocCount;
1593#endif
1594GLOBAL_EXTERN atomic_t smBufAllocCount;
1595GLOBAL_EXTERN atomic_t midCount;
1596
1597/* Misc globals */
1598GLOBAL_EXTERN bool enable_oplocks; /* enable or disable oplocks */
1599GLOBAL_EXTERN bool lookupCacheEnabled;
1600GLOBAL_EXTERN unsigned int global_secflags;     /* if on, session setup sent
1601                                with more secure ntlmssp2 challenge/resp */
1602GLOBAL_EXTERN unsigned int sign_CIFS_PDUs;  /* enable smb packet signing */
1603GLOBAL_EXTERN bool linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/
1604GLOBAL_EXTERN unsigned int CIFSMaxBufSize;  /* max size not including hdr */
1605GLOBAL_EXTERN unsigned int cifs_min_rcv;    /* min size of big ntwrk buf pool */
1606GLOBAL_EXTERN unsigned int cifs_min_small;  /* min size of small buf pool */
1607GLOBAL_EXTERN unsigned int cifs_max_pending; /* MAX requests at once to server*/
1608
1609#ifdef CONFIG_CIFS_ACL
1610GLOBAL_EXTERN struct rb_root uidtree;
1611GLOBAL_EXTERN struct rb_root gidtree;
1612GLOBAL_EXTERN spinlock_t siduidlock;
1613GLOBAL_EXTERN spinlock_t sidgidlock;
1614GLOBAL_EXTERN struct rb_root siduidtree;
1615GLOBAL_EXTERN struct rb_root sidgidtree;
1616GLOBAL_EXTERN spinlock_t uidsidlock;
1617GLOBAL_EXTERN spinlock_t gidsidlock;
1618#endif /* CONFIG_CIFS_ACL */
1619
1620void cifs_oplock_break(struct work_struct *work);
1621
1622extern const struct slow_work_ops cifs_oplock_break_ops;
1623extern struct workqueue_struct *cifsiod_wq;
1624
1625extern mempool_t *cifs_mid_poolp;
1626
1627/* Operations for different SMB versions */
1628#define SMB1_VERSION_STRING     "1.0"
1629extern struct smb_version_operations smb1_operations;
1630extern struct smb_version_values smb1_values;
1631#define SMB20_VERSION_STRING    "2.0"
1632extern struct smb_version_operations smb20_operations;
1633extern struct smb_version_values smb20_values;
1634#define SMB21_VERSION_STRING    "2.1"
1635extern struct smb_version_operations smb21_operations;
1636extern struct smb_version_values smb21_values;
1637#define SMB30_VERSION_STRING    "3.0"
1638extern struct smb_version_operations smb30_operations;
1639extern struct smb_version_values smb30_values;
1640#define SMB302_VERSION_STRING   "3.02"
1641/*extern struct smb_version_operations smb302_operations;*/ /* not needed yet */
1642extern struct smb_version_values smb302_values;
1643#define SMB311_VERSION_STRING   "3.1.1"
1644#define ALT_SMB311_VERSION_STRING "3.11"
1645extern struct smb_version_operations smb311_operations;
1646extern struct smb_version_values smb311_values;
1647#endif  /* _CIFS_GLOB_H */
1648