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