linux/fs/cifs/connect.c
<<
>>
Prefs
   1/*
   2 *   fs/cifs/connect.c
   3 *
   4 *   Copyright (C) International Business Machines  Corp., 2002,2011
   5 *   Author(s): Steve French (sfrench@us.ibm.com)
   6 *
   7 *   This library is free software; you can redistribute it and/or modify
   8 *   it under the terms of the GNU Lesser General Public License as published
   9 *   by the Free Software Foundation; either version 2.1 of the License, or
  10 *   (at your option) any later version.
  11 *
  12 *   This library is distributed in the hope that it will be useful,
  13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  15 *   the GNU Lesser General Public License for more details.
  16 *
  17 *   You should have received a copy of the GNU Lesser General Public License
  18 *   along with this library; if not, write to the Free Software
  19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20 */
  21#include <linux/fs.h>
  22#include <linux/net.h>
  23#include <linux/string.h>
  24#include <linux/sched/signal.h>
  25#include <linux/list.h>
  26#include <linux/wait.h>
  27#include <linux/slab.h>
  28#include <linux/pagemap.h>
  29#include <linux/ctype.h>
  30#include <linux/utsname.h>
  31#include <linux/mempool.h>
  32#include <linux/delay.h>
  33#include <linux/completion.h>
  34#include <linux/kthread.h>
  35#include <linux/pagevec.h>
  36#include <linux/freezer.h>
  37#include <linux/namei.h>
  38#include <linux/uuid.h>
  39#include <linux/uaccess.h>
  40#include <asm/processor.h>
  41#include <linux/inet.h>
  42#include <linux/module.h>
  43#include <keys/user-type.h>
  44#include <net/ipv6.h>
  45#include <linux/parser.h>
  46#include <linux/bvec.h>
  47#include "cifspdu.h"
  48#include "cifsglob.h"
  49#include "cifsproto.h"
  50#include "cifs_unicode.h"
  51#include "cifs_debug.h"
  52#include "cifs_fs_sb.h"
  53#include "ntlmssp.h"
  54#include "nterr.h"
  55#include "rfc1002pdu.h"
  56#include "fscache.h"
  57#include "smb2proto.h"
  58#include "smbdirect.h"
  59#include "dns_resolve.h"
  60#include "cifsfs.h"
  61#ifdef CONFIG_CIFS_DFS_UPCALL
  62#include "dfs_cache.h"
  63#endif
  64
  65extern mempool_t *cifs_req_poolp;
  66extern bool disable_legacy_dialects;
  67
  68/* FIXME: should these be tunable? */
  69#define TLINK_ERROR_EXPIRE      (1 * HZ)
  70#define TLINK_IDLE_EXPIRE       (600 * HZ)
  71
  72enum {
  73        /* Mount options that take no arguments */
  74        Opt_user_xattr, Opt_nouser_xattr,
  75        Opt_forceuid, Opt_noforceuid,
  76        Opt_forcegid, Opt_noforcegid,
  77        Opt_noblocksend, Opt_noautotune, Opt_nolease,
  78        Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
  79        Opt_mapposix, Opt_nomapposix,
  80        Opt_mapchars, Opt_nomapchars, Opt_sfu,
  81        Opt_nosfu, Opt_nodfs, Opt_posixpaths,
  82        Opt_noposixpaths, Opt_nounix, Opt_unix,
  83        Opt_nocase,
  84        Opt_brl, Opt_nobrl,
  85        Opt_handlecache, Opt_nohandlecache,
  86        Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
  87        Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
  88        Opt_nohard, Opt_nosoft,
  89        Opt_nointr, Opt_intr,
  90        Opt_nostrictsync, Opt_strictsync,
  91        Opt_serverino, Opt_noserverino,
  92        Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
  93        Opt_acl, Opt_noacl, Opt_locallease,
  94        Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
  95        Opt_fsc, Opt_mfsymlinks,
  96        Opt_multiuser, Opt_sloppy, Opt_nosharesock,
  97        Opt_persistent, Opt_nopersistent,
  98        Opt_resilient, Opt_noresilient,
  99        Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
 100        Opt_compress,
 101
 102        /* Mount options which take numeric value */
 103        Opt_backupuid, Opt_backupgid, Opt_uid,
 104        Opt_cruid, Opt_gid, Opt_file_mode,
 105        Opt_dirmode, Opt_port,
 106        Opt_min_enc_offload,
 107        Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
 108        Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
 109        Opt_snapshot,
 110
 111        /* Mount options which take string value */
 112        Opt_user, Opt_pass, Opt_ip,
 113        Opt_domain, Opt_srcaddr, Opt_iocharset,
 114        Opt_netbiosname, Opt_servern,
 115        Opt_ver, Opt_vers, Opt_sec, Opt_cache,
 116
 117        /* Mount options to be ignored */
 118        Opt_ignore,
 119
 120        /* Options which could be blank */
 121        Opt_blank_pass,
 122        Opt_blank_user,
 123        Opt_blank_ip,
 124
 125        Opt_err
 126};
 127
 128static const match_table_t cifs_mount_option_tokens = {
 129
 130        { Opt_user_xattr, "user_xattr" },
 131        { Opt_nouser_xattr, "nouser_xattr" },
 132        { Opt_forceuid, "forceuid" },
 133        { Opt_noforceuid, "noforceuid" },
 134        { Opt_forcegid, "forcegid" },
 135        { Opt_noforcegid, "noforcegid" },
 136        { Opt_noblocksend, "noblocksend" },
 137        { Opt_noautotune, "noautotune" },
 138        { Opt_nolease, "nolease" },
 139        { Opt_hard, "hard" },
 140        { Opt_soft, "soft" },
 141        { Opt_perm, "perm" },
 142        { Opt_noperm, "noperm" },
 143        { Opt_mapchars, "mapchars" }, /* SFU style */
 144        { Opt_nomapchars, "nomapchars" },
 145        { Opt_mapposix, "mapposix" }, /* SFM style */
 146        { Opt_nomapposix, "nomapposix" },
 147        { Opt_sfu, "sfu" },
 148        { Opt_nosfu, "nosfu" },
 149        { Opt_nodfs, "nodfs" },
 150        { Opt_posixpaths, "posixpaths" },
 151        { Opt_noposixpaths, "noposixpaths" },
 152        { Opt_nounix, "nounix" },
 153        { Opt_nounix, "nolinux" },
 154        { Opt_nounix, "noposix" },
 155        { Opt_unix, "unix" },
 156        { Opt_unix, "linux" },
 157        { Opt_unix, "posix" },
 158        { Opt_nocase, "nocase" },
 159        { Opt_nocase, "ignorecase" },
 160        { Opt_brl, "brl" },
 161        { Opt_nobrl, "nobrl" },
 162        { Opt_handlecache, "handlecache" },
 163        { Opt_nohandlecache, "nohandlecache" },
 164        { Opt_nobrl, "nolock" },
 165        { Opt_forcemandatorylock, "forcemandatorylock" },
 166        { Opt_forcemandatorylock, "forcemand" },
 167        { Opt_setuids, "setuids" },
 168        { Opt_nosetuids, "nosetuids" },
 169        { Opt_setuidfromacl, "idsfromsid" },
 170        { Opt_dynperm, "dynperm" },
 171        { Opt_nodynperm, "nodynperm" },
 172        { Opt_nohard, "nohard" },
 173        { Opt_nosoft, "nosoft" },
 174        { Opt_nointr, "nointr" },
 175        { Opt_intr, "intr" },
 176        { Opt_nostrictsync, "nostrictsync" },
 177        { Opt_strictsync, "strictsync" },
 178        { Opt_serverino, "serverino" },
 179        { Opt_noserverino, "noserverino" },
 180        { Opt_rwpidforward, "rwpidforward" },
 181        { Opt_modesid, "modefromsid" },
 182        { Opt_cifsacl, "cifsacl" },
 183        { Opt_nocifsacl, "nocifsacl" },
 184        { Opt_acl, "acl" },
 185        { Opt_noacl, "noacl" },
 186        { Opt_locallease, "locallease" },
 187        { Opt_sign, "sign" },
 188        { Opt_ignore_signature, "signloosely" },
 189        { Opt_seal, "seal" },
 190        { Opt_noac, "noac" },
 191        { Opt_fsc, "fsc" },
 192        { Opt_mfsymlinks, "mfsymlinks" },
 193        { Opt_multiuser, "multiuser" },
 194        { Opt_sloppy, "sloppy" },
 195        { Opt_nosharesock, "nosharesock" },
 196        { Opt_persistent, "persistenthandles"},
 197        { Opt_nopersistent, "nopersistenthandles"},
 198        { Opt_resilient, "resilienthandles"},
 199        { Opt_noresilient, "noresilienthandles"},
 200        { Opt_domainauto, "domainauto"},
 201        { Opt_rdma, "rdma"},
 202
 203        { Opt_backupuid, "backupuid=%s" },
 204        { Opt_backupgid, "backupgid=%s" },
 205        { Opt_uid, "uid=%s" },
 206        { Opt_cruid, "cruid=%s" },
 207        { Opt_gid, "gid=%s" },
 208        { Opt_file_mode, "file_mode=%s" },
 209        { Opt_dirmode, "dirmode=%s" },
 210        { Opt_dirmode, "dir_mode=%s" },
 211        { Opt_port, "port=%s" },
 212        { Opt_min_enc_offload, "esize=%s" },
 213        { Opt_blocksize, "bsize=%s" },
 214        { Opt_rsize, "rsize=%s" },
 215        { Opt_wsize, "wsize=%s" },
 216        { Opt_actimeo, "actimeo=%s" },
 217        { Opt_handletimeout, "handletimeout=%s" },
 218        { Opt_echo_interval, "echo_interval=%s" },
 219        { Opt_max_credits, "max_credits=%s" },
 220        { Opt_snapshot, "snapshot=%s" },
 221        { Opt_compress, "compress=%s" },
 222
 223        { Opt_blank_user, "user=" },
 224        { Opt_blank_user, "username=" },
 225        { Opt_user, "user=%s" },
 226        { Opt_user, "username=%s" },
 227        { Opt_blank_pass, "pass=" },
 228        { Opt_blank_pass, "password=" },
 229        { Opt_pass, "pass=%s" },
 230        { Opt_pass, "password=%s" },
 231        { Opt_blank_ip, "ip=" },
 232        { Opt_blank_ip, "addr=" },
 233        { Opt_ip, "ip=%s" },
 234        { Opt_ip, "addr=%s" },
 235        { Opt_ignore, "unc=%s" },
 236        { Opt_ignore, "target=%s" },
 237        { Opt_ignore, "path=%s" },
 238        { Opt_domain, "dom=%s" },
 239        { Opt_domain, "domain=%s" },
 240        { Opt_domain, "workgroup=%s" },
 241        { Opt_srcaddr, "srcaddr=%s" },
 242        { Opt_ignore, "prefixpath=%s" },
 243        { Opt_iocharset, "iocharset=%s" },
 244        { Opt_netbiosname, "netbiosname=%s" },
 245        { Opt_servern, "servern=%s" },
 246        { Opt_ver, "ver=%s" },
 247        { Opt_vers, "vers=%s" },
 248        { Opt_sec, "sec=%s" },
 249        { Opt_cache, "cache=%s" },
 250
 251        { Opt_ignore, "cred" },
 252        { Opt_ignore, "credentials" },
 253        { Opt_ignore, "cred=%s" },
 254        { Opt_ignore, "credentials=%s" },
 255        { Opt_ignore, "guest" },
 256        { Opt_ignore, "rw" },
 257        { Opt_ignore, "ro" },
 258        { Opt_ignore, "suid" },
 259        { Opt_ignore, "nosuid" },
 260        { Opt_ignore, "exec" },
 261        { Opt_ignore, "noexec" },
 262        { Opt_ignore, "nodev" },
 263        { Opt_ignore, "noauto" },
 264        { Opt_ignore, "dev" },
 265        { Opt_ignore, "mand" },
 266        { Opt_ignore, "nomand" },
 267        { Opt_ignore, "relatime" },
 268        { Opt_ignore, "_netdev" },
 269        { Opt_rootfs, "rootfs" },
 270
 271        { Opt_err, NULL }
 272};
 273
 274enum {
 275        Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
 276        Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
 277        Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
 278        Opt_sec_ntlmv2i, Opt_sec_lanman,
 279        Opt_sec_none,
 280
 281        Opt_sec_err
 282};
 283
 284static const match_table_t cifs_secflavor_tokens = {
 285        { Opt_sec_krb5, "krb5" },
 286        { Opt_sec_krb5i, "krb5i" },
 287        { Opt_sec_krb5p, "krb5p" },
 288        { Opt_sec_ntlmsspi, "ntlmsspi" },
 289        { Opt_sec_ntlmssp, "ntlmssp" },
 290        { Opt_ntlm, "ntlm" },
 291        { Opt_sec_ntlmi, "ntlmi" },
 292        { Opt_sec_ntlmv2, "nontlm" },
 293        { Opt_sec_ntlmv2, "ntlmv2" },
 294        { Opt_sec_ntlmv2i, "ntlmv2i" },
 295        { Opt_sec_lanman, "lanman" },
 296        { Opt_sec_none, "none" },
 297
 298        { Opt_sec_err, NULL }
 299};
 300
 301/* cache flavors */
 302enum {
 303        Opt_cache_loose,
 304        Opt_cache_strict,
 305        Opt_cache_none,
 306        Opt_cache_ro,
 307        Opt_cache_rw,
 308        Opt_cache_err
 309};
 310
 311static const match_table_t cifs_cacheflavor_tokens = {
 312        { Opt_cache_loose, "loose" },
 313        { Opt_cache_strict, "strict" },
 314        { Opt_cache_none, "none" },
 315        { Opt_cache_ro, "ro" },
 316        { Opt_cache_rw, "singleclient" },
 317        { Opt_cache_err, NULL }
 318};
 319
 320static const match_table_t cifs_smb_version_tokens = {
 321        { Smb_1, SMB1_VERSION_STRING },
 322        { Smb_20, SMB20_VERSION_STRING},
 323        { Smb_21, SMB21_VERSION_STRING },
 324        { Smb_30, SMB30_VERSION_STRING },
 325        { Smb_302, SMB302_VERSION_STRING },
 326        { Smb_302, ALT_SMB302_VERSION_STRING },
 327        { Smb_311, SMB311_VERSION_STRING },
 328        { Smb_311, ALT_SMB311_VERSION_STRING },
 329        { Smb_3any, SMB3ANY_VERSION_STRING },
 330        { Smb_default, SMBDEFAULT_VERSION_STRING },
 331        { Smb_version_err, NULL }
 332};
 333
 334static int ip_connect(struct TCP_Server_Info *server);
 335static int generic_ip_connect(struct TCP_Server_Info *server);
 336static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
 337static void cifs_prune_tlinks(struct work_struct *work);
 338static char *extract_hostname(const char *unc);
 339
 340/*
 341 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
 342 * get their ip addresses changed at some point.
 343 *
 344 * This should be called with server->srv_mutex held.
 345 */
 346#ifdef CONFIG_CIFS_DFS_UPCALL
 347static int reconn_set_ipaddr(struct TCP_Server_Info *server)
 348{
 349        int rc;
 350        int len;
 351        char *unc, *ipaddr = NULL;
 352
 353        if (!server->hostname)
 354                return -EINVAL;
 355
 356        len = strlen(server->hostname) + 3;
 357
 358        unc = kmalloc(len, GFP_KERNEL);
 359        if (!unc) {
 360                cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
 361                return -ENOMEM;
 362        }
 363        scnprintf(unc, len, "\\\\%s", server->hostname);
 364
 365        rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
 366        kfree(unc);
 367
 368        if (rc < 0) {
 369                cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
 370                         __func__, server->hostname, rc);
 371                return rc;
 372        }
 373
 374        rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
 375                                  strlen(ipaddr));
 376        kfree(ipaddr);
 377
 378        return !rc ? -1 : 0;
 379}
 380#else
 381static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
 382{
 383        return 0;
 384}
 385#endif
 386
 387#ifdef CONFIG_CIFS_DFS_UPCALL
 388struct super_cb_data {
 389        struct TCP_Server_Info *server;
 390        struct cifs_sb_info *cifs_sb;
 391};
 392
 393/* These functions must be called with server->srv_mutex held */
 394
 395static void super_cb(struct super_block *sb, void *arg)
 396{
 397        struct super_cb_data *d = arg;
 398        struct cifs_sb_info *cifs_sb;
 399        struct cifs_tcon *tcon;
 400
 401        if (d->cifs_sb)
 402                return;
 403
 404        cifs_sb = CIFS_SB(sb);
 405        tcon = cifs_sb_master_tcon(cifs_sb);
 406        if (tcon->ses->server == d->server)
 407                d->cifs_sb = cifs_sb;
 408}
 409
 410static inline struct cifs_sb_info *
 411find_super_by_tcp(struct TCP_Server_Info *server)
 412{
 413        struct super_cb_data d = {
 414                .server = server,
 415                .cifs_sb = NULL,
 416        };
 417
 418        iterate_supers_type(&cifs_fs_type, super_cb, &d);
 419        return d.cifs_sb ? d.cifs_sb : ERR_PTR(-ENOENT);
 420}
 421
 422static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
 423                                    struct cifs_sb_info *cifs_sb,
 424                                    struct dfs_cache_tgt_list *tgt_list,
 425                                    struct dfs_cache_tgt_iterator **tgt_it)
 426{
 427        const char *name;
 428
 429        if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
 430            !server->nr_targets)
 431                return;
 432
 433        if (!*tgt_it) {
 434                *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
 435        } else {
 436                *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
 437                if (!*tgt_it)
 438                        *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
 439        }
 440
 441        cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
 442
 443        name = dfs_cache_get_tgt_name(*tgt_it);
 444
 445        kfree(server->hostname);
 446
 447        server->hostname = extract_hostname(name);
 448        if (IS_ERR(server->hostname)) {
 449                cifs_dbg(FYI,
 450                         "%s: failed to extract hostname from target: %ld\n",
 451                         __func__, PTR_ERR(server->hostname));
 452        }
 453}
 454
 455static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
 456                                           struct dfs_cache_tgt_list *tl,
 457                                           struct dfs_cache_tgt_iterator **it)
 458{
 459        if (!cifs_sb->origin_fullpath)
 460                return -EOPNOTSUPP;
 461        return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
 462}
 463#endif
 464
 465/*
 466 * cifs tcp session reconnection
 467 *
 468 * mark tcp session as reconnecting so temporarily locked
 469 * mark all smb sessions as reconnecting for tcp session
 470 * reconnect tcp session
 471 * wake up waiters on reconnection? - (not needed currently)
 472 */
 473int
 474cifs_reconnect(struct TCP_Server_Info *server)
 475{
 476        int rc = 0;
 477        struct list_head *tmp, *tmp2;
 478        struct cifs_ses *ses;
 479        struct cifs_tcon *tcon;
 480        struct mid_q_entry *mid_entry;
 481        struct list_head retry_list;
 482#ifdef CONFIG_CIFS_DFS_UPCALL
 483        struct cifs_sb_info *cifs_sb = NULL;
 484        struct dfs_cache_tgt_list tgt_list = {0};
 485        struct dfs_cache_tgt_iterator *tgt_it = NULL;
 486#endif
 487
 488        spin_lock(&GlobalMid_Lock);
 489        server->nr_targets = 1;
 490#ifdef CONFIG_CIFS_DFS_UPCALL
 491        spin_unlock(&GlobalMid_Lock);
 492        cifs_sb = find_super_by_tcp(server);
 493        if (IS_ERR(cifs_sb)) {
 494                rc = PTR_ERR(cifs_sb);
 495                cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
 496                         __func__, rc);
 497                cifs_sb = NULL;
 498        } else {
 499                rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
 500                if (rc && (rc != -EOPNOTSUPP)) {
 501                        cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
 502                                 __func__);
 503                } else {
 504                        server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
 505                }
 506        }
 507        cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
 508                 server->nr_targets);
 509        spin_lock(&GlobalMid_Lock);
 510#endif
 511        if (server->tcpStatus == CifsExiting) {
 512                /* the demux thread will exit normally
 513                next time through the loop */
 514                spin_unlock(&GlobalMid_Lock);
 515                return rc;
 516        } else
 517                server->tcpStatus = CifsNeedReconnect;
 518        spin_unlock(&GlobalMid_Lock);
 519        server->maxBuf = 0;
 520        server->max_read = 0;
 521
 522        cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
 523        trace_smb3_reconnect(server->CurrentMid, server->hostname);
 524
 525        /* before reconnecting the tcp session, mark the smb session (uid)
 526                and the tid bad so they are not used until reconnected */
 527        cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
 528                 __func__);
 529        spin_lock(&cifs_tcp_ses_lock);
 530        list_for_each(tmp, &server->smb_ses_list) {
 531                ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
 532                ses->need_reconnect = true;
 533                list_for_each(tmp2, &ses->tcon_list) {
 534                        tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
 535                        tcon->need_reconnect = true;
 536                }
 537                if (ses->tcon_ipc)
 538                        ses->tcon_ipc->need_reconnect = true;
 539        }
 540        spin_unlock(&cifs_tcp_ses_lock);
 541
 542        /* do not want to be sending data on a socket we are freeing */
 543        cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
 544        mutex_lock(&server->srv_mutex);
 545        if (server->ssocket) {
 546                cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
 547                         server->ssocket->state, server->ssocket->flags);
 548                kernel_sock_shutdown(server->ssocket, SHUT_WR);
 549                cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
 550                         server->ssocket->state, server->ssocket->flags);
 551                sock_release(server->ssocket);
 552                server->ssocket = NULL;
 553        }
 554        server->sequence_number = 0;
 555        server->session_estab = false;
 556        kfree(server->session_key.response);
 557        server->session_key.response = NULL;
 558        server->session_key.len = 0;
 559        server->lstrp = jiffies;
 560
 561        /* mark submitted MIDs for retry and issue callback */
 562        INIT_LIST_HEAD(&retry_list);
 563        cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
 564        spin_lock(&GlobalMid_Lock);
 565        list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
 566                mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 567                kref_get(&mid_entry->refcount);
 568                if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
 569                        mid_entry->mid_state = MID_RETRY_NEEDED;
 570                list_move(&mid_entry->qhead, &retry_list);
 571                mid_entry->mid_flags |= MID_DELETED;
 572        }
 573        spin_unlock(&GlobalMid_Lock);
 574        mutex_unlock(&server->srv_mutex);
 575
 576        cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
 577        list_for_each_safe(tmp, tmp2, &retry_list) {
 578                mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 579                list_del_init(&mid_entry->qhead);
 580                mid_entry->callback(mid_entry);
 581                cifs_mid_q_entry_release(mid_entry);
 582        }
 583
 584        if (cifs_rdma_enabled(server)) {
 585                mutex_lock(&server->srv_mutex);
 586                smbd_destroy(server);
 587                mutex_unlock(&server->srv_mutex);
 588        }
 589
 590        do {
 591                try_to_freeze();
 592
 593                mutex_lock(&server->srv_mutex);
 594                /*
 595                 * Set up next DFS target server (if any) for reconnect. If DFS
 596                 * feature is disabled, then we will retry last server we
 597                 * connected to before.
 598                 */
 599                if (cifs_rdma_enabled(server))
 600                        rc = smbd_reconnect(server);
 601                else
 602                        rc = generic_ip_connect(server);
 603                if (rc) {
 604                        cifs_dbg(FYI, "reconnect error %d\n", rc);
 605#ifdef CONFIG_CIFS_DFS_UPCALL
 606                        reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
 607                                                &tgt_it);
 608#endif
 609                        rc = reconn_set_ipaddr(server);
 610                        if (rc) {
 611                                cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
 612                                         __func__, rc);
 613                        }
 614                        mutex_unlock(&server->srv_mutex);
 615                        msleep(3000);
 616                } else {
 617                        atomic_inc(&tcpSesReconnectCount);
 618                        set_credits(server, 1);
 619                        spin_lock(&GlobalMid_Lock);
 620                        if (server->tcpStatus != CifsExiting)
 621                                server->tcpStatus = CifsNeedNegotiate;
 622                        spin_unlock(&GlobalMid_Lock);
 623                        mutex_unlock(&server->srv_mutex);
 624                }
 625        } while (server->tcpStatus == CifsNeedReconnect);
 626
 627#ifdef CONFIG_CIFS_DFS_UPCALL
 628        if (tgt_it) {
 629                rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
 630                                                    tgt_it);
 631                if (rc) {
 632                        cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
 633                                 __func__, rc);
 634                }
 635                rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
 636                if (rc) {
 637                        cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
 638                                 __func__, rc);
 639                }
 640                dfs_cache_free_tgts(&tgt_list);
 641        }
 642#endif
 643        if (server->tcpStatus == CifsNeedNegotiate)
 644                mod_delayed_work(cifsiod_wq, &server->echo, 0);
 645
 646        return rc;
 647}
 648
 649static void
 650cifs_echo_request(struct work_struct *work)
 651{
 652        int rc;
 653        struct TCP_Server_Info *server = container_of(work,
 654                                        struct TCP_Server_Info, echo.work);
 655        unsigned long echo_interval;
 656
 657        /*
 658         * If we need to renegotiate, set echo interval to zero to
 659         * immediately call echo service where we can renegotiate.
 660         */
 661        if (server->tcpStatus == CifsNeedNegotiate)
 662                echo_interval = 0;
 663        else
 664                echo_interval = server->echo_interval;
 665
 666        /*
 667         * We cannot send an echo if it is disabled.
 668         * Also, no need to ping if we got a response recently.
 669         */
 670
 671        if (server->tcpStatus == CifsNeedReconnect ||
 672            server->tcpStatus == CifsExiting ||
 673            server->tcpStatus == CifsNew ||
 674            (server->ops->can_echo && !server->ops->can_echo(server)) ||
 675            time_before(jiffies, server->lstrp + echo_interval - HZ))
 676                goto requeue_echo;
 677
 678        rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
 679        if (rc)
 680                cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
 681                         server->hostname);
 682
 683requeue_echo:
 684        queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
 685}
 686
 687static bool
 688allocate_buffers(struct TCP_Server_Info *server)
 689{
 690        if (!server->bigbuf) {
 691                server->bigbuf = (char *)cifs_buf_get();
 692                if (!server->bigbuf) {
 693                        cifs_server_dbg(VFS, "No memory for large SMB response\n");
 694                        msleep(3000);
 695                        /* retry will check if exiting */
 696                        return false;
 697                }
 698        } else if (server->large_buf) {
 699                /* we are reusing a dirty large buf, clear its start */
 700                memset(server->bigbuf, 0, HEADER_SIZE(server));
 701        }
 702
 703        if (!server->smallbuf) {
 704                server->smallbuf = (char *)cifs_small_buf_get();
 705                if (!server->smallbuf) {
 706                        cifs_server_dbg(VFS, "No memory for SMB response\n");
 707                        msleep(1000);
 708                        /* retry will check if exiting */
 709                        return false;
 710                }
 711                /* beginning of smb buffer is cleared in our buf_get */
 712        } else {
 713                /* if existing small buf clear beginning */
 714                memset(server->smallbuf, 0, HEADER_SIZE(server));
 715        }
 716
 717        return true;
 718}
 719
 720static bool
 721server_unresponsive(struct TCP_Server_Info *server)
 722{
 723        /*
 724         * We need to wait 3 echo intervals to make sure we handle such
 725         * situations right:
 726         * 1s  client sends a normal SMB request
 727         * 2s  client gets a response
 728         * 30s echo workqueue job pops, and decides we got a response recently
 729         *     and don't need to send another
 730         * ...
 731         * 65s kernel_recvmsg times out, and we see that we haven't gotten
 732         *     a response in >60s.
 733         */
 734        if ((server->tcpStatus == CifsGood ||
 735            server->tcpStatus == CifsNeedNegotiate) &&
 736            time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
 737                cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
 738                         (3 * server->echo_interval) / HZ);
 739                cifs_reconnect(server);
 740                wake_up(&server->response_q);
 741                return true;
 742        }
 743
 744        return false;
 745}
 746
 747static inline bool
 748zero_credits(struct TCP_Server_Info *server)
 749{
 750        int val;
 751
 752        spin_lock(&server->req_lock);
 753        val = server->credits + server->echo_credits + server->oplock_credits;
 754        if (server->in_flight == 0 && val == 0) {
 755                spin_unlock(&server->req_lock);
 756                return true;
 757        }
 758        spin_unlock(&server->req_lock);
 759        return false;
 760}
 761
 762static int
 763cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
 764{
 765        int length = 0;
 766        int total_read;
 767
 768        smb_msg->msg_control = NULL;
 769        smb_msg->msg_controllen = 0;
 770
 771        for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
 772                try_to_freeze();
 773
 774                /* reconnect if no credits and no requests in flight */
 775                if (zero_credits(server)) {
 776                        cifs_reconnect(server);
 777                        return -ECONNABORTED;
 778                }
 779
 780                if (server_unresponsive(server))
 781                        return -ECONNABORTED;
 782                if (cifs_rdma_enabled(server) && server->smbd_conn)
 783                        length = smbd_recv(server->smbd_conn, smb_msg);
 784                else
 785                        length = sock_recvmsg(server->ssocket, smb_msg, 0);
 786
 787                if (server->tcpStatus == CifsExiting)
 788                        return -ESHUTDOWN;
 789
 790                if (server->tcpStatus == CifsNeedReconnect) {
 791                        cifs_reconnect(server);
 792                        return -ECONNABORTED;
 793                }
 794
 795                if (length == -ERESTARTSYS ||
 796                    length == -EAGAIN ||
 797                    length == -EINTR) {
 798                        /*
 799                         * Minimum sleep to prevent looping, allowing socket
 800                         * to clear and app threads to set tcpStatus
 801                         * CifsNeedReconnect if server hung.
 802                         */
 803                        usleep_range(1000, 2000);
 804                        length = 0;
 805                        continue;
 806                }
 807
 808                if (length <= 0) {
 809                        cifs_dbg(FYI, "Received no data or error: %d\n", length);
 810                        cifs_reconnect(server);
 811                        return -ECONNABORTED;
 812                }
 813        }
 814        return total_read;
 815}
 816
 817int
 818cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
 819                      unsigned int to_read)
 820{
 821        struct msghdr smb_msg;
 822        struct kvec iov = {.iov_base = buf, .iov_len = to_read};
 823        iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
 824
 825        return cifs_readv_from_socket(server, &smb_msg);
 826}
 827
 828int
 829cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
 830        unsigned int page_offset, unsigned int to_read)
 831{
 832        struct msghdr smb_msg;
 833        struct bio_vec bv = {
 834                .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
 835        iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
 836        return cifs_readv_from_socket(server, &smb_msg);
 837}
 838
 839static bool
 840is_smb_response(struct TCP_Server_Info *server, unsigned char type)
 841{
 842        /*
 843         * The first byte big endian of the length field,
 844         * is actually not part of the length but the type
 845         * with the most common, zero, as regular data.
 846         */
 847        switch (type) {
 848        case RFC1002_SESSION_MESSAGE:
 849                /* Regular SMB response */
 850                return true;
 851        case RFC1002_SESSION_KEEP_ALIVE:
 852                cifs_dbg(FYI, "RFC 1002 session keep alive\n");
 853                break;
 854        case RFC1002_POSITIVE_SESSION_RESPONSE:
 855                cifs_dbg(FYI, "RFC 1002 positive session response\n");
 856                break;
 857        case RFC1002_NEGATIVE_SESSION_RESPONSE:
 858                /*
 859                 * We get this from Windows 98 instead of an error on
 860                 * SMB negprot response.
 861                 */
 862                cifs_dbg(FYI, "RFC 1002 negative session response\n");
 863                /* give server a second to clean up */
 864                msleep(1000);
 865                /*
 866                 * Always try 445 first on reconnect since we get NACK
 867                 * on some if we ever connected to port 139 (the NACK
 868                 * is since we do not begin with RFC1001 session
 869                 * initialize frame).
 870                 */
 871                cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
 872                cifs_reconnect(server);
 873                wake_up(&server->response_q);
 874                break;
 875        default:
 876                cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
 877                cifs_reconnect(server);
 878        }
 879
 880        return false;
 881}
 882
 883void
 884dequeue_mid(struct mid_q_entry *mid, bool malformed)
 885{
 886#ifdef CONFIG_CIFS_STATS2
 887        mid->when_received = jiffies;
 888#endif
 889        spin_lock(&GlobalMid_Lock);
 890        if (!malformed)
 891                mid->mid_state = MID_RESPONSE_RECEIVED;
 892        else
 893                mid->mid_state = MID_RESPONSE_MALFORMED;
 894        /*
 895         * Trying to handle/dequeue a mid after the send_recv()
 896         * function has finished processing it is a bug.
 897         */
 898        if (mid->mid_flags & MID_DELETED)
 899                printk_once(KERN_WARNING
 900                            "trying to dequeue a deleted mid\n");
 901        else {
 902                list_del_init(&mid->qhead);
 903                mid->mid_flags |= MID_DELETED;
 904        }
 905        spin_unlock(&GlobalMid_Lock);
 906}
 907
 908static void
 909handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
 910           char *buf, int malformed)
 911{
 912        if (server->ops->check_trans2 &&
 913            server->ops->check_trans2(mid, server, buf, malformed))
 914                return;
 915        mid->resp_buf = buf;
 916        mid->large_buf = server->large_buf;
 917        /* Was previous buf put in mpx struct for multi-rsp? */
 918        if (!mid->multiRsp) {
 919                /* smb buffer will be freed by user thread */
 920                if (server->large_buf)
 921                        server->bigbuf = NULL;
 922                else
 923                        server->smallbuf = NULL;
 924        }
 925        dequeue_mid(mid, malformed);
 926}
 927
 928static void clean_demultiplex_info(struct TCP_Server_Info *server)
 929{
 930        int length;
 931
 932        /* take it off the list, if it's not already */
 933        spin_lock(&cifs_tcp_ses_lock);
 934        list_del_init(&server->tcp_ses_list);
 935        spin_unlock(&cifs_tcp_ses_lock);
 936
 937        spin_lock(&GlobalMid_Lock);
 938        server->tcpStatus = CifsExiting;
 939        spin_unlock(&GlobalMid_Lock);
 940        wake_up_all(&server->response_q);
 941
 942        /* check if we have blocked requests that need to free */
 943        spin_lock(&server->req_lock);
 944        if (server->credits <= 0)
 945                server->credits = 1;
 946        spin_unlock(&server->req_lock);
 947        /*
 948         * Although there should not be any requests blocked on this queue it
 949         * can not hurt to be paranoid and try to wake up requests that may
 950         * haven been blocked when more than 50 at time were on the wire to the
 951         * same server - they now will see the session is in exit state and get
 952         * out of SendReceive.
 953         */
 954        wake_up_all(&server->request_q);
 955        /* give those requests time to exit */
 956        msleep(125);
 957        if (cifs_rdma_enabled(server))
 958                smbd_destroy(server);
 959        if (server->ssocket) {
 960                sock_release(server->ssocket);
 961                server->ssocket = NULL;
 962        }
 963
 964        if (!list_empty(&server->pending_mid_q)) {
 965                struct list_head dispose_list;
 966                struct mid_q_entry *mid_entry;
 967                struct list_head *tmp, *tmp2;
 968
 969                INIT_LIST_HEAD(&dispose_list);
 970                spin_lock(&GlobalMid_Lock);
 971                list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
 972                        mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 973                        cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
 974                        kref_get(&mid_entry->refcount);
 975                        mid_entry->mid_state = MID_SHUTDOWN;
 976                        list_move(&mid_entry->qhead, &dispose_list);
 977                        mid_entry->mid_flags |= MID_DELETED;
 978                }
 979                spin_unlock(&GlobalMid_Lock);
 980
 981                /* now walk dispose list and issue callbacks */
 982                list_for_each_safe(tmp, tmp2, &dispose_list) {
 983                        mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 984                        cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
 985                        list_del_init(&mid_entry->qhead);
 986                        mid_entry->callback(mid_entry);
 987                        cifs_mid_q_entry_release(mid_entry);
 988                }
 989                /* 1/8th of sec is more than enough time for them to exit */
 990                msleep(125);
 991        }
 992
 993        if (!list_empty(&server->pending_mid_q)) {
 994                /*
 995                 * mpx threads have not exited yet give them at least the smb
 996                 * send timeout time for long ops.
 997                 *
 998                 * Due to delays on oplock break requests, we need to wait at
 999                 * least 45 seconds before giving up on a request getting a
1000                 * response and going ahead and killing cifsd.
1001                 */
1002                cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1003                msleep(46000);
1004                /*
1005                 * If threads still have not exited they are probably never
1006                 * coming home not much else we can do but free the memory.
1007                 */
1008        }
1009
1010        kfree(server->hostname);
1011        kfree(server);
1012
1013        length = atomic_dec_return(&tcpSesAllocCount);
1014        if (length > 0)
1015                mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1016}
1017
1018static int
1019standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1020{
1021        int length;
1022        char *buf = server->smallbuf;
1023        unsigned int pdu_length = server->pdu_size;
1024
1025        /* make sure this will fit in a large buffer */
1026        if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1027                server->vals->header_preamble_size) {
1028                cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1029                cifs_reconnect(server);
1030                wake_up(&server->response_q);
1031                return -ECONNABORTED;
1032        }
1033
1034        /* switch to large buffer if too big for a small one */
1035        if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1036                server->large_buf = true;
1037                memcpy(server->bigbuf, buf, server->total_read);
1038                buf = server->bigbuf;
1039        }
1040
1041        /* now read the rest */
1042        length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1043                                       pdu_length - HEADER_SIZE(server) + 1
1044                                       + server->vals->header_preamble_size);
1045
1046        if (length < 0)
1047                return length;
1048        server->total_read += length;
1049
1050        dump_smb(buf, server->total_read);
1051
1052        return cifs_handle_standard(server, mid);
1053}
1054
1055int
1056cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1057{
1058        char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1059        int length;
1060
1061        /*
1062         * We know that we received enough to get to the MID as we
1063         * checked the pdu_length earlier. Now check to see
1064         * if the rest of the header is OK. We borrow the length
1065         * var for the rest of the loop to avoid a new stack var.
1066         *
1067         * 48 bytes is enough to display the header and a little bit
1068         * into the payload for debugging purposes.
1069         */
1070        length = server->ops->check_message(buf, server->total_read, server);
1071        if (length != 0)
1072                cifs_dump_mem("Bad SMB: ", buf,
1073                        min_t(unsigned int, server->total_read, 48));
1074
1075        if (server->ops->is_session_expired &&
1076            server->ops->is_session_expired(buf)) {
1077                cifs_reconnect(server);
1078                wake_up(&server->response_q);
1079                return -1;
1080        }
1081
1082        if (server->ops->is_status_pending &&
1083            server->ops->is_status_pending(buf, server))
1084                return -1;
1085
1086        if (!mid)
1087                return length;
1088
1089        handle_mid(mid, server, buf, length);
1090        return 0;
1091}
1092
1093static void
1094smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1095{
1096        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1097
1098        /*
1099         * SMB1 does not use credits.
1100         */
1101        if (server->vals->header_preamble_size)
1102                return;
1103
1104        if (shdr->CreditRequest) {
1105                spin_lock(&server->req_lock);
1106                server->credits += le16_to_cpu(shdr->CreditRequest);
1107                spin_unlock(&server->req_lock);
1108                wake_up(&server->request_q);
1109        }
1110}
1111
1112
1113static int
1114cifs_demultiplex_thread(void *p)
1115{
1116        int i, num_mids, length;
1117        struct TCP_Server_Info *server = p;
1118        unsigned int pdu_length;
1119        unsigned int next_offset;
1120        char *buf = NULL;
1121        struct task_struct *task_to_wake = NULL;
1122        struct mid_q_entry *mids[MAX_COMPOUND];
1123        char *bufs[MAX_COMPOUND];
1124
1125        current->flags |= PF_MEMALLOC;
1126        cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1127
1128        length = atomic_inc_return(&tcpSesAllocCount);
1129        if (length > 1)
1130                mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1131
1132        set_freezable();
1133        allow_kernel_signal(SIGKILL);
1134        while (server->tcpStatus != CifsExiting) {
1135                if (try_to_freeze())
1136                        continue;
1137
1138                if (!allocate_buffers(server))
1139                        continue;
1140
1141                server->large_buf = false;
1142                buf = server->smallbuf;
1143                pdu_length = 4; /* enough to get RFC1001 header */
1144
1145                length = cifs_read_from_socket(server, buf, pdu_length);
1146                if (length < 0)
1147                        continue;
1148
1149                if (server->vals->header_preamble_size == 0)
1150                        server->total_read = 0;
1151                else
1152                        server->total_read = length;
1153
1154                /*
1155                 * The right amount was read from socket - 4 bytes,
1156                 * so we can now interpret the length field.
1157                 */
1158                pdu_length = get_rfc1002_length(buf);
1159
1160                cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1161                if (!is_smb_response(server, buf[0]))
1162                        continue;
1163next_pdu:
1164                server->pdu_size = pdu_length;
1165
1166                /* make sure we have enough to get to the MID */
1167                if (server->pdu_size < HEADER_SIZE(server) - 1 -
1168                    server->vals->header_preamble_size) {
1169                        cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1170                                 server->pdu_size);
1171                        cifs_reconnect(server);
1172                        wake_up(&server->response_q);
1173                        continue;
1174                }
1175
1176                /* read down to the MID */
1177                length = cifs_read_from_socket(server,
1178                             buf + server->vals->header_preamble_size,
1179                             HEADER_SIZE(server) - 1
1180                             - server->vals->header_preamble_size);
1181                if (length < 0)
1182                        continue;
1183                server->total_read += length;
1184
1185                if (server->ops->next_header) {
1186                        next_offset = server->ops->next_header(buf);
1187                        if (next_offset)
1188                                server->pdu_size = next_offset;
1189                }
1190
1191                memset(mids, 0, sizeof(mids));
1192                memset(bufs, 0, sizeof(bufs));
1193                num_mids = 0;
1194
1195                if (server->ops->is_transform_hdr &&
1196                    server->ops->receive_transform &&
1197                    server->ops->is_transform_hdr(buf)) {
1198                        length = server->ops->receive_transform(server,
1199                                                                mids,
1200                                                                bufs,
1201                                                                &num_mids);
1202                } else {
1203                        mids[0] = server->ops->find_mid(server, buf);
1204                        bufs[0] = buf;
1205                        num_mids = 1;
1206
1207                        if (!mids[0] || !mids[0]->receive)
1208                                length = standard_receive3(server, mids[0]);
1209                        else
1210                                length = mids[0]->receive(server, mids[0]);
1211                }
1212
1213                if (length < 0) {
1214                        for (i = 0; i < num_mids; i++)
1215                                if (mids[i])
1216                                        cifs_mid_q_entry_release(mids[i]);
1217                        continue;
1218                }
1219
1220                server->lstrp = jiffies;
1221
1222                for (i = 0; i < num_mids; i++) {
1223                        if (mids[i] != NULL) {
1224                                mids[i]->resp_buf_size = server->pdu_size;
1225                                if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1226                                    mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1227                                    server->ops->handle_cancelled_mid)
1228                                        server->ops->handle_cancelled_mid(
1229                                                        mids[i]->resp_buf,
1230                                                        server);
1231
1232                                if (!mids[i]->multiRsp || mids[i]->multiEnd)
1233                                        mids[i]->callback(mids[i]);
1234
1235                                cifs_mid_q_entry_release(mids[i]);
1236                        } else if (server->ops->is_oplock_break &&
1237                                   server->ops->is_oplock_break(bufs[i],
1238                                                                server)) {
1239                                smb2_add_credits_from_hdr(bufs[i], server);
1240                                cifs_dbg(FYI, "Received oplock break\n");
1241                        } else {
1242                                cifs_server_dbg(VFS, "No task to wake, unknown frame "
1243                                         "received! NumMids %d\n",
1244                                         atomic_read(&midCount));
1245                                cifs_dump_mem("Received Data is: ", bufs[i],
1246                                              HEADER_SIZE(server));
1247                                smb2_add_credits_from_hdr(bufs[i], server);
1248#ifdef CONFIG_CIFS_DEBUG2
1249                                if (server->ops->dump_detail)
1250                                        server->ops->dump_detail(bufs[i],
1251                                                                 server);
1252                                cifs_dump_mids(server);
1253#endif /* CIFS_DEBUG2 */
1254                        }
1255                }
1256
1257                if (pdu_length > server->pdu_size) {
1258                        if (!allocate_buffers(server))
1259                                continue;
1260                        pdu_length -= server->pdu_size;
1261                        server->total_read = 0;
1262                        server->large_buf = false;
1263                        buf = server->smallbuf;
1264                        goto next_pdu;
1265                }
1266        } /* end while !EXITING */
1267
1268        /* buffer usually freed in free_mid - need to free it here on exit */
1269        cifs_buf_release(server->bigbuf);
1270        if (server->smallbuf) /* no sense logging a debug message if NULL */
1271                cifs_small_buf_release(server->smallbuf);
1272
1273        task_to_wake = xchg(&server->tsk, NULL);
1274        clean_demultiplex_info(server);
1275
1276        /* if server->tsk was NULL then wait for a signal before exiting */
1277        if (!task_to_wake) {
1278                set_current_state(TASK_INTERRUPTIBLE);
1279                while (!signal_pending(current)) {
1280                        schedule();
1281                        set_current_state(TASK_INTERRUPTIBLE);
1282                }
1283                set_current_state(TASK_RUNNING);
1284        }
1285
1286        module_put_and_exit(0);
1287}
1288
1289/* extract the host portion of the UNC string */
1290static char *
1291extract_hostname(const char *unc)
1292{
1293        const char *src;
1294        char *dst, *delim;
1295        unsigned int len;
1296
1297        /* skip double chars at beginning of string */
1298        /* BB: check validity of these bytes? */
1299        if (strlen(unc) < 3)
1300                return ERR_PTR(-EINVAL);
1301        for (src = unc; *src && *src == '\\'; src++)
1302                ;
1303        if (!*src)
1304                return ERR_PTR(-EINVAL);
1305
1306        /* delimiter between hostname and sharename is always '\\' now */
1307        delim = strchr(src, '\\');
1308        if (!delim)
1309                return ERR_PTR(-EINVAL);
1310
1311        len = delim - src;
1312        dst = kmalloc((len + 1), GFP_KERNEL);
1313        if (dst == NULL)
1314                return ERR_PTR(-ENOMEM);
1315
1316        memcpy(dst, src, len);
1317        dst[len] = '\0';
1318
1319        return dst;
1320}
1321
1322static int get_option_ul(substring_t args[], unsigned long *option)
1323{
1324        int rc;
1325        char *string;
1326
1327        string = match_strdup(args);
1328        if (string == NULL)
1329                return -ENOMEM;
1330        rc = kstrtoul(string, 0, option);
1331        kfree(string);
1332
1333        return rc;
1334}
1335
1336static int get_option_uid(substring_t args[], kuid_t *result)
1337{
1338        unsigned long value;
1339        kuid_t uid;
1340        int rc;
1341
1342        rc = get_option_ul(args, &value);
1343        if (rc)
1344                return rc;
1345
1346        uid = make_kuid(current_user_ns(), value);
1347        if (!uid_valid(uid))
1348                return -EINVAL;
1349
1350        *result = uid;
1351        return 0;
1352}
1353
1354static int get_option_gid(substring_t args[], kgid_t *result)
1355{
1356        unsigned long value;
1357        kgid_t gid;
1358        int rc;
1359
1360        rc = get_option_ul(args, &value);
1361        if (rc)
1362                return rc;
1363
1364        gid = make_kgid(current_user_ns(), value);
1365        if (!gid_valid(gid))
1366                return -EINVAL;
1367
1368        *result = gid;
1369        return 0;
1370}
1371
1372static int cifs_parse_security_flavors(char *value,
1373                                       struct smb_vol *vol)
1374{
1375
1376        substring_t args[MAX_OPT_ARGS];
1377
1378        /*
1379         * With mount options, the last one should win. Reset any existing
1380         * settings back to default.
1381         */
1382        vol->sectype = Unspecified;
1383        vol->sign = false;
1384
1385        switch (match_token(value, cifs_secflavor_tokens, args)) {
1386        case Opt_sec_krb5p:
1387                cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1388                return 1;
1389        case Opt_sec_krb5i:
1390                vol->sign = true;
1391                /* Fallthrough */
1392        case Opt_sec_krb5:
1393                vol->sectype = Kerberos;
1394                break;
1395        case Opt_sec_ntlmsspi:
1396                vol->sign = true;
1397                /* Fallthrough */
1398        case Opt_sec_ntlmssp:
1399                vol->sectype = RawNTLMSSP;
1400                break;
1401        case Opt_sec_ntlmi:
1402                vol->sign = true;
1403                /* Fallthrough */
1404        case Opt_ntlm:
1405                vol->sectype = NTLM;
1406                break;
1407        case Opt_sec_ntlmv2i:
1408                vol->sign = true;
1409                /* Fallthrough */
1410        case Opt_sec_ntlmv2:
1411                vol->sectype = NTLMv2;
1412                break;
1413#ifdef CONFIG_CIFS_WEAK_PW_HASH
1414        case Opt_sec_lanman:
1415                vol->sectype = LANMAN;
1416                break;
1417#endif
1418        case Opt_sec_none:
1419                vol->nullauth = 1;
1420                break;
1421        default:
1422                cifs_dbg(VFS, "bad security option: %s\n", value);
1423                return 1;
1424        }
1425
1426        return 0;
1427}
1428
1429static int
1430cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1431{
1432        substring_t args[MAX_OPT_ARGS];
1433
1434        switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1435        case Opt_cache_loose:
1436                vol->direct_io = false;
1437                vol->strict_io = false;
1438                vol->cache_ro = false;
1439                vol->cache_rw = false;
1440                break;
1441        case Opt_cache_strict:
1442                vol->direct_io = false;
1443                vol->strict_io = true;
1444                vol->cache_ro = false;
1445                vol->cache_rw = false;
1446                break;
1447        case Opt_cache_none:
1448                vol->direct_io = true;
1449                vol->strict_io = false;
1450                vol->cache_ro = false;
1451                vol->cache_rw = false;
1452                break;
1453        case Opt_cache_ro:
1454                vol->direct_io = false;
1455                vol->strict_io = false;
1456                vol->cache_ro = true;
1457                vol->cache_rw = false;
1458                break;
1459        case Opt_cache_rw:
1460                vol->direct_io = false;
1461                vol->strict_io = false;
1462                vol->cache_ro = false;
1463                vol->cache_rw = true;
1464                break;
1465        default:
1466                cifs_dbg(VFS, "bad cache= option: %s\n", value);
1467                return 1;
1468        }
1469        return 0;
1470}
1471
1472static int
1473cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1474{
1475        substring_t args[MAX_OPT_ARGS];
1476
1477        switch (match_token(value, cifs_smb_version_tokens, args)) {
1478#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1479        case Smb_1:
1480                if (disable_legacy_dialects) {
1481                        cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1482                        return 1;
1483                }
1484                if (is_smb3) {
1485                        cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1486                        return 1;
1487                }
1488                vol->ops = &smb1_operations;
1489                vol->vals = &smb1_values;
1490                break;
1491        case Smb_20:
1492                if (disable_legacy_dialects) {
1493                        cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1494                        return 1;
1495                }
1496                if (is_smb3) {
1497                        cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1498                        return 1;
1499                }
1500                vol->ops = &smb20_operations;
1501                vol->vals = &smb20_values;
1502                break;
1503#else
1504        case Smb_1:
1505                cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1506                return 1;
1507        case Smb_20:
1508                cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1509                return 1;
1510#endif /* CIFS_ALLOW_INSECURE_LEGACY */
1511        case Smb_21:
1512                vol->ops = &smb21_operations;
1513                vol->vals = &smb21_values;
1514                break;
1515        case Smb_30:
1516                vol->ops = &smb30_operations;
1517                vol->vals = &smb30_values;
1518                break;
1519        case Smb_302:
1520                vol->ops = &smb30_operations; /* currently identical with 3.0 */
1521                vol->vals = &smb302_values;
1522                break;
1523        case Smb_311:
1524                vol->ops = &smb311_operations;
1525                vol->vals = &smb311_values;
1526                break;
1527        case Smb_3any:
1528                vol->ops = &smb30_operations; /* currently identical with 3.0 */
1529                vol->vals = &smb3any_values;
1530                break;
1531        case Smb_default:
1532                vol->ops = &smb30_operations; /* currently identical with 3.0 */
1533                vol->vals = &smbdefault_values;
1534                break;
1535        default:
1536                cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1537                return 1;
1538        }
1539        return 0;
1540}
1541
1542/*
1543 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1544 * fields with the result. Returns 0 on success and an error otherwise.
1545 */
1546static int
1547cifs_parse_devname(const char *devname, struct smb_vol *vol)
1548{
1549        char *pos;
1550        const char *delims = "/\\";
1551        size_t len;
1552
1553        if (unlikely(!devname || !*devname)) {
1554                cifs_dbg(VFS, "Device name not specified.\n");
1555                return -EINVAL;
1556        }
1557
1558        /* make sure we have a valid UNC double delimiter prefix */
1559        len = strspn(devname, delims);
1560        if (len != 2)
1561                return -EINVAL;
1562
1563        /* find delimiter between host and sharename */
1564        pos = strpbrk(devname + 2, delims);
1565        if (!pos)
1566                return -EINVAL;
1567
1568        /* skip past delimiter */
1569        ++pos;
1570
1571        /* now go until next delimiter or end of string */
1572        len = strcspn(pos, delims);
1573
1574        /* move "pos" up to delimiter or NULL */
1575        pos += len;
1576        vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1577        if (!vol->UNC)
1578                return -ENOMEM;
1579
1580        convert_delimiter(vol->UNC, '\\');
1581
1582        /* skip any delimiter */
1583        if (*pos == '/' || *pos == '\\')
1584                pos++;
1585
1586        /* If pos is NULL then no prepath */
1587        if (!*pos)
1588                return 0;
1589
1590        vol->prepath = kstrdup(pos, GFP_KERNEL);
1591        if (!vol->prepath)
1592                return -ENOMEM;
1593
1594        return 0;
1595}
1596
1597static int
1598cifs_parse_mount_options(const char *mountdata, const char *devname,
1599                         struct smb_vol *vol, bool is_smb3)
1600{
1601        char *data, *end;
1602        char *mountdata_copy = NULL, *options;
1603        unsigned int  temp_len, i, j;
1604        char separator[2];
1605        short int override_uid = -1;
1606        short int override_gid = -1;
1607        bool uid_specified = false;
1608        bool gid_specified = false;
1609        bool sloppy = false;
1610        char *invalid = NULL;
1611        char *nodename = utsname()->nodename;
1612        char *string = NULL;
1613        char *tmp_end, *value;
1614        char delim;
1615        bool got_ip = false;
1616        bool got_version = false;
1617        unsigned short port = 0;
1618        struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1619
1620        separator[0] = ',';
1621        separator[1] = 0;
1622        delim = separator[0];
1623
1624        /* ensure we always start with zeroed-out smb_vol */
1625        memset(vol, 0, sizeof(*vol));
1626
1627        /*
1628         * does not have to be perfect mapping since field is
1629         * informational, only used for servers that do not support
1630         * port 445 and it can be overridden at mount time
1631         */
1632        memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1633        for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1634                vol->source_rfc1001_name[i] = toupper(nodename[i]);
1635
1636        vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1637        /* null target name indicates to use *SMBSERVR default called name
1638           if we end up sending RFC1001 session initialize */
1639        vol->target_rfc1001_name[0] = 0;
1640        vol->cred_uid = current_uid();
1641        vol->linux_uid = current_uid();
1642        vol->linux_gid = current_gid();
1643        vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1644        /*
1645         * default to SFM style remapping of seven reserved characters
1646         * unless user overrides it or we negotiate CIFS POSIX where
1647         * it is unnecessary.  Can not simultaneously use more than one mapping
1648         * since then readdir could list files that open could not open
1649         */
1650        vol->remap = true;
1651
1652        /* default to only allowing write access to owner of the mount */
1653        vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1654
1655        /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1656        /* default is always to request posix paths. */
1657        vol->posix_paths = 1;
1658        /* default to using server inode numbers where available */
1659        vol->server_ino = 1;
1660
1661        /* default is to use strict cifs caching semantics */
1662        vol->strict_io = true;
1663
1664        vol->actimeo = CIFS_DEF_ACTIMEO;
1665
1666        /* Most clients set timeout to 0, allows server to use its default */
1667        vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1668
1669        /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1670        vol->ops = &smb30_operations;
1671        vol->vals = &smbdefault_values;
1672
1673        vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1674
1675        if (!mountdata)
1676                goto cifs_parse_mount_err;
1677
1678        mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1679        if (!mountdata_copy)
1680                goto cifs_parse_mount_err;
1681
1682        options = mountdata_copy;
1683        end = options + strlen(options);
1684
1685        if (strncmp(options, "sep=", 4) == 0) {
1686                if (options[4] != 0) {
1687                        separator[0] = options[4];
1688                        options += 5;
1689                } else {
1690                        cifs_dbg(FYI, "Null separator not allowed\n");
1691                }
1692        }
1693        vol->backupuid_specified = false; /* no backup intent for a user */
1694        vol->backupgid_specified = false; /* no backup intent for a group */
1695
1696        switch (cifs_parse_devname(devname, vol)) {
1697        case 0:
1698                break;
1699        case -ENOMEM:
1700                cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1701                goto cifs_parse_mount_err;
1702        case -EINVAL:
1703                cifs_dbg(VFS, "Malformed UNC in devname.\n");
1704                goto cifs_parse_mount_err;
1705        default:
1706                cifs_dbg(VFS, "Unknown error parsing devname.\n");
1707                goto cifs_parse_mount_err;
1708        }
1709
1710        while ((data = strsep(&options, separator)) != NULL) {
1711                substring_t args[MAX_OPT_ARGS];
1712                unsigned long option;
1713                int token;
1714
1715                if (!*data)
1716                        continue;
1717
1718                token = match_token(data, cifs_mount_option_tokens, args);
1719
1720                switch (token) {
1721
1722                /* Ingnore the following */
1723                case Opt_ignore:
1724                        break;
1725
1726                /* Boolean values */
1727                case Opt_user_xattr:
1728                        vol->no_xattr = 0;
1729                        break;
1730                case Opt_nouser_xattr:
1731                        vol->no_xattr = 1;
1732                        break;
1733                case Opt_forceuid:
1734                        override_uid = 1;
1735                        break;
1736                case Opt_noforceuid:
1737                        override_uid = 0;
1738                        break;
1739                case Opt_forcegid:
1740                        override_gid = 1;
1741                        break;
1742                case Opt_noforcegid:
1743                        override_gid = 0;
1744                        break;
1745                case Opt_noblocksend:
1746                        vol->noblocksnd = 1;
1747                        break;
1748                case Opt_noautotune:
1749                        vol->noautotune = 1;
1750                        break;
1751                case Opt_nolease:
1752                        vol->no_lease = 1;
1753                        break;
1754                case Opt_hard:
1755                        vol->retry = 1;
1756                        break;
1757                case Opt_soft:
1758                        vol->retry = 0;
1759                        break;
1760                case Opt_perm:
1761                        vol->noperm = 0;
1762                        break;
1763                case Opt_noperm:
1764                        vol->noperm = 1;
1765                        break;
1766                case Opt_mapchars:
1767                        vol->sfu_remap = true;
1768                        vol->remap = false; /* disable SFM mapping */
1769                        break;
1770                case Opt_nomapchars:
1771                        vol->sfu_remap = false;
1772                        break;
1773                case Opt_mapposix:
1774                        vol->remap = true;
1775                        vol->sfu_remap = false; /* disable SFU mapping */
1776                        break;
1777                case Opt_nomapposix:
1778                        vol->remap = false;
1779                        break;
1780                case Opt_sfu:
1781                        vol->sfu_emul = 1;
1782                        break;
1783                case Opt_nosfu:
1784                        vol->sfu_emul = 0;
1785                        break;
1786                case Opt_nodfs:
1787                        vol->nodfs = 1;
1788                        break;
1789                case Opt_rootfs:
1790#ifdef CONFIG_CIFS_ROOT
1791                        vol->rootfs = true;
1792#endif
1793                        break;
1794                case Opt_posixpaths:
1795                        vol->posix_paths = 1;
1796                        break;
1797                case Opt_noposixpaths:
1798                        vol->posix_paths = 0;
1799                        break;
1800                case Opt_nounix:
1801                        if (vol->linux_ext)
1802                                cifs_dbg(VFS,
1803                                        "conflicting unix mount options\n");
1804                        vol->no_linux_ext = 1;
1805                        break;
1806                case Opt_unix:
1807                        if (vol->no_linux_ext)
1808                                cifs_dbg(VFS,
1809                                        "conflicting unix mount options\n");
1810                        vol->linux_ext = 1;
1811                        break;
1812                case Opt_nocase:
1813                        vol->nocase = 1;
1814                        break;
1815                case Opt_brl:
1816                        vol->nobrl =  0;
1817                        break;
1818                case Opt_nobrl:
1819                        vol->nobrl =  1;
1820                        /*
1821                         * turn off mandatory locking in mode
1822                         * if remote locking is turned off since the
1823                         * local vfs will do advisory
1824                         */
1825                        if (vol->file_mode ==
1826                                (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1827                                vol->file_mode = S_IALLUGO;
1828                        break;
1829                case Opt_nohandlecache:
1830                        vol->nohandlecache = 1;
1831                        break;
1832                case Opt_handlecache:
1833                        vol->nohandlecache = 0;
1834                        break;
1835                case Opt_forcemandatorylock:
1836                        vol->mand_lock = 1;
1837                        break;
1838                case Opt_setuids:
1839                        vol->setuids = 1;
1840                        break;
1841                case Opt_nosetuids:
1842                        vol->setuids = 0;
1843                        break;
1844                case Opt_setuidfromacl:
1845                        vol->setuidfromacl = 1;
1846                        break;
1847                case Opt_dynperm:
1848                        vol->dynperm = true;
1849                        break;
1850                case Opt_nodynperm:
1851                        vol->dynperm = false;
1852                        break;
1853                case Opt_nohard:
1854                        vol->retry = 0;
1855                        break;
1856                case Opt_nosoft:
1857                        vol->retry = 1;
1858                        break;
1859                case Opt_nointr:
1860                        vol->intr = 0;
1861                        break;
1862                case Opt_intr:
1863                        vol->intr = 1;
1864                        break;
1865                case Opt_nostrictsync:
1866                        vol->nostrictsync = 1;
1867                        break;
1868                case Opt_strictsync:
1869                        vol->nostrictsync = 0;
1870                        break;
1871                case Opt_serverino:
1872                        vol->server_ino = 1;
1873                        break;
1874                case Opt_noserverino:
1875                        vol->server_ino = 0;
1876                        break;
1877                case Opt_rwpidforward:
1878                        vol->rwpidforward = 1;
1879                        break;
1880                case Opt_modesid:
1881                        vol->mode_ace = 1;
1882                        break;
1883                case Opt_cifsacl:
1884                        vol->cifs_acl = 1;
1885                        break;
1886                case Opt_nocifsacl:
1887                        vol->cifs_acl = 0;
1888                        break;
1889                case Opt_acl:
1890                        vol->no_psx_acl = 0;
1891                        break;
1892                case Opt_noacl:
1893                        vol->no_psx_acl = 1;
1894                        break;
1895                case Opt_locallease:
1896                        vol->local_lease = 1;
1897                        break;
1898                case Opt_sign:
1899                        vol->sign = true;
1900                        break;
1901                case Opt_ignore_signature:
1902                        vol->sign = true;
1903                        vol->ignore_signature = true;
1904                        break;
1905                case Opt_seal:
1906                        /* we do not do the following in secFlags because seal
1907                         * is a per tree connection (mount) not a per socket
1908                         * or per-smb connection option in the protocol
1909                         * vol->secFlg |= CIFSSEC_MUST_SEAL;
1910                         */
1911                        vol->seal = 1;
1912                        break;
1913                case Opt_noac:
1914                        pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1915                        break;
1916                case Opt_fsc:
1917#ifndef CONFIG_CIFS_FSCACHE
1918                        cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1919                        goto cifs_parse_mount_err;
1920#endif
1921                        vol->fsc = true;
1922                        break;
1923                case Opt_mfsymlinks:
1924                        vol->mfsymlinks = true;
1925                        break;
1926                case Opt_multiuser:
1927                        vol->multiuser = true;
1928                        break;
1929                case Opt_sloppy:
1930                        sloppy = true;
1931                        break;
1932                case Opt_nosharesock:
1933                        vol->nosharesock = true;
1934                        break;
1935                case Opt_nopersistent:
1936                        vol->nopersistent = true;
1937                        if (vol->persistent) {
1938                                cifs_dbg(VFS,
1939                                  "persistenthandles mount options conflict\n");
1940                                goto cifs_parse_mount_err;
1941                        }
1942                        break;
1943                case Opt_persistent:
1944                        vol->persistent = true;
1945                        if ((vol->nopersistent) || (vol->resilient)) {
1946                                cifs_dbg(VFS,
1947                                  "persistenthandles mount options conflict\n");
1948                                goto cifs_parse_mount_err;
1949                        }
1950                        break;
1951                case Opt_resilient:
1952                        vol->resilient = true;
1953                        if (vol->persistent) {
1954                                cifs_dbg(VFS,
1955                                  "persistenthandles mount options conflict\n");
1956                                goto cifs_parse_mount_err;
1957                        }
1958                        break;
1959                case Opt_noresilient:
1960                        vol->resilient = false; /* already the default */
1961                        break;
1962                case Opt_domainauto:
1963                        vol->domainauto = true;
1964                        break;
1965                case Opt_rdma:
1966                        vol->rdma = true;
1967                        break;
1968                case Opt_compress:
1969                        vol->compression = UNKNOWN_TYPE;
1970                        cifs_dbg(VFS,
1971                                "SMB3 compression support is experimental\n");
1972                        break;
1973
1974                /* Numeric Values */
1975                case Opt_backupuid:
1976                        if (get_option_uid(args, &vol->backupuid)) {
1977                                cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1978                                         __func__);
1979                                goto cifs_parse_mount_err;
1980                        }
1981                        vol->backupuid_specified = true;
1982                        break;
1983                case Opt_backupgid:
1984                        if (get_option_gid(args, &vol->backupgid)) {
1985                                cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1986                                         __func__);
1987                                goto cifs_parse_mount_err;
1988                        }
1989                        vol->backupgid_specified = true;
1990                        break;
1991                case Opt_uid:
1992                        if (get_option_uid(args, &vol->linux_uid)) {
1993                                cifs_dbg(VFS, "%s: Invalid uid value\n",
1994                                         __func__);
1995                                goto cifs_parse_mount_err;
1996                        }
1997                        uid_specified = true;
1998                        break;
1999                case Opt_cruid:
2000                        if (get_option_uid(args, &vol->cred_uid)) {
2001                                cifs_dbg(VFS, "%s: Invalid cruid value\n",
2002                                         __func__);
2003                                goto cifs_parse_mount_err;
2004                        }
2005                        break;
2006                case Opt_gid:
2007                        if (get_option_gid(args, &vol->linux_gid)) {
2008                                cifs_dbg(VFS, "%s: Invalid gid value\n",
2009                                         __func__);
2010                                goto cifs_parse_mount_err;
2011                        }
2012                        gid_specified = true;
2013                        break;
2014                case Opt_file_mode:
2015                        if (get_option_ul(args, &option)) {
2016                                cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2017                                         __func__);
2018                                goto cifs_parse_mount_err;
2019                        }
2020                        vol->file_mode = option;
2021                        break;
2022                case Opt_dirmode:
2023                        if (get_option_ul(args, &option)) {
2024                                cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2025                                         __func__);
2026                                goto cifs_parse_mount_err;
2027                        }
2028                        vol->dir_mode = option;
2029                        break;
2030                case Opt_port:
2031                        if (get_option_ul(args, &option) ||
2032                            option > USHRT_MAX) {
2033                                cifs_dbg(VFS, "%s: Invalid port value\n",
2034                                         __func__);
2035                                goto cifs_parse_mount_err;
2036                        }
2037                        port = (unsigned short)option;
2038                        break;
2039                case Opt_min_enc_offload:
2040                        if (get_option_ul(args, &option)) {
2041                                cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2042                                goto cifs_parse_mount_err;
2043                        }
2044                        vol->min_offload = option;
2045                        break;
2046                case Opt_blocksize:
2047                        if (get_option_ul(args, &option)) {
2048                                cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2049                                        __func__);
2050                                goto cifs_parse_mount_err;
2051                        }
2052                        /*
2053                         * inode blocksize realistically should never need to be
2054                         * less than 16K or greater than 16M and default is 1MB.
2055                         * Note that small inode block sizes (e.g. 64K) can lead
2056                         * to very poor performance of common tools like cp and scp
2057                         */
2058                        if ((option < CIFS_MAX_MSGSIZE) ||
2059                           (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2060                                cifs_dbg(VFS, "%s: Invalid blocksize\n",
2061                                        __func__);
2062                                goto cifs_parse_mount_err;
2063                        }
2064                        vol->bsize = option;
2065                        break;
2066                case Opt_rsize:
2067                        if (get_option_ul(args, &option)) {
2068                                cifs_dbg(VFS, "%s: Invalid rsize value\n",
2069                                         __func__);
2070                                goto cifs_parse_mount_err;
2071                        }
2072                        vol->rsize = option;
2073                        break;
2074                case Opt_wsize:
2075                        if (get_option_ul(args, &option)) {
2076                                cifs_dbg(VFS, "%s: Invalid wsize value\n",
2077                                         __func__);
2078                                goto cifs_parse_mount_err;
2079                        }
2080                        vol->wsize = option;
2081                        break;
2082                case Opt_actimeo:
2083                        if (get_option_ul(args, &option)) {
2084                                cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2085                                         __func__);
2086                                goto cifs_parse_mount_err;
2087                        }
2088                        vol->actimeo = HZ * option;
2089                        if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2090                                cifs_dbg(VFS, "attribute cache timeout too large\n");
2091                                goto cifs_parse_mount_err;
2092                        }
2093                        break;
2094                case Opt_handletimeout:
2095                        if (get_option_ul(args, &option)) {
2096                                cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2097                                         __func__);
2098                                goto cifs_parse_mount_err;
2099                        }
2100                        vol->handle_timeout = option;
2101                        if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2102                                cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2103                                goto cifs_parse_mount_err;
2104                        }
2105                        break;
2106                case Opt_echo_interval:
2107                        if (get_option_ul(args, &option)) {
2108                                cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2109                                         __func__);
2110                                goto cifs_parse_mount_err;
2111                        }
2112                        vol->echo_interval = option;
2113                        break;
2114                case Opt_snapshot:
2115                        if (get_option_ul(args, &option)) {
2116                                cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2117                                         __func__);
2118                                goto cifs_parse_mount_err;
2119                        }
2120                        vol->snapshot_time = option;
2121                        break;
2122                case Opt_max_credits:
2123                        if (get_option_ul(args, &option) || (option < 20) ||
2124                            (option > 60000)) {
2125                                cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2126                                         __func__);
2127                                goto cifs_parse_mount_err;
2128                        }
2129                        vol->max_credits = option;
2130                        break;
2131
2132                /* String Arguments */
2133
2134                case Opt_blank_user:
2135                        /* null user, ie. anonymous authentication */
2136                        vol->nullauth = 1;
2137                        vol->username = NULL;
2138                        break;
2139                case Opt_user:
2140                        string = match_strdup(args);
2141                        if (string == NULL)
2142                                goto out_nomem;
2143
2144                        if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2145                                                        CIFS_MAX_USERNAME_LEN) {
2146                                pr_warn("CIFS: username too long\n");
2147                                goto cifs_parse_mount_err;
2148                        }
2149
2150                        kfree(vol->username);
2151                        vol->username = kstrdup(string, GFP_KERNEL);
2152                        if (!vol->username)
2153                                goto cifs_parse_mount_err;
2154                        break;
2155                case Opt_blank_pass:
2156                        /* passwords have to be handled differently
2157                         * to allow the character used for deliminator
2158                         * to be passed within them
2159                         */
2160
2161                        /*
2162                         * Check if this is a case where the  password
2163                         * starts with a delimiter
2164                         */
2165                        tmp_end = strchr(data, '=');
2166                        tmp_end++;
2167                        if (!(tmp_end < end && tmp_end[1] == delim)) {
2168                                /* No it is not. Set the password to NULL */
2169                                kzfree(vol->password);
2170                                vol->password = NULL;
2171                                break;
2172                        }
2173                        /* Fallthrough - to Opt_pass below.*/
2174                case Opt_pass:
2175                        /* Obtain the value string */
2176                        value = strchr(data, '=');
2177                        value++;
2178
2179                        /* Set tmp_end to end of the string */
2180                        tmp_end = (char *) value + strlen(value);
2181
2182                        /* Check if following character is the deliminator
2183                         * If yes, we have encountered a double deliminator
2184                         * reset the NULL character to the deliminator
2185                         */
2186                        if (tmp_end < end && tmp_end[1] == delim) {
2187                                tmp_end[0] = delim;
2188
2189                                /* Keep iterating until we get to a single
2190                                 * deliminator OR the end
2191                                 */
2192                                while ((tmp_end = strchr(tmp_end, delim))
2193                                        != NULL && (tmp_end[1] == delim)) {
2194                                                tmp_end = (char *) &tmp_end[2];
2195                                }
2196
2197                                /* Reset var options to point to next element */
2198                                if (tmp_end) {
2199                                        tmp_end[0] = '\0';
2200                                        options = (char *) &tmp_end[1];
2201                                } else
2202                                        /* Reached the end of the mount option
2203                                         * string */
2204                                        options = end;
2205                        }
2206
2207                        kzfree(vol->password);
2208                        /* Now build new password string */
2209                        temp_len = strlen(value);
2210                        vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2211                        if (vol->password == NULL) {
2212                                pr_warn("CIFS: no memory for password\n");
2213                                goto cifs_parse_mount_err;
2214                        }
2215
2216                        for (i = 0, j = 0; i < temp_len; i++, j++) {
2217                                vol->password[j] = value[i];
2218                                if ((value[i] == delim) &&
2219                                     value[i+1] == delim)
2220                                        /* skip the second deliminator */
2221                                        i++;
2222                        }
2223                        vol->password[j] = '\0';
2224                        break;
2225                case Opt_blank_ip:
2226                        /* FIXME: should this be an error instead? */
2227                        got_ip = false;
2228                        break;
2229                case Opt_ip:
2230                        string = match_strdup(args);
2231                        if (string == NULL)
2232                                goto out_nomem;
2233
2234                        if (!cifs_convert_address(dstaddr, string,
2235                                        strlen(string))) {
2236                                pr_err("CIFS: bad ip= option (%s).\n", string);
2237                                goto cifs_parse_mount_err;
2238                        }
2239                        got_ip = true;
2240                        break;
2241                case Opt_domain:
2242                        string = match_strdup(args);
2243                        if (string == NULL)
2244                                goto out_nomem;
2245
2246                        if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2247                                        == CIFS_MAX_DOMAINNAME_LEN) {
2248                                pr_warn("CIFS: domain name too long\n");
2249                                goto cifs_parse_mount_err;
2250                        }
2251
2252                        kfree(vol->domainname);
2253                        vol->domainname = kstrdup(string, GFP_KERNEL);
2254                        if (!vol->domainname) {
2255                                pr_warn("CIFS: no memory for domainname\n");
2256                                goto cifs_parse_mount_err;
2257                        }
2258                        cifs_dbg(FYI, "Domain name set\n");
2259                        break;
2260                case Opt_srcaddr:
2261                        string = match_strdup(args);
2262                        if (string == NULL)
2263                                goto out_nomem;
2264
2265                        if (!cifs_convert_address(
2266                                        (struct sockaddr *)&vol->srcaddr,
2267                                        string, strlen(string))) {
2268                                pr_warn("CIFS: Could not parse srcaddr: %s\n",
2269                                        string);
2270                                goto cifs_parse_mount_err;
2271                        }
2272                        break;
2273                case Opt_iocharset:
2274                        string = match_strdup(args);
2275                        if (string == NULL)
2276                                goto out_nomem;
2277
2278                        if (strnlen(string, 1024) >= 65) {
2279                                pr_warn("CIFS: iocharset name too long.\n");
2280                                goto cifs_parse_mount_err;
2281                        }
2282
2283                         if (strncasecmp(string, "default", 7) != 0) {
2284                                kfree(vol->iocharset);
2285                                vol->iocharset = kstrdup(string,
2286                                                         GFP_KERNEL);
2287                                if (!vol->iocharset) {
2288                                        pr_warn("CIFS: no memory for charset\n");
2289                                        goto cifs_parse_mount_err;
2290                                }
2291                        }
2292                        /* if iocharset not set then load_nls_default
2293                         * is used by caller
2294                         */
2295                         cifs_dbg(FYI, "iocharset set to %s\n", string);
2296                        break;
2297                case Opt_netbiosname:
2298                        string = match_strdup(args);
2299                        if (string == NULL)
2300                                goto out_nomem;
2301
2302                        memset(vol->source_rfc1001_name, 0x20,
2303                                RFC1001_NAME_LEN);
2304                        /*
2305                         * FIXME: are there cases in which a comma can
2306                         * be valid in workstation netbios name (and
2307                         * need special handling)?
2308                         */
2309                        for (i = 0; i < RFC1001_NAME_LEN; i++) {
2310                                /* don't ucase netbiosname for user */
2311                                if (string[i] == 0)
2312                                        break;
2313                                vol->source_rfc1001_name[i] = string[i];
2314                        }
2315                        /* The string has 16th byte zero still from
2316                         * set at top of the function
2317                         */
2318                        if (i == RFC1001_NAME_LEN && string[i] != 0)
2319                                pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2320                        break;
2321                case Opt_servern:
2322                        /* servernetbiosname specified override *SMBSERVER */
2323                        string = match_strdup(args);
2324                        if (string == NULL)
2325                                goto out_nomem;
2326
2327                        /* last byte, type, is 0x20 for servr type */
2328                        memset(vol->target_rfc1001_name, 0x20,
2329                                RFC1001_NAME_LEN_WITH_NULL);
2330
2331                        /* BB are there cases in which a comma can be
2332                           valid in this workstation netbios name
2333                           (and need special handling)? */
2334
2335                        /* user or mount helper must uppercase the
2336                           netbios name */
2337                        for (i = 0; i < 15; i++) {
2338                                if (string[i] == 0)
2339                                        break;
2340                                vol->target_rfc1001_name[i] = string[i];
2341                        }
2342                        /* The string has 16th byte zero still from
2343                           set at top of the function  */
2344                        if (i == RFC1001_NAME_LEN && string[i] != 0)
2345                                pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2346                        break;
2347                case Opt_ver:
2348                        /* version of mount userspace tools, not dialect */
2349                        string = match_strdup(args);
2350                        if (string == NULL)
2351                                goto out_nomem;
2352
2353                        /* If interface changes in mount.cifs bump to new ver */
2354                        if (strncasecmp(string, "1", 1) == 0) {
2355                                if (strlen(string) > 1) {
2356                                        pr_warn("Bad mount helper ver=%s. Did "
2357                                                "you want SMB1 (CIFS) dialect "
2358                                                "and mean to type vers=1.0 "
2359                                                "instead?\n", string);
2360                                        goto cifs_parse_mount_err;
2361                                }
2362                                /* This is the default */
2363                                break;
2364                        }
2365                        /* For all other value, error */
2366                        pr_warn("CIFS: Invalid mount helper version specified\n");
2367                        goto cifs_parse_mount_err;
2368                case Opt_vers:
2369                        /* protocol version (dialect) */
2370                        string = match_strdup(args);
2371                        if (string == NULL)
2372                                goto out_nomem;
2373
2374                        if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2375                                goto cifs_parse_mount_err;
2376                        got_version = true;
2377                        break;
2378                case Opt_sec:
2379                        string = match_strdup(args);
2380                        if (string == NULL)
2381                                goto out_nomem;
2382
2383                        if (cifs_parse_security_flavors(string, vol) != 0)
2384                                goto cifs_parse_mount_err;
2385                        break;
2386                case Opt_cache:
2387                        string = match_strdup(args);
2388                        if (string == NULL)
2389                                goto out_nomem;
2390
2391                        if (cifs_parse_cache_flavor(string, vol) != 0)
2392                                goto cifs_parse_mount_err;
2393                        break;
2394                default:
2395                        /*
2396                         * An option we don't recognize. Save it off for later
2397                         * if we haven't already found one
2398                         */
2399                        if (!invalid)
2400                                invalid = data;
2401                        break;
2402                }
2403                /* Free up any allocated string */
2404                kfree(string);
2405                string = NULL;
2406        }
2407
2408        if (!sloppy && invalid) {
2409                pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2410                goto cifs_parse_mount_err;
2411        }
2412
2413        if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2414                cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2415                goto cifs_parse_mount_err;
2416        }
2417
2418#ifndef CONFIG_KEYS
2419        /* Muliuser mounts require CONFIG_KEYS support */
2420        if (vol->multiuser) {
2421                cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2422                goto cifs_parse_mount_err;
2423        }
2424#endif
2425        if (!vol->UNC) {
2426                cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2427                goto cifs_parse_mount_err;
2428        }
2429
2430        /* make sure UNC has a share name */
2431        if (!strchr(vol->UNC + 3, '\\')) {
2432                cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2433                goto cifs_parse_mount_err;
2434        }
2435
2436        if (!got_ip) {
2437                int len;
2438                const char *slash;
2439
2440                /* No ip= option specified? Try to get it from UNC */
2441                /* Use the address part of the UNC. */
2442                slash = strchr(&vol->UNC[2], '\\');
2443                len = slash - &vol->UNC[2];
2444                if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2445                        pr_err("Unable to determine destination address.\n");
2446                        goto cifs_parse_mount_err;
2447                }
2448        }
2449
2450        /* set the port that we got earlier */
2451        cifs_set_port(dstaddr, port);
2452
2453        if (uid_specified)
2454                vol->override_uid = override_uid;
2455        else if (override_uid == 1)
2456                pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2457
2458        if (gid_specified)
2459                vol->override_gid = override_gid;
2460        else if (override_gid == 1)
2461                pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2462
2463        if (got_version == false)
2464                pr_warn("No dialect specified on mount. Default has changed to "
2465                        "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2466                        "(SMB1). To use the less secure SMB1 dialect to access "
2467                        "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2468                        " on mount.\n");
2469
2470        kfree(mountdata_copy);
2471        return 0;
2472
2473out_nomem:
2474        pr_warn("Could not allocate temporary buffer\n");
2475cifs_parse_mount_err:
2476        kfree(string);
2477        kfree(mountdata_copy);
2478        return 1;
2479}
2480
2481/** Returns true if srcaddr isn't specified and rhs isn't
2482 * specified, or if srcaddr is specified and
2483 * matches the IP address of the rhs argument.
2484 */
2485static bool
2486srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2487{
2488        switch (srcaddr->sa_family) {
2489        case AF_UNSPEC:
2490                return (rhs->sa_family == AF_UNSPEC);
2491        case AF_INET: {
2492                struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2493                struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2494                return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2495        }
2496        case AF_INET6: {
2497                struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2498                struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2499                return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2500        }
2501        default:
2502                WARN_ON(1);
2503                return false; /* don't expect to be here */
2504        }
2505}
2506
2507/*
2508 * If no port is specified in addr structure, we try to match with 445 port
2509 * and if it fails - with 139 ports. It should be called only if address
2510 * families of server and addr are equal.
2511 */
2512static bool
2513match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2514{
2515        __be16 port, *sport;
2516
2517        /* SMBDirect manages its own ports, don't match it here */
2518        if (server->rdma)
2519                return true;
2520
2521        switch (addr->sa_family) {
2522        case AF_INET:
2523                sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2524                port = ((struct sockaddr_in *) addr)->sin_port;
2525                break;
2526        case AF_INET6:
2527                sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2528                port = ((struct sockaddr_in6 *) addr)->sin6_port;
2529                break;
2530        default:
2531                WARN_ON(1);
2532                return false;
2533        }
2534
2535        if (!port) {
2536                port = htons(CIFS_PORT);
2537                if (port == *sport)
2538                        return true;
2539
2540                port = htons(RFC1001_PORT);
2541        }
2542
2543        return port == *sport;
2544}
2545
2546static bool
2547match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2548              struct sockaddr *srcaddr)
2549{
2550        switch (addr->sa_family) {
2551        case AF_INET: {
2552                struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2553                struct sockaddr_in *srv_addr4 =
2554                                        (struct sockaddr_in *)&server->dstaddr;
2555
2556                if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2557                        return false;
2558                break;
2559        }
2560        case AF_INET6: {
2561                struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2562                struct sockaddr_in6 *srv_addr6 =
2563                                        (struct sockaddr_in6 *)&server->dstaddr;
2564
2565                if (!ipv6_addr_equal(&addr6->sin6_addr,
2566                                     &srv_addr6->sin6_addr))
2567                        return false;
2568                if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2569                        return false;
2570                break;
2571        }
2572        default:
2573                WARN_ON(1);
2574                return false; /* don't expect to be here */
2575        }
2576
2577        if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2578                return false;
2579
2580        return true;
2581}
2582
2583static bool
2584match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2585{
2586        /*
2587         * The select_sectype function should either return the vol->sectype
2588         * that was specified, or "Unspecified" if that sectype was not
2589         * compatible with the given NEGOTIATE request.
2590         */
2591        if (server->ops->select_sectype(server, vol->sectype)
2592             == Unspecified)
2593                return false;
2594
2595        /*
2596         * Now check if signing mode is acceptable. No need to check
2597         * global_secflags at this point since if MUST_SIGN is set then
2598         * the server->sign had better be too.
2599         */
2600        if (vol->sign && !server->sign)
2601                return false;
2602
2603        return true;
2604}
2605
2606static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2607{
2608        struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2609
2610        if (vol->nosharesock)
2611                return 0;
2612
2613        /* If multidialect negotiation see if existing sessions match one */
2614        if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2615                if (server->vals->protocol_id < SMB30_PROT_ID)
2616                        return 0;
2617        } else if (strcmp(vol->vals->version_string,
2618                   SMBDEFAULT_VERSION_STRING) == 0) {
2619                if (server->vals->protocol_id < SMB21_PROT_ID)
2620                        return 0;
2621        } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2622                return 0;
2623
2624        if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2625                return 0;
2626
2627        if (!match_address(server, addr,
2628                           (struct sockaddr *)&vol->srcaddr))
2629                return 0;
2630
2631        if (!match_port(server, addr))
2632                return 0;
2633
2634        if (!match_security(server, vol))
2635                return 0;
2636
2637        if (server->echo_interval != vol->echo_interval * HZ)
2638                return 0;
2639
2640        if (server->rdma != vol->rdma)
2641                return 0;
2642
2643        if (server->ignore_signature != vol->ignore_signature)
2644                return 0;
2645
2646        if (server->min_offload != vol->min_offload)
2647                return 0;
2648
2649        return 1;
2650}
2651
2652struct TCP_Server_Info *
2653cifs_find_tcp_session(struct smb_vol *vol)
2654{
2655        struct TCP_Server_Info *server;
2656
2657        spin_lock(&cifs_tcp_ses_lock);
2658        list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2659                if (!match_server(server, vol))
2660                        continue;
2661
2662                ++server->srv_count;
2663                spin_unlock(&cifs_tcp_ses_lock);
2664                cifs_dbg(FYI, "Existing tcp session with server found\n");
2665                return server;
2666        }
2667        spin_unlock(&cifs_tcp_ses_lock);
2668        return NULL;
2669}
2670
2671void
2672cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2673{
2674        struct task_struct *task;
2675
2676        spin_lock(&cifs_tcp_ses_lock);
2677        if (--server->srv_count > 0) {
2678                spin_unlock(&cifs_tcp_ses_lock);
2679                return;
2680        }
2681
2682        put_net(cifs_net_ns(server));
2683
2684        list_del_init(&server->tcp_ses_list);
2685        spin_unlock(&cifs_tcp_ses_lock);
2686
2687        cancel_delayed_work_sync(&server->echo);
2688
2689        if (from_reconnect)
2690                /*
2691                 * Avoid deadlock here: reconnect work calls
2692                 * cifs_put_tcp_session() at its end. Need to be sure
2693                 * that reconnect work does nothing with server pointer after
2694                 * that step.
2695                 */
2696                cancel_delayed_work(&server->reconnect);
2697        else
2698                cancel_delayed_work_sync(&server->reconnect);
2699
2700        spin_lock(&GlobalMid_Lock);
2701        server->tcpStatus = CifsExiting;
2702        spin_unlock(&GlobalMid_Lock);
2703
2704        cifs_crypto_secmech_release(server);
2705        cifs_fscache_release_client_cookie(server);
2706
2707        kfree(server->session_key.response);
2708        server->session_key.response = NULL;
2709        server->session_key.len = 0;
2710
2711        task = xchg(&server->tsk, NULL);
2712        if (task)
2713                send_sig(SIGKILL, task, 1);
2714}
2715
2716static struct TCP_Server_Info *
2717cifs_get_tcp_session(struct smb_vol *volume_info)
2718{
2719        struct TCP_Server_Info *tcp_ses = NULL;
2720        int rc;
2721
2722        cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2723
2724        /* see if we already have a matching tcp_ses */
2725        tcp_ses = cifs_find_tcp_session(volume_info);
2726        if (tcp_ses)
2727                return tcp_ses;
2728
2729        tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2730        if (!tcp_ses) {
2731                rc = -ENOMEM;
2732                goto out_err;
2733        }
2734
2735        tcp_ses->ops = volume_info->ops;
2736        tcp_ses->vals = volume_info->vals;
2737        cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2738        tcp_ses->hostname = extract_hostname(volume_info->UNC);
2739        if (IS_ERR(tcp_ses->hostname)) {
2740                rc = PTR_ERR(tcp_ses->hostname);
2741                goto out_err_crypto_release;
2742        }
2743
2744        tcp_ses->noblockcnt = volume_info->rootfs;
2745        tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2746        tcp_ses->noautotune = volume_info->noautotune;
2747        tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2748        tcp_ses->rdma = volume_info->rdma;
2749        tcp_ses->in_flight = 0;
2750        tcp_ses->max_in_flight = 0;
2751        tcp_ses->credits = 1;
2752        init_waitqueue_head(&tcp_ses->response_q);
2753        init_waitqueue_head(&tcp_ses->request_q);
2754        INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2755        mutex_init(&tcp_ses->srv_mutex);
2756        memcpy(tcp_ses->workstation_RFC1001_name,
2757                volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2758        memcpy(tcp_ses->server_RFC1001_name,
2759                volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2760        tcp_ses->session_estab = false;
2761        tcp_ses->sequence_number = 0;
2762        tcp_ses->reconnect_instance = 1;
2763        tcp_ses->lstrp = jiffies;
2764        tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2765        spin_lock_init(&tcp_ses->req_lock);
2766        INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2767        INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2768        INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2769        INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2770        mutex_init(&tcp_ses->reconnect_mutex);
2771        memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2772               sizeof(tcp_ses->srcaddr));
2773        memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2774                sizeof(tcp_ses->dstaddr));
2775        generate_random_uuid(tcp_ses->client_guid);
2776        /*
2777         * at this point we are the only ones with the pointer
2778         * to the struct since the kernel thread not created yet
2779         * no need to spinlock this init of tcpStatus or srv_count
2780         */
2781        tcp_ses->tcpStatus = CifsNew;
2782        ++tcp_ses->srv_count;
2783
2784        if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2785                volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2786                tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2787        else
2788                tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2789        if (tcp_ses->rdma) {
2790#ifndef CONFIG_CIFS_SMB_DIRECT
2791                cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2792                rc = -ENOENT;
2793                goto out_err_crypto_release;
2794#endif
2795                tcp_ses->smbd_conn = smbd_get_connection(
2796                        tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2797                if (tcp_ses->smbd_conn) {
2798                        cifs_dbg(VFS, "RDMA transport established\n");
2799                        rc = 0;
2800                        goto smbd_connected;
2801                } else {
2802                        rc = -ENOENT;
2803                        goto out_err_crypto_release;
2804                }
2805        }
2806        rc = ip_connect(tcp_ses);
2807        if (rc < 0) {
2808                cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2809                goto out_err_crypto_release;
2810        }
2811smbd_connected:
2812        /*
2813         * since we're in a cifs function already, we know that
2814         * this will succeed. No need for try_module_get().
2815         */
2816        __module_get(THIS_MODULE);
2817        tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2818                                  tcp_ses, "cifsd");
2819        if (IS_ERR(tcp_ses->tsk)) {
2820                rc = PTR_ERR(tcp_ses->tsk);
2821                cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2822                module_put(THIS_MODULE);
2823                goto out_err_crypto_release;
2824        }
2825        tcp_ses->min_offload = volume_info->min_offload;
2826        tcp_ses->tcpStatus = CifsNeedNegotiate;
2827
2828        tcp_ses->nr_targets = 1;
2829        tcp_ses->ignore_signature = volume_info->ignore_signature;
2830        /* thread spawned, put it on the list */
2831        spin_lock(&cifs_tcp_ses_lock);
2832        list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2833        spin_unlock(&cifs_tcp_ses_lock);
2834
2835        cifs_fscache_get_client_cookie(tcp_ses);
2836
2837        /* queue echo request delayed work */
2838        queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2839
2840        return tcp_ses;
2841
2842out_err_crypto_release:
2843        cifs_crypto_secmech_release(tcp_ses);
2844
2845        put_net(cifs_net_ns(tcp_ses));
2846
2847out_err:
2848        if (tcp_ses) {
2849                if (!IS_ERR(tcp_ses->hostname))
2850                        kfree(tcp_ses->hostname);
2851                if (tcp_ses->ssocket)
2852                        sock_release(tcp_ses->ssocket);
2853                kfree(tcp_ses);
2854        }
2855        return ERR_PTR(rc);
2856}
2857
2858static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2859{
2860        if (vol->sectype != Unspecified &&
2861            vol->sectype != ses->sectype)
2862                return 0;
2863
2864        switch (ses->sectype) {
2865        case Kerberos:
2866                if (!uid_eq(vol->cred_uid, ses->cred_uid))
2867                        return 0;
2868                break;
2869        default:
2870                /* NULL username means anonymous session */
2871                if (ses->user_name == NULL) {
2872                        if (!vol->nullauth)
2873                                return 0;
2874                        break;
2875                }
2876
2877                /* anything else takes username/password */
2878                if (strncmp(ses->user_name,
2879                            vol->username ? vol->username : "",
2880                            CIFS_MAX_USERNAME_LEN))
2881                        return 0;
2882                if ((vol->username && strlen(vol->username) != 0) &&
2883                    ses->password != NULL &&
2884                    strncmp(ses->password,
2885                            vol->password ? vol->password : "",
2886                            CIFS_MAX_PASSWORD_LEN))
2887                        return 0;
2888        }
2889        return 1;
2890}
2891
2892/**
2893 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2894 *
2895 * A new IPC connection is made and stored in the session
2896 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2897 */
2898static int
2899cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2900{
2901        int rc = 0, xid;
2902        struct cifs_tcon *tcon;
2903        struct nls_table *nls_codepage;
2904        char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2905        bool seal = false;
2906        struct TCP_Server_Info *server = ses->server;
2907
2908        /*
2909         * If the mount request that resulted in the creation of the
2910         * session requires encryption, force IPC to be encrypted too.
2911         */
2912        if (volume_info->seal) {
2913                if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2914                        seal = true;
2915                else {
2916                        cifs_server_dbg(VFS,
2917                                 "IPC: server doesn't support encryption\n");
2918                        return -EOPNOTSUPP;
2919                }
2920        }
2921
2922        tcon = tconInfoAlloc();
2923        if (tcon == NULL)
2924                return -ENOMEM;
2925
2926        scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2927
2928        /* cannot fail */
2929        nls_codepage = load_nls_default();
2930
2931        xid = get_xid();
2932        tcon->ses = ses;
2933        tcon->ipc = true;
2934        tcon->seal = seal;
2935        rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2936        free_xid(xid);
2937
2938        if (rc) {
2939                cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2940                tconInfoFree(tcon);
2941                goto out;
2942        }
2943
2944        cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2945
2946        ses->tcon_ipc = tcon;
2947out:
2948        unload_nls(nls_codepage);
2949        return rc;
2950}
2951
2952/**
2953 * cifs_free_ipc - helper to release the session IPC tcon
2954 *
2955 * Needs to be called everytime a session is destroyed
2956 */
2957static int
2958cifs_free_ipc(struct cifs_ses *ses)
2959{
2960        int rc = 0, xid;
2961        struct cifs_tcon *tcon = ses->tcon_ipc;
2962
2963        if (tcon == NULL)
2964                return 0;
2965
2966        if (ses->server->ops->tree_disconnect) {
2967                xid = get_xid();
2968                rc = ses->server->ops->tree_disconnect(xid, tcon);
2969                free_xid(xid);
2970        }
2971
2972        if (rc)
2973                cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2974
2975        tconInfoFree(tcon);
2976        ses->tcon_ipc = NULL;
2977        return rc;
2978}
2979
2980static struct cifs_ses *
2981cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2982{
2983        struct cifs_ses *ses;
2984
2985        spin_lock(&cifs_tcp_ses_lock);
2986        list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2987                if (ses->status == CifsExiting)
2988                        continue;
2989                if (!match_session(ses, vol))
2990                        continue;
2991                ++ses->ses_count;
2992                spin_unlock(&cifs_tcp_ses_lock);
2993                return ses;
2994        }
2995        spin_unlock(&cifs_tcp_ses_lock);
2996        return NULL;
2997}
2998
2999void cifs_put_smb_ses(struct cifs_ses *ses)
3000{
3001        unsigned int rc, xid;
3002        struct TCP_Server_Info *server = ses->server;
3003
3004        cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3005
3006        spin_lock(&cifs_tcp_ses_lock);
3007        if (ses->status == CifsExiting) {
3008                spin_unlock(&cifs_tcp_ses_lock);
3009                return;
3010        }
3011        if (--ses->ses_count > 0) {
3012                spin_unlock(&cifs_tcp_ses_lock);
3013                return;
3014        }
3015        if (ses->status == CifsGood)
3016                ses->status = CifsExiting;
3017        spin_unlock(&cifs_tcp_ses_lock);
3018
3019        cifs_free_ipc(ses);
3020
3021        if (ses->status == CifsExiting && server->ops->logoff) {
3022                xid = get_xid();
3023                rc = server->ops->logoff(xid, ses);
3024                if (rc)
3025                        cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3026                                __func__, rc);
3027                _free_xid(xid);
3028        }
3029
3030        spin_lock(&cifs_tcp_ses_lock);
3031        list_del_init(&ses->smb_ses_list);
3032        spin_unlock(&cifs_tcp_ses_lock);
3033
3034        sesInfoFree(ses);
3035        cifs_put_tcp_session(server, 0);
3036}
3037
3038#ifdef CONFIG_KEYS
3039
3040/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3041#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3042
3043/* Populate username and pw fields from keyring if possible */
3044static int
3045cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3046{
3047        int rc = 0;
3048        int is_domain = 0;
3049        const char *delim, *payload;
3050        char *desc;
3051        ssize_t len;
3052        struct key *key;
3053        struct TCP_Server_Info *server = ses->server;
3054        struct sockaddr_in *sa;
3055        struct sockaddr_in6 *sa6;
3056        const struct user_key_payload *upayload;
3057
3058        desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3059        if (!desc)
3060                return -ENOMEM;
3061
3062        /* try to find an address key first */
3063        switch (server->dstaddr.ss_family) {
3064        case AF_INET:
3065                sa = (struct sockaddr_in *)&server->dstaddr;
3066                sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3067                break;
3068        case AF_INET6:
3069                sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3070                sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3071                break;
3072        default:
3073                cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3074                         server->dstaddr.ss_family);
3075                rc = -EINVAL;
3076                goto out_err;
3077        }
3078
3079        cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3080        key = request_key(&key_type_logon, desc, "");
3081        if (IS_ERR(key)) {
3082                if (!ses->domainName) {
3083                        cifs_dbg(FYI, "domainName is NULL\n");
3084                        rc = PTR_ERR(key);
3085                        goto out_err;
3086                }
3087
3088                /* didn't work, try to find a domain key */
3089                sprintf(desc, "cifs:d:%s", ses->domainName);
3090                cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3091                key = request_key(&key_type_logon, desc, "");
3092                if (IS_ERR(key)) {
3093                        rc = PTR_ERR(key);
3094                        goto out_err;
3095                }
3096                is_domain = 1;
3097        }
3098
3099        down_read(&key->sem);
3100        upayload = user_key_payload_locked(key);
3101        if (IS_ERR_OR_NULL(upayload)) {
3102                rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3103                goto out_key_put;
3104        }
3105
3106        /* find first : in payload */
3107        payload = upayload->data;
3108        delim = strnchr(payload, upayload->datalen, ':');
3109        cifs_dbg(FYI, "payload=%s\n", payload);
3110        if (!delim) {
3111                cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3112                         upayload->datalen);
3113                rc = -EINVAL;
3114                goto out_key_put;
3115        }
3116
3117        len = delim - payload;
3118        if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3119                cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3120                         len);
3121                rc = -EINVAL;
3122                goto out_key_put;
3123        }
3124
3125        vol->username = kstrndup(payload, len, GFP_KERNEL);
3126        if (!vol->username) {
3127                cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3128                         len);
3129                rc = -ENOMEM;
3130                goto out_key_put;
3131        }
3132        cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3133
3134        len = key->datalen - (len + 1);
3135        if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3136                cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3137                rc = -EINVAL;
3138                kfree(vol->username);
3139                vol->username = NULL;
3140                goto out_key_put;
3141        }
3142
3143        ++delim;
3144        vol->password = kstrndup(delim, len, GFP_KERNEL);
3145        if (!vol->password) {
3146                cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3147                         len);
3148                rc = -ENOMEM;
3149                kfree(vol->username);
3150                vol->username = NULL;
3151                goto out_key_put;
3152        }
3153
3154        /*
3155         * If we have a domain key then we must set the domainName in the
3156         * for the request.
3157         */
3158        if (is_domain && ses->domainName) {
3159                vol->domainname = kstrndup(ses->domainName,
3160                                           strlen(ses->domainName),
3161                                           GFP_KERNEL);
3162                if (!vol->domainname) {
3163                        cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3164                                 "domain\n", len);
3165                        rc = -ENOMEM;
3166                        kfree(vol->username);
3167                        vol->username = NULL;
3168                        kzfree(vol->password);
3169                        vol->password = NULL;
3170                        goto out_key_put;
3171                }
3172        }
3173
3174out_key_put:
3175        up_read(&key->sem);
3176        key_put(key);
3177out_err:
3178        kfree(desc);
3179        cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3180        return rc;
3181}
3182#else /* ! CONFIG_KEYS */
3183static inline int
3184cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3185                   struct cifs_ses *ses __attribute__((unused)))
3186{
3187        return -ENOSYS;
3188}
3189#endif /* CONFIG_KEYS */
3190
3191/**
3192 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3193 *
3194 * This function assumes it is being called from cifs_mount() where we
3195 * already got a server reference (server refcount +1). See
3196 * cifs_get_tcon() for refcount explanations.
3197 */
3198struct cifs_ses *
3199cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3200{
3201        int rc = -ENOMEM;
3202        unsigned int xid;
3203        struct cifs_ses *ses;
3204        struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3205        struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3206
3207        xid = get_xid();
3208
3209        ses = cifs_find_smb_ses(server, volume_info);
3210        if (ses) {
3211                cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3212                         ses->status);
3213
3214                mutex_lock(&ses->session_mutex);
3215                rc = cifs_negotiate_protocol(xid, ses);
3216                if (rc) {
3217                        mutex_unlock(&ses->session_mutex);
3218                        /* problem -- put our ses reference */
3219                        cifs_put_smb_ses(ses);
3220                        free_xid(xid);
3221                        return ERR_PTR(rc);
3222                }
3223                if (ses->need_reconnect) {
3224                        cifs_dbg(FYI, "Session needs reconnect\n");
3225                        rc = cifs_setup_session(xid, ses,
3226                                                volume_info->local_nls);
3227                        if (rc) {
3228                                mutex_unlock(&ses->session_mutex);
3229                                /* problem -- put our reference */
3230                                cifs_put_smb_ses(ses);
3231                                free_xid(xid);
3232                                return ERR_PTR(rc);
3233                        }
3234                }
3235                mutex_unlock(&ses->session_mutex);
3236
3237                /* existing SMB ses has a server reference already */
3238                cifs_put_tcp_session(server, 0);
3239                free_xid(xid);
3240                return ses;
3241        }
3242
3243        cifs_dbg(FYI, "Existing smb sess not found\n");
3244        ses = sesInfoAlloc();
3245        if (ses == NULL)
3246                goto get_ses_fail;
3247
3248        /* new SMB session uses our server ref */
3249        ses->server = server;
3250        if (server->dstaddr.ss_family == AF_INET6)
3251                sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3252        else
3253                sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3254
3255        if (volume_info->username) {
3256                ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3257                if (!ses->user_name)
3258                        goto get_ses_fail;
3259        }
3260
3261        /* volume_info->password freed at unmount */
3262        if (volume_info->password) {
3263                ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3264                if (!ses->password)
3265                        goto get_ses_fail;
3266        }
3267        if (volume_info->domainname) {
3268                ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3269                if (!ses->domainName)
3270                        goto get_ses_fail;
3271        }
3272        if (volume_info->domainauto)
3273                ses->domainAuto = volume_info->domainauto;
3274        ses->cred_uid = volume_info->cred_uid;
3275        ses->linux_uid = volume_info->linux_uid;
3276
3277        ses->sectype = volume_info->sectype;
3278        ses->sign = volume_info->sign;
3279        mutex_lock(&ses->session_mutex);
3280        rc = cifs_negotiate_protocol(xid, ses);
3281        if (!rc)
3282                rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3283        mutex_unlock(&ses->session_mutex);
3284        if (rc)
3285                goto get_ses_fail;
3286
3287        /* success, put it on the list */
3288        spin_lock(&cifs_tcp_ses_lock);
3289        list_add(&ses->smb_ses_list, &server->smb_ses_list);
3290        spin_unlock(&cifs_tcp_ses_lock);
3291
3292        free_xid(xid);
3293
3294        cifs_setup_ipc(ses, volume_info);
3295
3296        return ses;
3297
3298get_ses_fail:
3299        sesInfoFree(ses);
3300        free_xid(xid);
3301        return ERR_PTR(rc);
3302}
3303
3304static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3305{
3306        if (tcon->tidStatus == CifsExiting)
3307                return 0;
3308        if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3309                return 0;
3310        if (tcon->seal != volume_info->seal)
3311                return 0;
3312        if (tcon->snapshot_time != volume_info->snapshot_time)
3313                return 0;
3314        if (tcon->handle_timeout != volume_info->handle_timeout)
3315                return 0;
3316        if (tcon->no_lease != volume_info->no_lease)
3317                return 0;
3318        return 1;
3319}
3320
3321static struct cifs_tcon *
3322cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3323{
3324        struct list_head *tmp;
3325        struct cifs_tcon *tcon;
3326
3327        spin_lock(&cifs_tcp_ses_lock);
3328        list_for_each(tmp, &ses->tcon_list) {
3329                tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3330                if (!match_tcon(tcon, volume_info))
3331                        continue;
3332                ++tcon->tc_count;
3333                spin_unlock(&cifs_tcp_ses_lock);
3334                return tcon;
3335        }
3336        spin_unlock(&cifs_tcp_ses_lock);
3337        return NULL;
3338}
3339
3340void
3341cifs_put_tcon(struct cifs_tcon *tcon)
3342{
3343        unsigned int xid;
3344        struct cifs_ses *ses;
3345
3346        /*
3347         * IPC tcon share the lifetime of their session and are
3348         * destroyed in the session put function
3349         */
3350        if (tcon == NULL || tcon->ipc)
3351                return;
3352
3353        ses = tcon->ses;
3354        cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3355        spin_lock(&cifs_tcp_ses_lock);
3356        if (--tcon->tc_count > 0) {
3357                spin_unlock(&cifs_tcp_ses_lock);
3358                return;
3359        }
3360
3361        list_del_init(&tcon->tcon_list);
3362        spin_unlock(&cifs_tcp_ses_lock);
3363
3364        xid = get_xid();
3365        if (ses->server->ops->tree_disconnect)
3366                ses->server->ops->tree_disconnect(xid, tcon);
3367        _free_xid(xid);
3368
3369        cifs_fscache_release_super_cookie(tcon);
3370        tconInfoFree(tcon);
3371        cifs_put_smb_ses(ses);
3372}
3373
3374/**
3375 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3376 *
3377 * - tcon refcount is the number of mount points using the tcon.
3378 * - ses refcount is the number of tcon using the session.
3379 *
3380 * 1. This function assumes it is being called from cifs_mount() where
3381 *    we already got a session reference (ses refcount +1).
3382 *
3383 * 2. Since we're in the context of adding a mount point, the end
3384 *    result should be either:
3385 *
3386 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3387 *    its session refcount incremented (1 new tcon). This +1 was
3388 *    already done in (1).
3389 *
3390 * b) an existing tcon with refcount+1 (add a mount point to it) and
3391 *    identical ses refcount (no new tcon). Because of (1) we need to
3392 *    decrement the ses refcount.
3393 */
3394static struct cifs_tcon *
3395cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3396{
3397        int rc, xid;
3398        struct cifs_tcon *tcon;
3399
3400        tcon = cifs_find_tcon(ses, volume_info);
3401        if (tcon) {
3402                /*
3403                 * tcon has refcount already incremented but we need to
3404                 * decrement extra ses reference gotten by caller (case b)
3405                 */
3406                cifs_dbg(FYI, "Found match on UNC path\n");
3407                cifs_put_smb_ses(ses);
3408                return tcon;
3409        }
3410
3411        if (!ses->server->ops->tree_connect) {
3412                rc = -ENOSYS;
3413                goto out_fail;
3414        }
3415
3416        tcon = tconInfoAlloc();
3417        if (tcon == NULL) {
3418                rc = -ENOMEM;
3419                goto out_fail;
3420        }
3421
3422        if (volume_info->snapshot_time) {
3423                if (ses->server->vals->protocol_id == 0) {
3424                        cifs_dbg(VFS,
3425                             "Use SMB2 or later for snapshot mount option\n");
3426                        rc = -EOPNOTSUPP;
3427                        goto out_fail;
3428                } else
3429                        tcon->snapshot_time = volume_info->snapshot_time;
3430        }
3431
3432        if (volume_info->handle_timeout) {
3433                if (ses->server->vals->protocol_id == 0) {
3434                        cifs_dbg(VFS,
3435                             "Use SMB2.1 or later for handle timeout option\n");
3436                        rc = -EOPNOTSUPP;
3437                        goto out_fail;
3438                } else
3439                        tcon->handle_timeout = volume_info->handle_timeout;
3440        }
3441
3442        tcon->ses = ses;
3443        if (volume_info->password) {
3444                tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3445                if (!tcon->password) {
3446                        rc = -ENOMEM;
3447                        goto out_fail;
3448                }
3449        }
3450
3451        if (volume_info->seal) {
3452                if (ses->server->vals->protocol_id == 0) {
3453                        cifs_dbg(VFS,
3454                                 "SMB3 or later required for encryption\n");
3455                        rc = -EOPNOTSUPP;
3456                        goto out_fail;
3457                } else if (tcon->ses->server->capabilities &
3458                                        SMB2_GLOBAL_CAP_ENCRYPTION)
3459                        tcon->seal = true;
3460                else {
3461                        cifs_dbg(VFS, "Encryption is not supported on share\n");
3462                        rc = -EOPNOTSUPP;
3463                        goto out_fail;
3464                }
3465        }
3466
3467        if (volume_info->linux_ext) {
3468                if (ses->server->posix_ext_supported) {
3469                        tcon->posix_extensions = true;
3470                        printk_once(KERN_WARNING
3471                                "SMB3.11 POSIX Extensions are experimental\n");
3472                } else {
3473                        cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3474                        rc = -EOPNOTSUPP;
3475                        goto out_fail;
3476                }
3477        }
3478
3479        /*
3480         * BB Do we need to wrap session_mutex around this TCon call and Unix
3481         * SetFS as we do on SessSetup and reconnect?
3482         */
3483        xid = get_xid();
3484        rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3485                                            volume_info->local_nls);
3486        free_xid(xid);
3487        cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3488        if (rc)
3489                goto out_fail;
3490
3491        tcon->use_persistent = false;
3492        /* check if SMB2 or later, CIFS does not support persistent handles */
3493        if (volume_info->persistent) {
3494                if (ses->server->vals->protocol_id == 0) {
3495                        cifs_dbg(VFS,
3496                             "SMB3 or later required for persistent handles\n");
3497                        rc = -EOPNOTSUPP;
3498                        goto out_fail;
3499                } else if (ses->server->capabilities &
3500                           SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3501                        tcon->use_persistent = true;
3502                else /* persistent handles requested but not supported */ {
3503                        cifs_dbg(VFS,
3504                                "Persistent handles not supported on share\n");
3505                        rc = -EOPNOTSUPP;
3506                        goto out_fail;
3507                }
3508        } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3509             && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3510             && (volume_info->nopersistent == false)) {
3511                cifs_dbg(FYI, "enabling persistent handles\n");
3512                tcon->use_persistent = true;
3513        } else if (volume_info->resilient) {
3514                if (ses->server->vals->protocol_id == 0) {
3515                        cifs_dbg(VFS,
3516                             "SMB2.1 or later required for resilient handles\n");
3517                        rc = -EOPNOTSUPP;
3518                        goto out_fail;
3519                }
3520                tcon->use_resilient = true;
3521        }
3522
3523        /* If the user really knows what they are doing they can override */
3524        if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3525                if (volume_info->cache_ro)
3526                        cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3527                else if (volume_info->cache_rw)
3528                        cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3529        }
3530
3531        /*
3532         * We can have only one retry value for a connection to a share so for
3533         * resources mounted more than once to the same server share the last
3534         * value passed in for the retry flag is used.
3535         */
3536        tcon->retry = volume_info->retry;
3537        tcon->nocase = volume_info->nocase;
3538        tcon->nohandlecache = volume_info->nohandlecache;
3539        tcon->local_lease = volume_info->local_lease;
3540        tcon->no_lease = volume_info->no_lease;
3541        INIT_LIST_HEAD(&tcon->pending_opens);
3542
3543        spin_lock(&cifs_tcp_ses_lock);
3544        list_add(&tcon->tcon_list, &ses->tcon_list);
3545        spin_unlock(&cifs_tcp_ses_lock);
3546
3547        cifs_fscache_get_super_cookie(tcon);
3548
3549        return tcon;
3550
3551out_fail:
3552        tconInfoFree(tcon);
3553        return ERR_PTR(rc);
3554}
3555
3556void
3557cifs_put_tlink(struct tcon_link *tlink)
3558{
3559        if (!tlink || IS_ERR(tlink))
3560                return;
3561
3562        if (!atomic_dec_and_test(&tlink->tl_count) ||
3563            test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3564                tlink->tl_time = jiffies;
3565                return;
3566        }
3567
3568        if (!IS_ERR(tlink_tcon(tlink)))
3569                cifs_put_tcon(tlink_tcon(tlink));
3570        kfree(tlink);
3571        return;
3572}
3573
3574static int
3575compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3576{
3577        struct cifs_sb_info *old = CIFS_SB(sb);
3578        struct cifs_sb_info *new = mnt_data->cifs_sb;
3579        unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3580        unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3581
3582        if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3583                return 0;
3584
3585        if (old->mnt_cifs_serverino_autodisabled)
3586                newflags &= ~CIFS_MOUNT_SERVER_INUM;
3587
3588        if (oldflags != newflags)
3589                return 0;
3590
3591        /*
3592         * We want to share sb only if we don't specify an r/wsize or
3593         * specified r/wsize is greater than or equal to existing one.
3594         */
3595        if (new->wsize && new->wsize < old->wsize)
3596                return 0;
3597
3598        if (new->rsize && new->rsize < old->rsize)
3599                return 0;
3600
3601        if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3602                return 0;
3603
3604        if (old->mnt_file_mode != new->mnt_file_mode ||
3605            old->mnt_dir_mode != new->mnt_dir_mode)
3606                return 0;
3607
3608        if (strcmp(old->local_nls->charset, new->local_nls->charset))
3609                return 0;
3610
3611        if (old->actimeo != new->actimeo)
3612                return 0;
3613
3614        return 1;
3615}
3616
3617static int
3618match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3619{
3620        struct cifs_sb_info *old = CIFS_SB(sb);
3621        struct cifs_sb_info *new = mnt_data->cifs_sb;
3622        bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3623        bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3624
3625        if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3626                return 1;
3627        else if (!old_set && !new_set)
3628                return 1;
3629
3630        return 0;
3631}
3632
3633int
3634cifs_match_super(struct super_block *sb, void *data)
3635{
3636        struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3637        struct smb_vol *volume_info;
3638        struct cifs_sb_info *cifs_sb;
3639        struct TCP_Server_Info *tcp_srv;
3640        struct cifs_ses *ses;
3641        struct cifs_tcon *tcon;
3642        struct tcon_link *tlink;
3643        int rc = 0;
3644
3645        spin_lock(&cifs_tcp_ses_lock);
3646        cifs_sb = CIFS_SB(sb);
3647        tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3648        if (IS_ERR(tlink)) {
3649                spin_unlock(&cifs_tcp_ses_lock);
3650                return rc;
3651        }
3652        tcon = tlink_tcon(tlink);
3653        ses = tcon->ses;
3654        tcp_srv = ses->server;
3655
3656        volume_info = mnt_data->vol;
3657
3658        if (!match_server(tcp_srv, volume_info) ||
3659            !match_session(ses, volume_info) ||
3660            !match_tcon(tcon, volume_info) ||
3661            !match_prepath(sb, mnt_data)) {
3662                rc = 0;
3663                goto out;
3664        }
3665
3666        rc = compare_mount_options(sb, mnt_data);
3667out:
3668        spin_unlock(&cifs_tcp_ses_lock);
3669        cifs_put_tlink(tlink);
3670        return rc;
3671}
3672
3673#ifdef CONFIG_DEBUG_LOCK_ALLOC
3674static struct lock_class_key cifs_key[2];
3675static struct lock_class_key cifs_slock_key[2];
3676
3677static inline void
3678cifs_reclassify_socket4(struct socket *sock)
3679{
3680        struct sock *sk = sock->sk;
3681        BUG_ON(!sock_allow_reclassification(sk));
3682        sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3683                &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3684}
3685
3686static inline void
3687cifs_reclassify_socket6(struct socket *sock)
3688{
3689        struct sock *sk = sock->sk;
3690        BUG_ON(!sock_allow_reclassification(sk));
3691        sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3692                &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3693}
3694#else
3695static inline void
3696cifs_reclassify_socket4(struct socket *sock)
3697{
3698}
3699
3700static inline void
3701cifs_reclassify_socket6(struct socket *sock)
3702{
3703}
3704#endif
3705
3706/* See RFC1001 section 14 on representation of Netbios names */
3707static void rfc1002mangle(char *target, char *source, unsigned int length)
3708{
3709        unsigned int i, j;
3710
3711        for (i = 0, j = 0; i < (length); i++) {
3712                /* mask a nibble at a time and encode */
3713                target[j] = 'A' + (0x0F & (source[i] >> 4));
3714                target[j+1] = 'A' + (0x0F & source[i]);
3715                j += 2;
3716        }
3717
3718}
3719
3720static int
3721bind_socket(struct TCP_Server_Info *server)
3722{
3723        int rc = 0;
3724        if (server->srcaddr.ss_family != AF_UNSPEC) {
3725                /* Bind to the specified local IP address */
3726                struct socket *socket = server->ssocket;
3727                rc = socket->ops->bind(socket,
3728                                       (struct sockaddr *) &server->srcaddr,
3729                                       sizeof(server->srcaddr));
3730                if (rc < 0) {
3731                        struct sockaddr_in *saddr4;
3732                        struct sockaddr_in6 *saddr6;
3733                        saddr4 = (struct sockaddr_in *)&server->srcaddr;
3734                        saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3735                        if (saddr6->sin6_family == AF_INET6)
3736                                cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3737                                         &saddr6->sin6_addr, rc);
3738                        else
3739                                cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3740                                         &saddr4->sin_addr.s_addr, rc);
3741                }
3742        }
3743        return rc;
3744}
3745
3746static int
3747ip_rfc1001_connect(struct TCP_Server_Info *server)
3748{
3749        int rc = 0;
3750        /*
3751         * some servers require RFC1001 sessinit before sending
3752         * negprot - BB check reconnection in case where second
3753         * sessinit is sent but no second negprot
3754         */
3755        struct rfc1002_session_packet *ses_init_buf;
3756        struct smb_hdr *smb_buf;
3757        ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3758                               GFP_KERNEL);
3759        if (ses_init_buf) {
3760                ses_init_buf->trailer.session_req.called_len = 32;
3761
3762                if (server->server_RFC1001_name[0] != 0)
3763                        rfc1002mangle(ses_init_buf->trailer.
3764                                      session_req.called_name,
3765                                      server->server_RFC1001_name,
3766                                      RFC1001_NAME_LEN_WITH_NULL);
3767                else
3768                        rfc1002mangle(ses_init_buf->trailer.
3769                                      session_req.called_name,
3770                                      DEFAULT_CIFS_CALLED_NAME,
3771                                      RFC1001_NAME_LEN_WITH_NULL);
3772
3773                ses_init_buf->trailer.session_req.calling_len = 32;
3774
3775                /*
3776                 * calling name ends in null (byte 16) from old smb
3777                 * convention.
3778                 */
3779                if (server->workstation_RFC1001_name[0] != 0)
3780                        rfc1002mangle(ses_init_buf->trailer.
3781                                      session_req.calling_name,
3782                                      server->workstation_RFC1001_name,
3783                                      RFC1001_NAME_LEN_WITH_NULL);
3784                else
3785                        rfc1002mangle(ses_init_buf->trailer.
3786                                      session_req.calling_name,
3787                                      "LINUX_CIFS_CLNT",
3788                                      RFC1001_NAME_LEN_WITH_NULL);
3789
3790                ses_init_buf->trailer.session_req.scope1 = 0;
3791                ses_init_buf->trailer.session_req.scope2 = 0;
3792                smb_buf = (struct smb_hdr *)ses_init_buf;
3793
3794                /* sizeof RFC1002_SESSION_REQUEST with no scope */
3795                smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3796                rc = smb_send(server, smb_buf, 0x44);
3797                kfree(ses_init_buf);
3798                /*
3799                 * RFC1001 layer in at least one server
3800                 * requires very short break before negprot
3801                 * presumably because not expecting negprot
3802                 * to follow so fast.  This is a simple
3803                 * solution that works without
3804                 * complicating the code and causes no
3805                 * significant slowing down on mount
3806                 * for everyone else
3807                 */
3808                usleep_range(1000, 2000);
3809        }
3810        /*
3811         * else the negprot may still work without this
3812         * even though malloc failed
3813         */
3814
3815        return rc;
3816}
3817
3818static int
3819generic_ip_connect(struct TCP_Server_Info *server)
3820{
3821        int rc = 0;
3822        __be16 sport;
3823        int slen, sfamily;
3824        struct socket *socket = server->ssocket;
3825        struct sockaddr *saddr;
3826
3827        saddr = (struct sockaddr *) &server->dstaddr;
3828
3829        if (server->dstaddr.ss_family == AF_INET6) {
3830                sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3831                slen = sizeof(struct sockaddr_in6);
3832                sfamily = AF_INET6;
3833        } else {
3834                sport = ((struct sockaddr_in *) saddr)->sin_port;
3835                slen = sizeof(struct sockaddr_in);
3836                sfamily = AF_INET;
3837        }
3838
3839        if (socket == NULL) {
3840                rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3841                                   IPPROTO_TCP, &socket, 1);
3842                if (rc < 0) {
3843                        cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3844                        server->ssocket = NULL;
3845                        return rc;
3846                }
3847
3848                /* BB other socket options to set KEEPALIVE, NODELAY? */
3849                cifs_dbg(FYI, "Socket created\n");
3850                server->ssocket = socket;
3851                socket->sk->sk_allocation = GFP_NOFS;
3852                if (sfamily == AF_INET6)
3853                        cifs_reclassify_socket6(socket);
3854                else
3855                        cifs_reclassify_socket4(socket);
3856        }
3857
3858        rc = bind_socket(server);
3859        if (rc < 0)
3860                return rc;
3861
3862        /*
3863         * Eventually check for other socket options to change from
3864         * the default. sock_setsockopt not used because it expects
3865         * user space buffer
3866         */
3867        socket->sk->sk_rcvtimeo = 7 * HZ;
3868        socket->sk->sk_sndtimeo = 5 * HZ;
3869
3870        /* make the bufsizes depend on wsize/rsize and max requests */
3871        if (server->noautotune) {
3872                if (socket->sk->sk_sndbuf < (200 * 1024))
3873                        socket->sk->sk_sndbuf = 200 * 1024;
3874                if (socket->sk->sk_rcvbuf < (140 * 1024))
3875                        socket->sk->sk_rcvbuf = 140 * 1024;
3876        }
3877
3878        if (server->tcp_nodelay) {
3879                int val = 1;
3880                rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3881                                (char *)&val, sizeof(val));
3882                if (rc)
3883                        cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3884                                 rc);
3885        }
3886
3887        cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3888                 socket->sk->sk_sndbuf,
3889                 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3890
3891        rc = socket->ops->connect(socket, saddr, slen,
3892                                  server->noblockcnt ? O_NONBLOCK : 0);
3893        /*
3894         * When mounting SMB root file systems, we do not want to block in
3895         * connect. Otherwise bail out and then let cifs_reconnect() perform
3896         * reconnect failover - if possible.
3897         */
3898        if (server->noblockcnt && rc == -EINPROGRESS)
3899                rc = 0;
3900        if (rc < 0) {
3901                cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3902                sock_release(socket);
3903                server->ssocket = NULL;
3904                return rc;
3905        }
3906
3907        if (sport == htons(RFC1001_PORT))
3908                rc = ip_rfc1001_connect(server);
3909
3910        return rc;
3911}
3912
3913static int
3914ip_connect(struct TCP_Server_Info *server)
3915{
3916        __be16 *sport;
3917        struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3918        struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3919
3920        if (server->dstaddr.ss_family == AF_INET6)
3921                sport = &addr6->sin6_port;
3922        else
3923                sport = &addr->sin_port;
3924
3925        if (*sport == 0) {
3926                int rc;
3927
3928                /* try with 445 port at first */
3929                *sport = htons(CIFS_PORT);
3930
3931                rc = generic_ip_connect(server);
3932                if (rc >= 0)
3933                        return rc;
3934
3935                /* if it failed, try with 139 port */
3936                *sport = htons(RFC1001_PORT);
3937        }
3938
3939        return generic_ip_connect(server);
3940}
3941
3942void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3943                          struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3944{
3945        /* if we are reconnecting then should we check to see if
3946         * any requested capabilities changed locally e.g. via
3947         * remount but we can not do much about it here
3948         * if they have (even if we could detect it by the following)
3949         * Perhaps we could add a backpointer to array of sb from tcon
3950         * or if we change to make all sb to same share the same
3951         * sb as NFS - then we only have one backpointer to sb.
3952         * What if we wanted to mount the server share twice once with
3953         * and once without posixacls or posix paths? */
3954        __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3955
3956        if (vol_info && vol_info->no_linux_ext) {
3957                tcon->fsUnixInfo.Capability = 0;
3958                tcon->unix_ext = 0; /* Unix Extensions disabled */
3959                cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3960                return;
3961        } else if (vol_info)
3962                tcon->unix_ext = 1; /* Unix Extensions supported */
3963
3964        if (tcon->unix_ext == 0) {
3965                cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3966                return;
3967        }
3968
3969        if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3970                __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3971                cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3972                /* check for reconnect case in which we do not
3973                   want to change the mount behavior if we can avoid it */
3974                if (vol_info == NULL) {
3975                        /* turn off POSIX ACL and PATHNAMES if not set
3976                           originally at mount time */
3977                        if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3978                                cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3979                        if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3980                                if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3981                                        cifs_dbg(VFS, "POSIXPATH support change\n");
3982                                cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3983                        } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3984                                cifs_dbg(VFS, "possible reconnect error\n");
3985                                cifs_dbg(VFS, "server disabled POSIX path support\n");
3986                        }
3987                }
3988
3989                if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3990                        cifs_dbg(VFS, "per-share encryption not supported yet\n");
3991
3992                cap &= CIFS_UNIX_CAP_MASK;
3993                if (vol_info && vol_info->no_psx_acl)
3994                        cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3995                else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3996                        cifs_dbg(FYI, "negotiated posix acl support\n");
3997                        if (cifs_sb)
3998                                cifs_sb->mnt_cifs_flags |=
3999                                        CIFS_MOUNT_POSIXACL;
4000                }
4001
4002                if (vol_info && vol_info->posix_paths == 0)
4003                        cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4004                else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4005                        cifs_dbg(FYI, "negotiate posix pathnames\n");
4006                        if (cifs_sb)
4007                                cifs_sb->mnt_cifs_flags |=
4008                                        CIFS_MOUNT_POSIX_PATHS;
4009                }
4010
4011                cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4012#ifdef CONFIG_CIFS_DEBUG2
4013                if (cap & CIFS_UNIX_FCNTL_CAP)
4014                        cifs_dbg(FYI, "FCNTL cap\n");
4015                if (cap & CIFS_UNIX_EXTATTR_CAP)
4016                        cifs_dbg(FYI, "EXTATTR cap\n");
4017                if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4018                        cifs_dbg(FYI, "POSIX path cap\n");
4019                if (cap & CIFS_UNIX_XATTR_CAP)
4020                        cifs_dbg(FYI, "XATTR cap\n");
4021                if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4022                        cifs_dbg(FYI, "POSIX ACL cap\n");
4023                if (cap & CIFS_UNIX_LARGE_READ_CAP)
4024                        cifs_dbg(FYI, "very large read cap\n");
4025                if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4026                        cifs_dbg(FYI, "very large write cap\n");
4027                if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4028                        cifs_dbg(FYI, "transport encryption cap\n");
4029                if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4030                        cifs_dbg(FYI, "mandatory transport encryption cap\n");
4031#endif /* CIFS_DEBUG2 */
4032                if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4033                        if (vol_info == NULL) {
4034                                cifs_dbg(FYI, "resetting capabilities failed\n");
4035                        } else
4036                                cifs_dbg(VFS, "Negotiating Unix capabilities with the server failed. Consider mounting with the Unix Extensions disabled if problems are found by specifying the nounix mount option.\n");
4037
4038                }
4039        }
4040}
4041
4042int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4043                        struct cifs_sb_info *cifs_sb)
4044{
4045        INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4046
4047        spin_lock_init(&cifs_sb->tlink_tree_lock);
4048        cifs_sb->tlink_tree = RB_ROOT;
4049
4050        cifs_sb->bsize = pvolume_info->bsize;
4051        /*
4052         * Temporarily set r/wsize for matching superblock. If we end up using
4053         * new sb then client will later negotiate it downward if needed.
4054         */
4055        cifs_sb->rsize = pvolume_info->rsize;
4056        cifs_sb->wsize = pvolume_info->wsize;
4057
4058        cifs_sb->mnt_uid = pvolume_info->linux_uid;
4059        cifs_sb->mnt_gid = pvolume_info->linux_gid;
4060        cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4061        cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4062        cifs_dbg(FYI, "file mode: 0x%hx  dir mode: 0x%hx\n",
4063                 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4064
4065        cifs_sb->actimeo = pvolume_info->actimeo;
4066        cifs_sb->local_nls = pvolume_info->local_nls;
4067
4068        if (pvolume_info->nodfs)
4069                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4070        if (pvolume_info->noperm)
4071                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4072        if (pvolume_info->setuids)
4073                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4074        if (pvolume_info->setuidfromacl)
4075                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4076        if (pvolume_info->server_ino)
4077                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4078        if (pvolume_info->remap)
4079                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4080        if (pvolume_info->sfu_remap)
4081                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4082        if (pvolume_info->no_xattr)
4083                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4084        if (pvolume_info->sfu_emul)
4085                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4086        if (pvolume_info->nobrl)
4087                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4088        if (pvolume_info->nohandlecache)
4089                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4090        if (pvolume_info->nostrictsync)
4091                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4092        if (pvolume_info->mand_lock)
4093                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4094        if (pvolume_info->rwpidforward)
4095                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4096        if (pvolume_info->mode_ace)
4097                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4098        if (pvolume_info->cifs_acl)
4099                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4100        if (pvolume_info->backupuid_specified) {
4101                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4102                cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4103        }
4104        if (pvolume_info->backupgid_specified) {
4105                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4106                cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4107        }
4108        if (pvolume_info->override_uid)
4109                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4110        if (pvolume_info->override_gid)
4111                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4112        if (pvolume_info->dynperm)
4113                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4114        if (pvolume_info->fsc)
4115                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4116        if (pvolume_info->multiuser)
4117                cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4118                                            CIFS_MOUNT_NO_PERM);
4119        if (pvolume_info->strict_io)
4120                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4121        if (pvolume_info->direct_io) {
4122                cifs_dbg(FYI, "mounting share using direct i/o\n");
4123                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4124        }
4125        if (pvolume_info->cache_ro) {
4126                cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4127                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4128        } else if (pvolume_info->cache_rw) {
4129                cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4130                cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4131                                            CIFS_MOUNT_RW_CACHE);
4132        }
4133        if (pvolume_info->mfsymlinks) {
4134                if (pvolume_info->sfu_emul) {
4135                        /*
4136                         * Our SFU ("Services for Unix" emulation does not allow
4137                         * creating symlinks but does allow reading existing SFU
4138                         * symlinks (it does allow both creating and reading SFU
4139                         * style mknod and FIFOs though). When "mfsymlinks" and
4140                         * "sfu" are both enabled at the same time, it allows
4141                         * reading both types of symlinks, but will only create
4142                         * them with mfsymlinks format. This allows better
4143                         * Apple compatibility (probably better for Samba too)
4144                         * while still recognizing old Windows style symlinks.
4145                         */
4146                        cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4147                }
4148                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4149        }
4150
4151        if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4152                cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4153
4154        if (pvolume_info->prepath) {
4155                cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4156                if (cifs_sb->prepath == NULL)
4157                        return -ENOMEM;
4158        }
4159
4160        return 0;
4161}
4162
4163void
4164cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4165{
4166        kfree(volume_info->username);
4167        kzfree(volume_info->password);
4168        kfree(volume_info->UNC);
4169        kfree(volume_info->domainname);
4170        kfree(volume_info->iocharset);
4171        kfree(volume_info->prepath);
4172}
4173
4174void
4175cifs_cleanup_volume_info(struct smb_vol *volume_info)
4176{
4177        if (!volume_info)
4178                return;
4179        cifs_cleanup_volume_info_contents(volume_info);
4180        kfree(volume_info);
4181}
4182
4183/* Release all succeed connections */
4184static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4185                                   unsigned int xid,
4186                                   struct TCP_Server_Info *server,
4187                                   struct cifs_ses *ses, struct cifs_tcon *tcon)
4188{
4189        int rc = 0;
4190
4191        if (tcon)
4192                cifs_put_tcon(tcon);
4193        else if (ses)
4194                cifs_put_smb_ses(ses);
4195        else if (server)
4196                cifs_put_tcp_session(server, 0);
4197        cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4198        free_xid(xid);
4199}
4200
4201/* Get connections for tcp, ses and tcon */
4202static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4203                           unsigned int *xid,
4204                           struct TCP_Server_Info **nserver,
4205                           struct cifs_ses **nses, struct cifs_tcon **ntcon)
4206{
4207        int rc = 0;
4208        struct TCP_Server_Info *server;
4209        struct cifs_ses *ses;
4210        struct cifs_tcon *tcon;
4211
4212        *nserver = NULL;
4213        *nses = NULL;
4214        *ntcon = NULL;
4215
4216        *xid = get_xid();
4217
4218        /* get a reference to a tcp session */
4219        server = cifs_get_tcp_session(vol);
4220        if (IS_ERR(server)) {
4221                rc = PTR_ERR(server);
4222                return rc;
4223        }
4224
4225        *nserver = server;
4226
4227        if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4228                server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4229        else
4230                server->max_credits = vol->max_credits;
4231
4232        /* get a reference to a SMB session */
4233        ses = cifs_get_smb_ses(server, vol);
4234        if (IS_ERR(ses)) {
4235                rc = PTR_ERR(ses);
4236                return rc;
4237        }
4238
4239        *nses = ses;
4240
4241        if ((vol->persistent == true) && (!(ses->server->capabilities &
4242                                            SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4243                cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4244                return -EOPNOTSUPP;
4245        }
4246
4247        /* search for existing tcon to this server share */
4248        tcon = cifs_get_tcon(ses, vol);
4249        if (IS_ERR(tcon)) {
4250                rc = PTR_ERR(tcon);
4251                return rc;
4252        }
4253
4254        *ntcon = tcon;
4255
4256        /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4257        if (tcon->posix_extensions)
4258                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4259
4260        /* tell server which Unix caps we support */
4261        if (cap_unix(tcon->ses)) {
4262                /*
4263                 * reset of caps checks mount to see if unix extensions disabled
4264                 * for just this mount.
4265                 */
4266                reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4267                if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4268                    (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4269                     CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4270                        return -EACCES;
4271        } else
4272                tcon->unix_ext = 0; /* server does not support them */
4273
4274        /* do not care if a following call succeed - informational */
4275        if (!tcon->pipe && server->ops->qfs_tcon) {
4276                server->ops->qfs_tcon(*xid, tcon);
4277                if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4278                        if (tcon->fsDevInfo.DeviceCharacteristics &
4279                            cpu_to_le32(FILE_READ_ONLY_DEVICE))
4280                                cifs_dbg(VFS, "mounted to read only share\n");
4281                        else if ((cifs_sb->mnt_cifs_flags &
4282                                  CIFS_MOUNT_RW_CACHE) == 0)
4283                                cifs_dbg(VFS, "read only mount of RW share\n");
4284                        /* no need to log a RW mount of a typical RW share */
4285                }
4286        }
4287
4288        cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4289        cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4290
4291        return 0;
4292}
4293
4294static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4295                             struct cifs_tcon *tcon)
4296{
4297        struct tcon_link *tlink;
4298
4299        /* hang the tcon off of the superblock */
4300        tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4301        if (tlink == NULL)
4302                return -ENOMEM;
4303
4304        tlink->tl_uid = ses->linux_uid;
4305        tlink->tl_tcon = tcon;
4306        tlink->tl_time = jiffies;
4307        set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4308        set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4309
4310        cifs_sb->master_tlink = tlink;
4311        spin_lock(&cifs_sb->tlink_tree_lock);
4312        tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4313        spin_unlock(&cifs_sb->tlink_tree_lock);
4314
4315        queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4316                                TLINK_IDLE_EXPIRE);
4317        return 0;
4318}
4319
4320#ifdef CONFIG_CIFS_DFS_UPCALL
4321/*
4322 * cifs_build_path_to_root returns full path to root when we do not have an
4323 * exiting connection (tcon)
4324 */
4325static char *
4326build_unc_path_to_root(const struct smb_vol *vol,
4327                       const struct cifs_sb_info *cifs_sb, bool useppath)
4328{
4329        char *full_path, *pos;
4330        unsigned int pplen = useppath && vol->prepath ?
4331                strlen(vol->prepath) + 1 : 0;
4332        unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4333
4334        if (unc_len > MAX_TREE_SIZE)
4335                return ERR_PTR(-EINVAL);
4336
4337        full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4338        if (full_path == NULL)
4339                return ERR_PTR(-ENOMEM);
4340
4341        memcpy(full_path, vol->UNC, unc_len);
4342        pos = full_path + unc_len;
4343
4344        if (pplen) {
4345                *pos = CIFS_DIR_SEP(cifs_sb);
4346                memcpy(pos + 1, vol->prepath, pplen);
4347                pos += pplen;
4348        }
4349
4350        *pos = '\0'; /* add trailing null */
4351        convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4352        cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4353        return full_path;
4354}
4355
4356/**
4357 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4358 *
4359 *
4360 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4361 * to a string containing updated options for the submount.  Otherwise it
4362 * will be left untouched.
4363 *
4364 * Returns the rc from get_dfs_path to the caller, which can be used to
4365 * determine whether there were referrals.
4366 */
4367static int
4368expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4369                    struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4370                    int check_prefix)
4371{
4372        int rc;
4373        struct dfs_info3_param referral = {0};
4374        char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4375
4376        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4377                return -EREMOTE;
4378
4379        full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4380        if (IS_ERR(full_path))
4381                return PTR_ERR(full_path);
4382
4383        /* For DFS paths, skip the first '\' of the UNC */
4384        ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4385
4386        rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4387                            ref_path, &referral, NULL);
4388        if (!rc) {
4389                char *fake_devname = NULL;
4390
4391                mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4392                                                   full_path + 1, &referral,
4393                                                   &fake_devname);
4394                free_dfs_info_param(&referral);
4395
4396                if (IS_ERR(mdata)) {
4397                        rc = PTR_ERR(mdata);
4398                        mdata = NULL;
4399                } else {
4400                        cifs_cleanup_volume_info_contents(volume_info);
4401                        rc = cifs_setup_volume_info(volume_info, mdata,
4402                                                    fake_devname, false);
4403                }
4404                kfree(fake_devname);
4405                kfree(cifs_sb->mountdata);
4406                cifs_sb->mountdata = mdata;
4407        }
4408        kfree(full_path);
4409        return rc;
4410}
4411
4412static inline int get_next_dfs_tgt(const char *path,
4413                                   struct dfs_cache_tgt_list *tgt_list,
4414                                   struct dfs_cache_tgt_iterator **tgt_it)
4415{
4416        if (!*tgt_it)
4417                *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4418        else
4419                *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4420        return !*tgt_it ? -EHOSTDOWN : 0;
4421}
4422
4423static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4424                           struct smb_vol *fake_vol, struct smb_vol *vol)
4425{
4426        const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4427        int len = strlen(tgt) + 2;
4428        char *new_unc;
4429
4430        new_unc = kmalloc(len, GFP_KERNEL);
4431        if (!new_unc)
4432                return -ENOMEM;
4433        scnprintf(new_unc, len, "\\%s", tgt);
4434
4435        kfree(vol->UNC);
4436        vol->UNC = new_unc;
4437
4438        if (fake_vol->prepath) {
4439                kfree(vol->prepath);
4440                vol->prepath = fake_vol->prepath;
4441                fake_vol->prepath = NULL;
4442        }
4443        memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4444
4445        return 0;
4446}
4447
4448static int setup_dfs_tgt_conn(const char *path,
4449                              const struct dfs_cache_tgt_iterator *tgt_it,
4450                              struct cifs_sb_info *cifs_sb,
4451                              struct smb_vol *vol,
4452                              unsigned int *xid,
4453                              struct TCP_Server_Info **server,
4454                              struct cifs_ses **ses,
4455                              struct cifs_tcon **tcon)
4456{
4457        int rc;
4458        struct dfs_info3_param ref = {0};
4459        char *mdata = NULL, *fake_devname = NULL;
4460        struct smb_vol fake_vol = {NULL};
4461
4462        cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4463
4464        rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4465        if (rc)
4466                return rc;
4467
4468        mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4469                                           &fake_devname);
4470        free_dfs_info_param(&ref);
4471
4472        if (IS_ERR(mdata)) {
4473                rc = PTR_ERR(mdata);
4474                mdata = NULL;
4475        } else {
4476                cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4477                rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4478                                            false);
4479        }
4480        kfree(mdata);
4481        kfree(fake_devname);
4482
4483        if (!rc) {
4484                /*
4485                 * We use a 'fake_vol' here because we need pass it down to the
4486                 * mount_{get,put} functions to test connection against new DFS
4487                 * targets.
4488                 */
4489                mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4490                rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4491                                     tcon);
4492                if (!rc) {
4493                        /*
4494                         * We were able to connect to new target server.
4495                         * Update current volume info with new target server.
4496                         */
4497                        rc = update_vol_info(tgt_it, &fake_vol, vol);
4498                }
4499        }
4500        cifs_cleanup_volume_info_contents(&fake_vol);
4501        return rc;
4502}
4503
4504static int mount_do_dfs_failover(const char *path,
4505                                 struct cifs_sb_info *cifs_sb,
4506                                 struct smb_vol *vol,
4507                                 struct cifs_ses *root_ses,
4508                                 unsigned int *xid,
4509                                 struct TCP_Server_Info **server,
4510                                 struct cifs_ses **ses,
4511                                 struct cifs_tcon **tcon)
4512{
4513        int rc;
4514        struct dfs_cache_tgt_list tgt_list;
4515        struct dfs_cache_tgt_iterator *tgt_it = NULL;
4516
4517        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4518                return -EOPNOTSUPP;
4519
4520        rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4521        if (rc)
4522                return rc;
4523
4524        for (;;) {
4525                /* Get next DFS target server - if any */
4526                rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4527                if (rc)
4528                        break;
4529                /* Connect to next DFS target */
4530                rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4531                                        ses, tcon);
4532                if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4533                        break;
4534        }
4535        if (!rc) {
4536                /*
4537                 * Update DFS target hint in DFS referral cache with the target
4538                 * server we successfully reconnected to.
4539                 */
4540                rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4541                                              cifs_sb->local_nls,
4542                                              cifs_remap(cifs_sb), path,
4543                                              tgt_it);
4544        }
4545        dfs_cache_free_tgts(&tgt_list);
4546        return rc;
4547}
4548#endif
4549
4550int
4551cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4552                        const char *devname, bool is_smb3)
4553{
4554        int rc = 0;
4555
4556        if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4557                return -EINVAL;
4558
4559        if (volume_info->nullauth) {
4560                cifs_dbg(FYI, "Anonymous login\n");
4561                kfree(volume_info->username);
4562                volume_info->username = NULL;
4563        } else if (volume_info->username) {
4564                /* BB fixme parse for domain name here */
4565                cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4566        } else {
4567                cifs_dbg(VFS, "No username specified\n");
4568        /* In userspace mount helper we can get user name from alternate
4569           locations such as env variables and files on disk */
4570                return -EINVAL;
4571        }
4572
4573        /* this is needed for ASCII cp to Unicode converts */
4574        if (volume_info->iocharset == NULL) {
4575                /* load_nls_default cannot return null */
4576                volume_info->local_nls = load_nls_default();
4577        } else {
4578                volume_info->local_nls = load_nls(volume_info->iocharset);
4579                if (volume_info->local_nls == NULL) {
4580                        cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4581                                 volume_info->iocharset);
4582                        return -ELIBACC;
4583                }
4584        }
4585
4586        return rc;
4587}
4588
4589struct smb_vol *
4590cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4591{
4592        int rc;
4593        struct smb_vol *volume_info;
4594
4595        volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4596        if (!volume_info)
4597                return ERR_PTR(-ENOMEM);
4598
4599        rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4600        if (rc) {
4601                cifs_cleanup_volume_info(volume_info);
4602                volume_info = ERR_PTR(rc);
4603        }
4604
4605        return volume_info;
4606}
4607
4608static int
4609cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4610                                        unsigned int xid,
4611                                        struct cifs_tcon *tcon,
4612                                        struct cifs_sb_info *cifs_sb,
4613                                        char *full_path,
4614                                        int added_treename)
4615{
4616        int rc;
4617        char *s;
4618        char sep, tmp;
4619        int skip = added_treename ? 1 : 0;
4620
4621        sep = CIFS_DIR_SEP(cifs_sb);
4622        s = full_path;
4623
4624        rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4625        while (rc == 0) {
4626                /* skip separators */
4627                while (*s == sep)
4628                        s++;
4629                if (!*s)
4630                        break;
4631                /* next separator */
4632                while (*s && *s != sep)
4633                        s++;
4634                /*
4635                 * if the treename is added, we then have to skip the first
4636                 * part within the separators
4637                 */
4638                if (skip) {
4639                        skip = 0;
4640                        continue;
4641                }
4642                /*
4643                 * temporarily null-terminate the path at the end of
4644                 * the current component
4645                 */
4646                tmp = *s;
4647                *s = 0;
4648                rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4649                                                     full_path);
4650                *s = tmp;
4651        }
4652        return rc;
4653}
4654
4655/*
4656 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4657 * otherwise 0.
4658 */
4659static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4660                          const unsigned int xid,
4661                          struct TCP_Server_Info *server,
4662                          struct cifs_tcon *tcon)
4663{
4664        int rc;
4665        char *full_path;
4666
4667        if (!server->ops->is_path_accessible)
4668                return -EOPNOTSUPP;
4669
4670        /*
4671         * cifs_build_path_to_root works only when we have a valid tcon
4672         */
4673        full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4674                                            tcon->Flags & SMB_SHARE_IS_IN_DFS);
4675        if (full_path == NULL)
4676                return -ENOMEM;
4677
4678        cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4679
4680        rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4681                                             full_path);
4682        if (rc != 0 && rc != -EREMOTE) {
4683                kfree(full_path);
4684                return rc;
4685        }
4686
4687        if (rc != -EREMOTE) {
4688                rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4689                        cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4690                if (rc != 0) {
4691                        cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4692                                 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4693                        cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4694                        rc = 0;
4695                }
4696        }
4697
4698        kfree(full_path);
4699        return rc;
4700}
4701
4702#ifdef CONFIG_CIFS_DFS_UPCALL
4703int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4704{
4705        int rc = 0;
4706        unsigned int xid;
4707        struct cifs_ses *ses;
4708        struct cifs_tcon *root_tcon = NULL;
4709        struct cifs_tcon *tcon = NULL;
4710        struct TCP_Server_Info *server;
4711        char *root_path = NULL, *full_path = NULL;
4712        char *old_mountdata, *origin_mountdata = NULL;
4713        int count;
4714
4715        rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4716        if (!rc && tcon) {
4717                /* If not a standalone DFS root, then check if path is remote */
4718                rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4719                                    cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4720                                    NULL);
4721                if (rc) {
4722                        rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4723                        if (!rc)
4724                                goto out;
4725                        if (rc != -EREMOTE)
4726                                goto error;
4727                }
4728        }
4729        /*
4730         * If first DFS target server went offline and we failed to connect it,
4731         * server and ses pointers are NULL at this point, though we still have
4732         * chance to get a cached DFS referral in expand_dfs_referral() and
4733         * retry next target available in it.
4734         *
4735         * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4736         * performed against DFS path and *no* requests will be sent to server
4737         * for any new DFS referrals. Hence it's safe to skip checking whether
4738         * server or ses ptr is NULL.
4739         */
4740        if (rc == -EACCES || rc == -EOPNOTSUPP)
4741                goto error;
4742
4743        root_path = build_unc_path_to_root(vol, cifs_sb, false);
4744        if (IS_ERR(root_path)) {
4745                rc = PTR_ERR(root_path);
4746                root_path = NULL;
4747                goto error;
4748        }
4749
4750        full_path = build_unc_path_to_root(vol, cifs_sb, true);
4751        if (IS_ERR(full_path)) {
4752                rc = PTR_ERR(full_path);
4753                full_path = NULL;
4754                goto error;
4755        }
4756        /*
4757         * Perform an unconditional check for whether there are DFS
4758         * referrals for this path without prefix, to provide support
4759         * for DFS referrals from w2k8 servers which don't seem to respond
4760         * with PATH_NOT_COVERED to requests that include the prefix.
4761         * Chase the referral if found, otherwise continue normally.
4762         */
4763        old_mountdata = cifs_sb->mountdata;
4764        (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4765
4766        if (cifs_sb->mountdata == NULL) {
4767                rc = -ENOENT;
4768                goto error;
4769        }
4770
4771        /* Save DFS root volume information for DFS refresh worker */
4772        origin_mountdata = kstrndup(cifs_sb->mountdata,
4773                                    strlen(cifs_sb->mountdata), GFP_KERNEL);
4774        if (!origin_mountdata) {
4775                rc = -ENOMEM;
4776                goto error;
4777        }
4778
4779        if (cifs_sb->mountdata != old_mountdata) {
4780                /* If we were redirected, reconnect to new target server */
4781                mount_put_conns(cifs_sb, xid, server, ses, tcon);
4782                rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4783        }
4784        if (rc) {
4785                if (rc == -EACCES || rc == -EOPNOTSUPP)
4786                        goto error;
4787                /* Perform DFS failover to any other DFS targets */
4788                rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4789                                           &xid, &server, &ses, &tcon);
4790                if (rc)
4791                        goto error;
4792        }
4793
4794        kfree(root_path);
4795        root_path = build_unc_path_to_root(vol, cifs_sb, false);
4796        if (IS_ERR(root_path)) {
4797                rc = PTR_ERR(root_path);
4798                root_path = NULL;
4799                goto error;
4800        }
4801        /* Cache out resolved root server */
4802        (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4803                             root_path + 1, NULL, NULL);
4804        /*
4805         * Save root tcon for additional DFS requests to update or create a new
4806         * DFS cache entry, or even perform DFS failover.
4807         */
4808        spin_lock(&cifs_tcp_ses_lock);
4809        tcon->tc_count++;
4810        tcon->dfs_path = root_path;
4811        root_path = NULL;
4812        tcon->remap = cifs_remap(cifs_sb);
4813        spin_unlock(&cifs_tcp_ses_lock);
4814
4815        root_tcon = tcon;
4816
4817        for (count = 1; ;) {
4818                if (!rc && tcon) {
4819                        rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4820                        if (!rc || rc != -EREMOTE)
4821                                break;
4822                }
4823                /*
4824                 * BB: when we implement proper loop detection,
4825                 *     we will remove this check. But now we need it
4826                 *     to prevent an indefinite loop if 'DFS tree' is
4827                 *     misconfigured (i.e. has loops).
4828                 */
4829                if (count++ > MAX_NESTED_LINKS) {
4830                        rc = -ELOOP;
4831                        break;
4832                }
4833
4834                kfree(full_path);
4835                full_path = build_unc_path_to_root(vol, cifs_sb, true);
4836                if (IS_ERR(full_path)) {
4837                        rc = PTR_ERR(full_path);
4838                        full_path = NULL;
4839                        break;
4840                }
4841
4842                old_mountdata = cifs_sb->mountdata;
4843                rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4844                                         true);
4845                if (rc)
4846                        break;
4847
4848                if (cifs_sb->mountdata != old_mountdata) {
4849                        mount_put_conns(cifs_sb, xid, server, ses, tcon);
4850                        rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4851                                             &tcon);
4852                }
4853                if (rc) {
4854                        if (rc == -EACCES || rc == -EOPNOTSUPP)
4855                                break;
4856                        /* Perform DFS failover to any other DFS targets */
4857                        rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4858                                                   root_tcon->ses, &xid,
4859                                                   &server, &ses, &tcon);
4860                        if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4861                            !ses)
4862                                goto error;
4863                }
4864        }
4865        cifs_put_tcon(root_tcon);
4866
4867        if (rc)
4868                goto error;
4869
4870        spin_lock(&cifs_tcp_ses_lock);
4871        if (!tcon->dfs_path) {
4872                /* Save full path in new tcon to do failover when reconnecting tcons */
4873                tcon->dfs_path = full_path;
4874                full_path = NULL;
4875                tcon->remap = cifs_remap(cifs_sb);
4876        }
4877        cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4878                                            strlen(tcon->dfs_path),
4879                                            GFP_ATOMIC);
4880        if (!cifs_sb->origin_fullpath) {
4881                spin_unlock(&cifs_tcp_ses_lock);
4882                rc = -ENOMEM;
4883                goto error;
4884        }
4885        spin_unlock(&cifs_tcp_ses_lock);
4886
4887        rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4888        if (rc) {
4889                kfree(cifs_sb->origin_fullpath);
4890                goto error;
4891        }
4892        /*
4893         * After reconnecting to a different server, unique ids won't
4894         * match anymore, so we disable serverino. This prevents
4895         * dentry revalidation to think the dentry are stale (ESTALE).
4896         */
4897        cifs_autodisable_serverino(cifs_sb);
4898out:
4899        free_xid(xid);
4900        return mount_setup_tlink(cifs_sb, ses, tcon);
4901
4902error:
4903        kfree(full_path);
4904        kfree(root_path);
4905        kfree(origin_mountdata);
4906        mount_put_conns(cifs_sb, xid, server, ses, tcon);
4907        return rc;
4908}
4909#else
4910int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4911{
4912        int rc = 0;
4913        unsigned int xid;
4914        struct cifs_ses *ses;
4915        struct cifs_tcon *tcon;
4916        struct TCP_Server_Info *server;
4917
4918        rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4919        if (rc)
4920                goto error;
4921
4922        if (tcon) {
4923                rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4924                if (rc == -EREMOTE)
4925                        rc = -EOPNOTSUPP;
4926                if (rc)
4927                        goto error;
4928        }
4929
4930        free_xid(xid);
4931
4932        return mount_setup_tlink(cifs_sb, ses, tcon);
4933
4934error:
4935        mount_put_conns(cifs_sb, xid, server, ses, tcon);
4936        return rc;
4937}
4938#endif
4939
4940/*
4941 * Issue a TREE_CONNECT request.
4942 */
4943int
4944CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4945         const char *tree, struct cifs_tcon *tcon,
4946         const struct nls_table *nls_codepage)
4947{
4948        struct smb_hdr *smb_buffer;
4949        struct smb_hdr *smb_buffer_response;
4950        TCONX_REQ *pSMB;
4951        TCONX_RSP *pSMBr;
4952        unsigned char *bcc_ptr;
4953        int rc = 0;
4954        int length;
4955        __u16 bytes_left, count;
4956
4957        if (ses == NULL)
4958                return -EIO;
4959
4960        smb_buffer = cifs_buf_get();
4961        if (smb_buffer == NULL)
4962                return -ENOMEM;
4963
4964        smb_buffer_response = smb_buffer;
4965
4966        header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4967                        NULL /*no tid */ , 4 /*wct */ );
4968
4969        smb_buffer->Mid = get_next_mid(ses->server);
4970        smb_buffer->Uid = ses->Suid;
4971        pSMB = (TCONX_REQ *) smb_buffer;
4972        pSMBr = (TCONX_RSP *) smb_buffer_response;
4973
4974        pSMB->AndXCommand = 0xFF;
4975        pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4976        bcc_ptr = &pSMB->Password[0];
4977        if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4978                pSMB->PasswordLength = cpu_to_le16(1);  /* minimum */
4979                *bcc_ptr = 0; /* password is null byte */
4980                bcc_ptr++;              /* skip password */
4981                /* already aligned so no need to do it below */
4982        } else {
4983                pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4984                /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4985                   specified as required (when that support is added to
4986                   the vfs in the future) as only NTLM or the much
4987                   weaker LANMAN (which we do not send by default) is accepted
4988                   by Samba (not sure whether other servers allow
4989                   NTLMv2 password here) */
4990#ifdef CONFIG_CIFS_WEAK_PW_HASH
4991                if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4992                    (ses->sectype == LANMAN))
4993                        calc_lanman_hash(tcon->password, ses->server->cryptkey,
4994                                         ses->server->sec_mode &
4995                                            SECMODE_PW_ENCRYPT ? true : false,
4996                                         bcc_ptr);
4997                else
4998#endif /* CIFS_WEAK_PW_HASH */
4999                rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5000                                        bcc_ptr, nls_codepage);
5001                if (rc) {
5002                        cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5003                                 __func__, rc);
5004                        cifs_buf_release(smb_buffer);
5005                        return rc;
5006                }
5007
5008                bcc_ptr += CIFS_AUTH_RESP_SIZE;
5009                if (ses->capabilities & CAP_UNICODE) {
5010                        /* must align unicode strings */
5011                        *bcc_ptr = 0; /* null byte password */
5012                        bcc_ptr++;
5013                }
5014        }
5015
5016        if (ses->server->sign)
5017                smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5018
5019        if (ses->capabilities & CAP_STATUS32) {
5020                smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5021        }
5022        if (ses->capabilities & CAP_DFS) {
5023                smb_buffer->Flags2 |= SMBFLG2_DFS;
5024        }
5025        if (ses->capabilities & CAP_UNICODE) {
5026                smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5027                length =
5028                    cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5029                        6 /* max utf8 char length in bytes */ *
5030                        (/* server len*/ + 256 /* share len */), nls_codepage);
5031                bcc_ptr += 2 * length;  /* convert num 16 bit words to bytes */
5032                bcc_ptr += 2;   /* skip trailing null */
5033        } else {                /* ASCII */
5034                strcpy(bcc_ptr, tree);
5035                bcc_ptr += strlen(tree) + 1;
5036        }
5037        strcpy(bcc_ptr, "?????");
5038        bcc_ptr += strlen("?????");
5039        bcc_ptr += 1;
5040        count = bcc_ptr - &pSMB->Password[0];
5041        pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5042                                        pSMB->hdr.smb_buf_length) + count);
5043        pSMB->ByteCount = cpu_to_le16(count);
5044
5045        rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5046                         0);
5047
5048        /* above now done in SendReceive */
5049        if (rc == 0) {
5050                bool is_unicode;
5051
5052                tcon->tidStatus = CifsGood;
5053                tcon->need_reconnect = false;
5054                tcon->tid = smb_buffer_response->Tid;
5055                bcc_ptr = pByteArea(smb_buffer_response);
5056                bytes_left = get_bcc(smb_buffer_response);
5057                length = strnlen(bcc_ptr, bytes_left - 2);
5058                if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5059                        is_unicode = true;
5060                else
5061                        is_unicode = false;
5062
5063
5064                /* skip service field (NB: this field is always ASCII) */
5065                if (length == 3) {
5066                        if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5067                            (bcc_ptr[2] == 'C')) {
5068                                cifs_dbg(FYI, "IPC connection\n");
5069                                tcon->ipc = true;
5070                                tcon->pipe = true;
5071                        }
5072                } else if (length == 2) {
5073                        if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5074                                /* the most common case */
5075                                cifs_dbg(FYI, "disk share connection\n");
5076                        }
5077                }
5078                bcc_ptr += length + 1;
5079                bytes_left -= (length + 1);
5080                strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5081
5082                /* mostly informational -- no need to fail on error here */
5083                kfree(tcon->nativeFileSystem);
5084                tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5085                                                      bytes_left, is_unicode,
5086                                                      nls_codepage);
5087
5088                cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5089
5090                if ((smb_buffer_response->WordCount == 3) ||
5091                         (smb_buffer_response->WordCount == 7))
5092                        /* field is in same location */
5093                        tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5094                else
5095                        tcon->Flags = 0;
5096                cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5097        }
5098
5099        cifs_buf_release(smb_buffer);
5100        return rc;
5101}
5102
5103static void delayed_free(struct rcu_head *p)
5104{
5105        struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5106        unload_nls(sbi->local_nls);
5107        kfree(sbi);
5108}
5109
5110void
5111cifs_umount(struct cifs_sb_info *cifs_sb)
5112{
5113        struct rb_root *root = &cifs_sb->tlink_tree;
5114        struct rb_node *node;
5115        struct tcon_link *tlink;
5116
5117        cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5118
5119        spin_lock(&cifs_sb->tlink_tree_lock);
5120        while ((node = rb_first(root))) {
5121                tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5122                cifs_get_tlink(tlink);
5123                clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5124                rb_erase(node, root);
5125
5126                spin_unlock(&cifs_sb->tlink_tree_lock);
5127                cifs_put_tlink(tlink);
5128                spin_lock(&cifs_sb->tlink_tree_lock);
5129        }
5130        spin_unlock(&cifs_sb->tlink_tree_lock);
5131
5132        kfree(cifs_sb->mountdata);
5133        kfree(cifs_sb->prepath);
5134#ifdef CONFIG_CIFS_DFS_UPCALL
5135        dfs_cache_del_vol(cifs_sb->origin_fullpath);
5136        kfree(cifs_sb->origin_fullpath);
5137#endif
5138        call_rcu(&cifs_sb->rcu, delayed_free);
5139}
5140
5141int
5142cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5143{
5144        int rc = 0;
5145        struct TCP_Server_Info *server = ses->server;
5146
5147        if (!server->ops->need_neg || !server->ops->negotiate)
5148                return -ENOSYS;
5149
5150        /* only send once per connect */
5151        if (!server->ops->need_neg(server))
5152                return 0;
5153
5154        rc = server->ops->negotiate(xid, ses);
5155        if (rc == 0) {
5156                spin_lock(&GlobalMid_Lock);
5157                if (server->tcpStatus == CifsNeedNegotiate)
5158                        server->tcpStatus = CifsGood;
5159                else
5160                        rc = -EHOSTDOWN;
5161                spin_unlock(&GlobalMid_Lock);
5162        }
5163
5164        return rc;
5165}
5166
5167int
5168cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5169                   struct nls_table *nls_info)
5170{
5171        int rc = -ENOSYS;
5172        struct TCP_Server_Info *server = ses->server;
5173
5174        ses->capabilities = server->capabilities;
5175        if (linuxExtEnabled == 0)
5176                ses->capabilities &= (~server->vals->cap_unix);
5177
5178        cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5179                 server->sec_mode, server->capabilities, server->timeAdj);
5180
5181        if (ses->auth_key.response) {
5182                cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5183                         ses->auth_key.response);
5184                kfree(ses->auth_key.response);
5185                ses->auth_key.response = NULL;
5186                ses->auth_key.len = 0;
5187        }
5188
5189        if (server->ops->sess_setup)
5190                rc = server->ops->sess_setup(xid, ses, nls_info);
5191
5192        if (rc)
5193                cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5194
5195        return rc;
5196}
5197
5198static int
5199cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5200{
5201        vol->sectype = ses->sectype;
5202
5203        /* krb5 is special, since we don't need username or pw */
5204        if (vol->sectype == Kerberos)
5205                return 0;
5206
5207        return cifs_set_cifscreds(vol, ses);
5208}
5209
5210static struct cifs_tcon *
5211cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5212{
5213        int rc;
5214        struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5215        struct cifs_ses *ses;
5216        struct cifs_tcon *tcon = NULL;
5217        struct smb_vol *vol_info;
5218
5219        vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5220        if (vol_info == NULL)
5221                return ERR_PTR(-ENOMEM);
5222
5223        vol_info->local_nls = cifs_sb->local_nls;
5224        vol_info->linux_uid = fsuid;
5225        vol_info->cred_uid = fsuid;
5226        vol_info->UNC = master_tcon->treeName;
5227        vol_info->retry = master_tcon->retry;
5228        vol_info->nocase = master_tcon->nocase;
5229        vol_info->nohandlecache = master_tcon->nohandlecache;
5230        vol_info->local_lease = master_tcon->local_lease;
5231        vol_info->no_linux_ext = !master_tcon->unix_ext;
5232        vol_info->sectype = master_tcon->ses->sectype;
5233        vol_info->sign = master_tcon->ses->sign;
5234
5235        rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5236        if (rc) {
5237                tcon = ERR_PTR(rc);
5238                goto out;
5239        }
5240
5241        /* get a reference for the same TCP session */
5242        spin_lock(&cifs_tcp_ses_lock);
5243        ++master_tcon->ses->server->srv_count;
5244        spin_unlock(&cifs_tcp_ses_lock);
5245
5246        ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5247        if (IS_ERR(ses)) {
5248                tcon = (struct cifs_tcon *)ses;
5249                cifs_put_tcp_session(master_tcon->ses->server, 0);
5250                goto out;
5251        }
5252
5253        tcon = cifs_get_tcon(ses, vol_info);
5254        if (IS_ERR(tcon)) {
5255                cifs_put_smb_ses(ses);
5256                goto out;
5257        }
5258
5259        /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5260        if (tcon->posix_extensions)
5261                cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5262
5263        if (cap_unix(ses))
5264                reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5265
5266out:
5267        kfree(vol_info->username);
5268        kzfree(vol_info->password);
5269        kfree(vol_info);
5270
5271        return tcon;
5272}
5273
5274struct cifs_tcon *
5275cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5276{
5277        return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5278}
5279
5280/* find and return a tlink with given uid */
5281static struct tcon_link *
5282tlink_rb_search(struct rb_root *root, kuid_t uid)
5283{
5284        struct rb_node *node = root->rb_node;
5285        struct tcon_link *tlink;
5286
5287        while (node) {
5288                tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5289
5290                if (uid_gt(tlink->tl_uid, uid))
5291                        node = node->rb_left;
5292                else if (uid_lt(tlink->tl_uid, uid))
5293                        node = node->rb_right;
5294                else
5295                        return tlink;
5296        }
5297        return NULL;
5298}
5299
5300/* insert a tcon_link into the tree */
5301static void
5302tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5303{
5304        struct rb_node **new = &(root->rb_node), *parent = NULL;
5305        struct tcon_link *tlink;
5306
5307        while (*new) {
5308                tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5309                parent = *new;
5310
5311                if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5312                        new = &((*new)->rb_left);
5313                else
5314                        new = &((*new)->rb_right);
5315        }
5316
5317        rb_link_node(&new_tlink->tl_rbnode, parent, new);
5318        rb_insert_color(&new_tlink->tl_rbnode, root);
5319}
5320
5321/*
5322 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5323 * current task.
5324 *
5325 * If the superblock doesn't refer to a multiuser mount, then just return
5326 * the master tcon for the mount.
5327 *
5328 * First, search the rbtree for an existing tcon for this fsuid. If one
5329 * exists, then check to see if it's pending construction. If it is then wait
5330 * for construction to complete. Once it's no longer pending, check to see if
5331 * it failed and either return an error or retry construction, depending on
5332 * the timeout.
5333 *
5334 * If one doesn't exist then insert a new tcon_link struct into the tree and
5335 * try to construct a new one.
5336 */
5337struct tcon_link *
5338cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5339{
5340        int ret;
5341        kuid_t fsuid = current_fsuid();
5342        struct tcon_link *tlink, *newtlink;
5343
5344        if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5345                return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5346
5347        spin_lock(&cifs_sb->tlink_tree_lock);
5348        tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5349        if (tlink)
5350                cifs_get_tlink(tlink);
5351        spin_unlock(&cifs_sb->tlink_tree_lock);
5352
5353        if (tlink == NULL) {
5354                newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5355                if (newtlink == NULL)
5356                        return ERR_PTR(-ENOMEM);
5357                newtlink->tl_uid = fsuid;
5358                newtlink->tl_tcon = ERR_PTR(-EACCES);
5359                set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5360                set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5361                cifs_get_tlink(newtlink);
5362
5363                spin_lock(&cifs_sb->tlink_tree_lock);
5364                /* was one inserted after previous search? */
5365                tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5366                if (tlink) {
5367                        cifs_get_tlink(tlink);
5368                        spin_unlock(&cifs_sb->tlink_tree_lock);
5369                        kfree(newtlink);
5370                        goto wait_for_construction;
5371                }
5372                tlink = newtlink;
5373                tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5374                spin_unlock(&cifs_sb->tlink_tree_lock);
5375        } else {
5376wait_for_construction:
5377                ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5378                                  TASK_INTERRUPTIBLE);
5379                if (ret) {
5380                        cifs_put_tlink(tlink);
5381                        return ERR_PTR(-ERESTARTSYS);
5382                }
5383
5384                /* if it's good, return it */
5385                if (!IS_ERR(tlink->tl_tcon))
5386                        return tlink;
5387
5388                /* return error if we tried this already recently */
5389                if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5390                        cifs_put_tlink(tlink);
5391                        return ERR_PTR(-EACCES);
5392                }
5393
5394                if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5395                        goto wait_for_construction;
5396        }
5397
5398        tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5399        clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5400        wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5401
5402        if (IS_ERR(tlink->tl_tcon)) {
5403                cifs_put_tlink(tlink);
5404                return ERR_PTR(-EACCES);
5405        }
5406
5407        return tlink;
5408}
5409
5410/*
5411 * periodic workqueue job that scans tcon_tree for a superblock and closes
5412 * out tcons.
5413 */
5414static void
5415cifs_prune_tlinks(struct work_struct *work)
5416{
5417        struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5418                                                    prune_tlinks.work);
5419        struct rb_root *root = &cifs_sb->tlink_tree;
5420        struct rb_node *node;
5421        struct rb_node *tmp;
5422        struct tcon_link *tlink;
5423
5424        /*
5425         * Because we drop the spinlock in the loop in order to put the tlink
5426         * it's not guarded against removal of links from the tree. The only
5427         * places that remove entries from the tree are this function and
5428         * umounts. Because this function is non-reentrant and is canceled
5429         * before umount can proceed, this is safe.
5430         */
5431        spin_lock(&cifs_sb->tlink_tree_lock);
5432        node = rb_first(root);
5433        while (node != NULL) {
5434                tmp = node;
5435                node = rb_next(tmp);
5436                tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5437
5438                if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5439                    atomic_read(&tlink->tl_count) != 0 ||
5440                    time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5441                        continue;
5442
5443                cifs_get_tlink(tlink);
5444                clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5445                rb_erase(tmp, root);
5446
5447                spin_unlock(&cifs_sb->tlink_tree_lock);
5448                cifs_put_tlink(tlink);
5449                spin_lock(&cifs_sb->tlink_tree_lock);
5450        }
5451        spin_unlock(&cifs_sb->tlink_tree_lock);
5452
5453        queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
5454                                TLINK_IDLE_EXPIRE);
5455}
5456