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