linux/fs/cifs/smb2ops.c
<<
>>
Prefs
   1/*
   2 *  SMB2 version specific operations
   3 *
   4 *  Copyright (c) 2012, Jeff Layton <jlayton@redhat.com>
   5 *
   6 *  This library is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License v2 as published
   8 *  by the Free Software Foundation.
   9 *
  10 *  This library is distributed in the hope that it will be useful,
  11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  13 *  the GNU Lesser General Public License for more details.
  14 *
  15 *  You should have received a copy of the GNU Lesser General Public License
  16 *  along with this library; if not, write to the Free Software
  17 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18 */
  19
  20#include <linux/pagemap.h>
  21#include <linux/vfs.h>
  22#include <linux/falloc.h>
  23#include <linux/scatterlist.h>
  24#include <linux/uuid.h>
  25#include <crypto/aead.h>
  26#include "cifsglob.h"
  27#include "smb2pdu.h"
  28#include "smb2proto.h"
  29#include "cifsproto.h"
  30#include "cifs_debug.h"
  31#include "cifs_unicode.h"
  32#include "smb2status.h"
  33#include "smb2glob.h"
  34#include "cifs_ioctl.h"
  35#include "smbdirect.h"
  36
  37/* Change credits for different ops and return the total number of credits */
  38static int
  39change_conf(struct TCP_Server_Info *server)
  40{
  41        server->credits += server->echo_credits + server->oplock_credits;
  42        server->oplock_credits = server->echo_credits = 0;
  43        switch (server->credits) {
  44        case 0:
  45                return 0;
  46        case 1:
  47                server->echoes = false;
  48                server->oplocks = false;
  49                break;
  50        case 2:
  51                server->echoes = true;
  52                server->oplocks = false;
  53                server->echo_credits = 1;
  54                break;
  55        default:
  56                server->echoes = true;
  57                if (enable_oplocks) {
  58                        server->oplocks = true;
  59                        server->oplock_credits = 1;
  60                } else
  61                        server->oplocks = false;
  62
  63                server->echo_credits = 1;
  64        }
  65        server->credits -= server->echo_credits + server->oplock_credits;
  66        return server->credits + server->echo_credits + server->oplock_credits;
  67}
  68
  69static void
  70smb2_add_credits(struct TCP_Server_Info *server,
  71                 const struct cifs_credits *credits, const int optype)
  72{
  73        int *val, rc = -1;
  74        unsigned int add = credits->value;
  75        unsigned int instance = credits->instance;
  76        bool reconnect_detected = false;
  77
  78        spin_lock(&server->req_lock);
  79        val = server->ops->get_credits_field(server, optype);
  80
  81        /* eg found case where write overlapping reconnect messed up credits */
  82        if (((optype & CIFS_OP_MASK) == CIFS_NEG_OP) && (*val != 0))
  83                trace_smb3_reconnect_with_invalid_credits(server->CurrentMid,
  84                        server->hostname, *val);
  85        if ((instance == 0) || (instance == server->reconnect_instance))
  86                *val += add;
  87        else
  88                reconnect_detected = true;
  89
  90        if (*val > 65000) {
  91                *val = 65000; /* Don't get near 64K credits, avoid srv bugs */
  92                printk_once(KERN_WARNING "server overflowed SMB3 credits\n");
  93        }
  94        server->in_flight--;
  95        if (server->in_flight == 0 && (optype & CIFS_OP_MASK) != CIFS_NEG_OP)
  96                rc = change_conf(server);
  97        /*
  98         * Sometimes server returns 0 credits on oplock break ack - we need to
  99         * rebalance credits in this case.
 100         */
 101        else if (server->in_flight > 0 && server->oplock_credits == 0 &&
 102                 server->oplocks) {
 103                if (server->credits > 1) {
 104                        server->credits--;
 105                        server->oplock_credits++;
 106                }
 107        }
 108        spin_unlock(&server->req_lock);
 109        wake_up(&server->request_q);
 110
 111        if (reconnect_detected)
 112                cifs_dbg(FYI, "trying to put %d credits from the old server instance %d\n",
 113                         add, instance);
 114
 115        if (server->tcpStatus == CifsNeedReconnect
 116            || server->tcpStatus == CifsExiting)
 117                return;
 118
 119        switch (rc) {
 120        case -1:
 121                /* change_conf hasn't been executed */
 122                break;
 123        case 0:
 124                cifs_dbg(VFS, "Possible client or server bug - zero credits\n");
 125                break;
 126        case 1:
 127                cifs_dbg(VFS, "disabling echoes and oplocks\n");
 128                break;
 129        case 2:
 130                cifs_dbg(FYI, "disabling oplocks\n");
 131                break;
 132        default:
 133                cifs_dbg(FYI, "add %u credits total=%d\n", add, rc);
 134        }
 135}
 136
 137static void
 138smb2_set_credits(struct TCP_Server_Info *server, const int val)
 139{
 140        spin_lock(&server->req_lock);
 141        server->credits = val;
 142        if (val == 1)
 143                server->reconnect_instance++;
 144        spin_unlock(&server->req_lock);
 145        /* don't log while holding the lock */
 146        if (val == 1)
 147                cifs_dbg(FYI, "set credits to 1 due to smb2 reconnect\n");
 148}
 149
 150static int *
 151smb2_get_credits_field(struct TCP_Server_Info *server, const int optype)
 152{
 153        switch (optype) {
 154        case CIFS_ECHO_OP:
 155                return &server->echo_credits;
 156        case CIFS_OBREAK_OP:
 157                return &server->oplock_credits;
 158        default:
 159                return &server->credits;
 160        }
 161}
 162
 163static unsigned int
 164smb2_get_credits(struct mid_q_entry *mid)
 165{
 166        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)mid->resp_buf;
 167
 168        if (mid->mid_state == MID_RESPONSE_RECEIVED
 169            || mid->mid_state == MID_RESPONSE_MALFORMED)
 170                return le16_to_cpu(shdr->CreditRequest);
 171
 172        return 0;
 173}
 174
 175static int
 176smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
 177                      unsigned int *num, struct cifs_credits *credits)
 178{
 179        int rc = 0;
 180        unsigned int scredits;
 181
 182        spin_lock(&server->req_lock);
 183        while (1) {
 184                if (server->credits <= 0) {
 185                        spin_unlock(&server->req_lock);
 186                        cifs_num_waiters_inc(server);
 187                        rc = wait_event_killable(server->request_q,
 188                                has_credits(server, &server->credits, 1));
 189                        cifs_num_waiters_dec(server);
 190                        if (rc)
 191                                return rc;
 192                        spin_lock(&server->req_lock);
 193                } else {
 194                        if (server->tcpStatus == CifsExiting) {
 195                                spin_unlock(&server->req_lock);
 196                                return -ENOENT;
 197                        }
 198
 199                        scredits = server->credits;
 200                        /* can deadlock with reopen */
 201                        if (scredits <= 8) {
 202                                *num = SMB2_MAX_BUFFER_SIZE;
 203                                credits->value = 0;
 204                                credits->instance = 0;
 205                                break;
 206                        }
 207
 208                        /* leave some credits for reopen and other ops */
 209                        scredits -= 8;
 210                        *num = min_t(unsigned int, size,
 211                                     scredits * SMB2_MAX_BUFFER_SIZE);
 212
 213                        credits->value =
 214                                DIV_ROUND_UP(*num, SMB2_MAX_BUFFER_SIZE);
 215                        credits->instance = server->reconnect_instance;
 216                        server->credits -= credits->value;
 217                        server->in_flight++;
 218                        break;
 219                }
 220        }
 221        spin_unlock(&server->req_lock);
 222        return rc;
 223}
 224
 225static int
 226smb2_adjust_credits(struct TCP_Server_Info *server,
 227                    struct cifs_credits *credits,
 228                    const unsigned int payload_size)
 229{
 230        int new_val = DIV_ROUND_UP(payload_size, SMB2_MAX_BUFFER_SIZE);
 231
 232        if (!credits->value || credits->value == new_val)
 233                return 0;
 234
 235        if (credits->value < new_val) {
 236                WARN_ONCE(1, "request has less credits (%d) than required (%d)",
 237                          credits->value, new_val);
 238                return -ENOTSUPP;
 239        }
 240
 241        spin_lock(&server->req_lock);
 242
 243        if (server->reconnect_instance != credits->instance) {
 244                spin_unlock(&server->req_lock);
 245                cifs_dbg(VFS, "trying to return %d credits to old session\n",
 246                         credits->value - new_val);
 247                return -EAGAIN;
 248        }
 249
 250        server->credits += credits->value - new_val;
 251        spin_unlock(&server->req_lock);
 252        wake_up(&server->request_q);
 253        credits->value = new_val;
 254        return 0;
 255}
 256
 257static __u64
 258smb2_get_next_mid(struct TCP_Server_Info *server)
 259{
 260        __u64 mid;
 261        /* for SMB2 we need the current value */
 262        spin_lock(&GlobalMid_Lock);
 263        mid = server->CurrentMid++;
 264        spin_unlock(&GlobalMid_Lock);
 265        return mid;
 266}
 267
 268static void
 269smb2_revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
 270{
 271        spin_lock(&GlobalMid_Lock);
 272        if (server->CurrentMid >= val)
 273                server->CurrentMid -= val;
 274        spin_unlock(&GlobalMid_Lock);
 275}
 276
 277static struct mid_q_entry *
 278smb2_find_mid(struct TCP_Server_Info *server, char *buf)
 279{
 280        struct mid_q_entry *mid;
 281        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
 282        __u64 wire_mid = le64_to_cpu(shdr->MessageId);
 283
 284        if (shdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) {
 285                cifs_dbg(VFS, "encrypted frame parsing not supported yet");
 286                return NULL;
 287        }
 288
 289        spin_lock(&GlobalMid_Lock);
 290        list_for_each_entry(mid, &server->pending_mid_q, qhead) {
 291                if ((mid->mid == wire_mid) &&
 292                    (mid->mid_state == MID_REQUEST_SUBMITTED) &&
 293                    (mid->command == shdr->Command)) {
 294                        kref_get(&mid->refcount);
 295                        spin_unlock(&GlobalMid_Lock);
 296                        return mid;
 297                }
 298        }
 299        spin_unlock(&GlobalMid_Lock);
 300        return NULL;
 301}
 302
 303static void
 304smb2_dump_detail(void *buf, struct TCP_Server_Info *server)
 305{
 306#ifdef CONFIG_CIFS_DEBUG2
 307        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
 308
 309        cifs_dbg(VFS, "Cmd: %d Err: 0x%x Flags: 0x%x Mid: %llu Pid: %d\n",
 310                 shdr->Command, shdr->Status, shdr->Flags, shdr->MessageId,
 311                 shdr->ProcessId);
 312        cifs_dbg(VFS, "smb buf %p len %u\n", buf,
 313                 server->ops->calc_smb_size(buf, server));
 314#endif
 315}
 316
 317static bool
 318smb2_need_neg(struct TCP_Server_Info *server)
 319{
 320        return server->max_read == 0;
 321}
 322
 323static int
 324smb2_negotiate(const unsigned int xid, struct cifs_ses *ses)
 325{
 326        int rc;
 327        ses->server->CurrentMid = 0;
 328        rc = SMB2_negotiate(xid, ses);
 329        /* BB we probably don't need to retry with modern servers */
 330        if (rc == -EAGAIN)
 331                rc = -EHOSTDOWN;
 332        return rc;
 333}
 334
 335static unsigned int
 336smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 337{
 338        struct TCP_Server_Info *server = tcon->ses->server;
 339        unsigned int wsize;
 340
 341        /* start with specified wsize, or default */
 342        wsize = volume_info->wsize ? volume_info->wsize : CIFS_DEFAULT_IOSIZE;
 343        wsize = min_t(unsigned int, wsize, server->max_write);
 344#ifdef CONFIG_CIFS_SMB_DIRECT
 345        if (server->rdma) {
 346                if (server->sign)
 347                        wsize = min_t(unsigned int,
 348                                wsize, server->smbd_conn->max_fragmented_send_size);
 349                else
 350                        wsize = min_t(unsigned int,
 351                                wsize, server->smbd_conn->max_readwrite_size);
 352        }
 353#endif
 354        if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
 355                wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE);
 356
 357        return wsize;
 358}
 359
 360static unsigned int
 361smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 362{
 363        struct TCP_Server_Info *server = tcon->ses->server;
 364        unsigned int wsize;
 365
 366        /* start with specified wsize, or default */
 367        wsize = volume_info->wsize ? volume_info->wsize : SMB3_DEFAULT_IOSIZE;
 368        wsize = min_t(unsigned int, wsize, server->max_write);
 369#ifdef CONFIG_CIFS_SMB_DIRECT
 370        if (server->rdma) {
 371                if (server->sign)
 372                        wsize = min_t(unsigned int,
 373                                wsize, server->smbd_conn->max_fragmented_send_size);
 374                else
 375                        wsize = min_t(unsigned int,
 376                                wsize, server->smbd_conn->max_readwrite_size);
 377        }
 378#endif
 379        if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
 380                wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE);
 381
 382        return wsize;
 383}
 384
 385static unsigned int
 386smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 387{
 388        struct TCP_Server_Info *server = tcon->ses->server;
 389        unsigned int rsize;
 390
 391        /* start with specified rsize, or default */
 392        rsize = volume_info->rsize ? volume_info->rsize : CIFS_DEFAULT_IOSIZE;
 393        rsize = min_t(unsigned int, rsize, server->max_read);
 394#ifdef CONFIG_CIFS_SMB_DIRECT
 395        if (server->rdma) {
 396                if (server->sign)
 397                        rsize = min_t(unsigned int,
 398                                rsize, server->smbd_conn->max_fragmented_recv_size);
 399                else
 400                        rsize = min_t(unsigned int,
 401                                rsize, server->smbd_conn->max_readwrite_size);
 402        }
 403#endif
 404
 405        if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
 406                rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE);
 407
 408        return rsize;
 409}
 410
 411static unsigned int
 412smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 413{
 414        struct TCP_Server_Info *server = tcon->ses->server;
 415        unsigned int rsize;
 416
 417        /* start with specified rsize, or default */
 418        rsize = volume_info->rsize ? volume_info->rsize : SMB3_DEFAULT_IOSIZE;
 419        rsize = min_t(unsigned int, rsize, server->max_read);
 420#ifdef CONFIG_CIFS_SMB_DIRECT
 421        if (server->rdma) {
 422                if (server->sign)
 423                        rsize = min_t(unsigned int,
 424                                rsize, server->smbd_conn->max_fragmented_recv_size);
 425                else
 426                        rsize = min_t(unsigned int,
 427                                rsize, server->smbd_conn->max_readwrite_size);
 428        }
 429#endif
 430
 431        if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
 432                rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE);
 433
 434        return rsize;
 435}
 436
 437static int
 438parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
 439                        size_t buf_len,
 440                        struct cifs_server_iface **iface_list,
 441                        size_t *iface_count)
 442{
 443        struct network_interface_info_ioctl_rsp *p;
 444        struct sockaddr_in *addr4;
 445        struct sockaddr_in6 *addr6;
 446        struct iface_info_ipv4 *p4;
 447        struct iface_info_ipv6 *p6;
 448        struct cifs_server_iface *info;
 449        ssize_t bytes_left;
 450        size_t next = 0;
 451        int nb_iface = 0;
 452        int rc = 0;
 453
 454        *iface_list = NULL;
 455        *iface_count = 0;
 456
 457        /*
 458         * Fist pass: count and sanity check
 459         */
 460
 461        bytes_left = buf_len;
 462        p = buf;
 463        while (bytes_left >= sizeof(*p)) {
 464                nb_iface++;
 465                next = le32_to_cpu(p->Next);
 466                if (!next) {
 467                        bytes_left -= sizeof(*p);
 468                        break;
 469                }
 470                p = (struct network_interface_info_ioctl_rsp *)((u8 *)p+next);
 471                bytes_left -= next;
 472        }
 473
 474        if (!nb_iface) {
 475                cifs_dbg(VFS, "%s: malformed interface info\n", __func__);
 476                rc = -EINVAL;
 477                goto out;
 478        }
 479
 480        if (bytes_left || p->Next)
 481                cifs_dbg(VFS, "%s: incomplete interface info\n", __func__);
 482
 483
 484        /*
 485         * Second pass: extract info to internal structure
 486         */
 487
 488        *iface_list = kcalloc(nb_iface, sizeof(**iface_list), GFP_KERNEL);
 489        if (!*iface_list) {
 490                rc = -ENOMEM;
 491                goto out;
 492        }
 493
 494        info = *iface_list;
 495        bytes_left = buf_len;
 496        p = buf;
 497        while (bytes_left >= sizeof(*p)) {
 498                info->speed = le64_to_cpu(p->LinkSpeed);
 499                info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE);
 500                info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE);
 501
 502                cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, *iface_count);
 503                cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed);
 504                cifs_dbg(FYI, "%s: capabilities 0x%08x\n", __func__,
 505                         le32_to_cpu(p->Capability));
 506
 507                switch (p->Family) {
 508                /*
 509                 * The kernel and wire socket structures have the same
 510                 * layout and use network byte order but make the
 511                 * conversion explicit in case either one changes.
 512                 */
 513                case INTERNETWORK:
 514                        addr4 = (struct sockaddr_in *)&info->sockaddr;
 515                        p4 = (struct iface_info_ipv4 *)p->Buffer;
 516                        addr4->sin_family = AF_INET;
 517                        memcpy(&addr4->sin_addr, &p4->IPv4Address, 4);
 518
 519                        /* [MS-SMB2] 2.2.32.5.1.1 Clients MUST ignore these */
 520                        addr4->sin_port = cpu_to_be16(CIFS_PORT);
 521
 522                        cifs_dbg(FYI, "%s: ipv4 %pI4\n", __func__,
 523                                 &addr4->sin_addr);
 524                        break;
 525                case INTERNETWORKV6:
 526                        addr6 = (struct sockaddr_in6 *)&info->sockaddr;
 527                        p6 = (struct iface_info_ipv6 *)p->Buffer;
 528                        addr6->sin6_family = AF_INET6;
 529                        memcpy(&addr6->sin6_addr, &p6->IPv6Address, 16);
 530
 531                        /* [MS-SMB2] 2.2.32.5.1.2 Clients MUST ignore these */
 532                        addr6->sin6_flowinfo = 0;
 533                        addr6->sin6_scope_id = 0;
 534                        addr6->sin6_port = cpu_to_be16(CIFS_PORT);
 535
 536                        cifs_dbg(FYI, "%s: ipv6 %pI6\n", __func__,
 537                                 &addr6->sin6_addr);
 538                        break;
 539                default:
 540                        cifs_dbg(VFS,
 541                                 "%s: skipping unsupported socket family\n",
 542                                 __func__);
 543                        goto next_iface;
 544                }
 545
 546                (*iface_count)++;
 547                info++;
 548next_iface:
 549                next = le32_to_cpu(p->Next);
 550                if (!next)
 551                        break;
 552                p = (struct network_interface_info_ioctl_rsp *)((u8 *)p+next);
 553                bytes_left -= next;
 554        }
 555
 556        if (!*iface_count) {
 557                rc = -EINVAL;
 558                goto out;
 559        }
 560
 561out:
 562        if (rc) {
 563                kfree(*iface_list);
 564                *iface_count = 0;
 565                *iface_list = NULL;
 566        }
 567        return rc;
 568}
 569
 570
 571static int
 572SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
 573{
 574        int rc;
 575        unsigned int ret_data_len = 0;
 576        struct network_interface_info_ioctl_rsp *out_buf = NULL;
 577        struct cifs_server_iface *iface_list;
 578        size_t iface_count;
 579        struct cifs_ses *ses = tcon->ses;
 580
 581        rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
 582                        FSCTL_QUERY_NETWORK_INTERFACE_INFO, true /* is_fsctl */,
 583                        NULL /* no data input */, 0 /* no data input */,
 584                        CIFSMaxBufSize, (char **)&out_buf, &ret_data_len);
 585        if (rc == -EOPNOTSUPP) {
 586                cifs_dbg(FYI,
 587                         "server does not support query network interfaces\n");
 588                goto out;
 589        } else if (rc != 0) {
 590                cifs_dbg(VFS, "error %d on ioctl to get interface list\n", rc);
 591                goto out;
 592        }
 593
 594        rc = parse_server_interfaces(out_buf, ret_data_len,
 595                                     &iface_list, &iface_count);
 596        if (rc)
 597                goto out;
 598
 599        spin_lock(&ses->iface_lock);
 600        kfree(ses->iface_list);
 601        ses->iface_list = iface_list;
 602        ses->iface_count = iface_count;
 603        ses->iface_last_update = jiffies;
 604        spin_unlock(&ses->iface_lock);
 605
 606out:
 607        kfree(out_buf);
 608        return rc;
 609}
 610
 611static void
 612smb2_close_cached_fid(struct kref *ref)
 613{
 614        struct cached_fid *cfid = container_of(ref, struct cached_fid,
 615                                               refcount);
 616
 617        if (cfid->is_valid) {
 618                cifs_dbg(FYI, "clear cached root file handle\n");
 619                SMB2_close(0, cfid->tcon, cfid->fid->persistent_fid,
 620                           cfid->fid->volatile_fid);
 621                cfid->is_valid = false;
 622                cfid->file_all_info_is_valid = false;
 623        }
 624}
 625
 626void close_shroot(struct cached_fid *cfid)
 627{
 628        mutex_lock(&cfid->fid_mutex);
 629        kref_put(&cfid->refcount, smb2_close_cached_fid);
 630        mutex_unlock(&cfid->fid_mutex);
 631}
 632
 633void
 634smb2_cached_lease_break(struct work_struct *work)
 635{
 636        struct cached_fid *cfid = container_of(work,
 637                                struct cached_fid, lease_break);
 638
 639        close_shroot(cfid);
 640}
 641
 642/*
 643 * Open the directory at the root of a share
 644 */
 645int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
 646{
 647        struct cifs_ses *ses = tcon->ses;
 648        struct TCP_Server_Info *server = ses->server;
 649        struct cifs_open_parms oparms;
 650        struct smb2_create_rsp *o_rsp = NULL;
 651        struct smb2_query_info_rsp *qi_rsp = NULL;
 652        int resp_buftype[2];
 653        struct smb_rqst rqst[2];
 654        struct kvec rsp_iov[2];
 655        struct kvec open_iov[SMB2_CREATE_IOV_SIZE];
 656        struct kvec qi_iov[1];
 657        int rc, flags = 0;
 658        __le16 utf16_path = 0; /* Null - since an open of top of share */
 659        u8 oplock = SMB2_OPLOCK_LEVEL_II;
 660
 661        mutex_lock(&tcon->crfid.fid_mutex);
 662        if (tcon->crfid.is_valid) {
 663                cifs_dbg(FYI, "found a cached root file handle\n");
 664                memcpy(pfid, tcon->crfid.fid, sizeof(struct cifs_fid));
 665                kref_get(&tcon->crfid.refcount);
 666                mutex_unlock(&tcon->crfid.fid_mutex);
 667                return 0;
 668        }
 669
 670        if (smb3_encryption_required(tcon))
 671                flags |= CIFS_TRANSFORM_REQ;
 672
 673        memset(rqst, 0, sizeof(rqst));
 674        resp_buftype[0] = resp_buftype[1] = CIFS_NO_BUFFER;
 675        memset(rsp_iov, 0, sizeof(rsp_iov));
 676
 677        /* Open */
 678        memset(&open_iov, 0, sizeof(open_iov));
 679        rqst[0].rq_iov = open_iov;
 680        rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
 681
 682        oparms.tcon = tcon;
 683        oparms.create_options = 0;
 684        oparms.desired_access = FILE_READ_ATTRIBUTES;
 685        oparms.disposition = FILE_OPEN;
 686        oparms.fid = pfid;
 687        oparms.reconnect = false;
 688
 689        rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, &utf16_path);
 690        if (rc)
 691                goto oshr_exit;
 692        smb2_set_next_command(tcon, &rqst[0]);
 693
 694        memset(&qi_iov, 0, sizeof(qi_iov));
 695        rqst[1].rq_iov = qi_iov;
 696        rqst[1].rq_nvec = 1;
 697
 698        rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID,
 699                                  COMPOUND_FID, FILE_ALL_INFORMATION,
 700                                  SMB2_O_INFO_FILE, 0,
 701                                  sizeof(struct smb2_file_all_info) +
 702                                  PATH_MAX * 2, 0, NULL);
 703        if (rc)
 704                goto oshr_exit;
 705
 706        smb2_set_related(&rqst[1]);
 707
 708        rc = compound_send_recv(xid, ses, flags, 2, rqst,
 709                                resp_buftype, rsp_iov);
 710        if (rc)
 711                goto oshr_exit;
 712
 713        o_rsp = (struct smb2_create_rsp *)rsp_iov[0].iov_base;
 714        oparms.fid->persistent_fid = o_rsp->PersistentFileId;
 715        oparms.fid->volatile_fid = o_rsp->VolatileFileId;
 716#ifdef CONFIG_CIFS_DEBUG2
 717        oparms.fid->mid = le64_to_cpu(o_rsp->sync_hdr.MessageId);
 718#endif /* CIFS_DEBUG2 */
 719
 720        memcpy(tcon->crfid.fid, pfid, sizeof(struct cifs_fid));
 721        tcon->crfid.tcon = tcon;
 722        tcon->crfid.is_valid = true;
 723        kref_init(&tcon->crfid.refcount);
 724
 725        if (o_rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE) {
 726                kref_get(&tcon->crfid.refcount);
 727                oplock = smb2_parse_lease_state(server, o_rsp,
 728                                                &oparms.fid->epoch,
 729                                                oparms.fid->lease_key);
 730        } else
 731                goto oshr_exit;
 732
 733        qi_rsp = (struct smb2_query_info_rsp *)rsp_iov[1].iov_base;
 734        if (le32_to_cpu(qi_rsp->OutputBufferLength) < sizeof(struct smb2_file_all_info))
 735                goto oshr_exit;
 736        if (!smb2_validate_and_copy_iov(
 737                                le16_to_cpu(qi_rsp->OutputBufferOffset),
 738                                sizeof(struct smb2_file_all_info),
 739                                &rsp_iov[1], sizeof(struct smb2_file_all_info),
 740                                (char *)&tcon->crfid.file_all_info))
 741                tcon->crfid.file_all_info_is_valid = 1;
 742
 743 oshr_exit:
 744        mutex_unlock(&tcon->crfid.fid_mutex);
 745        SMB2_open_free(&rqst[0]);
 746        SMB2_query_info_free(&rqst[1]);
 747        free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
 748        free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base);
 749        return rc;
 750}
 751
 752static void
 753smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
 754{
 755        int rc;
 756        __le16 srch_path = 0; /* Null - open root of share */
 757        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 758        struct cifs_open_parms oparms;
 759        struct cifs_fid fid;
 760        bool no_cached_open = tcon->nohandlecache;
 761
 762        oparms.tcon = tcon;
 763        oparms.desired_access = FILE_READ_ATTRIBUTES;
 764        oparms.disposition = FILE_OPEN;
 765        oparms.create_options = 0;
 766        oparms.fid = &fid;
 767        oparms.reconnect = false;
 768
 769        if (no_cached_open)
 770                rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL,
 771                               NULL);
 772        else
 773                rc = open_shroot(xid, tcon, &fid);
 774
 775        if (rc)
 776                return;
 777
 778        SMB3_request_interfaces(xid, tcon);
 779
 780        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 781                        FS_ATTRIBUTE_INFORMATION);
 782        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 783                        FS_DEVICE_INFORMATION);
 784        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 785                        FS_VOLUME_INFORMATION);
 786        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 787                        FS_SECTOR_SIZE_INFORMATION); /* SMB3 specific */
 788        if (no_cached_open)
 789                SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 790        else
 791                close_shroot(&tcon->crfid);
 792
 793        return;
 794}
 795
 796static void
 797smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
 798{
 799        int rc;
 800        __le16 srch_path = 0; /* Null - open root of share */
 801        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 802        struct cifs_open_parms oparms;
 803        struct cifs_fid fid;
 804
 805        oparms.tcon = tcon;
 806        oparms.desired_access = FILE_READ_ATTRIBUTES;
 807        oparms.disposition = FILE_OPEN;
 808        oparms.create_options = 0;
 809        oparms.fid = &fid;
 810        oparms.reconnect = false;
 811
 812        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL, NULL);
 813        if (rc)
 814                return;
 815
 816        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 817                        FS_ATTRIBUTE_INFORMATION);
 818        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 819                        FS_DEVICE_INFORMATION);
 820        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 821        return;
 822}
 823
 824static int
 825smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
 826                        struct cifs_sb_info *cifs_sb, const char *full_path)
 827{
 828        int rc;
 829        __le16 *utf16_path;
 830        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 831        struct cifs_open_parms oparms;
 832        struct cifs_fid fid;
 833
 834        if ((*full_path == 0) && tcon->crfid.is_valid)
 835                return 0;
 836
 837        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
 838        if (!utf16_path)
 839                return -ENOMEM;
 840
 841        oparms.tcon = tcon;
 842        oparms.desired_access = FILE_READ_ATTRIBUTES;
 843        oparms.disposition = FILE_OPEN;
 844        if (backup_cred(cifs_sb))
 845                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
 846        else
 847                oparms.create_options = 0;
 848        oparms.fid = &fid;
 849        oparms.reconnect = false;
 850
 851        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL, NULL);
 852        if (rc) {
 853                kfree(utf16_path);
 854                return rc;
 855        }
 856
 857        rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 858        kfree(utf16_path);
 859        return rc;
 860}
 861
 862static int
 863smb2_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon,
 864                  struct cifs_sb_info *cifs_sb, const char *full_path,
 865                  u64 *uniqueid, FILE_ALL_INFO *data)
 866{
 867        *uniqueid = le64_to_cpu(data->IndexNumber);
 868        return 0;
 869}
 870
 871static int
 872smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
 873                     struct cifs_fid *fid, FILE_ALL_INFO *data)
 874{
 875        int rc;
 876        struct smb2_file_all_info *smb2_data;
 877
 878        smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + PATH_MAX * 2,
 879                            GFP_KERNEL);
 880        if (smb2_data == NULL)
 881                return -ENOMEM;
 882
 883        rc = SMB2_query_info(xid, tcon, fid->persistent_fid, fid->volatile_fid,
 884                             smb2_data);
 885        if (!rc)
 886                move_smb2_info_to_cifs(data, smb2_data);
 887        kfree(smb2_data);
 888        return rc;
 889}
 890
 891#ifdef CONFIG_CIFS_XATTR
 892static ssize_t
 893move_smb2_ea_to_cifs(char *dst, size_t dst_size,
 894                     struct smb2_file_full_ea_info *src, size_t src_size,
 895                     const unsigned char *ea_name)
 896{
 897        int rc = 0;
 898        unsigned int ea_name_len = ea_name ? strlen(ea_name) : 0;
 899        char *name, *value;
 900        size_t buf_size = dst_size;
 901        size_t name_len, value_len, user_name_len;
 902
 903        while (src_size > 0) {
 904                name = &src->ea_data[0];
 905                name_len = (size_t)src->ea_name_length;
 906                value = &src->ea_data[src->ea_name_length + 1];
 907                value_len = (size_t)le16_to_cpu(src->ea_value_length);
 908
 909                if (name_len == 0) {
 910                        break;
 911                }
 912
 913                if (src_size < 8 + name_len + 1 + value_len) {
 914                        cifs_dbg(FYI, "EA entry goes beyond length of list\n");
 915                        rc = -EIO;
 916                        goto out;
 917                }
 918
 919                if (ea_name) {
 920                        if (ea_name_len == name_len &&
 921                            memcmp(ea_name, name, name_len) == 0) {
 922                                rc = value_len;
 923                                if (dst_size == 0)
 924                                        goto out;
 925                                if (dst_size < value_len) {
 926                                        rc = -ERANGE;
 927                                        goto out;
 928                                }
 929                                memcpy(dst, value, value_len);
 930                                goto out;
 931                        }
 932                } else {
 933                        /* 'user.' plus a terminating null */
 934                        user_name_len = 5 + 1 + name_len;
 935
 936                        if (buf_size == 0) {
 937                                /* skip copy - calc size only */
 938                                rc += user_name_len;
 939                        } else if (dst_size >= user_name_len) {
 940                                dst_size -= user_name_len;
 941                                memcpy(dst, "user.", 5);
 942                                dst += 5;
 943                                memcpy(dst, src->ea_data, name_len);
 944                                dst += name_len;
 945                                *dst = 0;
 946                                ++dst;
 947                                rc += user_name_len;
 948                        } else {
 949                                /* stop before overrun buffer */
 950                                rc = -ERANGE;
 951                                break;
 952                        }
 953                }
 954
 955                if (!src->next_entry_offset)
 956                        break;
 957
 958                if (src_size < le32_to_cpu(src->next_entry_offset)) {
 959                        /* stop before overrun buffer */
 960                        rc = -ERANGE;
 961                        break;
 962                }
 963                src_size -= le32_to_cpu(src->next_entry_offset);
 964                src = (void *)((char *)src +
 965                               le32_to_cpu(src->next_entry_offset));
 966        }
 967
 968        /* didn't find the named attribute */
 969        if (ea_name)
 970                rc = -ENODATA;
 971
 972out:
 973        return (ssize_t)rc;
 974}
 975
 976static ssize_t
 977smb2_query_eas(const unsigned int xid, struct cifs_tcon *tcon,
 978               const unsigned char *path, const unsigned char *ea_name,
 979               char *ea_data, size_t buf_size,
 980               struct cifs_sb_info *cifs_sb)
 981{
 982        int rc;
 983        __le16 *utf16_path;
 984        struct kvec rsp_iov = {NULL, 0};
 985        int buftype = CIFS_NO_BUFFER;
 986        struct smb2_query_info_rsp *rsp;
 987        struct smb2_file_full_ea_info *info = NULL;
 988
 989        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
 990        if (!utf16_path)
 991                return -ENOMEM;
 992
 993        rc = smb2_query_info_compound(xid, tcon, utf16_path,
 994                                      FILE_READ_EA,
 995                                      FILE_FULL_EA_INFORMATION,
 996                                      SMB2_O_INFO_FILE,
 997                                      CIFSMaxBufSize -
 998                                      MAX_SMB2_CREATE_RESPONSE_SIZE -
 999                                      MAX_SMB2_CLOSE_RESPONSE_SIZE,
1000                                      &rsp_iov, &buftype, cifs_sb);
1001        if (rc) {
1002                /*
1003                 * If ea_name is NULL (listxattr) and there are no EAs,
1004                 * return 0 as it's not an error. Otherwise, the specified
1005                 * ea_name was not found.
1006                 */
1007                if (!ea_name && rc == -ENODATA)
1008                        rc = 0;
1009                goto qeas_exit;
1010        }
1011
1012        rsp = (struct smb2_query_info_rsp *)rsp_iov.iov_base;
1013        rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset),
1014                               le32_to_cpu(rsp->OutputBufferLength),
1015                               &rsp_iov,
1016                               sizeof(struct smb2_file_full_ea_info));
1017        if (rc)
1018                goto qeas_exit;
1019
1020        info = (struct smb2_file_full_ea_info *)(
1021                        le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp);
1022        rc = move_smb2_ea_to_cifs(ea_data, buf_size, info,
1023                        le32_to_cpu(rsp->OutputBufferLength), ea_name);
1024
1025 qeas_exit:
1026        kfree(utf16_path);
1027        free_rsp_buf(buftype, rsp_iov.iov_base);
1028        return rc;
1029}
1030
1031
1032static int
1033smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
1034            const char *path, const char *ea_name, const void *ea_value,
1035            const __u16 ea_value_len, const struct nls_table *nls_codepage,
1036            struct cifs_sb_info *cifs_sb)
1037{
1038        struct cifs_ses *ses = tcon->ses;
1039        __le16 *utf16_path = NULL;
1040        int ea_name_len = strlen(ea_name);
1041        int flags = 0;
1042        int len;
1043        struct smb_rqst rqst[3];
1044        int resp_buftype[3];
1045        struct kvec rsp_iov[3];
1046        struct kvec open_iov[SMB2_CREATE_IOV_SIZE];
1047        struct cifs_open_parms oparms;
1048        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1049        struct cifs_fid fid;
1050        struct kvec si_iov[SMB2_SET_INFO_IOV_SIZE];
1051        unsigned int size[1];
1052        void *data[1];
1053        struct smb2_file_full_ea_info *ea = NULL;
1054        struct kvec close_iov[1];
1055        int rc;
1056
1057        if (smb3_encryption_required(tcon))
1058                flags |= CIFS_TRANSFORM_REQ;
1059
1060        if (ea_name_len > 255)
1061                return -EINVAL;
1062
1063        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
1064        if (!utf16_path)
1065                return -ENOMEM;
1066
1067        memset(rqst, 0, sizeof(rqst));
1068        resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
1069        memset(rsp_iov, 0, sizeof(rsp_iov));
1070
1071        if (ses->server->ops->query_all_EAs) {
1072                if (!ea_value) {
1073                        rc = ses->server->ops->query_all_EAs(xid, tcon, path,
1074                                                             ea_name, NULL, 0,
1075                                                             cifs_sb);
1076                        if (rc == -ENODATA)
1077                                goto sea_exit;
1078                }
1079        }
1080
1081        /* Open */
1082        memset(&open_iov, 0, sizeof(open_iov));
1083        rqst[0].rq_iov = open_iov;
1084        rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
1085
1086        memset(&oparms, 0, sizeof(oparms));
1087        oparms.tcon = tcon;
1088        oparms.desired_access = FILE_WRITE_EA;
1089        oparms.disposition = FILE_OPEN;
1090        if (backup_cred(cifs_sb))
1091                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
1092        else
1093                oparms.create_options = 0;
1094        oparms.fid = &fid;
1095        oparms.reconnect = false;
1096
1097        rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, utf16_path);
1098        if (rc)
1099                goto sea_exit;
1100        smb2_set_next_command(tcon, &rqst[0]);
1101
1102
1103        /* Set Info */
1104        memset(&si_iov, 0, sizeof(si_iov));
1105        rqst[1].rq_iov = si_iov;
1106        rqst[1].rq_nvec = 1;
1107
1108        len = sizeof(ea) + ea_name_len + ea_value_len + 1;
1109        ea = kzalloc(len, GFP_KERNEL);
1110        if (ea == NULL) {
1111                rc = -ENOMEM;
1112                goto sea_exit;
1113        }
1114
1115        ea->ea_name_length = ea_name_len;
1116        ea->ea_value_length = cpu_to_le16(ea_value_len);
1117        memcpy(ea->ea_data, ea_name, ea_name_len + 1);
1118        memcpy(ea->ea_data + ea_name_len + 1, ea_value, ea_value_len);
1119
1120        size[0] = len;
1121        data[0] = ea;
1122
1123        rc = SMB2_set_info_init(tcon, &rqst[1], COMPOUND_FID,
1124                                COMPOUND_FID, current->tgid,
1125                                FILE_FULL_EA_INFORMATION,
1126                                SMB2_O_INFO_FILE, 0, data, size);
1127        smb2_set_next_command(tcon, &rqst[1]);
1128        smb2_set_related(&rqst[1]);
1129
1130
1131        /* Close */
1132        memset(&close_iov, 0, sizeof(close_iov));
1133        rqst[2].rq_iov = close_iov;
1134        rqst[2].rq_nvec = 1;
1135        rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID);
1136        smb2_set_related(&rqst[2]);
1137
1138        rc = compound_send_recv(xid, ses, flags, 3, rqst,
1139                                resp_buftype, rsp_iov);
1140
1141 sea_exit:
1142        kfree(ea);
1143        kfree(utf16_path);
1144        SMB2_open_free(&rqst[0]);
1145        SMB2_set_info_free(&rqst[1]);
1146        SMB2_close_free(&rqst[2]);
1147        free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
1148        free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base);
1149        free_rsp_buf(resp_buftype[2], rsp_iov[2].iov_base);
1150        return rc;
1151}
1152#endif
1153
1154static bool
1155smb2_can_echo(struct TCP_Server_Info *server)
1156{
1157        return server->echoes;
1158}
1159
1160static void
1161smb2_clear_stats(struct cifs_tcon *tcon)
1162{
1163        int i;
1164        for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) {
1165                atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0);
1166                atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0);
1167        }
1168}
1169
1170static void
1171smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon)
1172{
1173        seq_puts(m, "\n\tShare Capabilities:");
1174        if (tcon->capabilities & SMB2_SHARE_CAP_DFS)
1175                seq_puts(m, " DFS,");
1176        if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
1177                seq_puts(m, " CONTINUOUS AVAILABILITY,");
1178        if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT)
1179                seq_puts(m, " SCALEOUT,");
1180        if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER)
1181                seq_puts(m, " CLUSTER,");
1182        if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC)
1183                seq_puts(m, " ASYMMETRIC,");
1184        if (tcon->capabilities == 0)
1185                seq_puts(m, " None");
1186        if (tcon->ss_flags & SSINFO_FLAGS_ALIGNED_DEVICE)
1187                seq_puts(m, " Aligned,");
1188        if (tcon->ss_flags & SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE)
1189                seq_puts(m, " Partition Aligned,");
1190        if (tcon->ss_flags & SSINFO_FLAGS_NO_SEEK_PENALTY)
1191                seq_puts(m, " SSD,");
1192        if (tcon->ss_flags & SSINFO_FLAGS_TRIM_ENABLED)
1193                seq_puts(m, " TRIM-support,");
1194
1195        seq_printf(m, "\tShare Flags: 0x%x", tcon->share_flags);
1196        seq_printf(m, "\n\ttid: 0x%x", tcon->tid);
1197        if (tcon->perf_sector_size)
1198                seq_printf(m, "\tOptimal sector size: 0x%x",
1199                           tcon->perf_sector_size);
1200        seq_printf(m, "\tMaximal Access: 0x%x", tcon->maximal_access);
1201}
1202
1203static void
1204smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
1205{
1206        atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent;
1207        atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed;
1208
1209        /*
1210         *  Can't display SMB2_NEGOTIATE, SESSION_SETUP, LOGOFF, CANCEL and ECHO
1211         *  totals (requests sent) since those SMBs are per-session not per tcon
1212         */
1213        seq_printf(m, "\nBytes read: %llu  Bytes written: %llu",
1214                   (long long)(tcon->bytes_read),
1215                   (long long)(tcon->bytes_written));
1216        seq_printf(m, "\nOpen files: %d total (local), %d open on server",
1217                   atomic_read(&tcon->num_local_opens),
1218                   atomic_read(&tcon->num_remote_opens));
1219        seq_printf(m, "\nTreeConnects: %d total %d failed",
1220                   atomic_read(&sent[SMB2_TREE_CONNECT_HE]),
1221                   atomic_read(&failed[SMB2_TREE_CONNECT_HE]));
1222        seq_printf(m, "\nTreeDisconnects: %d total %d failed",
1223                   atomic_read(&sent[SMB2_TREE_DISCONNECT_HE]),
1224                   atomic_read(&failed[SMB2_TREE_DISCONNECT_HE]));
1225        seq_printf(m, "\nCreates: %d total %d failed",
1226                   atomic_read(&sent[SMB2_CREATE_HE]),
1227                   atomic_read(&failed[SMB2_CREATE_HE]));
1228        seq_printf(m, "\nCloses: %d total %d failed",
1229                   atomic_read(&sent[SMB2_CLOSE_HE]),
1230                   atomic_read(&failed[SMB2_CLOSE_HE]));
1231        seq_printf(m, "\nFlushes: %d total %d failed",
1232                   atomic_read(&sent[SMB2_FLUSH_HE]),
1233                   atomic_read(&failed[SMB2_FLUSH_HE]));
1234        seq_printf(m, "\nReads: %d total %d failed",
1235                   atomic_read(&sent[SMB2_READ_HE]),
1236                   atomic_read(&failed[SMB2_READ_HE]));
1237        seq_printf(m, "\nWrites: %d total %d failed",
1238                   atomic_read(&sent[SMB2_WRITE_HE]),
1239                   atomic_read(&failed[SMB2_WRITE_HE]));
1240        seq_printf(m, "\nLocks: %d total %d failed",
1241                   atomic_read(&sent[SMB2_LOCK_HE]),
1242                   atomic_read(&failed[SMB2_LOCK_HE]));
1243        seq_printf(m, "\nIOCTLs: %d total %d failed",
1244                   atomic_read(&sent[SMB2_IOCTL_HE]),
1245                   atomic_read(&failed[SMB2_IOCTL_HE]));
1246        seq_printf(m, "\nQueryDirectories: %d total %d failed",
1247                   atomic_read(&sent[SMB2_QUERY_DIRECTORY_HE]),
1248                   atomic_read(&failed[SMB2_QUERY_DIRECTORY_HE]));
1249        seq_printf(m, "\nChangeNotifies: %d total %d failed",
1250                   atomic_read(&sent[SMB2_CHANGE_NOTIFY_HE]),
1251                   atomic_read(&failed[SMB2_CHANGE_NOTIFY_HE]));
1252        seq_printf(m, "\nQueryInfos: %d total %d failed",
1253                   atomic_read(&sent[SMB2_QUERY_INFO_HE]),
1254                   atomic_read(&failed[SMB2_QUERY_INFO_HE]));
1255        seq_printf(m, "\nSetInfos: %d total %d failed",
1256                   atomic_read(&sent[SMB2_SET_INFO_HE]),
1257                   atomic_read(&failed[SMB2_SET_INFO_HE]));
1258        seq_printf(m, "\nOplockBreaks: %d sent %d failed",
1259                   atomic_read(&sent[SMB2_OPLOCK_BREAK_HE]),
1260                   atomic_read(&failed[SMB2_OPLOCK_BREAK_HE]));
1261}
1262
1263static void
1264smb2_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock)
1265{
1266        struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
1267        struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
1268
1269        cfile->fid.persistent_fid = fid->persistent_fid;
1270        cfile->fid.volatile_fid = fid->volatile_fid;
1271#ifdef CONFIG_CIFS_DEBUG2
1272        cfile->fid.mid = fid->mid;
1273#endif /* CIFS_DEBUG2 */
1274        server->ops->set_oplock_level(cinode, oplock, fid->epoch,
1275                                      &fid->purge_cache);
1276        cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode);
1277        memcpy(cfile->fid.create_guid, fid->create_guid, 16);
1278}
1279
1280static void
1281smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon,
1282                struct cifs_fid *fid)
1283{
1284        SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
1285}
1286
1287static int
1288SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon,
1289                     u64 persistent_fid, u64 volatile_fid,
1290                     struct copychunk_ioctl *pcchunk)
1291{
1292        int rc;
1293        unsigned int ret_data_len;
1294        struct resume_key_req *res_key;
1295
1296        rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid,
1297                        FSCTL_SRV_REQUEST_RESUME_KEY, true /* is_fsctl */,
1298                        NULL, 0 /* no input */, CIFSMaxBufSize,
1299                        (char **)&res_key, &ret_data_len);
1300
1301        if (rc) {
1302                cifs_dbg(VFS, "refcpy ioctl error %d getting resume key\n", rc);
1303                goto req_res_key_exit;
1304        }
1305        if (ret_data_len < sizeof(struct resume_key_req)) {
1306                cifs_dbg(VFS, "Invalid refcopy resume key length\n");
1307                rc = -EINVAL;
1308                goto req_res_key_exit;
1309        }
1310        memcpy(pcchunk->SourceKey, res_key->ResumeKey, COPY_CHUNK_RES_KEY_SIZE);
1311
1312req_res_key_exit:
1313        kfree(res_key);
1314        return rc;
1315}
1316
1317static int
1318smb2_ioctl_query_info(const unsigned int xid,
1319                      struct cifs_tcon *tcon,
1320                      __le16 *path, int is_dir,
1321                      unsigned long p)
1322{
1323        struct cifs_ses *ses = tcon->ses;
1324        char __user *arg = (char __user *)p;
1325        struct smb_query_info qi;
1326        struct smb_query_info __user *pqi;
1327        int rc = 0;
1328        int flags = 0;
1329        struct smb2_query_info_rsp *qi_rsp = NULL;
1330        struct smb2_ioctl_rsp *io_rsp = NULL;
1331        void *buffer = NULL;
1332        struct smb_rqst rqst[3];
1333        int resp_buftype[3];
1334        struct kvec rsp_iov[3];
1335        struct kvec open_iov[SMB2_CREATE_IOV_SIZE];
1336        struct cifs_open_parms oparms;
1337        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1338        struct cifs_fid fid;
1339        struct kvec qi_iov[1];
1340        struct kvec io_iov[SMB2_IOCTL_IOV_SIZE];
1341        struct kvec close_iov[1];
1342
1343        memset(rqst, 0, sizeof(rqst));
1344        resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
1345        memset(rsp_iov, 0, sizeof(rsp_iov));
1346
1347        if (copy_from_user(&qi, arg, sizeof(struct smb_query_info)))
1348                return -EFAULT;
1349
1350        if (qi.output_buffer_length > 1024)
1351                return -EINVAL;
1352
1353        if (!ses || !(ses->server))
1354                return -EIO;
1355
1356        if (smb3_encryption_required(tcon))
1357                flags |= CIFS_TRANSFORM_REQ;
1358
1359        buffer = kmalloc(qi.output_buffer_length, GFP_KERNEL);
1360        if (buffer == NULL)
1361                return -ENOMEM;
1362
1363        if (copy_from_user(buffer, arg + sizeof(struct smb_query_info),
1364                           qi.output_buffer_length)) {
1365                rc = -EFAULT;
1366                goto iqinf_exit;
1367        }
1368
1369        /* Open */
1370        memset(&open_iov, 0, sizeof(open_iov));
1371        rqst[0].rq_iov = open_iov;
1372        rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
1373
1374        memset(&oparms, 0, sizeof(oparms));
1375        oparms.tcon = tcon;
1376        oparms.desired_access = FILE_READ_ATTRIBUTES | READ_CONTROL;
1377        oparms.disposition = FILE_OPEN;
1378        if (is_dir)
1379                oparms.create_options = CREATE_NOT_FILE;
1380        else
1381                oparms.create_options = CREATE_NOT_DIR;
1382        oparms.fid = &fid;
1383        oparms.reconnect = false;
1384
1385        rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, path);
1386        if (rc)
1387                goto iqinf_exit;
1388        smb2_set_next_command(tcon, &rqst[0]);
1389
1390        /* Query */
1391        if (qi.flags & PASSTHRU_FSCTL) {
1392                /* Can eventually relax perm check since server enforces too */
1393                if (!capable(CAP_SYS_ADMIN))
1394                        rc = -EPERM;
1395                else  {
1396                        memset(&io_iov, 0, sizeof(io_iov));
1397                        rqst[1].rq_iov = io_iov;
1398                        rqst[1].rq_nvec = SMB2_IOCTL_IOV_SIZE;
1399
1400                        rc = SMB2_ioctl_init(tcon, &rqst[1],
1401                                             COMPOUND_FID, COMPOUND_FID,
1402                                             qi.info_type, true, NULL,
1403                                             0, CIFSMaxBufSize);
1404                }
1405        } else if (qi.flags == PASSTHRU_QUERY_INFO) {
1406                memset(&qi_iov, 0, sizeof(qi_iov));
1407                rqst[1].rq_iov = qi_iov;
1408                rqst[1].rq_nvec = 1;
1409
1410                rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID,
1411                                  COMPOUND_FID, qi.file_info_class,
1412                                  qi.info_type, qi.additional_information,
1413                                  qi.input_buffer_length,
1414                                  qi.output_buffer_length, buffer);
1415        } else { /* unknown flags */
1416                cifs_dbg(VFS, "invalid passthru query flags: 0x%x\n", qi.flags);
1417                rc = -EINVAL;
1418        }
1419
1420        if (rc)
1421                goto iqinf_exit;
1422        smb2_set_next_command(tcon, &rqst[1]);
1423        smb2_set_related(&rqst[1]);
1424
1425        /* Close */
1426        memset(&close_iov, 0, sizeof(close_iov));
1427        rqst[2].rq_iov = close_iov;
1428        rqst[2].rq_nvec = 1;
1429
1430        rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID);
1431        if (rc)
1432                goto iqinf_exit;
1433        smb2_set_related(&rqst[2]);
1434
1435        rc = compound_send_recv(xid, ses, flags, 3, rqst,
1436                                resp_buftype, rsp_iov);
1437        if (rc)
1438                goto iqinf_exit;
1439        if (qi.flags & PASSTHRU_FSCTL) {
1440                pqi = (struct smb_query_info __user *)arg;
1441                io_rsp = (struct smb2_ioctl_rsp *)rsp_iov[1].iov_base;
1442                if (le32_to_cpu(io_rsp->OutputCount) < qi.input_buffer_length)
1443                        qi.input_buffer_length = le32_to_cpu(io_rsp->OutputCount);
1444                if (copy_to_user(&pqi->input_buffer_length, &qi.input_buffer_length,
1445                                 sizeof(qi.input_buffer_length))) {
1446                        rc = -EFAULT;
1447                        goto iqinf_exit;
1448                }
1449                if (copy_to_user(pqi + 1, &io_rsp[1], qi.input_buffer_length)) {
1450                        rc = -EFAULT;
1451                        goto iqinf_exit;
1452                }
1453        } else {
1454                pqi = (struct smb_query_info __user *)arg;
1455                qi_rsp = (struct smb2_query_info_rsp *)rsp_iov[1].iov_base;
1456                if (le32_to_cpu(qi_rsp->OutputBufferLength) < qi.input_buffer_length)
1457                        qi.input_buffer_length = le32_to_cpu(qi_rsp->OutputBufferLength);
1458                if (copy_to_user(&pqi->input_buffer_length, &qi.input_buffer_length,
1459                                 sizeof(qi.input_buffer_length))) {
1460                        rc = -EFAULT;
1461                        goto iqinf_exit;
1462                }
1463                if (copy_to_user(pqi + 1, qi_rsp->Buffer, qi.input_buffer_length)) {
1464                        rc = -EFAULT;
1465                        goto iqinf_exit;
1466                }
1467        }
1468
1469 iqinf_exit:
1470        kfree(buffer);
1471        SMB2_open_free(&rqst[0]);
1472        if (qi.flags & PASSTHRU_FSCTL)
1473                SMB2_ioctl_free(&rqst[1]);
1474        else
1475                SMB2_query_info_free(&rqst[1]);
1476
1477        SMB2_close_free(&rqst[2]);
1478        free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
1479        free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base);
1480        free_rsp_buf(resp_buftype[2], rsp_iov[2].iov_base);
1481        return rc;
1482}
1483
1484static ssize_t
1485smb2_copychunk_range(const unsigned int xid,
1486                        struct cifsFileInfo *srcfile,
1487                        struct cifsFileInfo *trgtfile, u64 src_off,
1488                        u64 len, u64 dest_off)
1489{
1490        int rc;
1491        unsigned int ret_data_len;
1492        struct copychunk_ioctl *pcchunk;
1493        struct copychunk_ioctl_rsp *retbuf = NULL;
1494        struct cifs_tcon *tcon;
1495        int chunks_copied = 0;
1496        bool chunk_sizes_updated = false;
1497        ssize_t bytes_written, total_bytes_written = 0;
1498
1499        pcchunk = kmalloc(sizeof(struct copychunk_ioctl), GFP_KERNEL);
1500
1501        if (pcchunk == NULL)
1502                return -ENOMEM;
1503
1504        cifs_dbg(FYI, "in smb2_copychunk_range - about to call request res key\n");
1505        /* Request a key from the server to identify the source of the copy */
1506        rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink),
1507                                srcfile->fid.persistent_fid,
1508                                srcfile->fid.volatile_fid, pcchunk);
1509
1510        /* Note: request_res_key sets res_key null only if rc !=0 */
1511        if (rc)
1512                goto cchunk_out;
1513
1514        /* For now array only one chunk long, will make more flexible later */
1515        pcchunk->ChunkCount = cpu_to_le32(1);
1516        pcchunk->Reserved = 0;
1517        pcchunk->Reserved2 = 0;
1518
1519        tcon = tlink_tcon(trgtfile->tlink);
1520
1521        while (len > 0) {
1522                pcchunk->SourceOffset = cpu_to_le64(src_off);
1523                pcchunk->TargetOffset = cpu_to_le64(dest_off);
1524                pcchunk->Length =
1525                        cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
1526
1527                /* Request server copy to target from src identified by key */
1528                rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
1529                        trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE,
1530                        true /* is_fsctl */, (char *)pcchunk,
1531                        sizeof(struct copychunk_ioctl), CIFSMaxBufSize,
1532                        (char **)&retbuf, &ret_data_len);
1533                if (rc == 0) {
1534                        if (ret_data_len !=
1535                                        sizeof(struct copychunk_ioctl_rsp)) {
1536                                cifs_dbg(VFS, "invalid cchunk response size\n");
1537                                rc = -EIO;
1538                                goto cchunk_out;
1539                        }
1540                        if (retbuf->TotalBytesWritten == 0) {
1541                                cifs_dbg(FYI, "no bytes copied\n");
1542                                rc = -EIO;
1543                                goto cchunk_out;
1544                        }
1545                        /*
1546                         * Check if server claimed to write more than we asked
1547                         */
1548                        if (le32_to_cpu(retbuf->TotalBytesWritten) >
1549                            le32_to_cpu(pcchunk->Length)) {
1550                                cifs_dbg(VFS, "invalid copy chunk response\n");
1551                                rc = -EIO;
1552                                goto cchunk_out;
1553                        }
1554                        if (le32_to_cpu(retbuf->ChunksWritten) != 1) {
1555                                cifs_dbg(VFS, "invalid num chunks written\n");
1556                                rc = -EIO;
1557                                goto cchunk_out;
1558                        }
1559                        chunks_copied++;
1560
1561                        bytes_written = le32_to_cpu(retbuf->TotalBytesWritten);
1562                        src_off += bytes_written;
1563                        dest_off += bytes_written;
1564                        len -= bytes_written;
1565                        total_bytes_written += bytes_written;
1566
1567                        cifs_dbg(FYI, "Chunks %d PartialChunk %d Total %zu\n",
1568                                le32_to_cpu(retbuf->ChunksWritten),
1569                                le32_to_cpu(retbuf->ChunkBytesWritten),
1570                                bytes_written);
1571                } else if (rc == -EINVAL) {
1572                        if (ret_data_len != sizeof(struct copychunk_ioctl_rsp))
1573                                goto cchunk_out;
1574
1575                        cifs_dbg(FYI, "MaxChunks %d BytesChunk %d MaxCopy %d\n",
1576                                le32_to_cpu(retbuf->ChunksWritten),
1577                                le32_to_cpu(retbuf->ChunkBytesWritten),
1578                                le32_to_cpu(retbuf->TotalBytesWritten));
1579
1580                        /*
1581                         * Check if this is the first request using these sizes,
1582                         * (ie check if copy succeed once with original sizes
1583                         * and check if the server gave us different sizes after
1584                         * we already updated max sizes on previous request).
1585                         * if not then why is the server returning an error now
1586                         */
1587                        if ((chunks_copied != 0) || chunk_sizes_updated)
1588                                goto cchunk_out;
1589
1590                        /* Check that server is not asking us to grow size */
1591                        if (le32_to_cpu(retbuf->ChunkBytesWritten) <
1592                                        tcon->max_bytes_chunk)
1593                                tcon->max_bytes_chunk =
1594                                        le32_to_cpu(retbuf->ChunkBytesWritten);
1595                        else
1596                                goto cchunk_out; /* server gave us bogus size */
1597
1598                        /* No need to change MaxChunks since already set to 1 */
1599                        chunk_sizes_updated = true;
1600                } else
1601                        goto cchunk_out;
1602        }
1603
1604cchunk_out:
1605        kfree(pcchunk);
1606        kfree(retbuf);
1607        if (rc)
1608                return rc;
1609        else
1610                return total_bytes_written;
1611}
1612
1613static int
1614smb2_flush_file(const unsigned int xid, struct cifs_tcon *tcon,
1615                struct cifs_fid *fid)
1616{
1617        return SMB2_flush(xid, tcon, fid->persistent_fid, fid->volatile_fid);
1618}
1619
1620static unsigned int
1621smb2_read_data_offset(char *buf)
1622{
1623        struct smb2_read_rsp *rsp = (struct smb2_read_rsp *)buf;
1624        return rsp->DataOffset;
1625}
1626
1627static unsigned int
1628smb2_read_data_length(char *buf, bool in_remaining)
1629{
1630        struct smb2_read_rsp *rsp = (struct smb2_read_rsp *)buf;
1631
1632        if (in_remaining)
1633                return le32_to_cpu(rsp->DataRemaining);
1634
1635        return le32_to_cpu(rsp->DataLength);
1636}
1637
1638
1639static int
1640smb2_sync_read(const unsigned int xid, struct cifs_fid *pfid,
1641               struct cifs_io_parms *parms, unsigned int *bytes_read,
1642               char **buf, int *buf_type)
1643{
1644        parms->persistent_fid = pfid->persistent_fid;
1645        parms->volatile_fid = pfid->volatile_fid;
1646        return SMB2_read(xid, parms, bytes_read, buf, buf_type);
1647}
1648
1649static int
1650smb2_sync_write(const unsigned int xid, struct cifs_fid *pfid,
1651                struct cifs_io_parms *parms, unsigned int *written,
1652                struct kvec *iov, unsigned long nr_segs)
1653{
1654
1655        parms->persistent_fid = pfid->persistent_fid;
1656        parms->volatile_fid = pfid->volatile_fid;
1657        return SMB2_write(xid, parms, written, iov, nr_segs);
1658}
1659
1660/* Set or clear the SPARSE_FILE attribute based on value passed in setsparse */
1661static bool smb2_set_sparse(const unsigned int xid, struct cifs_tcon *tcon,
1662                struct cifsFileInfo *cfile, struct inode *inode, __u8 setsparse)
1663{
1664        struct cifsInodeInfo *cifsi;
1665        int rc;
1666
1667        cifsi = CIFS_I(inode);
1668
1669        /* if file already sparse don't bother setting sparse again */
1670        if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && setsparse)
1671                return true; /* already sparse */
1672
1673        if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && !setsparse)
1674                return true; /* already not sparse */
1675
1676        /*
1677         * Can't check for sparse support on share the usual way via the
1678         * FS attribute info (FILE_SUPPORTS_SPARSE_FILES) on the share
1679         * since Samba server doesn't set the flag on the share, yet
1680         * supports the set sparse FSCTL and returns sparse correctly
1681         * in the file attributes. If we fail setting sparse though we
1682         * mark that server does not support sparse files for this share
1683         * to avoid repeatedly sending the unsupported fsctl to server
1684         * if the file is repeatedly extended.
1685         */
1686        if (tcon->broken_sparse_sup)
1687                return false;
1688
1689        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1690                        cfile->fid.volatile_fid, FSCTL_SET_SPARSE,
1691                        true /* is_fctl */,
1692                        &setsparse, 1, CIFSMaxBufSize, NULL, NULL);
1693        if (rc) {
1694                tcon->broken_sparse_sup = true;
1695                cifs_dbg(FYI, "set sparse rc = %d\n", rc);
1696                return false;
1697        }
1698
1699        if (setsparse)
1700                cifsi->cifsAttrs |= FILE_ATTRIBUTE_SPARSE_FILE;
1701        else
1702                cifsi->cifsAttrs &= (~FILE_ATTRIBUTE_SPARSE_FILE);
1703
1704        return true;
1705}
1706
1707static int
1708smb2_set_file_size(const unsigned int xid, struct cifs_tcon *tcon,
1709                   struct cifsFileInfo *cfile, __u64 size, bool set_alloc)
1710{
1711        __le64 eof = cpu_to_le64(size);
1712        struct inode *inode;
1713
1714        /*
1715         * If extending file more than one page make sparse. Many Linux fs
1716         * make files sparse by default when extending via ftruncate
1717         */
1718        inode = d_inode(cfile->dentry);
1719
1720        if (!set_alloc && (size > inode->i_size + 8192)) {
1721                __u8 set_sparse = 1;
1722
1723                /* whether set sparse succeeds or not, extend the file */
1724                smb2_set_sparse(xid, tcon, cfile, inode, set_sparse);
1725        }
1726
1727        return SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
1728                            cfile->fid.volatile_fid, cfile->pid, &eof);
1729}
1730
1731static int
1732smb2_duplicate_extents(const unsigned int xid,
1733                        struct cifsFileInfo *srcfile,
1734                        struct cifsFileInfo *trgtfile, u64 src_off,
1735                        u64 len, u64 dest_off)
1736{
1737        int rc;
1738        unsigned int ret_data_len;
1739        struct duplicate_extents_to_file dup_ext_buf;
1740        struct cifs_tcon *tcon = tlink_tcon(trgtfile->tlink);
1741
1742        /* server fileays advertise duplicate extent support with this flag */
1743        if ((le32_to_cpu(tcon->fsAttrInfo.Attributes) &
1744             FILE_SUPPORTS_BLOCK_REFCOUNTING) == 0)
1745                return -EOPNOTSUPP;
1746
1747        dup_ext_buf.VolatileFileHandle = srcfile->fid.volatile_fid;
1748        dup_ext_buf.PersistentFileHandle = srcfile->fid.persistent_fid;
1749        dup_ext_buf.SourceFileOffset = cpu_to_le64(src_off);
1750        dup_ext_buf.TargetFileOffset = cpu_to_le64(dest_off);
1751        dup_ext_buf.ByteCount = cpu_to_le64(len);
1752        cifs_dbg(FYI, "duplicate extents: src off %lld dst off %lld len %lld",
1753                src_off, dest_off, len);
1754
1755        rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false);
1756        if (rc)
1757                goto duplicate_extents_out;
1758
1759        rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
1760                        trgtfile->fid.volatile_fid,
1761                        FSCTL_DUPLICATE_EXTENTS_TO_FILE,
1762                        true /* is_fsctl */,
1763                        (char *)&dup_ext_buf,
1764                        sizeof(struct duplicate_extents_to_file),
1765                        CIFSMaxBufSize, NULL,
1766                        &ret_data_len);
1767
1768        if (ret_data_len > 0)
1769                cifs_dbg(FYI, "non-zero response length in duplicate extents");
1770
1771duplicate_extents_out:
1772        return rc;
1773}
1774
1775static int
1776smb2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
1777                   struct cifsFileInfo *cfile)
1778{
1779        return SMB2_set_compression(xid, tcon, cfile->fid.persistent_fid,
1780                            cfile->fid.volatile_fid);
1781}
1782
1783static int
1784smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon,
1785                   struct cifsFileInfo *cfile)
1786{
1787        struct fsctl_set_integrity_information_req integr_info;
1788        unsigned int ret_data_len;
1789
1790        integr_info.ChecksumAlgorithm = cpu_to_le16(CHECKSUM_TYPE_UNCHANGED);
1791        integr_info.Flags = 0;
1792        integr_info.Reserved = 0;
1793
1794        return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1795                        cfile->fid.volatile_fid,
1796                        FSCTL_SET_INTEGRITY_INFORMATION,
1797                        true /* is_fsctl */,
1798                        (char *)&integr_info,
1799                        sizeof(struct fsctl_set_integrity_information_req),
1800                        CIFSMaxBufSize, NULL,
1801                        &ret_data_len);
1802
1803}
1804
1805/* GMT Token is @GMT-YYYY.MM.DD-HH.MM.SS Unicode which is 48 bytes + null */
1806#define GMT_TOKEN_SIZE 50
1807
1808#define MIN_SNAPSHOT_ARRAY_SIZE 16 /* See MS-SMB2 section 3.3.5.15.1 */
1809
1810/*
1811 * Input buffer contains (empty) struct smb_snapshot array with size filled in
1812 * For output see struct SRV_SNAPSHOT_ARRAY in MS-SMB2 section 2.2.32.2
1813 */
1814static int
1815smb3_enum_snapshots(const unsigned int xid, struct cifs_tcon *tcon,
1816                   struct cifsFileInfo *cfile, void __user *ioc_buf)
1817{
1818        char *retbuf = NULL;
1819        unsigned int ret_data_len = 0;
1820        int rc;
1821        u32 max_response_size;
1822        struct smb_snapshot_array snapshot_in;
1823
1824        if (get_user(ret_data_len, (unsigned int __user *)ioc_buf))
1825                return -EFAULT;
1826
1827        /*
1828         * Note that for snapshot queries that servers like Azure expect that
1829         * the first query be minimal size (and just used to get the number/size
1830         * of previous versions) so response size must be specified as EXACTLY
1831         * sizeof(struct snapshot_array) which is 16 when rounded up to multiple
1832         * of eight bytes.
1833         */
1834        if (ret_data_len == 0)
1835                max_response_size = MIN_SNAPSHOT_ARRAY_SIZE;
1836        else
1837                max_response_size = CIFSMaxBufSize;
1838
1839        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1840                        cfile->fid.volatile_fid,
1841                        FSCTL_SRV_ENUMERATE_SNAPSHOTS,
1842                        true /* is_fsctl */,
1843                        NULL, 0 /* no input data */, max_response_size,
1844                        (char **)&retbuf,
1845                        &ret_data_len);
1846        cifs_dbg(FYI, "enum snaphots ioctl returned %d and ret buflen is %d\n",
1847                        rc, ret_data_len);
1848        if (rc)
1849                return rc;
1850
1851        if (ret_data_len && (ioc_buf != NULL) && (retbuf != NULL)) {
1852                /* Fixup buffer */
1853                if (copy_from_user(&snapshot_in, ioc_buf,
1854                    sizeof(struct smb_snapshot_array))) {
1855                        rc = -EFAULT;
1856                        kfree(retbuf);
1857                        return rc;
1858                }
1859
1860                /*
1861                 * Check for min size, ie not large enough to fit even one GMT
1862                 * token (snapshot).  On the first ioctl some users may pass in
1863                 * smaller size (or zero) to simply get the size of the array
1864                 * so the user space caller can allocate sufficient memory
1865                 * and retry the ioctl again with larger array size sufficient
1866                 * to hold all of the snapshot GMT tokens on the second try.
1867                 */
1868                if (snapshot_in.snapshot_array_size < GMT_TOKEN_SIZE)
1869                        ret_data_len = sizeof(struct smb_snapshot_array);
1870
1871                /*
1872                 * We return struct SRV_SNAPSHOT_ARRAY, followed by
1873                 * the snapshot array (of 50 byte GMT tokens) each
1874                 * representing an available previous version of the data
1875                 */
1876                if (ret_data_len > (snapshot_in.snapshot_array_size +
1877                                        sizeof(struct smb_snapshot_array)))
1878                        ret_data_len = snapshot_in.snapshot_array_size +
1879                                        sizeof(struct smb_snapshot_array);
1880
1881                if (copy_to_user(ioc_buf, retbuf, ret_data_len))
1882                        rc = -EFAULT;
1883        }
1884
1885        kfree(retbuf);
1886        return rc;
1887}
1888
1889static int
1890smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
1891                     const char *path, struct cifs_sb_info *cifs_sb,
1892                     struct cifs_fid *fid, __u16 search_flags,
1893                     struct cifs_search_info *srch_inf)
1894{
1895        __le16 *utf16_path;
1896        int rc;
1897        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1898        struct cifs_open_parms oparms;
1899
1900        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
1901        if (!utf16_path)
1902                return -ENOMEM;
1903
1904        oparms.tcon = tcon;
1905        oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
1906        oparms.disposition = FILE_OPEN;
1907        if (backup_cred(cifs_sb))
1908                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
1909        else
1910                oparms.create_options = 0;
1911        oparms.fid = fid;
1912        oparms.reconnect = false;
1913
1914        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL, NULL);
1915        kfree(utf16_path);
1916        if (rc) {
1917                cifs_dbg(FYI, "open dir failed rc=%d\n", rc);
1918                return rc;
1919        }
1920
1921        srch_inf->entries_in_buffer = 0;
1922        srch_inf->index_of_last_entry = 2;
1923
1924        rc = SMB2_query_directory(xid, tcon, fid->persistent_fid,
1925                                  fid->volatile_fid, 0, srch_inf);
1926        if (rc) {
1927                cifs_dbg(FYI, "query directory failed rc=%d\n", rc);
1928                SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
1929        }
1930        return rc;
1931}
1932
1933static int
1934smb2_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon,
1935                    struct cifs_fid *fid, __u16 search_flags,
1936                    struct cifs_search_info *srch_inf)
1937{
1938        return SMB2_query_directory(xid, tcon, fid->persistent_fid,
1939                                    fid->volatile_fid, 0, srch_inf);
1940}
1941
1942static int
1943smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
1944               struct cifs_fid *fid)
1945{
1946        return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
1947}
1948
1949/*
1950* If we negotiate SMB2 protocol and get STATUS_PENDING - update
1951* the number of credits and return true. Otherwise - return false.
1952*/
1953static bool
1954smb2_is_status_pending(char *buf, struct TCP_Server_Info *server)
1955{
1956        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
1957
1958        if (shdr->Status != STATUS_PENDING)
1959                return false;
1960
1961        if (shdr->CreditRequest) {
1962                spin_lock(&server->req_lock);
1963                server->credits += le16_to_cpu(shdr->CreditRequest);
1964                spin_unlock(&server->req_lock);
1965                wake_up(&server->request_q);
1966        }
1967
1968        return true;
1969}
1970
1971static bool
1972smb2_is_session_expired(char *buf)
1973{
1974        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
1975
1976        if (shdr->Status != STATUS_NETWORK_SESSION_EXPIRED &&
1977            shdr->Status != STATUS_USER_SESSION_DELETED)
1978                return false;
1979
1980        trace_smb3_ses_expired(shdr->TreeId, shdr->SessionId,
1981                               le16_to_cpu(shdr->Command),
1982                               le64_to_cpu(shdr->MessageId));
1983        cifs_dbg(FYI, "Session expired or deleted\n");
1984
1985        return true;
1986}
1987
1988static int
1989smb2_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
1990                     struct cifsInodeInfo *cinode)
1991{
1992        if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING)
1993                return SMB2_lease_break(0, tcon, cinode->lease_key,
1994                                        smb2_get_lease_state(cinode));
1995
1996        return SMB2_oplock_break(0, tcon, fid->persistent_fid,
1997                                 fid->volatile_fid,
1998                                 CIFS_CACHE_READ(cinode) ? 1 : 0);
1999}
2000
2001void
2002smb2_set_related(struct smb_rqst *rqst)
2003{
2004        struct smb2_sync_hdr *shdr;
2005
2006        shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base);
2007        if (shdr == NULL) {
2008                cifs_dbg(FYI, "shdr NULL in smb2_set_related\n");
2009                return;
2010        }
2011        shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS;
2012}
2013
2014char smb2_padding[7] = {0, 0, 0, 0, 0, 0, 0};
2015
2016void
2017smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst)
2018{
2019        struct smb2_sync_hdr *shdr;
2020        struct cifs_ses *ses = tcon->ses;
2021        struct TCP_Server_Info *server = ses->server;
2022        unsigned long len = smb_rqst_len(server, rqst);
2023        int i, num_padding;
2024
2025        shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base);
2026        if (shdr == NULL) {
2027                cifs_dbg(FYI, "shdr NULL in smb2_set_next_command\n");
2028                return;
2029        }
2030
2031        /* SMB headers in a compound are 8 byte aligned. */
2032
2033        /* No padding needed */
2034        if (!(len & 7))
2035                goto finished;
2036
2037        num_padding = 8 - (len & 7);
2038        if (!smb3_encryption_required(tcon)) {
2039                /*
2040                 * If we do not have encryption then we can just add an extra
2041                 * iov for the padding.
2042                 */
2043                rqst->rq_iov[rqst->rq_nvec].iov_base = smb2_padding;
2044                rqst->rq_iov[rqst->rq_nvec].iov_len = num_padding;
2045                rqst->rq_nvec++;
2046                len += num_padding;
2047        } else {
2048                /*
2049                 * We can not add a small padding iov for the encryption case
2050                 * because the encryption framework can not handle the padding
2051                 * iovs.
2052                 * We have to flatten this into a single buffer and add
2053                 * the padding to it.
2054                 */
2055                for (i = 1; i < rqst->rq_nvec; i++) {
2056                        memcpy(rqst->rq_iov[0].iov_base +
2057                               rqst->rq_iov[0].iov_len,
2058                               rqst->rq_iov[i].iov_base,
2059                               rqst->rq_iov[i].iov_len);
2060                        rqst->rq_iov[0].iov_len += rqst->rq_iov[i].iov_len;
2061                }
2062                memset(rqst->rq_iov[0].iov_base + rqst->rq_iov[0].iov_len,
2063                       0, num_padding);
2064                rqst->rq_iov[0].iov_len += num_padding;
2065                len += num_padding;
2066                rqst->rq_nvec = 1;
2067        }
2068
2069 finished:
2070        shdr->NextCommand = cpu_to_le32(len);
2071}
2072
2073/*
2074 * Passes the query info response back to the caller on success.
2075 * Caller need to free this with free_rsp_buf().
2076 */
2077int
2078smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
2079                         __le16 *utf16_path, u32 desired_access,
2080                         u32 class, u32 type, u32 output_len,
2081                         struct kvec *rsp, int *buftype,
2082                         struct cifs_sb_info *cifs_sb)
2083{
2084        struct cifs_ses *ses = tcon->ses;
2085        int flags = 0;
2086        struct smb_rqst rqst[3];
2087        int resp_buftype[3];
2088        struct kvec rsp_iov[3];
2089        struct kvec open_iov[SMB2_CREATE_IOV_SIZE];
2090        struct kvec qi_iov[1];
2091        struct kvec close_iov[1];
2092        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
2093        struct cifs_open_parms oparms;
2094        struct cifs_fid fid;
2095        int rc;
2096
2097        if (smb3_encryption_required(tcon))
2098                flags |= CIFS_TRANSFORM_REQ;
2099
2100        memset(rqst, 0, sizeof(rqst));
2101        resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
2102        memset(rsp_iov, 0, sizeof(rsp_iov));
2103
2104        memset(&open_iov, 0, sizeof(open_iov));
2105        rqst[0].rq_iov = open_iov;
2106        rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
2107
2108        oparms.tcon = tcon;
2109        oparms.desired_access = desired_access;
2110        oparms.disposition = FILE_OPEN;
2111        if (cifs_sb && backup_cred(cifs_sb))
2112                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
2113        else
2114                oparms.create_options = 0;
2115        oparms.fid = &fid;
2116        oparms.reconnect = false;
2117
2118        rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, utf16_path);
2119        if (rc)
2120                goto qic_exit;
2121        smb2_set_next_command(tcon, &rqst[0]);
2122
2123        memset(&qi_iov, 0, sizeof(qi_iov));
2124        rqst[1].rq_iov = qi_iov;
2125        rqst[1].rq_nvec = 1;
2126
2127        rc = SMB2_query_info_init(tcon, &rqst[1], COMPOUND_FID, COMPOUND_FID,
2128                                  class, type, 0,
2129                                  output_len, 0,
2130                                  NULL);
2131        if (rc)
2132                goto qic_exit;
2133        smb2_set_next_command(tcon, &rqst[1]);
2134        smb2_set_related(&rqst[1]);
2135
2136        memset(&close_iov, 0, sizeof(close_iov));
2137        rqst[2].rq_iov = close_iov;
2138        rqst[2].rq_nvec = 1;
2139
2140        rc = SMB2_close_init(tcon, &rqst[2], COMPOUND_FID, COMPOUND_FID);
2141        if (rc)
2142                goto qic_exit;
2143        smb2_set_related(&rqst[2]);
2144
2145        rc = compound_send_recv(xid, ses, flags, 3, rqst,
2146                                resp_buftype, rsp_iov);
2147        if (rc) {
2148                free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base);
2149                goto qic_exit;
2150        }
2151        *rsp = rsp_iov[1];
2152        *buftype = resp_buftype[1];
2153
2154 qic_exit:
2155        SMB2_open_free(&rqst[0]);
2156        SMB2_query_info_free(&rqst[1]);
2157        SMB2_close_free(&rqst[2]);
2158        free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
2159        free_rsp_buf(resp_buftype[2], rsp_iov[2].iov_base);
2160        return rc;
2161}
2162
2163static int
2164smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
2165             struct kstatfs *buf)
2166{
2167        struct smb2_query_info_rsp *rsp;
2168        struct smb2_fs_full_size_info *info = NULL;
2169        __le16 utf16_path = 0; /* Null - open root of share */
2170        struct kvec rsp_iov = {NULL, 0};
2171        int buftype = CIFS_NO_BUFFER;
2172        int rc;
2173
2174
2175        rc = smb2_query_info_compound(xid, tcon, &utf16_path,
2176                                      FILE_READ_ATTRIBUTES,
2177                                      FS_FULL_SIZE_INFORMATION,
2178                                      SMB2_O_INFO_FILESYSTEM,
2179                                      sizeof(struct smb2_fs_full_size_info),
2180                                      &rsp_iov, &buftype, NULL);
2181        if (rc)
2182                goto qfs_exit;
2183
2184        rsp = (struct smb2_query_info_rsp *)rsp_iov.iov_base;
2185        buf->f_type = SMB2_MAGIC_NUMBER;
2186        info = (struct smb2_fs_full_size_info *)(
2187                le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp);
2188        rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset),
2189                               le32_to_cpu(rsp->OutputBufferLength),
2190                               &rsp_iov,
2191                               sizeof(struct smb2_fs_full_size_info));
2192        if (!rc)
2193                smb2_copy_fs_info_to_kstatfs(info, buf);
2194
2195qfs_exit:
2196        free_rsp_buf(buftype, rsp_iov.iov_base);
2197        return rc;
2198}
2199
2200static int
2201smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
2202             struct kstatfs *buf)
2203{
2204        int rc;
2205        __le16 srch_path = 0; /* Null - open root of share */
2206        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
2207        struct cifs_open_parms oparms;
2208        struct cifs_fid fid;
2209
2210        if (!tcon->posix_extensions)
2211                return smb2_queryfs(xid, tcon, buf);
2212
2213        oparms.tcon = tcon;
2214        oparms.desired_access = FILE_READ_ATTRIBUTES;
2215        oparms.disposition = FILE_OPEN;
2216        oparms.create_options = 0;
2217        oparms.fid = &fid;
2218        oparms.reconnect = false;
2219
2220        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL, NULL);
2221        if (rc)
2222                return rc;
2223
2224        rc = SMB311_posix_qfs_info(xid, tcon, fid.persistent_fid,
2225                                   fid.volatile_fid, buf);
2226        buf->f_type = SMB2_MAGIC_NUMBER;
2227        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
2228        return rc;
2229}
2230
2231static bool
2232smb2_compare_fids(struct cifsFileInfo *ob1, struct cifsFileInfo *ob2)
2233{
2234        return ob1->fid.persistent_fid == ob2->fid.persistent_fid &&
2235               ob1->fid.volatile_fid == ob2->fid.volatile_fid;
2236}
2237
2238static int
2239smb2_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset,
2240               __u64 length, __u32 type, int lock, int unlock, bool wait)
2241{
2242        if (unlock && !lock)
2243                type = SMB2_LOCKFLAG_UNLOCK;
2244        return SMB2_lock(xid, tlink_tcon(cfile->tlink),
2245                         cfile->fid.persistent_fid, cfile->fid.volatile_fid,
2246                         current->tgid, length, offset, type, wait);
2247}
2248
2249static void
2250smb2_get_lease_key(struct inode *inode, struct cifs_fid *fid)
2251{
2252        memcpy(fid->lease_key, CIFS_I(inode)->lease_key, SMB2_LEASE_KEY_SIZE);
2253}
2254
2255static void
2256smb2_set_lease_key(struct inode *inode, struct cifs_fid *fid)
2257{
2258        memcpy(CIFS_I(inode)->lease_key, fid->lease_key, SMB2_LEASE_KEY_SIZE);
2259}
2260
2261static void
2262smb2_new_lease_key(struct cifs_fid *fid)
2263{
2264        generate_random_uuid(fid->lease_key);
2265}
2266
2267static int
2268smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,
2269                   const char *search_name,
2270                   struct dfs_info3_param **target_nodes,
2271                   unsigned int *num_of_nodes,
2272                   const struct nls_table *nls_codepage, int remap)
2273{
2274        int rc;
2275        __le16 *utf16_path = NULL;
2276        int utf16_path_len = 0;
2277        struct cifs_tcon *tcon;
2278        struct fsctl_get_dfs_referral_req *dfs_req = NULL;
2279        struct get_dfs_referral_rsp *dfs_rsp = NULL;
2280        u32 dfs_req_size = 0, dfs_rsp_size = 0;
2281
2282        cifs_dbg(FYI, "smb2_get_dfs_refer path <%s>\n", search_name);
2283
2284        /*
2285         * Try to use the IPC tcon, otherwise just use any
2286         */
2287        tcon = ses->tcon_ipc;
2288        if (tcon == NULL) {
2289                spin_lock(&cifs_tcp_ses_lock);
2290                tcon = list_first_entry_or_null(&ses->tcon_list,
2291                                                struct cifs_tcon,
2292                                                tcon_list);
2293                if (tcon)
2294                        tcon->tc_count++;
2295                spin_unlock(&cifs_tcp_ses_lock);
2296        }
2297
2298        if (tcon == NULL) {
2299                cifs_dbg(VFS, "session %p has no tcon available for a dfs referral request\n",
2300                         ses);
2301                rc = -ENOTCONN;
2302                goto out;
2303        }
2304
2305        utf16_path = cifs_strndup_to_utf16(search_name, PATH_MAX,
2306                                           &utf16_path_len,
2307                                           nls_codepage, remap);
2308        if (!utf16_path) {
2309                rc = -ENOMEM;
2310                goto out;
2311        }
2312
2313        dfs_req_size = sizeof(*dfs_req) + utf16_path_len;
2314        dfs_req = kzalloc(dfs_req_size, GFP_KERNEL);
2315        if (!dfs_req) {
2316                rc = -ENOMEM;
2317                goto out;
2318        }
2319
2320        /* Highest DFS referral version understood */
2321        dfs_req->MaxReferralLevel = DFS_VERSION;
2322
2323        /* Path to resolve in an UTF-16 null-terminated string */
2324        memcpy(dfs_req->RequestFileName, utf16_path, utf16_path_len);
2325
2326        do {
2327                rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
2328                                FSCTL_DFS_GET_REFERRALS,
2329                                true /* is_fsctl */,
2330                                (char *)dfs_req, dfs_req_size, CIFSMaxBufSize,
2331                                (char **)&dfs_rsp, &dfs_rsp_size);
2332        } while (rc == -EAGAIN);
2333
2334        if (rc) {
2335                if ((rc != -ENOENT) && (rc != -EOPNOTSUPP))
2336                        cifs_dbg(VFS, "ioctl error in smb2_get_dfs_refer rc=%d\n", rc);
2337                goto out;
2338        }
2339
2340        rc = parse_dfs_referrals(dfs_rsp, dfs_rsp_size,
2341                                 num_of_nodes, target_nodes,
2342                                 nls_codepage, remap, search_name,
2343                                 true /* is_unicode */);
2344        if (rc) {
2345                cifs_dbg(VFS, "parse error in smb2_get_dfs_refer rc=%d\n", rc);
2346                goto out;
2347        }
2348
2349 out:
2350        if (tcon && !tcon->ipc) {
2351                /* ipc tcons are not refcounted */
2352                spin_lock(&cifs_tcp_ses_lock);
2353                tcon->tc_count--;
2354                spin_unlock(&cifs_tcp_ses_lock);
2355        }
2356        kfree(utf16_path);
2357        kfree(dfs_req);
2358        kfree(dfs_rsp);
2359        return rc;
2360}
2361#define SMB2_SYMLINK_STRUCT_SIZE \
2362        (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp))
2363
2364static int
2365smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
2366                   const char *full_path, char **target_path,
2367                   struct cifs_sb_info *cifs_sb)
2368{
2369        int rc;
2370        __le16 *utf16_path;
2371        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
2372        struct cifs_open_parms oparms;
2373        struct cifs_fid fid;
2374        struct kvec err_iov = {NULL, 0};
2375        struct smb2_err_rsp *err_buf = NULL;
2376        int resp_buftype;
2377        struct smb2_symlink_err_rsp *symlink;
2378        unsigned int sub_len;
2379        unsigned int sub_offset;
2380        unsigned int print_len;
2381        unsigned int print_offset;
2382
2383        cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
2384
2385        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
2386        if (!utf16_path)
2387                return -ENOMEM;
2388
2389        oparms.tcon = tcon;
2390        oparms.desired_access = FILE_READ_ATTRIBUTES;
2391        oparms.disposition = FILE_OPEN;
2392        if (backup_cred(cifs_sb))
2393                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
2394        else
2395                oparms.create_options = 0;
2396        oparms.fid = &fid;
2397        oparms.reconnect = false;
2398
2399        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, &err_iov,
2400                       &resp_buftype);
2401        if (!rc)
2402                SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
2403        if (!rc || !err_iov.iov_base) {
2404                rc = -ENOENT;
2405                goto free_path;
2406        }
2407
2408        err_buf = err_iov.iov_base;
2409        if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) ||
2410            err_iov.iov_len < SMB2_SYMLINK_STRUCT_SIZE) {
2411                rc = -ENOENT;
2412                goto querty_exit;
2413        }
2414
2415        /* open must fail on symlink - reset rc */
2416        rc = 0;
2417        symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData;
2418        sub_len = le16_to_cpu(symlink->SubstituteNameLength);
2419        sub_offset = le16_to_cpu(symlink->SubstituteNameOffset);
2420        print_len = le16_to_cpu(symlink->PrintNameLength);
2421        print_offset = le16_to_cpu(symlink->PrintNameOffset);
2422
2423        if (err_iov.iov_len < SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
2424                rc = -ENOENT;
2425                goto querty_exit;
2426        }
2427
2428        if (err_iov.iov_len <
2429            SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
2430                rc = -ENOENT;
2431                goto querty_exit;
2432        }
2433
2434        *target_path = cifs_strndup_from_utf16(
2435                                (char *)symlink->PathBuffer + sub_offset,
2436                                sub_len, true, cifs_sb->local_nls);
2437        if (!(*target_path)) {
2438                rc = -ENOMEM;
2439                goto querty_exit;
2440        }
2441        convert_delimiter(*target_path, '/');
2442        cifs_dbg(FYI, "%s: target path: %s\n", __func__, *target_path);
2443
2444 querty_exit:
2445        free_rsp_buf(resp_buftype, err_buf);
2446 free_path:
2447        kfree(utf16_path);
2448        return rc;
2449}
2450
2451#ifdef CONFIG_CIFS_ACL
2452static struct cifs_ntsd *
2453get_smb2_acl_by_fid(struct cifs_sb_info *cifs_sb,
2454                const struct cifs_fid *cifsfid, u32 *pacllen)
2455{
2456        struct cifs_ntsd *pntsd = NULL;
2457        unsigned int xid;
2458        int rc = -EOPNOTSUPP;
2459        struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
2460
2461        if (IS_ERR(tlink))
2462                return ERR_CAST(tlink);
2463
2464        xid = get_xid();
2465        cifs_dbg(FYI, "trying to get acl\n");
2466
2467        rc = SMB2_query_acl(xid, tlink_tcon(tlink), cifsfid->persistent_fid,
2468                            cifsfid->volatile_fid, (void **)&pntsd, pacllen);
2469        free_xid(xid);
2470
2471        cifs_put_tlink(tlink);
2472
2473        cifs_dbg(FYI, "%s: rc = %d ACL len %d\n", __func__, rc, *pacllen);
2474        if (rc)
2475                return ERR_PTR(rc);
2476        return pntsd;
2477
2478}
2479
2480static struct cifs_ntsd *
2481get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
2482                const char *path, u32 *pacllen)
2483{
2484        struct cifs_ntsd *pntsd = NULL;
2485        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
2486        unsigned int xid;
2487        int rc;
2488        struct cifs_tcon *tcon;
2489        struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
2490        struct cifs_fid fid;
2491        struct cifs_open_parms oparms;
2492        __le16 *utf16_path;
2493
2494        cifs_dbg(FYI, "get smb3 acl for path %s\n", path);
2495        if (IS_ERR(tlink))
2496                return ERR_CAST(tlink);
2497
2498        tcon = tlink_tcon(tlink);
2499        xid = get_xid();
2500
2501        if (backup_cred(cifs_sb))
2502                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
2503        else
2504                oparms.create_options = 0;
2505
2506        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
2507        if (!utf16_path) {
2508                rc = -ENOMEM;
2509                free_xid(xid);
2510                return ERR_PTR(rc);
2511        }
2512
2513        oparms.tcon = tcon;
2514        oparms.desired_access = READ_CONTROL;
2515        oparms.disposition = FILE_OPEN;
2516        oparms.fid = &fid;
2517        oparms.reconnect = false;
2518
2519        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL, NULL);
2520        kfree(utf16_path);
2521        if (!rc) {
2522                rc = SMB2_query_acl(xid, tlink_tcon(tlink), fid.persistent_fid,
2523                            fid.volatile_fid, (void **)&pntsd, pacllen);
2524                SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
2525        }
2526
2527        cifs_put_tlink(tlink);
2528        free_xid(xid);
2529
2530        cifs_dbg(FYI, "%s: rc = %d ACL len %d\n", __func__, rc, *pacllen);
2531        if (rc)
2532                return ERR_PTR(rc);
2533        return pntsd;
2534}
2535
2536#ifdef CONFIG_CIFS_ACL
2537static int
2538set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
2539                struct inode *inode, const char *path, int aclflag)
2540{
2541        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
2542        unsigned int xid;
2543        int rc, access_flags = 0;
2544        struct cifs_tcon *tcon;
2545        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2546        struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
2547        struct cifs_fid fid;
2548        struct cifs_open_parms oparms;
2549        __le16 *utf16_path;
2550
2551        cifs_dbg(FYI, "set smb3 acl for path %s\n", path);
2552        if (IS_ERR(tlink))
2553                return PTR_ERR(tlink);
2554
2555        tcon = tlink_tcon(tlink);
2556        xid = get_xid();
2557
2558        if (backup_cred(cifs_sb))
2559                oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
2560        else
2561                oparms.create_options = 0;
2562
2563        if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
2564                access_flags = WRITE_OWNER;
2565        else
2566                access_flags = WRITE_DAC;
2567
2568        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
2569        if (!utf16_path) {
2570                rc = -ENOMEM;
2571                free_xid(xid);
2572                return rc;
2573        }
2574
2575        oparms.tcon = tcon;
2576        oparms.desired_access = access_flags;
2577        oparms.disposition = FILE_OPEN;
2578        oparms.path = path;
2579        oparms.fid = &fid;
2580        oparms.reconnect = false;
2581
2582        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL, NULL);
2583        kfree(utf16_path);
2584        if (!rc) {
2585                rc = SMB2_set_acl(xid, tlink_tcon(tlink), fid.persistent_fid,
2586                            fid.volatile_fid, pnntsd, acllen, aclflag);
2587                SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
2588        }
2589
2590        cifs_put_tlink(tlink);
2591        free_xid(xid);
2592        return rc;
2593}
2594#endif /* CIFS_ACL */
2595
2596/* Retrieve an ACL from the server */
2597static struct cifs_ntsd *
2598get_smb2_acl(struct cifs_sb_info *cifs_sb,
2599                                      struct inode *inode, const char *path,
2600                                      u32 *pacllen)
2601{
2602        struct cifs_ntsd *pntsd = NULL;
2603        struct cifsFileInfo *open_file = NULL;
2604
2605        if (inode)
2606                open_file = find_readable_file(CIFS_I(inode), true);
2607        if (!open_file)
2608                return get_smb2_acl_by_path(cifs_sb, path, pacllen);
2609
2610        pntsd = get_smb2_acl_by_fid(cifs_sb, &open_file->fid, pacllen);
2611        cifsFileInfo_put(open_file);
2612        return pntsd;
2613}
2614#endif
2615
2616static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
2617                            loff_t offset, loff_t len, bool keep_size)
2618{
2619        struct cifs_ses *ses = tcon->ses;
2620        struct inode *inode;
2621        struct cifsInodeInfo *cifsi;
2622        struct cifsFileInfo *cfile = file->private_data;
2623        struct file_zero_data_information fsctl_buf;
2624        struct smb_rqst rqst[2];
2625        int resp_buftype[2];
2626        struct kvec rsp_iov[2];
2627        struct kvec io_iov[SMB2_IOCTL_IOV_SIZE];
2628        struct kvec si_iov[1];
2629        unsigned int size[1];
2630        void *data[1];
2631        long rc;
2632        unsigned int xid;
2633        int num = 0, flags = 0;
2634        __le64 eof;
2635
2636        xid = get_xid();
2637
2638        inode = d_inode(cfile->dentry);
2639        cifsi = CIFS_I(inode);
2640
2641        trace_smb3_zero_enter(xid, cfile->fid.persistent_fid, tcon->tid,
2642                              ses->Suid, offset, len);
2643
2644
2645        /* if file not oplocked can't be sure whether asking to extend size */
2646        if (!CIFS_CACHE_READ(cifsi))
2647                if (keep_size == false) {
2648                        rc = -EOPNOTSUPP;
2649                        trace_smb3_zero_err(xid, cfile->fid.persistent_fid,
2650                                tcon->tid, ses->Suid, offset, len, rc);
2651                        free_xid(xid);
2652                        return rc;
2653                }
2654
2655        /*
2656         * Must check if file sparse since fallocate -z (zero range) assumes
2657         * non-sparse allocation
2658         */
2659        if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE)) {
2660                rc = -EOPNOTSUPP;
2661                trace_smb3_zero_err(xid, cfile->fid.persistent_fid, tcon->tid,
2662                              ses->Suid, offset, len, rc);
2663                free_xid(xid);
2664                return rc;
2665        }
2666
2667        cifs_dbg(FYI, "offset %lld len %lld", offset, len);
2668
2669        fsctl_buf.FileOffset = cpu_to_le64(offset);
2670        fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len);
2671
2672        if (smb3_encryption_required(tcon))
2673                flags |= CIFS_TRANSFORM_REQ;
2674
2675        memset(rqst, 0, sizeof(rqst));
2676        resp_buftype[0] = resp_buftype[1] = CIFS_NO_BUFFER;
2677        memset(rsp_iov, 0, sizeof(rsp_iov));
2678
2679
2680        memset(&io_iov, 0, sizeof(io_iov));
2681        rqst[num].rq_iov = io_iov;
2682        rqst[num].rq_nvec = SMB2_IOCTL_IOV_SIZE;
2683        rc = SMB2_ioctl_init(tcon, &rqst[num++], cfile->fid.persistent_fid,
2684                             cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
2685                             true /* is_fctl */, (char *)&fsctl_buf,
2686                             sizeof(struct file_zero_data_information),
2687                             CIFSMaxBufSize);
2688        if (rc)
2689                goto zero_range_exit;
2690
2691        /*
2692         * do we also need to change the size of the file?
2693         */
2694        if (keep_size == false && i_size_read(inode) < offset + len) {
2695                smb2_set_next_command(tcon, &rqst[0]);
2696
2697                memset(&si_iov, 0, sizeof(si_iov));
2698                rqst[num].rq_iov = si_iov;
2699                rqst[num].rq_nvec = 1;
2700
2701                eof = cpu_to_le64(offset + len);
2702                size[0] = 8; /* sizeof __le64 */
2703                data[0] = &eof;
2704
2705                rc = SMB2_set_info_init(tcon, &rqst[num++],
2706                                        cfile->fid.persistent_fid,
2707                                        cfile->fid.persistent_fid,
2708                                        current->tgid,
2709                                        FILE_END_OF_FILE_INFORMATION,
2710                                        SMB2_O_INFO_FILE, 0, data, size);
2711                smb2_set_related(&rqst[1]);
2712        }
2713
2714        rc = compound_send_recv(xid, ses, flags, num, rqst,
2715                                resp_buftype, rsp_iov);
2716
2717 zero_range_exit:
2718        SMB2_ioctl_free(&rqst[0]);
2719        SMB2_set_info_free(&rqst[1]);
2720        free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
2721        free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base);
2722        free_xid(xid);
2723        if (rc)
2724                trace_smb3_zero_err(xid, cfile->fid.persistent_fid, tcon->tid,
2725                              ses->Suid, offset, len, rc);
2726        else
2727                trace_smb3_zero_done(xid, cfile->fid.persistent_fid, tcon->tid,
2728                              ses->Suid, offset, len);
2729        return rc;
2730}
2731
2732static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon,
2733                            loff_t offset, loff_t len)
2734{
2735        struct inode *inode;
2736        struct cifsInodeInfo *cifsi;
2737        struct cifsFileInfo *cfile = file->private_data;
2738        struct file_zero_data_information fsctl_buf;
2739        long rc;
2740        unsigned int xid;
2741        __u8 set_sparse = 1;
2742
2743        xid = get_xid();
2744
2745        inode = d_inode(cfile->dentry);
2746        cifsi = CIFS_I(inode);
2747
2748        /* Need to make file sparse, if not already, before freeing range. */
2749        /* Consider adding equivalent for compressed since it could also work */
2750        if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse)) {
2751                rc = -EOPNOTSUPP;
2752                free_xid(xid);
2753                return rc;
2754        }
2755
2756        cifs_dbg(FYI, "offset %lld len %lld", offset, len);
2757
2758        fsctl_buf.FileOffset = cpu_to_le64(offset);
2759        fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len);
2760
2761        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
2762                        cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
2763                        true /* is_fctl */, (char *)&fsctl_buf,
2764                        sizeof(struct file_zero_data_information),
2765                        CIFSMaxBufSize, NULL, NULL);
2766        free_xid(xid);
2767        return rc;
2768}
2769
2770static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
2771                            loff_t off, loff_t len, bool keep_size)
2772{
2773        struct inode *inode;
2774        struct cifsInodeInfo *cifsi;
2775        struct cifsFileInfo *cfile = file->private_data;
2776        long rc = -EOPNOTSUPP;
2777        unsigned int xid;
2778        __le64 eof;
2779
2780        xid = get_xid();
2781
2782        inode = d_inode(cfile->dentry);
2783        cifsi = CIFS_I(inode);
2784
2785        trace_smb3_falloc_enter(xid, cfile->fid.persistent_fid, tcon->tid,
2786                                tcon->ses->Suid, off, len);
2787        /* if file not oplocked can't be sure whether asking to extend size */
2788        if (!CIFS_CACHE_READ(cifsi))
2789                if (keep_size == false) {
2790                        trace_smb3_falloc_err(xid, cfile->fid.persistent_fid,
2791                                tcon->tid, tcon->ses->Suid, off, len, rc);
2792                        free_xid(xid);
2793                        return rc;
2794                }
2795
2796        /*
2797         * Files are non-sparse by default so falloc may be a no-op
2798         * Must check if file sparse. If not sparse, and not extending
2799         * then no need to do anything since file already allocated
2800         */
2801        if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) {
2802                if (keep_size == true)
2803                        rc = 0;
2804                /* check if extending file */
2805                else if (i_size_read(inode) >= off + len)
2806                        /* not extending file and already not sparse */
2807                        rc = 0;
2808                /* BB: in future add else clause to extend file */
2809                else
2810                        rc = -EOPNOTSUPP;
2811                if (rc)
2812                        trace_smb3_falloc_err(xid, cfile->fid.persistent_fid,
2813                                tcon->tid, tcon->ses->Suid, off, len, rc);
2814                else
2815                        trace_smb3_falloc_done(xid, cfile->fid.persistent_fid,
2816                                tcon->tid, tcon->ses->Suid, off, len);
2817                free_xid(xid);
2818                return rc;
2819        }
2820
2821        if ((keep_size == true) || (i_size_read(inode) >= off + len)) {
2822                /*
2823                 * Check if falloc starts within first few pages of file
2824                 * and ends within a few pages of the end of file to
2825                 * ensure that most of file is being forced to be
2826                 * fallocated now. If so then setting whole file sparse
2827                 * ie potentially making a few extra pages at the beginning
2828                 * or end of the file non-sparse via set_sparse is harmless.
2829                 */
2830                if ((off > 8192) || (off + len + 8192 < i_size_read(inode))) {
2831                        rc = -EOPNOTSUPP;
2832                        trace_smb3_falloc_err(xid, cfile->fid.persistent_fid,
2833                                tcon->tid, tcon->ses->Suid, off, len, rc);
2834                        free_xid(xid);
2835                        return rc;
2836                }
2837
2838                smb2_set_sparse(xid, tcon, cfile, inode, false);
2839                rc = 0;
2840        } else {
2841                smb2_set_sparse(xid, tcon, cfile, inode, false);
2842                rc = 0;
2843                if (i_size_read(inode) < off + len) {
2844                        eof = cpu_to_le64(off + len);
2845                        rc = SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
2846                                          cfile->fid.volatile_fid, cfile->pid,
2847                                          &eof);
2848                }
2849        }
2850
2851        if (rc)
2852                trace_smb3_falloc_err(xid, cfile->fid.persistent_fid, tcon->tid,
2853                                tcon->ses->Suid, off, len, rc);
2854        else
2855                trace_smb3_falloc_done(xid, cfile->fid.persistent_fid, tcon->tid,
2856                                tcon->ses->Suid, off, len);
2857
2858        free_xid(xid);
2859        return rc;
2860}
2861
2862
2863static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode,
2864                           loff_t off, loff_t len)
2865{
2866        /* KEEP_SIZE already checked for by do_fallocate */
2867        if (mode & FALLOC_FL_PUNCH_HOLE)
2868                return smb3_punch_hole(file, tcon, off, len);
2869        else if (mode & FALLOC_FL_ZERO_RANGE) {
2870                if (mode & FALLOC_FL_KEEP_SIZE)
2871                        return smb3_zero_range(file, tcon, off, len, true);
2872                return smb3_zero_range(file, tcon, off, len, false);
2873        } else if (mode == FALLOC_FL_KEEP_SIZE)
2874                return smb3_simple_falloc(file, tcon, off, len, true);
2875        else if (mode == 0)
2876                return smb3_simple_falloc(file, tcon, off, len, false);
2877
2878        return -EOPNOTSUPP;
2879}
2880
2881static void
2882smb2_downgrade_oplock(struct TCP_Server_Info *server,
2883                        struct cifsInodeInfo *cinode, bool set_level2)
2884{
2885        if (set_level2)
2886                server->ops->set_oplock_level(cinode, SMB2_OPLOCK_LEVEL_II,
2887                                                0, NULL);
2888        else
2889                server->ops->set_oplock_level(cinode, 0, 0, NULL);
2890}
2891
2892static void
2893smb21_downgrade_oplock(struct TCP_Server_Info *server,
2894                       struct cifsInodeInfo *cinode, bool set_level2)
2895{
2896        server->ops->set_oplock_level(cinode,
2897                                      set_level2 ? SMB2_LEASE_READ_CACHING_HE :
2898                                      0, 0, NULL);
2899}
2900
2901static void
2902smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
2903                      unsigned int epoch, bool *purge_cache)
2904{
2905        oplock &= 0xFF;
2906        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
2907                return;
2908        if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
2909                cinode->oplock = CIFS_CACHE_RHW_FLG;
2910                cifs_dbg(FYI, "Batch Oplock granted on inode %p\n",
2911                         &cinode->vfs_inode);
2912        } else if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
2913                cinode->oplock = CIFS_CACHE_RW_FLG;
2914                cifs_dbg(FYI, "Exclusive Oplock granted on inode %p\n",
2915                         &cinode->vfs_inode);
2916        } else if (oplock == SMB2_OPLOCK_LEVEL_II) {
2917                cinode->oplock = CIFS_CACHE_READ_FLG;
2918                cifs_dbg(FYI, "Level II Oplock granted on inode %p\n",
2919                         &cinode->vfs_inode);
2920        } else
2921                cinode->oplock = 0;
2922}
2923
2924static void
2925smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
2926                       unsigned int epoch, bool *purge_cache)
2927{
2928        char message[5] = {0};
2929
2930        oplock &= 0xFF;
2931        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
2932                return;
2933
2934        cinode->oplock = 0;
2935        if (oplock & SMB2_LEASE_READ_CACHING_HE) {
2936                cinode->oplock |= CIFS_CACHE_READ_FLG;
2937                strcat(message, "R");
2938        }
2939        if (oplock & SMB2_LEASE_HANDLE_CACHING_HE) {
2940                cinode->oplock |= CIFS_CACHE_HANDLE_FLG;
2941                strcat(message, "H");
2942        }
2943        if (oplock & SMB2_LEASE_WRITE_CACHING_HE) {
2944                cinode->oplock |= CIFS_CACHE_WRITE_FLG;
2945                strcat(message, "W");
2946        }
2947        if (!cinode->oplock)
2948                strcat(message, "None");
2949        cifs_dbg(FYI, "%s Lease granted on inode %p\n", message,
2950                 &cinode->vfs_inode);
2951}
2952
2953static void
2954smb3_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
2955                      unsigned int epoch, bool *purge_cache)
2956{
2957        unsigned int old_oplock = cinode->oplock;
2958
2959        smb21_set_oplock_level(cinode, oplock, epoch, purge_cache);
2960
2961        if (purge_cache) {
2962                *purge_cache = false;
2963                if (old_oplock == CIFS_CACHE_READ_FLG) {
2964                        if (cinode->oplock == CIFS_CACHE_READ_FLG &&
2965                            (epoch - cinode->epoch > 0))
2966                                *purge_cache = true;
2967                        else if (cinode->oplock == CIFS_CACHE_RH_FLG &&
2968                                 (epoch - cinode->epoch > 1))
2969                                *purge_cache = true;
2970                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
2971                                 (epoch - cinode->epoch > 1))
2972                                *purge_cache = true;
2973                        else if (cinode->oplock == 0 &&
2974                                 (epoch - cinode->epoch > 0))
2975                                *purge_cache = true;
2976                } else if (old_oplock == CIFS_CACHE_RH_FLG) {
2977                        if (cinode->oplock == CIFS_CACHE_RH_FLG &&
2978                            (epoch - cinode->epoch > 0))
2979                                *purge_cache = true;
2980                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
2981                                 (epoch - cinode->epoch > 1))
2982                                *purge_cache = true;
2983                }
2984                cinode->epoch = epoch;
2985        }
2986}
2987
2988static bool
2989smb2_is_read_op(__u32 oplock)
2990{
2991        return oplock == SMB2_OPLOCK_LEVEL_II;
2992}
2993
2994static bool
2995smb21_is_read_op(__u32 oplock)
2996{
2997        return (oplock & SMB2_LEASE_READ_CACHING_HE) &&
2998               !(oplock & SMB2_LEASE_WRITE_CACHING_HE);
2999}
3000
3001static __le32
3002map_oplock_to_lease(u8 oplock)
3003{
3004        if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE)
3005                return SMB2_LEASE_WRITE_CACHING | SMB2_LEASE_READ_CACHING;
3006        else if (oplock == SMB2_OPLOCK_LEVEL_II)
3007                return SMB2_LEASE_READ_CACHING;
3008        else if (oplock == SMB2_OPLOCK_LEVEL_BATCH)
3009                return SMB2_LEASE_HANDLE_CACHING | SMB2_LEASE_READ_CACHING |
3010                       SMB2_LEASE_WRITE_CACHING;
3011        return 0;
3012}
3013
3014static char *
3015smb2_create_lease_buf(u8 *lease_key, u8 oplock)
3016{
3017        struct create_lease *buf;
3018
3019        buf = kzalloc(sizeof(struct create_lease), GFP_KERNEL);
3020        if (!buf)
3021                return NULL;
3022
3023        memcpy(&buf->lcontext.LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE);
3024        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
3025
3026        buf->ccontext.DataOffset = cpu_to_le16(offsetof
3027                                        (struct create_lease, lcontext));
3028        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context));
3029        buf->ccontext.NameOffset = cpu_to_le16(offsetof
3030                                (struct create_lease, Name));
3031        buf->ccontext.NameLength = cpu_to_le16(4);
3032        /* SMB2_CREATE_REQUEST_LEASE is "RqLs" */
3033        buf->Name[0] = 'R';
3034        buf->Name[1] = 'q';
3035        buf->Name[2] = 'L';
3036        buf->Name[3] = 's';
3037        return (char *)buf;
3038}
3039
3040static char *
3041smb3_create_lease_buf(u8 *lease_key, u8 oplock)
3042{
3043        struct create_lease_v2 *buf;
3044
3045        buf = kzalloc(sizeof(struct create_lease_v2), GFP_KERNEL);
3046        if (!buf)
3047                return NULL;
3048
3049        memcpy(&buf->lcontext.LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE);
3050        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
3051
3052        buf->ccontext.DataOffset = cpu_to_le16(offsetof
3053                                        (struct create_lease_v2, lcontext));
3054        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2));
3055        buf->ccontext.NameOffset = cpu_to_le16(offsetof
3056                                (struct create_lease_v2, Name));
3057        buf->ccontext.NameLength = cpu_to_le16(4);
3058        /* SMB2_CREATE_REQUEST_LEASE is "RqLs" */
3059        buf->Name[0] = 'R';
3060        buf->Name[1] = 'q';
3061        buf->Name[2] = 'L';
3062        buf->Name[3] = 's';
3063        return (char *)buf;
3064}
3065
3066static __u8
3067smb2_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
3068{
3069        struct create_lease *lc = (struct create_lease *)buf;
3070
3071        *epoch = 0; /* not used */
3072        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
3073                return SMB2_OPLOCK_LEVEL_NOCHANGE;
3074        return le32_to_cpu(lc->lcontext.LeaseState);
3075}
3076
3077static __u8
3078smb3_parse_lease_buf(void *buf, unsigned int *epoch, char *lease_key)
3079{
3080        struct create_lease_v2 *lc = (struct create_lease_v2 *)buf;
3081
3082        *epoch = le16_to_cpu(lc->lcontext.Epoch);
3083        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
3084                return SMB2_OPLOCK_LEVEL_NOCHANGE;
3085        if (lease_key)
3086                memcpy(lease_key, &lc->lcontext.LeaseKey, SMB2_LEASE_KEY_SIZE);
3087        return le32_to_cpu(lc->lcontext.LeaseState);
3088}
3089
3090static unsigned int
3091smb2_wp_retry_size(struct inode *inode)
3092{
3093        return min_t(unsigned int, CIFS_SB(inode->i_sb)->wsize,
3094                     SMB2_MAX_BUFFER_SIZE);
3095}
3096
3097static bool
3098smb2_dir_needs_close(struct cifsFileInfo *cfile)
3099{
3100        return !cfile->invalidHandle;
3101}
3102
3103static void
3104fill_transform_hdr(struct smb2_transform_hdr *tr_hdr, unsigned int orig_len,
3105                   struct smb_rqst *old_rq)
3106{
3107        struct smb2_sync_hdr *shdr =
3108                        (struct smb2_sync_hdr *)old_rq->rq_iov[0].iov_base;
3109
3110        memset(tr_hdr, 0, sizeof(struct smb2_transform_hdr));
3111        tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM;
3112        tr_hdr->OriginalMessageSize = cpu_to_le32(orig_len);
3113        tr_hdr->Flags = cpu_to_le16(0x01);
3114        get_random_bytes(&tr_hdr->Nonce, SMB3_AES128CMM_NONCE);
3115        memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8);
3116}
3117
3118/* We can not use the normal sg_set_buf() as we will sometimes pass a
3119 * stack object as buf.
3120 */
3121static inline void smb2_sg_set_buf(struct scatterlist *sg, const void *buf,
3122                                   unsigned int buflen)
3123{
3124        sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf));
3125}
3126
3127/* Assumes the first rqst has a transform header as the first iov.
3128 * I.e.
3129 * rqst[0].rq_iov[0]  is transform header
3130 * rqst[0].rq_iov[1+] data to be encrypted/decrypted
3131 * rqst[1+].rq_iov[0+] data to be encrypted/decrypted
3132 */
3133static struct scatterlist *
3134init_sg(int num_rqst, struct smb_rqst *rqst, u8 *sign)
3135{
3136        unsigned int sg_len;
3137        struct scatterlist *sg;
3138        unsigned int i;
3139        unsigned int j;
3140        unsigned int idx = 0;
3141        int skip;
3142
3143        sg_len = 1;
3144        for (i = 0; i < num_rqst; i++)
3145                sg_len += rqst[i].rq_nvec + rqst[i].rq_npages;
3146
3147        sg = kmalloc_array(sg_len, sizeof(struct scatterlist), GFP_KERNEL);
3148        if (!sg)
3149                return NULL;
3150
3151        sg_init_table(sg, sg_len);
3152        for (i = 0; i < num_rqst; i++) {
3153                for (j = 0; j < rqst[i].rq_nvec; j++) {
3154                        /*
3155                         * The first rqst has a transform header where the
3156                         * first 20 bytes are not part of the encrypted blob
3157                         */
3158                        skip = (i == 0) && (j == 0) ? 20 : 0;
3159                        smb2_sg_set_buf(&sg[idx++],
3160                                        rqst[i].rq_iov[j].iov_base + skip,
3161                                        rqst[i].rq_iov[j].iov_len - skip);
3162                        }
3163
3164                for (j = 0; j < rqst[i].rq_npages; j++) {
3165                        unsigned int len, offset;
3166
3167                        rqst_page_get_length(&rqst[i], j, &len, &offset);
3168                        sg_set_page(&sg[idx++], rqst[i].rq_pages[j], len, offset);
3169                }
3170        }
3171        smb2_sg_set_buf(&sg[idx], sign, SMB2_SIGNATURE_SIZE);
3172        return sg;
3173}
3174
3175static int
3176smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
3177{
3178        struct cifs_ses *ses;
3179        u8 *ses_enc_key;
3180
3181        spin_lock(&cifs_tcp_ses_lock);
3182        list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3183                if (ses->Suid != ses_id)
3184                        continue;
3185                ses_enc_key = enc ? ses->smb3encryptionkey :
3186                                                        ses->smb3decryptionkey;
3187                memcpy(key, ses_enc_key, SMB3_SIGN_KEY_SIZE);
3188                spin_unlock(&cifs_tcp_ses_lock);
3189                return 0;
3190        }
3191        spin_unlock(&cifs_tcp_ses_lock);
3192
3193        return 1;
3194}
3195/*
3196 * Encrypt or decrypt @rqst message. @rqst[0] has the following format:
3197 * iov[0]   - transform header (associate data),
3198 * iov[1-N] - SMB2 header and pages - data to encrypt.
3199 * On success return encrypted data in iov[1-N] and pages, leave iov[0]
3200 * untouched.
3201 */
3202static int
3203crypt_message(struct TCP_Server_Info *server, int num_rqst,
3204              struct smb_rqst *rqst, int enc)
3205{
3206        struct smb2_transform_hdr *tr_hdr =
3207                (struct smb2_transform_hdr *)rqst[0].rq_iov[0].iov_base;
3208        unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20;
3209        int rc = 0;
3210        struct scatterlist *sg;
3211        u8 sign[SMB2_SIGNATURE_SIZE] = {};
3212        u8 key[SMB3_SIGN_KEY_SIZE];
3213        struct aead_request *req;
3214        char *iv;
3215        unsigned int iv_len;
3216        DECLARE_CRYPTO_WAIT(wait);
3217        struct crypto_aead *tfm;
3218        unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
3219
3220        rc = smb2_get_enc_key(server, tr_hdr->SessionId, enc, key);
3221        if (rc) {
3222                cifs_dbg(VFS, "%s: Could not get %scryption key\n", __func__,
3223                         enc ? "en" : "de");
3224                return 0;
3225        }
3226
3227        rc = smb3_crypto_aead_allocate(server);
3228        if (rc) {
3229                cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
3230                return rc;
3231        }
3232
3233        tfm = enc ? server->secmech.ccmaesencrypt :
3234                                                server->secmech.ccmaesdecrypt;
3235        rc = crypto_aead_setkey(tfm, key, SMB3_SIGN_KEY_SIZE);
3236        if (rc) {
3237                cifs_dbg(VFS, "%s: Failed to set aead key %d\n", __func__, rc);
3238                return rc;
3239        }
3240
3241        rc = crypto_aead_setauthsize(tfm, SMB2_SIGNATURE_SIZE);
3242        if (rc) {
3243                cifs_dbg(VFS, "%s: Failed to set authsize %d\n", __func__, rc);
3244                return rc;
3245        }
3246
3247        req = aead_request_alloc(tfm, GFP_KERNEL);
3248        if (!req) {
3249                cifs_dbg(VFS, "%s: Failed to alloc aead request", __func__);
3250                return -ENOMEM;
3251        }
3252
3253        if (!enc) {
3254                memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE);
3255                crypt_len += SMB2_SIGNATURE_SIZE;
3256        }
3257
3258        sg = init_sg(num_rqst, rqst, sign);
3259        if (!sg) {
3260                cifs_dbg(VFS, "%s: Failed to init sg", __func__);
3261                rc = -ENOMEM;
3262                goto free_req;
3263        }
3264
3265        iv_len = crypto_aead_ivsize(tfm);
3266        iv = kzalloc(iv_len, GFP_KERNEL);
3267        if (!iv) {
3268                cifs_dbg(VFS, "%s: Failed to alloc IV", __func__);
3269                rc = -ENOMEM;
3270                goto free_sg;
3271        }
3272        iv[0] = 3;
3273        memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES128CMM_NONCE);
3274
3275        aead_request_set_crypt(req, sg, sg, crypt_len, iv);
3276        aead_request_set_ad(req, assoc_data_len);
3277
3278        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
3279                                  crypto_req_done, &wait);
3280
3281        rc = crypto_wait_req(enc ? crypto_aead_encrypt(req)
3282                                : crypto_aead_decrypt(req), &wait);
3283
3284        if (!rc && enc)
3285                memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE);
3286
3287        kfree(iv);
3288free_sg:
3289        kfree(sg);
3290free_req:
3291        kfree(req);
3292        return rc;
3293}
3294
3295void
3296smb3_free_compound_rqst(int num_rqst, struct smb_rqst *rqst)
3297{
3298        int i, j;
3299
3300        for (i = 0; i < num_rqst; i++) {
3301                if (rqst[i].rq_pages) {
3302                        for (j = rqst[i].rq_npages - 1; j >= 0; j--)
3303                                put_page(rqst[i].rq_pages[j]);
3304                        kfree(rqst[i].rq_pages);
3305                }
3306        }
3307}
3308
3309/*
3310 * This function will initialize new_rq and encrypt the content.
3311 * The first entry, new_rq[0], only contains a single iov which contains
3312 * a smb2_transform_hdr and is pre-allocated by the caller.
3313 * This function then populates new_rq[1+] with the content from olq_rq[0+].
3314 *
3315 * The end result is an array of smb_rqst structures where the first structure
3316 * only contains a single iov for the transform header which we then can pass
3317 * to crypt_message().
3318 *
3319 * new_rq[0].rq_iov[0] :  smb2_transform_hdr pre-allocated by the caller
3320 * new_rq[1+].rq_iov[*] == old_rq[0+].rq_iov[*] : SMB2/3 requests
3321 */
3322static int
3323smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst,
3324                       struct smb_rqst *new_rq, struct smb_rqst *old_rq)
3325{
3326        struct page **pages;
3327        struct smb2_transform_hdr *tr_hdr = new_rq[0].rq_iov[0].iov_base;
3328        unsigned int npages;
3329        unsigned int orig_len = 0;
3330        int i, j;
3331        int rc = -ENOMEM;
3332
3333        for (i = 1; i < num_rqst; i++) {
3334                npages = old_rq[i - 1].rq_npages;
3335                pages = kmalloc_array(npages, sizeof(struct page *),
3336                                      GFP_KERNEL);
3337                if (!pages)
3338                        goto err_free;
3339
3340                new_rq[i].rq_pages = pages;
3341                new_rq[i].rq_npages = npages;
3342                new_rq[i].rq_offset = old_rq[i - 1].rq_offset;
3343                new_rq[i].rq_pagesz = old_rq[i - 1].rq_pagesz;
3344                new_rq[i].rq_tailsz = old_rq[i - 1].rq_tailsz;
3345                new_rq[i].rq_iov = old_rq[i - 1].rq_iov;
3346                new_rq[i].rq_nvec = old_rq[i - 1].rq_nvec;
3347
3348                orig_len += smb_rqst_len(server, &old_rq[i - 1]);
3349
3350                for (j = 0; j < npages; j++) {
3351                        pages[j] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
3352                        if (!pages[j])
3353                                goto err_free;
3354                }
3355
3356                /* copy pages form the old */
3357                for (j = 0; j < npages; j++) {
3358                        char *dst, *src;
3359                        unsigned int offset, len;
3360
3361                        rqst_page_get_length(&new_rq[i], j, &len, &offset);
3362
3363                        dst = (char *) kmap(new_rq[i].rq_pages[j]) + offset;
3364                        src = (char *) kmap(old_rq[i - 1].rq_pages[j]) + offset;
3365
3366                        memcpy(dst, src, len);
3367                        kunmap(new_rq[i].rq_pages[j]);
3368                        kunmap(old_rq[i - 1].rq_pages[j]);
3369                }
3370        }
3371
3372        /* fill the 1st iov with a transform header */
3373        fill_transform_hdr(tr_hdr, orig_len, old_rq);
3374
3375        rc = crypt_message(server, num_rqst, new_rq, 1);
3376        cifs_dbg(FYI, "encrypt message returned %d", rc);
3377        if (rc)
3378                goto err_free;
3379
3380        return rc;
3381
3382err_free:
3383        smb3_free_compound_rqst(num_rqst - 1, &new_rq[1]);
3384        return rc;
3385}
3386
3387static int
3388smb3_is_transform_hdr(void *buf)
3389{
3390        struct smb2_transform_hdr *trhdr = buf;
3391
3392        return trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM;
3393}
3394
3395static int
3396decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
3397                 unsigned int buf_data_size, struct page **pages,
3398                 unsigned int npages, unsigned int page_data_size)
3399{
3400        struct kvec iov[2];
3401        struct smb_rqst rqst = {NULL};
3402        int rc;
3403
3404        iov[0].iov_base = buf;
3405        iov[0].iov_len = sizeof(struct smb2_transform_hdr);
3406        iov[1].iov_base = buf + sizeof(struct smb2_transform_hdr);
3407        iov[1].iov_len = buf_data_size;
3408
3409        rqst.rq_iov = iov;
3410        rqst.rq_nvec = 2;
3411        rqst.rq_pages = pages;
3412        rqst.rq_npages = npages;
3413        rqst.rq_pagesz = PAGE_SIZE;
3414        rqst.rq_tailsz = (page_data_size % PAGE_SIZE) ? : PAGE_SIZE;
3415
3416        rc = crypt_message(server, 1, &rqst, 0);
3417        cifs_dbg(FYI, "decrypt message returned %d\n", rc);
3418
3419        if (rc)
3420                return rc;
3421
3422        memmove(buf, iov[1].iov_base, buf_data_size);
3423
3424        server->total_read = buf_data_size + page_data_size;
3425
3426        return rc;
3427}
3428
3429static int
3430read_data_into_pages(struct TCP_Server_Info *server, struct page **pages,
3431                     unsigned int npages, unsigned int len)
3432{
3433        int i;
3434        int length;
3435
3436        for (i = 0; i < npages; i++) {
3437                struct page *page = pages[i];
3438                size_t n;
3439
3440                n = len;
3441                if (len >= PAGE_SIZE) {
3442                        /* enough data to fill the page */
3443                        n = PAGE_SIZE;
3444                        len -= n;
3445                } else {
3446                        zero_user(page, len, PAGE_SIZE - len);
3447                        len = 0;
3448                }
3449                length = cifs_read_page_from_socket(server, page, 0, n);
3450                if (length < 0)
3451                        return length;
3452                server->total_read += length;
3453        }
3454
3455        return 0;
3456}
3457
3458static int
3459init_read_bvec(struct page **pages, unsigned int npages, unsigned int data_size,
3460               unsigned int cur_off, struct bio_vec **page_vec)
3461{
3462        struct bio_vec *bvec;
3463        int i;
3464
3465        bvec = kcalloc(npages, sizeof(struct bio_vec), GFP_KERNEL);
3466        if (!bvec)
3467                return -ENOMEM;
3468
3469        for (i = 0; i < npages; i++) {
3470                bvec[i].bv_page = pages[i];
3471                bvec[i].bv_offset = (i == 0) ? cur_off : 0;
3472                bvec[i].bv_len = min_t(unsigned int, PAGE_SIZE, data_size);
3473                data_size -= bvec[i].bv_len;
3474        }
3475
3476        if (data_size != 0) {
3477                cifs_dbg(VFS, "%s: something went wrong\n", __func__);
3478                kfree(bvec);
3479                return -EIO;
3480        }
3481
3482        *page_vec = bvec;
3483        return 0;
3484}
3485
3486static int
3487handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
3488                 char *buf, unsigned int buf_len, struct page **pages,
3489                 unsigned int npages, unsigned int page_data_size)
3490{
3491        unsigned int data_offset;
3492        unsigned int data_len;
3493        unsigned int cur_off;
3494        unsigned int cur_page_idx;
3495        unsigned int pad_len;
3496        struct cifs_readdata *rdata = mid->callback_data;
3497        struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
3498        struct bio_vec *bvec = NULL;
3499        struct iov_iter iter;
3500        struct kvec iov;
3501        int length;
3502        bool use_rdma_mr = false;
3503
3504        if (shdr->Command != SMB2_READ) {
3505                cifs_dbg(VFS, "only big read responses are supported\n");
3506                return -ENOTSUPP;
3507        }
3508
3509        if (server->ops->is_session_expired &&
3510            server->ops->is_session_expired(buf)) {
3511                cifs_reconnect(server);
3512                wake_up(&server->response_q);
3513                return -1;
3514        }
3515
3516        if (server->ops->is_status_pending &&
3517                        server->ops->is_status_pending(buf, server))
3518                return -1;
3519
3520        /* set up first two iov to get credits */
3521        rdata->iov[0].iov_base = buf;
3522        rdata->iov[0].iov_len = 0;
3523        rdata->iov[1].iov_base = buf;
3524        rdata->iov[1].iov_len =
3525                min_t(unsigned int, buf_len, server->vals->read_rsp_size);
3526        cifs_dbg(FYI, "0: iov_base=%p iov_len=%zu\n",
3527                 rdata->iov[0].iov_base, rdata->iov[0].iov_len);
3528        cifs_dbg(FYI, "1: iov_base=%p iov_len=%zu\n",
3529                 rdata->iov[1].iov_base, rdata->iov[1].iov_len);
3530
3531        rdata->result = server->ops->map_error(buf, true);
3532        if (rdata->result != 0) {
3533                cifs_dbg(FYI, "%s: server returned error %d\n",
3534                         __func__, rdata->result);
3535                /* normal error on read response */
3536                dequeue_mid(mid, false);
3537                return 0;
3538        }
3539
3540        data_offset = server->ops->read_data_offset(buf);
3541#ifdef CONFIG_CIFS_SMB_DIRECT
3542        use_rdma_mr = rdata->mr;
3543#endif
3544        data_len = server->ops->read_data_length(buf, use_rdma_mr);
3545
3546        if (data_offset < server->vals->read_rsp_size) {
3547                /*
3548                 * win2k8 sometimes sends an offset of 0 when the read
3549                 * is beyond the EOF. Treat it as if the data starts just after
3550                 * the header.
3551                 */
3552                cifs_dbg(FYI, "%s: data offset (%u) inside read response header\n",
3553                         __func__, data_offset);
3554                data_offset = server->vals->read_rsp_size;
3555        } else if (data_offset > MAX_CIFS_SMALL_BUFFER_SIZE) {
3556                /* data_offset is beyond the end of smallbuf */
3557                cifs_dbg(FYI, "%s: data offset (%u) beyond end of smallbuf\n",
3558                         __func__, data_offset);
3559                rdata->result = -EIO;
3560                dequeue_mid(mid, rdata->result);
3561                return 0;
3562        }
3563
3564        pad_len = data_offset - server->vals->read_rsp_size;
3565
3566        if (buf_len <= data_offset) {
3567                /* read response payload is in pages */
3568                cur_page_idx = pad_len / PAGE_SIZE;
3569                cur_off = pad_len % PAGE_SIZE;
3570
3571                if (cur_page_idx != 0) {
3572                        /* data offset is beyond the 1st page of response */
3573                        cifs_dbg(FYI, "%s: data offset (%u) beyond 1st page of response\n",
3574                                 __func__, data_offset);
3575                        rdata->result = -EIO;
3576                        dequeue_mid(mid, rdata->result);
3577                        return 0;
3578                }
3579
3580                if (data_len > page_data_size - pad_len) {
3581                        /* data_len is corrupt -- discard frame */
3582                        rdata->result = -EIO;
3583                        dequeue_mid(mid, rdata->result);
3584                        return 0;
3585                }
3586
3587                rdata->result = init_read_bvec(pages, npages, page_data_size,
3588                                               cur_off, &bvec);
3589                if (rdata->result != 0) {
3590                        dequeue_mid(mid, rdata->result);
3591                        return 0;
3592                }
3593
3594                iov_iter_bvec(&iter, WRITE | ITER_BVEC, bvec, npages, data_len);
3595        } else if (buf_len >= data_offset + data_len) {
3596                /* read response payload is in buf */
3597                WARN_ONCE(npages > 0, "read data can be either in buf or in pages");
3598                iov.iov_base = buf + data_offset;
3599                iov.iov_len = data_len;
3600                iov_iter_kvec(&iter, WRITE | ITER_KVEC, &iov, 1, data_len);
3601        } else {
3602                /* read response payload cannot be in both buf and pages */
3603                WARN_ONCE(1, "buf can not contain only a part of read data");
3604                rdata->result = -EIO;
3605                dequeue_mid(mid, rdata->result);
3606                return 0;
3607        }
3608
3609        length = rdata->copy_into_pages(server, rdata, &iter);
3610
3611        kfree(bvec);
3612
3613        if (length < 0)
3614                return length;
3615
3616        dequeue_mid(mid, false);
3617        return length;
3618}
3619
3620static int
3621receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
3622{
3623        char *buf = server->smallbuf;
3624        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
3625        unsigned int npages;
3626        struct page **pages;
3627        unsigned int len;
3628        unsigned int buflen = server->pdu_size;
3629        int rc;
3630        int i = 0;
3631
3632        len = min_t(unsigned int, buflen, server->vals->read_rsp_size +
3633                sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1;
3634
3635        rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len);
3636        if (rc < 0)
3637                return rc;
3638        server->total_read += rc;
3639
3640        len = le32_to_cpu(tr_hdr->OriginalMessageSize) -
3641                server->vals->read_rsp_size;
3642        npages = DIV_ROUND_UP(len, PAGE_SIZE);
3643
3644        pages = kmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
3645        if (!pages) {
3646                rc = -ENOMEM;
3647                goto discard_data;
3648        }
3649
3650        for (; i < npages; i++) {
3651                pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
3652                if (!pages[i]) {
3653                        rc = -ENOMEM;
3654                        goto discard_data;
3655                }
3656        }
3657
3658        /* read read data into pages */
3659        rc = read_data_into_pages(server, pages, npages, len);
3660        if (rc)
3661                goto free_pages;
3662
3663        rc = cifs_discard_remaining_data(server);
3664        if (rc)
3665                goto free_pages;
3666
3667        rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size,
3668                              pages, npages, len);
3669        if (rc)
3670                goto free_pages;
3671
3672        *mid = smb2_find_mid(server, buf);
3673        if (*mid == NULL)
3674                cifs_dbg(FYI, "mid not found\n");
3675        else {
3676                cifs_dbg(FYI, "mid found\n");
3677                (*mid)->decrypted = true;
3678                rc = handle_read_data(server, *mid, buf,
3679                                      server->vals->read_rsp_size,
3680                                      pages, npages, len);
3681        }
3682
3683free_pages:
3684        for (i = i - 1; i >= 0; i--)
3685                put_page(pages[i]);
3686        kfree(pages);
3687        return rc;
3688discard_data:
3689        cifs_discard_remaining_data(server);
3690        goto free_pages;
3691}
3692
3693static int
3694receive_encrypted_standard(struct TCP_Server_Info *server,
3695                           struct mid_q_entry **mids, char **bufs,
3696                           int *num_mids)
3697{
3698        int ret, length;
3699        char *buf = server->smallbuf;
3700        char *tmpbuf;
3701        struct smb2_sync_hdr *shdr;
3702        unsigned int pdu_length = server->pdu_size;
3703        unsigned int buf_size;
3704        struct mid_q_entry *mid_entry;
3705        int next_is_large;
3706        char *next_buffer = NULL;
3707
3708        *num_mids = 0;
3709
3710        /* switch to large buffer if too big for a small one */
3711        if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE) {
3712                server->large_buf = true;
3713                memcpy(server->bigbuf, buf, server->total_read);
3714                buf = server->bigbuf;
3715        }
3716
3717        /* now read the rest */
3718        length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
3719                                pdu_length - HEADER_SIZE(server) + 1);
3720        if (length < 0)
3721                return length;
3722        server->total_read += length;
3723
3724        buf_size = pdu_length - sizeof(struct smb2_transform_hdr);
3725        length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0);
3726        if (length)
3727                return length;
3728
3729        next_is_large = server->large_buf;
3730 one_more:
3731        shdr = (struct smb2_sync_hdr *)buf;
3732        if (shdr->NextCommand) {
3733                if (next_is_large) {
3734                        tmpbuf = server->bigbuf;
3735                        next_buffer = (char *)cifs_buf_get();
3736                } else {
3737                        tmpbuf = server->smallbuf;
3738                        next_buffer = (char *)cifs_small_buf_get();
3739                }
3740                memcpy(next_buffer,
3741                       tmpbuf + le32_to_cpu(shdr->NextCommand),
3742                       pdu_length - le32_to_cpu(shdr->NextCommand));
3743        }
3744
3745        mid_entry = smb2_find_mid(server, buf);
3746        if (mid_entry == NULL)
3747                cifs_dbg(FYI, "mid not found\n");
3748        else {
3749                cifs_dbg(FYI, "mid found\n");
3750                mid_entry->decrypted = true;
3751                mid_entry->resp_buf_size = server->pdu_size;
3752        }
3753
3754        if (*num_mids >= MAX_COMPOUND) {
3755                cifs_dbg(VFS, "too many PDUs in compound\n");
3756                return -1;
3757        }
3758        bufs[*num_mids] = buf;
3759        mids[(*num_mids)++] = mid_entry;
3760
3761        if (mid_entry && mid_entry->handle)
3762                ret = mid_entry->handle(server, mid_entry);
3763        else
3764                ret = cifs_handle_standard(server, mid_entry);
3765
3766        if (ret == 0 && shdr->NextCommand) {
3767                pdu_length -= le32_to_cpu(shdr->NextCommand);
3768                server->large_buf = next_is_large;
3769                if (next_is_large)
3770                        server->bigbuf = next_buffer;
3771                else
3772                        server->smallbuf = next_buffer;
3773
3774                buf += le32_to_cpu(shdr->NextCommand);
3775                goto one_more;
3776        }
3777
3778        return ret;
3779}
3780
3781static int
3782smb3_receive_transform(struct TCP_Server_Info *server,
3783                       struct mid_q_entry **mids, char **bufs, int *num_mids)
3784{
3785        char *buf = server->smallbuf;
3786        unsigned int pdu_length = server->pdu_size;
3787        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
3788        unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
3789
3790        if (pdu_length < sizeof(struct smb2_transform_hdr) +
3791                                                sizeof(struct smb2_sync_hdr)) {
3792                cifs_dbg(VFS, "Transform message is too small (%u)\n",
3793                         pdu_length);
3794                cifs_reconnect(server);
3795                wake_up(&server->response_q);
3796                return -ECONNABORTED;
3797        }
3798
3799        if (pdu_length < orig_len + sizeof(struct smb2_transform_hdr)) {
3800                cifs_dbg(VFS, "Transform message is broken\n");
3801                cifs_reconnect(server);
3802                wake_up(&server->response_q);
3803                return -ECONNABORTED;
3804        }
3805
3806        /* TODO: add support for compounds containing READ. */
3807        if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server)) {
3808                *num_mids = 1;
3809                return receive_encrypted_read(server, &mids[0]);
3810        }
3811
3812        return receive_encrypted_standard(server, mids, bufs, num_mids);
3813}
3814
3815int
3816smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
3817{
3818        char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
3819
3820        return handle_read_data(server, mid, buf, server->pdu_size,
3821                                NULL, 0, 0);
3822}
3823
3824static int
3825smb2_next_header(char *buf)
3826{
3827        struct smb2_sync_hdr *hdr = (struct smb2_sync_hdr *)buf;
3828        struct smb2_transform_hdr *t_hdr = (struct smb2_transform_hdr *)buf;
3829
3830        if (hdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM)
3831                return sizeof(struct smb2_transform_hdr) +
3832                  le32_to_cpu(t_hdr->OriginalMessageSize);
3833
3834        return le32_to_cpu(hdr->NextCommand);
3835}
3836
3837static int
3838smb2_make_node(unsigned int xid, struct inode *inode,
3839               struct dentry *dentry, struct cifs_tcon *tcon,
3840               char *full_path, umode_t mode, dev_t dev)
3841{
3842        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3843        int rc = -EPERM;
3844        int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
3845        FILE_ALL_INFO *buf = NULL;
3846        struct cifs_io_parms io_parms;
3847        __u32 oplock = 0;
3848        struct cifs_fid fid;
3849        struct cifs_open_parms oparms;
3850        unsigned int bytes_written;
3851        struct win_dev *pdev;
3852        struct kvec iov[2];
3853
3854        /*
3855         * Check if mounted with mount parm 'sfu' mount parm.
3856         * SFU emulation should work with all servers, but only
3857         * supports block and char device (no socket & fifo),
3858         * and was used by default in earlier versions of Windows
3859         */
3860        if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL))
3861                goto out;
3862
3863        /*
3864         * TODO: Add ability to create instead via reparse point. Windows (e.g.
3865         * their current NFS server) uses this approach to expose special files
3866         * over SMB2/SMB3 and Samba will do this with SMB3.1.1 POSIX Extensions
3867         */
3868
3869        if (!S_ISCHR(mode) && !S_ISBLK(mode))
3870                goto out;
3871
3872        cifs_dbg(FYI, "sfu compat create special file\n");
3873
3874        buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
3875        if (buf == NULL) {
3876                rc = -ENOMEM;
3877                goto out;
3878        }
3879
3880        if (backup_cred(cifs_sb))
3881                create_options |= CREATE_OPEN_BACKUP_INTENT;
3882
3883        oparms.tcon = tcon;
3884        oparms.cifs_sb = cifs_sb;
3885        oparms.desired_access = GENERIC_WRITE;
3886        oparms.create_options = create_options;
3887        oparms.disposition = FILE_CREATE;
3888        oparms.path = full_path;
3889        oparms.fid = &fid;
3890        oparms.reconnect = false;
3891
3892        if (tcon->ses->server->oplocks)
3893                oplock = REQ_OPLOCK;
3894        else
3895                oplock = 0;
3896        rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, buf);
3897        if (rc)
3898                goto out;
3899
3900        /*
3901         * BB Do not bother to decode buf since no local inode yet to put
3902         * timestamps in, but we can reuse it safely.
3903         */
3904
3905        pdev = (struct win_dev *)buf;
3906        io_parms.pid = current->tgid;
3907        io_parms.tcon = tcon;
3908        io_parms.offset = 0;
3909        io_parms.length = sizeof(struct win_dev);
3910        iov[1].iov_base = buf;
3911        iov[1].iov_len = sizeof(struct win_dev);
3912        if (S_ISCHR(mode)) {
3913                memcpy(pdev->type, "IntxCHR", 8);
3914                pdev->major = cpu_to_le64(MAJOR(dev));
3915                pdev->minor = cpu_to_le64(MINOR(dev));
3916                rc = tcon->ses->server->ops->sync_write(xid, &fid, &io_parms,
3917                                                        &bytes_written, iov, 1);
3918        } else if (S_ISBLK(mode)) {
3919                memcpy(pdev->type, "IntxBLK", 8);
3920                pdev->major = cpu_to_le64(MAJOR(dev));
3921                pdev->minor = cpu_to_le64(MINOR(dev));
3922                rc = tcon->ses->server->ops->sync_write(xid, &fid, &io_parms,
3923                                                        &bytes_written, iov, 1);
3924        }
3925        tcon->ses->server->ops->close(xid, tcon, &fid);
3926        d_drop(dentry);
3927
3928        /* FIXME: add code here to set EAs */
3929out:
3930        kfree(buf);
3931        return rc;
3932}
3933
3934
3935struct smb_version_operations smb20_operations = {
3936        .compare_fids = smb2_compare_fids,
3937        .setup_request = smb2_setup_request,
3938        .setup_async_request = smb2_setup_async_request,
3939        .check_receive = smb2_check_receive,
3940        .add_credits = smb2_add_credits,
3941        .set_credits = smb2_set_credits,
3942        .get_credits_field = smb2_get_credits_field,
3943        .get_credits = smb2_get_credits,
3944        .wait_mtu_credits = cifs_wait_mtu_credits,
3945        .get_next_mid = smb2_get_next_mid,
3946        .revert_current_mid = smb2_revert_current_mid,
3947        .read_data_offset = smb2_read_data_offset,
3948        .read_data_length = smb2_read_data_length,
3949        .map_error = map_smb2_to_linux_error,
3950        .find_mid = smb2_find_mid,
3951        .check_message = smb2_check_message,
3952        .dump_detail = smb2_dump_detail,
3953        .clear_stats = smb2_clear_stats,
3954        .print_stats = smb2_print_stats,
3955        .is_oplock_break = smb2_is_valid_oplock_break,
3956        .handle_cancelled_mid = smb2_handle_cancelled_mid,
3957        .downgrade_oplock = smb2_downgrade_oplock,
3958        .need_neg = smb2_need_neg,
3959        .negotiate = smb2_negotiate,
3960        .negotiate_wsize = smb2_negotiate_wsize,
3961        .negotiate_rsize = smb2_negotiate_rsize,
3962        .sess_setup = SMB2_sess_setup,
3963        .logoff = SMB2_logoff,
3964        .tree_connect = SMB2_tcon,
3965        .tree_disconnect = SMB2_tdis,
3966        .qfs_tcon = smb2_qfs_tcon,
3967        .is_path_accessible = smb2_is_path_accessible,
3968        .can_echo = smb2_can_echo,
3969        .echo = SMB2_echo,
3970        .query_path_info = smb2_query_path_info,
3971        .get_srv_inum = smb2_get_srv_inum,
3972        .query_file_info = smb2_query_file_info,
3973        .set_path_size = smb2_set_path_size,
3974        .set_file_size = smb2_set_file_size,
3975        .set_file_info = smb2_set_file_info,
3976        .set_compression = smb2_set_compression,
3977        .mkdir = smb2_mkdir,
3978        .mkdir_setinfo = smb2_mkdir_setinfo,
3979        .rmdir = smb2_rmdir,
3980        .unlink = smb2_unlink,
3981        .rename = smb2_rename_path,
3982        .create_hardlink = smb2_create_hardlink,
3983        .query_symlink = smb2_query_symlink,
3984        .query_mf_symlink = smb3_query_mf_symlink,
3985        .create_mf_symlink = smb3_create_mf_symlink,
3986        .open = smb2_open_file,
3987        .set_fid = smb2_set_fid,
3988        .close = smb2_close_file,
3989        .flush = smb2_flush_file,
3990        .async_readv = smb2_async_readv,
3991        .async_writev = smb2_async_writev,
3992        .sync_read = smb2_sync_read,
3993        .sync_write = smb2_sync_write,
3994        .query_dir_first = smb2_query_dir_first,
3995        .query_dir_next = smb2_query_dir_next,
3996        .close_dir = smb2_close_dir,
3997        .calc_smb_size = smb2_calc_size,
3998        .is_status_pending = smb2_is_status_pending,
3999        .is_session_expired = smb2_is_session_expired,
4000        .oplock_response = smb2_oplock_response,
4001        .queryfs = smb2_queryfs,
4002        .mand_lock = smb2_mand_lock,
4003        .mand_unlock_range = smb2_unlock_range,
4004        .push_mand_locks = smb2_push_mandatory_locks,
4005        .get_lease_key = smb2_get_lease_key,
4006        .set_lease_key = smb2_set_lease_key,
4007        .new_lease_key = smb2_new_lease_key,
4008        .calc_signature = smb2_calc_signature,
4009        .is_read_op = smb2_is_read_op,
4010        .set_oplock_level = smb2_set_oplock_level,
4011        .create_lease_buf = smb2_create_lease_buf,
4012        .parse_lease_buf = smb2_parse_lease_buf,
4013        .copychunk_range = smb2_copychunk_range,
4014        .wp_retry_size = smb2_wp_retry_size,
4015        .dir_needs_close = smb2_dir_needs_close,
4016        .get_dfs_refer = smb2_get_dfs_refer,
4017        .select_sectype = smb2_select_sectype,
4018#ifdef CONFIG_CIFS_XATTR
4019        .query_all_EAs = smb2_query_eas,
4020        .set_EA = smb2_set_ea,
4021#endif /* CIFS_XATTR */
4022#ifdef CONFIG_CIFS_ACL
4023        .get_acl = get_smb2_acl,
4024        .get_acl_by_fid = get_smb2_acl_by_fid,
4025        .set_acl = set_smb2_acl,
4026#endif /* CIFS_ACL */
4027        .next_header = smb2_next_header,
4028        .ioctl_query_info = smb2_ioctl_query_info,
4029        .make_node = smb2_make_node,
4030};
4031
4032struct smb_version_operations smb21_operations = {
4033        .compare_fids = smb2_compare_fids,
4034        .setup_request = smb2_setup_request,
4035        .setup_async_request = smb2_setup_async_request,
4036        .check_receive = smb2_check_receive,
4037        .add_credits = smb2_add_credits,
4038        .set_credits = smb2_set_credits,
4039        .get_credits_field = smb2_get_credits_field,
4040        .get_credits = smb2_get_credits,
4041        .wait_mtu_credits = smb2_wait_mtu_credits,
4042        .adjust_credits = smb2_adjust_credits,
4043        .get_next_mid = smb2_get_next_mid,
4044        .revert_current_mid = smb2_revert_current_mid,
4045        .read_data_offset = smb2_read_data_offset,
4046        .read_data_length = smb2_read_data_length,
4047        .map_error = map_smb2_to_linux_error,
4048        .find_mid = smb2_find_mid,
4049        .check_message = smb2_check_message,
4050        .dump_detail = smb2_dump_detail,
4051        .clear_stats = smb2_clear_stats,
4052        .print_stats = smb2_print_stats,
4053        .is_oplock_break = smb2_is_valid_oplock_break,
4054        .handle_cancelled_mid = smb2_handle_cancelled_mid,
4055        .downgrade_oplock = smb21_downgrade_oplock,
4056        .need_neg = smb2_need_neg,
4057        .negotiate = smb2_negotiate,
4058        .negotiate_wsize = smb2_negotiate_wsize,
4059        .negotiate_rsize = smb2_negotiate_rsize,
4060        .sess_setup = SMB2_sess_setup,
4061        .logoff = SMB2_logoff,
4062        .tree_connect = SMB2_tcon,
4063        .tree_disconnect = SMB2_tdis,
4064        .qfs_tcon = smb2_qfs_tcon,
4065        .is_path_accessible = smb2_is_path_accessible,
4066        .can_echo = smb2_can_echo,
4067        .echo = SMB2_echo,
4068        .query_path_info = smb2_query_path_info,
4069        .get_srv_inum = smb2_get_srv_inum,
4070        .query_file_info = smb2_query_file_info,
4071        .set_path_size = smb2_set_path_size,
4072        .set_file_size = smb2_set_file_size,
4073        .set_file_info = smb2_set_file_info,
4074        .set_compression = smb2_set_compression,
4075        .mkdir = smb2_mkdir,
4076        .mkdir_setinfo = smb2_mkdir_setinfo,
4077        .rmdir = smb2_rmdir,
4078        .unlink = smb2_unlink,
4079        .rename = smb2_rename_path,
4080        .create_hardlink = smb2_create_hardlink,
4081        .query_symlink = smb2_query_symlink,
4082        .query_mf_symlink = smb3_query_mf_symlink,
4083        .create_mf_symlink = smb3_create_mf_symlink,
4084        .open = smb2_open_file,
4085        .set_fid = smb2_set_fid,
4086        .close = smb2_close_file,
4087        .flush = smb2_flush_file,
4088        .async_readv = smb2_async_readv,
4089        .async_writev = smb2_async_writev,
4090        .sync_read = smb2_sync_read,
4091        .sync_write = smb2_sync_write,
4092        .query_dir_first = smb2_query_dir_first,
4093        .query_dir_next = smb2_query_dir_next,
4094        .close_dir = smb2_close_dir,
4095        .calc_smb_size = smb2_calc_size,
4096        .is_status_pending = smb2_is_status_pending,
4097        .is_session_expired = smb2_is_session_expired,
4098        .oplock_response = smb2_oplock_response,
4099        .queryfs = smb2_queryfs,
4100        .mand_lock = smb2_mand_lock,
4101        .mand_unlock_range = smb2_unlock_range,
4102        .push_mand_locks = smb2_push_mandatory_locks,
4103        .get_lease_key = smb2_get_lease_key,
4104        .set_lease_key = smb2_set_lease_key,
4105        .new_lease_key = smb2_new_lease_key,
4106        .calc_signature = smb2_calc_signature,
4107        .is_read_op = smb21_is_read_op,
4108        .set_oplock_level = smb21_set_oplock_level,
4109        .create_lease_buf = smb2_create_lease_buf,
4110        .parse_lease_buf = smb2_parse_lease_buf,
4111        .copychunk_range = smb2_copychunk_range,
4112        .wp_retry_size = smb2_wp_retry_size,
4113        .dir_needs_close = smb2_dir_needs_close,
4114        .enum_snapshots = smb3_enum_snapshots,
4115        .get_dfs_refer = smb2_get_dfs_refer,
4116        .select_sectype = smb2_select_sectype,
4117#ifdef CONFIG_CIFS_XATTR
4118        .query_all_EAs = smb2_query_eas,
4119        .set_EA = smb2_set_ea,
4120#endif /* CIFS_XATTR */
4121#ifdef CONFIG_CIFS_ACL
4122        .get_acl = get_smb2_acl,
4123        .get_acl_by_fid = get_smb2_acl_by_fid,
4124        .set_acl = set_smb2_acl,
4125#endif /* CIFS_ACL */
4126        .next_header = smb2_next_header,
4127        .ioctl_query_info = smb2_ioctl_query_info,
4128        .make_node = smb2_make_node,
4129};
4130
4131struct smb_version_operations smb30_operations = {
4132        .compare_fids = smb2_compare_fids,
4133        .setup_request = smb2_setup_request,
4134        .setup_async_request = smb2_setup_async_request,
4135        .check_receive = smb2_check_receive,
4136        .add_credits = smb2_add_credits,
4137        .set_credits = smb2_set_credits,
4138        .get_credits_field = smb2_get_credits_field,
4139        .get_credits = smb2_get_credits,
4140        .wait_mtu_credits = smb2_wait_mtu_credits,
4141        .adjust_credits = smb2_adjust_credits,
4142        .get_next_mid = smb2_get_next_mid,
4143        .revert_current_mid = smb2_revert_current_mid,
4144        .read_data_offset = smb2_read_data_offset,
4145        .read_data_length = smb2_read_data_length,
4146        .map_error = map_smb2_to_linux_error,
4147        .find_mid = smb2_find_mid,
4148        .check_message = smb2_check_message,
4149        .dump_detail = smb2_dump_detail,
4150        .clear_stats = smb2_clear_stats,
4151        .print_stats = smb2_print_stats,
4152        .dump_share_caps = smb2_dump_share_caps,
4153        .is_oplock_break = smb2_is_valid_oplock_break,
4154        .handle_cancelled_mid = smb2_handle_cancelled_mid,
4155        .downgrade_oplock = smb21_downgrade_oplock,
4156        .need_neg = smb2_need_neg,
4157        .negotiate = smb2_negotiate,
4158        .negotiate_wsize = smb3_negotiate_wsize,
4159        .negotiate_rsize = smb3_negotiate_rsize,
4160        .sess_setup = SMB2_sess_setup,
4161        .logoff = SMB2_logoff,
4162        .tree_connect = SMB2_tcon,
4163        .tree_disconnect = SMB2_tdis,
4164        .qfs_tcon = smb3_qfs_tcon,
4165        .is_path_accessible = smb2_is_path_accessible,
4166        .can_echo = smb2_can_echo,
4167        .echo = SMB2_echo,
4168        .query_path_info = smb2_query_path_info,
4169        .get_srv_inum = smb2_get_srv_inum,
4170        .query_file_info = smb2_query_file_info,
4171        .set_path_size = smb2_set_path_size,
4172        .set_file_size = smb2_set_file_size,
4173        .set_file_info = smb2_set_file_info,
4174        .set_compression = smb2_set_compression,
4175        .mkdir = smb2_mkdir,
4176        .mkdir_setinfo = smb2_mkdir_setinfo,
4177        .rmdir = smb2_rmdir,
4178        .unlink = smb2_unlink,
4179        .rename = smb2_rename_path,
4180        .create_hardlink = smb2_create_hardlink,
4181        .query_symlink = smb2_query_symlink,
4182        .query_mf_symlink = smb3_query_mf_symlink,
4183        .create_mf_symlink = smb3_create_mf_symlink,
4184        .open = smb2_open_file,
4185        .set_fid = smb2_set_fid,
4186        .close = smb2_close_file,
4187        .flush = smb2_flush_file,
4188        .async_readv = smb2_async_readv,
4189        .async_writev = smb2_async_writev,
4190        .sync_read = smb2_sync_read,
4191        .sync_write = smb2_sync_write,
4192        .query_dir_first = smb2_query_dir_first,
4193        .query_dir_next = smb2_query_dir_next,
4194        .close_dir = smb2_close_dir,
4195        .calc_smb_size = smb2_calc_size,
4196        .is_status_pending = smb2_is_status_pending,
4197        .is_session_expired = smb2_is_session_expired,
4198        .oplock_response = smb2_oplock_response,
4199        .queryfs = smb2_queryfs,
4200        .mand_lock = smb2_mand_lock,
4201        .mand_unlock_range = smb2_unlock_range,
4202        .push_mand_locks = smb2_push_mandatory_locks,
4203        .get_lease_key = smb2_get_lease_key,
4204        .set_lease_key = smb2_set_lease_key,
4205        .new_lease_key = smb2_new_lease_key,
4206        .generate_signingkey = generate_smb30signingkey,
4207        .calc_signature = smb3_calc_signature,
4208        .set_integrity  = smb3_set_integrity,
4209        .is_read_op = smb21_is_read_op,
4210        .set_oplock_level = smb3_set_oplock_level,
4211        .create_lease_buf = smb3_create_lease_buf,
4212        .parse_lease_buf = smb3_parse_lease_buf,
4213        .copychunk_range = smb2_copychunk_range,
4214        .duplicate_extents = smb2_duplicate_extents,
4215        .validate_negotiate = smb3_validate_negotiate,
4216        .wp_retry_size = smb2_wp_retry_size,
4217        .dir_needs_close = smb2_dir_needs_close,
4218        .fallocate = smb3_fallocate,
4219        .enum_snapshots = smb3_enum_snapshots,
4220        .init_transform_rq = smb3_init_transform_rq,
4221        .is_transform_hdr = smb3_is_transform_hdr,
4222        .receive_transform = smb3_receive_transform,
4223        .get_dfs_refer = smb2_get_dfs_refer,
4224        .select_sectype = smb2_select_sectype,
4225#ifdef CONFIG_CIFS_XATTR
4226        .query_all_EAs = smb2_query_eas,
4227        .set_EA = smb2_set_ea,
4228#endif /* CIFS_XATTR */
4229#ifdef CONFIG_CIFS_ACL
4230        .get_acl = get_smb2_acl,
4231        .get_acl_by_fid = get_smb2_acl_by_fid,
4232        .set_acl = set_smb2_acl,
4233#endif /* CIFS_ACL */
4234        .next_header = smb2_next_header,
4235        .ioctl_query_info = smb2_ioctl_query_info,
4236        .make_node = smb2_make_node,
4237};
4238
4239struct smb_version_operations smb311_operations = {
4240        .compare_fids = smb2_compare_fids,
4241        .setup_request = smb2_setup_request,
4242        .setup_async_request = smb2_setup_async_request,
4243        .check_receive = smb2_check_receive,
4244        .add_credits = smb2_add_credits,
4245        .set_credits = smb2_set_credits,
4246        .get_credits_field = smb2_get_credits_field,
4247        .get_credits = smb2_get_credits,
4248        .wait_mtu_credits = smb2_wait_mtu_credits,
4249        .adjust_credits = smb2_adjust_credits,
4250        .get_next_mid = smb2_get_next_mid,
4251        .revert_current_mid = smb2_revert_current_mid,
4252        .read_data_offset = smb2_read_data_offset,
4253        .read_data_length = smb2_read_data_length,
4254        .map_error = map_smb2_to_linux_error,
4255        .find_mid = smb2_find_mid,
4256        .check_message = smb2_check_message,
4257        .dump_detail = smb2_dump_detail,
4258        .clear_stats = smb2_clear_stats,
4259        .print_stats = smb2_print_stats,
4260        .dump_share_caps = smb2_dump_share_caps,
4261        .is_oplock_break = smb2_is_valid_oplock_break,
4262        .handle_cancelled_mid = smb2_handle_cancelled_mid,
4263        .downgrade_oplock = smb21_downgrade_oplock,
4264        .need_neg = smb2_need_neg,
4265        .negotiate = smb2_negotiate,
4266        .negotiate_wsize = smb3_negotiate_wsize,
4267        .negotiate_rsize = smb3_negotiate_rsize,
4268        .sess_setup = SMB2_sess_setup,
4269        .logoff = SMB2_logoff,
4270        .tree_connect = SMB2_tcon,
4271        .tree_disconnect = SMB2_tdis,
4272        .qfs_tcon = smb3_qfs_tcon,
4273        .is_path_accessible = smb2_is_path_accessible,
4274        .can_echo = smb2_can_echo,
4275        .echo = SMB2_echo,
4276        .query_path_info = smb2_query_path_info,
4277        .get_srv_inum = smb2_get_srv_inum,
4278        .query_file_info = smb2_query_file_info,
4279        .set_path_size = smb2_set_path_size,
4280        .set_file_size = smb2_set_file_size,
4281        .set_file_info = smb2_set_file_info,
4282        .set_compression = smb2_set_compression,
4283        .mkdir = smb2_mkdir,
4284        .mkdir_setinfo = smb2_mkdir_setinfo,
4285        .posix_mkdir = smb311_posix_mkdir,
4286        .rmdir = smb2_rmdir,
4287        .unlink = smb2_unlink,
4288        .rename = smb2_rename_path,
4289        .create_hardlink = smb2_create_hardlink,
4290        .query_symlink = smb2_query_symlink,
4291        .query_mf_symlink = smb3_query_mf_symlink,
4292        .create_mf_symlink = smb3_create_mf_symlink,
4293        .open = smb2_open_file,
4294        .set_fid = smb2_set_fid,
4295        .close = smb2_close_file,
4296        .flush = smb2_flush_file,
4297        .async_readv = smb2_async_readv,
4298        .async_writev = smb2_async_writev,
4299        .sync_read = smb2_sync_read,
4300        .sync_write = smb2_sync_write,
4301        .query_dir_first = smb2_query_dir_first,
4302        .query_dir_next = smb2_query_dir_next,
4303        .close_dir = smb2_close_dir,
4304        .calc_smb_size = smb2_calc_size,
4305        .is_status_pending = smb2_is_status_pending,
4306        .is_session_expired = smb2_is_session_expired,
4307        .oplock_response = smb2_oplock_response,
4308        .queryfs = smb311_queryfs,
4309        .mand_lock = smb2_mand_lock,
4310        .mand_unlock_range = smb2_unlock_range,
4311        .push_mand_locks = smb2_push_mandatory_locks,
4312        .get_lease_key = smb2_get_lease_key,
4313        .set_lease_key = smb2_set_lease_key,
4314        .new_lease_key = smb2_new_lease_key,
4315        .generate_signingkey = generate_smb311signingkey,
4316        .calc_signature = smb3_calc_signature,
4317        .set_integrity  = smb3_set_integrity,
4318        .is_read_op = smb21_is_read_op,
4319        .set_oplock_level = smb3_set_oplock_level,
4320        .create_lease_buf = smb3_create_lease_buf,
4321        .parse_lease_buf = smb3_parse_lease_buf,
4322        .copychunk_range = smb2_copychunk_range,
4323        .duplicate_extents = smb2_duplicate_extents,
4324/*      .validate_negotiate = smb3_validate_negotiate, */ /* not used in 3.11 */
4325        .wp_retry_size = smb2_wp_retry_size,
4326        .dir_needs_close = smb2_dir_needs_close,
4327        .fallocate = smb3_fallocate,
4328        .enum_snapshots = smb3_enum_snapshots,
4329        .init_transform_rq = smb3_init_transform_rq,
4330        .is_transform_hdr = smb3_is_transform_hdr,
4331        .receive_transform = smb3_receive_transform,
4332        .get_dfs_refer = smb2_get_dfs_refer,
4333        .select_sectype = smb2_select_sectype,
4334#ifdef CONFIG_CIFS_XATTR
4335        .query_all_EAs = smb2_query_eas,
4336        .set_EA = smb2_set_ea,
4337#endif /* CIFS_XATTR */
4338#ifdef CONFIG_CIFS_ACL
4339        .get_acl = get_smb2_acl,
4340        .get_acl_by_fid = get_smb2_acl_by_fid,
4341        .set_acl = set_smb2_acl,
4342#endif /* CIFS_ACL */
4343        .next_header = smb2_next_header,
4344        .ioctl_query_info = smb2_ioctl_query_info,
4345        .make_node = smb2_make_node,
4346};
4347
4348struct smb_version_values smb20_values = {
4349        .version_string = SMB20_VERSION_STRING,
4350        .protocol_id = SMB20_PROT_ID,
4351        .req_capabilities = 0, /* MBZ */
4352        .large_lock_type = 0,
4353        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4354        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4355        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4356        .header_size = sizeof(struct smb2_sync_hdr),
4357        .header_preamble_size = 0,
4358        .max_header_size = MAX_SMB2_HDR_SIZE,
4359        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4360        .lock_cmd = SMB2_LOCK,
4361        .cap_unix = 0,
4362        .cap_nt_find = SMB2_NT_FIND,
4363        .cap_large_files = SMB2_LARGE_FILES,
4364        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4365        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4366        .create_lease_size = sizeof(struct create_lease),
4367};
4368
4369struct smb_version_values smb21_values = {
4370        .version_string = SMB21_VERSION_STRING,
4371        .protocol_id = SMB21_PROT_ID,
4372        .req_capabilities = 0, /* MBZ on negotiate req until SMB3 dialect */
4373        .large_lock_type = 0,
4374        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4375        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4376        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4377        .header_size = sizeof(struct smb2_sync_hdr),
4378        .header_preamble_size = 0,
4379        .max_header_size = MAX_SMB2_HDR_SIZE,
4380        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4381        .lock_cmd = SMB2_LOCK,
4382        .cap_unix = 0,
4383        .cap_nt_find = SMB2_NT_FIND,
4384        .cap_large_files = SMB2_LARGE_FILES,
4385        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4386        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4387        .create_lease_size = sizeof(struct create_lease),
4388};
4389
4390struct smb_version_values smb3any_values = {
4391        .version_string = SMB3ANY_VERSION_STRING,
4392        .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
4393        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
4394        .large_lock_type = 0,
4395        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4396        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4397        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4398        .header_size = sizeof(struct smb2_sync_hdr),
4399        .header_preamble_size = 0,
4400        .max_header_size = MAX_SMB2_HDR_SIZE,
4401        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4402        .lock_cmd = SMB2_LOCK,
4403        .cap_unix = 0,
4404        .cap_nt_find = SMB2_NT_FIND,
4405        .cap_large_files = SMB2_LARGE_FILES,
4406        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4407        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4408        .create_lease_size = sizeof(struct create_lease_v2),
4409};
4410
4411struct smb_version_values smbdefault_values = {
4412        .version_string = SMBDEFAULT_VERSION_STRING,
4413        .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
4414        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
4415        .large_lock_type = 0,
4416        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4417        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4418        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4419        .header_size = sizeof(struct smb2_sync_hdr),
4420        .header_preamble_size = 0,
4421        .max_header_size = MAX_SMB2_HDR_SIZE,
4422        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4423        .lock_cmd = SMB2_LOCK,
4424        .cap_unix = 0,
4425        .cap_nt_find = SMB2_NT_FIND,
4426        .cap_large_files = SMB2_LARGE_FILES,
4427        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4428        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4429        .create_lease_size = sizeof(struct create_lease_v2),
4430};
4431
4432struct smb_version_values smb30_values = {
4433        .version_string = SMB30_VERSION_STRING,
4434        .protocol_id = SMB30_PROT_ID,
4435        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
4436        .large_lock_type = 0,
4437        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4438        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4439        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4440        .header_size = sizeof(struct smb2_sync_hdr),
4441        .header_preamble_size = 0,
4442        .max_header_size = MAX_SMB2_HDR_SIZE,
4443        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4444        .lock_cmd = SMB2_LOCK,
4445        .cap_unix = 0,
4446        .cap_nt_find = SMB2_NT_FIND,
4447        .cap_large_files = SMB2_LARGE_FILES,
4448        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4449        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4450        .create_lease_size = sizeof(struct create_lease_v2),
4451};
4452
4453struct smb_version_values smb302_values = {
4454        .version_string = SMB302_VERSION_STRING,
4455        .protocol_id = SMB302_PROT_ID,
4456        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
4457        .large_lock_type = 0,
4458        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4459        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4460        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4461        .header_size = sizeof(struct smb2_sync_hdr),
4462        .header_preamble_size = 0,
4463        .max_header_size = MAX_SMB2_HDR_SIZE,
4464        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4465        .lock_cmd = SMB2_LOCK,
4466        .cap_unix = 0,
4467        .cap_nt_find = SMB2_NT_FIND,
4468        .cap_large_files = SMB2_LARGE_FILES,
4469        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4470        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4471        .create_lease_size = sizeof(struct create_lease_v2),
4472};
4473
4474struct smb_version_values smb311_values = {
4475        .version_string = SMB311_VERSION_STRING,
4476        .protocol_id = SMB311_PROT_ID,
4477        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
4478        .large_lock_type = 0,
4479        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
4480        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
4481        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
4482        .header_size = sizeof(struct smb2_sync_hdr),
4483        .header_preamble_size = 0,
4484        .max_header_size = MAX_SMB2_HDR_SIZE,
4485        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
4486        .lock_cmd = SMB2_LOCK,
4487        .cap_unix = 0,
4488        .cap_nt_find = SMB2_NT_FIND,
4489        .cap_large_files = SMB2_LARGE_FILES,
4490        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
4491        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
4492        .create_lease_size = sizeof(struct create_lease_v2),
4493};
4494