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
  36static int
  37change_conf(struct TCP_Server_Info *server)
  38{
  39        server->credits += server->echo_credits + server->oplock_credits;
  40        server->oplock_credits = server->echo_credits = 0;
  41        switch (server->credits) {
  42        case 0:
  43                return -1;
  44        case 1:
  45                server->echoes = false;
  46                server->oplocks = false;
  47                cifs_dbg(VFS, "disabling echoes and oplocks\n");
  48                break;
  49        case 2:
  50                server->echoes = true;
  51                server->oplocks = false;
  52                server->echo_credits = 1;
  53                cifs_dbg(FYI, "disabling oplocks\n");
  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 0;
  67}
  68
  69static void
  70smb2_add_credits(struct TCP_Server_Info *server, const unsigned int add,
  71                 const int optype)
  72{
  73        int *val, rc = 0;
  74        spin_lock(&server->req_lock);
  75        val = server->ops->get_credits_field(server, optype);
  76        *val += add;
  77        if (*val > 65000) {
  78                *val = 65000; /* Don't get near 64K credits, avoid srv bugs */
  79                printk_once(KERN_WARNING "server overflowed SMB3 credits\n");
  80        }
  81        server->in_flight--;
  82        if (server->in_flight == 0 && (optype & CIFS_OP_MASK) != CIFS_NEG_OP)
  83                rc = change_conf(server);
  84        /*
  85         * Sometimes server returns 0 credits on oplock break ack - we need to
  86         * rebalance credits in this case.
  87         */
  88        else if (server->in_flight > 0 && server->oplock_credits == 0 &&
  89                 server->oplocks) {
  90                if (server->credits > 1) {
  91                        server->credits--;
  92                        server->oplock_credits++;
  93                }
  94        }
  95        spin_unlock(&server->req_lock);
  96        wake_up(&server->request_q);
  97        if (rc)
  98                cifs_reconnect(server);
  99}
 100
 101static void
 102smb2_set_credits(struct TCP_Server_Info *server, const int val)
 103{
 104        spin_lock(&server->req_lock);
 105        server->credits = val;
 106        spin_unlock(&server->req_lock);
 107}
 108
 109static int *
 110smb2_get_credits_field(struct TCP_Server_Info *server, const int optype)
 111{
 112        switch (optype) {
 113        case CIFS_ECHO_OP:
 114                return &server->echo_credits;
 115        case CIFS_OBREAK_OP:
 116                return &server->oplock_credits;
 117        default:
 118                return &server->credits;
 119        }
 120}
 121
 122static unsigned int
 123smb2_get_credits(struct mid_q_entry *mid)
 124{
 125        struct smb2_sync_hdr *shdr = get_sync_hdr(mid->resp_buf);
 126
 127        return le16_to_cpu(shdr->CreditRequest);
 128}
 129
 130static int
 131smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
 132                      unsigned int *num, unsigned int *credits)
 133{
 134        int rc = 0;
 135        unsigned int scredits;
 136
 137        spin_lock(&server->req_lock);
 138        while (1) {
 139                if (server->credits <= 0) {
 140                        spin_unlock(&server->req_lock);
 141                        cifs_num_waiters_inc(server);
 142                        rc = wait_event_killable(server->request_q,
 143                                        has_credits(server, &server->credits));
 144                        cifs_num_waiters_dec(server);
 145                        if (rc)
 146                                return rc;
 147                        spin_lock(&server->req_lock);
 148                } else {
 149                        if (server->tcpStatus == CifsExiting) {
 150                                spin_unlock(&server->req_lock);
 151                                return -ENOENT;
 152                        }
 153
 154                        scredits = server->credits;
 155                        /* can deadlock with reopen */
 156                        if (scredits == 1) {
 157                                *num = SMB2_MAX_BUFFER_SIZE;
 158                                *credits = 0;
 159                                break;
 160                        }
 161
 162                        /* leave one credit for a possible reopen */
 163                        scredits--;
 164                        *num = min_t(unsigned int, size,
 165                                     scredits * SMB2_MAX_BUFFER_SIZE);
 166
 167                        *credits = DIV_ROUND_UP(*num, SMB2_MAX_BUFFER_SIZE);
 168                        server->credits -= *credits;
 169                        server->in_flight++;
 170                        break;
 171                }
 172        }
 173        spin_unlock(&server->req_lock);
 174        return rc;
 175}
 176
 177static __u64
 178smb2_get_next_mid(struct TCP_Server_Info *server)
 179{
 180        __u64 mid;
 181        /* for SMB2 we need the current value */
 182        spin_lock(&GlobalMid_Lock);
 183        mid = server->CurrentMid++;
 184        spin_unlock(&GlobalMid_Lock);
 185        return mid;
 186}
 187
 188static struct mid_q_entry *
 189smb2_find_mid(struct TCP_Server_Info *server, char *buf)
 190{
 191        struct mid_q_entry *mid;
 192        struct smb2_sync_hdr *shdr = get_sync_hdr(buf);
 193        __u64 wire_mid = le64_to_cpu(shdr->MessageId);
 194
 195        if (shdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) {
 196                cifs_dbg(VFS, "encrypted frame parsing not supported yet");
 197                return NULL;
 198        }
 199
 200        spin_lock(&GlobalMid_Lock);
 201        list_for_each_entry(mid, &server->pending_mid_q, qhead) {
 202                if ((mid->mid == wire_mid) &&
 203                    (mid->mid_state == MID_REQUEST_SUBMITTED) &&
 204                    (mid->command == shdr->Command)) {
 205                        spin_unlock(&GlobalMid_Lock);
 206                        return mid;
 207                }
 208        }
 209        spin_unlock(&GlobalMid_Lock);
 210        return NULL;
 211}
 212
 213static void
 214smb2_dump_detail(void *buf)
 215{
 216#ifdef CONFIG_CIFS_DEBUG2
 217        struct smb2_sync_hdr *shdr = get_sync_hdr(buf);
 218
 219        cifs_dbg(VFS, "Cmd: %d Err: 0x%x Flags: 0x%x Mid: %llu Pid: %d\n",
 220                 shdr->Command, shdr->Status, shdr->Flags, shdr->MessageId,
 221                 shdr->ProcessId);
 222        cifs_dbg(VFS, "smb buf %p len %u\n", buf, smb2_calc_size(buf));
 223#endif
 224}
 225
 226static bool
 227smb2_need_neg(struct TCP_Server_Info *server)
 228{
 229        return server->max_read == 0;
 230}
 231
 232static int
 233smb2_negotiate(const unsigned int xid, struct cifs_ses *ses)
 234{
 235        int rc;
 236        ses->server->CurrentMid = 0;
 237        rc = SMB2_negotiate(xid, ses);
 238        /* BB we probably don't need to retry with modern servers */
 239        if (rc == -EAGAIN)
 240                rc = -EHOSTDOWN;
 241        return rc;
 242}
 243
 244static unsigned int
 245smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 246{
 247        struct TCP_Server_Info *server = tcon->ses->server;
 248        unsigned int wsize;
 249
 250        /* start with specified wsize, or default */
 251        wsize = volume_info->wsize ? volume_info->wsize : CIFS_DEFAULT_IOSIZE;
 252        wsize = min_t(unsigned int, wsize, server->max_write);
 253
 254        if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
 255                wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE);
 256
 257        return wsize;
 258}
 259
 260static unsigned int
 261smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 262{
 263        struct TCP_Server_Info *server = tcon->ses->server;
 264        unsigned int rsize;
 265
 266        /* start with specified rsize, or default */
 267        rsize = volume_info->rsize ? volume_info->rsize : CIFS_DEFAULT_IOSIZE;
 268        rsize = min_t(unsigned int, rsize, server->max_read);
 269
 270        if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
 271                rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE);
 272
 273        return rsize;
 274}
 275
 276#ifdef CONFIG_CIFS_STATS2
 277static int
 278SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
 279{
 280        int rc;
 281        unsigned int ret_data_len = 0;
 282        struct network_interface_info_ioctl_rsp *out_buf;
 283
 284        rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
 285                        FSCTL_QUERY_NETWORK_INTERFACE_INFO, true /* is_fsctl */,
 286                        false /* use_ipc */,
 287                        NULL /* no data input */, 0 /* no data input */,
 288                        (char **)&out_buf, &ret_data_len);
 289        if (rc != 0)
 290                cifs_dbg(VFS, "error %d on ioctl to get interface list\n", rc);
 291        else if (ret_data_len < sizeof(struct network_interface_info_ioctl_rsp)) {
 292                cifs_dbg(VFS, "server returned bad net interface info buf\n");
 293                rc = -EINVAL;
 294        } else {
 295                /* Dump info on first interface */
 296                cifs_dbg(FYI, "Adapter Capability 0x%x\t",
 297                        le32_to_cpu(out_buf->Capability));
 298                cifs_dbg(FYI, "Link Speed %lld\n",
 299                        le64_to_cpu(out_buf->LinkSpeed));
 300        }
 301        kfree(out_buf);
 302        return rc;
 303}
 304#endif /* STATS2 */
 305
 306static void
 307smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
 308{
 309        int rc;
 310        __le16 srch_path = 0; /* Null - open root of share */
 311        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 312        struct cifs_open_parms oparms;
 313        struct cifs_fid fid;
 314
 315        oparms.tcon = tcon;
 316        oparms.desired_access = FILE_READ_ATTRIBUTES;
 317        oparms.disposition = FILE_OPEN;
 318        oparms.create_options = 0;
 319        oparms.fid = &fid;
 320        oparms.reconnect = false;
 321
 322        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL);
 323        if (rc)
 324                return;
 325
 326#ifdef CONFIG_CIFS_STATS2
 327        SMB3_request_interfaces(xid, tcon);
 328#endif /* STATS2 */
 329
 330        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 331                        FS_ATTRIBUTE_INFORMATION);
 332        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 333                        FS_DEVICE_INFORMATION);
 334        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 335                        FS_SECTOR_SIZE_INFORMATION); /* SMB3 specific */
 336        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 337        return;
 338}
 339
 340static void
 341smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
 342{
 343        int rc;
 344        __le16 srch_path = 0; /* Null - open root of share */
 345        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 346        struct cifs_open_parms oparms;
 347        struct cifs_fid fid;
 348
 349        oparms.tcon = tcon;
 350        oparms.desired_access = FILE_READ_ATTRIBUTES;
 351        oparms.disposition = FILE_OPEN;
 352        oparms.create_options = 0;
 353        oparms.fid = &fid;
 354        oparms.reconnect = false;
 355
 356        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL);
 357        if (rc)
 358                return;
 359
 360        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 361                        FS_ATTRIBUTE_INFORMATION);
 362        SMB2_QFS_attr(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 363                        FS_DEVICE_INFORMATION);
 364        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 365        return;
 366}
 367
 368static int
 369smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
 370                        struct cifs_sb_info *cifs_sb, const char *full_path)
 371{
 372        int rc;
 373        __le16 *utf16_path;
 374        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 375        struct cifs_open_parms oparms;
 376        struct cifs_fid fid;
 377
 378        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
 379        if (!utf16_path)
 380                return -ENOMEM;
 381
 382        oparms.tcon = tcon;
 383        oparms.desired_access = FILE_READ_ATTRIBUTES;
 384        oparms.disposition = FILE_OPEN;
 385        oparms.create_options = 0;
 386        oparms.fid = &fid;
 387        oparms.reconnect = false;
 388
 389        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL);
 390        if (rc) {
 391                kfree(utf16_path);
 392                return rc;
 393        }
 394
 395        rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 396        kfree(utf16_path);
 397        return rc;
 398}
 399
 400static int
 401smb2_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon,
 402                  struct cifs_sb_info *cifs_sb, const char *full_path,
 403                  u64 *uniqueid, FILE_ALL_INFO *data)
 404{
 405        *uniqueid = le64_to_cpu(data->IndexNumber);
 406        return 0;
 407}
 408
 409static int
 410smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
 411                     struct cifs_fid *fid, FILE_ALL_INFO *data)
 412{
 413        int rc;
 414        struct smb2_file_all_info *smb2_data;
 415
 416        smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + PATH_MAX * 2,
 417                            GFP_KERNEL);
 418        if (smb2_data == NULL)
 419                return -ENOMEM;
 420
 421        rc = SMB2_query_info(xid, tcon, fid->persistent_fid, fid->volatile_fid,
 422                             smb2_data);
 423        if (!rc)
 424                move_smb2_info_to_cifs(data, smb2_data);
 425        kfree(smb2_data);
 426        return rc;
 427}
 428
 429static bool
 430smb2_can_echo(struct TCP_Server_Info *server)
 431{
 432        return server->echoes;
 433}
 434
 435static void
 436smb2_clear_stats(struct cifs_tcon *tcon)
 437{
 438#ifdef CONFIG_CIFS_STATS
 439        int i;
 440        for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) {
 441                atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0);
 442                atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0);
 443        }
 444#endif
 445}
 446
 447static void
 448smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon)
 449{
 450        seq_puts(m, "\n\tShare Capabilities:");
 451        if (tcon->capabilities & SMB2_SHARE_CAP_DFS)
 452                seq_puts(m, " DFS,");
 453        if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
 454                seq_puts(m, " CONTINUOUS AVAILABILITY,");
 455        if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT)
 456                seq_puts(m, " SCALEOUT,");
 457        if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER)
 458                seq_puts(m, " CLUSTER,");
 459        if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC)
 460                seq_puts(m, " ASYMMETRIC,");
 461        if (tcon->capabilities == 0)
 462                seq_puts(m, " None");
 463        if (tcon->ss_flags & SSINFO_FLAGS_ALIGNED_DEVICE)
 464                seq_puts(m, " Aligned,");
 465        if (tcon->ss_flags & SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE)
 466                seq_puts(m, " Partition Aligned,");
 467        if (tcon->ss_flags & SSINFO_FLAGS_NO_SEEK_PENALTY)
 468                seq_puts(m, " SSD,");
 469        if (tcon->ss_flags & SSINFO_FLAGS_TRIM_ENABLED)
 470                seq_puts(m, " TRIM-support,");
 471
 472        seq_printf(m, "\tShare Flags: 0x%x", tcon->share_flags);
 473        if (tcon->perf_sector_size)
 474                seq_printf(m, "\tOptimal sector size: 0x%x",
 475                           tcon->perf_sector_size);
 476}
 477
 478static void
 479smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
 480{
 481#ifdef CONFIG_CIFS_STATS
 482        atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent;
 483        atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed;
 484        seq_printf(m, "\nNegotiates: %d sent %d failed",
 485                   atomic_read(&sent[SMB2_NEGOTIATE_HE]),
 486                   atomic_read(&failed[SMB2_NEGOTIATE_HE]));
 487        seq_printf(m, "\nSessionSetups: %d sent %d failed",
 488                   atomic_read(&sent[SMB2_SESSION_SETUP_HE]),
 489                   atomic_read(&failed[SMB2_SESSION_SETUP_HE]));
 490        seq_printf(m, "\nLogoffs: %d sent %d failed",
 491                   atomic_read(&sent[SMB2_LOGOFF_HE]),
 492                   atomic_read(&failed[SMB2_LOGOFF_HE]));
 493        seq_printf(m, "\nTreeConnects: %d sent %d failed",
 494                   atomic_read(&sent[SMB2_TREE_CONNECT_HE]),
 495                   atomic_read(&failed[SMB2_TREE_CONNECT_HE]));
 496        seq_printf(m, "\nTreeDisconnects: %d sent %d failed",
 497                   atomic_read(&sent[SMB2_TREE_DISCONNECT_HE]),
 498                   atomic_read(&failed[SMB2_TREE_DISCONNECT_HE]));
 499        seq_printf(m, "\nCreates: %d sent %d failed",
 500                   atomic_read(&sent[SMB2_CREATE_HE]),
 501                   atomic_read(&failed[SMB2_CREATE_HE]));
 502        seq_printf(m, "\nCloses: %d sent %d failed",
 503                   atomic_read(&sent[SMB2_CLOSE_HE]),
 504                   atomic_read(&failed[SMB2_CLOSE_HE]));
 505        seq_printf(m, "\nFlushes: %d sent %d failed",
 506                   atomic_read(&sent[SMB2_FLUSH_HE]),
 507                   atomic_read(&failed[SMB2_FLUSH_HE]));
 508        seq_printf(m, "\nReads: %d sent %d failed",
 509                   atomic_read(&sent[SMB2_READ_HE]),
 510                   atomic_read(&failed[SMB2_READ_HE]));
 511        seq_printf(m, "\nWrites: %d sent %d failed",
 512                   atomic_read(&sent[SMB2_WRITE_HE]),
 513                   atomic_read(&failed[SMB2_WRITE_HE]));
 514        seq_printf(m, "\nLocks: %d sent %d failed",
 515                   atomic_read(&sent[SMB2_LOCK_HE]),
 516                   atomic_read(&failed[SMB2_LOCK_HE]));
 517        seq_printf(m, "\nIOCTLs: %d sent %d failed",
 518                   atomic_read(&sent[SMB2_IOCTL_HE]),
 519                   atomic_read(&failed[SMB2_IOCTL_HE]));
 520        seq_printf(m, "\nCancels: %d sent %d failed",
 521                   atomic_read(&sent[SMB2_CANCEL_HE]),
 522                   atomic_read(&failed[SMB2_CANCEL_HE]));
 523        seq_printf(m, "\nEchos: %d sent %d failed",
 524                   atomic_read(&sent[SMB2_ECHO_HE]),
 525                   atomic_read(&failed[SMB2_ECHO_HE]));
 526        seq_printf(m, "\nQueryDirectories: %d sent %d failed",
 527                   atomic_read(&sent[SMB2_QUERY_DIRECTORY_HE]),
 528                   atomic_read(&failed[SMB2_QUERY_DIRECTORY_HE]));
 529        seq_printf(m, "\nChangeNotifies: %d sent %d failed",
 530                   atomic_read(&sent[SMB2_CHANGE_NOTIFY_HE]),
 531                   atomic_read(&failed[SMB2_CHANGE_NOTIFY_HE]));
 532        seq_printf(m, "\nQueryInfos: %d sent %d failed",
 533                   atomic_read(&sent[SMB2_QUERY_INFO_HE]),
 534                   atomic_read(&failed[SMB2_QUERY_INFO_HE]));
 535        seq_printf(m, "\nSetInfos: %d sent %d failed",
 536                   atomic_read(&sent[SMB2_SET_INFO_HE]),
 537                   atomic_read(&failed[SMB2_SET_INFO_HE]));
 538        seq_printf(m, "\nOplockBreaks: %d sent %d failed",
 539                   atomic_read(&sent[SMB2_OPLOCK_BREAK_HE]),
 540                   atomic_read(&failed[SMB2_OPLOCK_BREAK_HE]));
 541#endif
 542}
 543
 544static void
 545smb2_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock)
 546{
 547        struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
 548        struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
 549
 550        cfile->fid.persistent_fid = fid->persistent_fid;
 551        cfile->fid.volatile_fid = fid->volatile_fid;
 552        server->ops->set_oplock_level(cinode, oplock, fid->epoch,
 553                                      &fid->purge_cache);
 554        cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode);
 555        memcpy(cfile->fid.create_guid, fid->create_guid, 16);
 556}
 557
 558static void
 559smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon,
 560                struct cifs_fid *fid)
 561{
 562        SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 563}
 564
 565static int
 566SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon,
 567                     u64 persistent_fid, u64 volatile_fid,
 568                     struct copychunk_ioctl *pcchunk)
 569{
 570        int rc;
 571        unsigned int ret_data_len;
 572        struct resume_key_req *res_key;
 573
 574        rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid,
 575                        FSCTL_SRV_REQUEST_RESUME_KEY, true /* is_fsctl */,
 576                        false /* use_ipc */,
 577                        NULL, 0 /* no input */,
 578                        (char **)&res_key, &ret_data_len);
 579
 580        if (rc) {
 581                cifs_dbg(VFS, "refcpy ioctl error %d getting resume key\n", rc);
 582                goto req_res_key_exit;
 583        }
 584        if (ret_data_len < sizeof(struct resume_key_req)) {
 585                cifs_dbg(VFS, "Invalid refcopy resume key length\n");
 586                rc = -EINVAL;
 587                goto req_res_key_exit;
 588        }
 589        memcpy(pcchunk->SourceKey, res_key->ResumeKey, COPY_CHUNK_RES_KEY_SIZE);
 590
 591req_res_key_exit:
 592        kfree(res_key);
 593        return rc;
 594}
 595
 596static ssize_t
 597smb2_copychunk_range(const unsigned int xid,
 598                        struct cifsFileInfo *srcfile,
 599                        struct cifsFileInfo *trgtfile, u64 src_off,
 600                        u64 len, u64 dest_off)
 601{
 602        int rc;
 603        unsigned int ret_data_len;
 604        struct copychunk_ioctl *pcchunk;
 605        struct copychunk_ioctl_rsp *retbuf = NULL;
 606        struct cifs_tcon *tcon;
 607        int chunks_copied = 0;
 608        bool chunk_sizes_updated = false;
 609        ssize_t bytes_written, total_bytes_written = 0;
 610
 611        pcchunk = kmalloc(sizeof(struct copychunk_ioctl), GFP_KERNEL);
 612
 613        if (pcchunk == NULL)
 614                return -ENOMEM;
 615
 616        cifs_dbg(FYI, "in smb2_copychunk_range - about to call request res key\n");
 617        /* Request a key from the server to identify the source of the copy */
 618        rc = SMB2_request_res_key(xid, tlink_tcon(srcfile->tlink),
 619                                srcfile->fid.persistent_fid,
 620                                srcfile->fid.volatile_fid, pcchunk);
 621
 622        /* Note: request_res_key sets res_key null only if rc !=0 */
 623        if (rc)
 624                goto cchunk_out;
 625
 626        /* For now array only one chunk long, will make more flexible later */
 627        pcchunk->ChunkCount = cpu_to_le32(1);
 628        pcchunk->Reserved = 0;
 629        pcchunk->Reserved2 = 0;
 630
 631        tcon = tlink_tcon(trgtfile->tlink);
 632
 633        while (len > 0) {
 634                pcchunk->SourceOffset = cpu_to_le64(src_off);
 635                pcchunk->TargetOffset = cpu_to_le64(dest_off);
 636                pcchunk->Length =
 637                        cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
 638
 639                /* Request server copy to target from src identified by key */
 640                rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
 641                        trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE,
 642                        true /* is_fsctl */, false /* use_ipc */,
 643                        (char *)pcchunk,
 644                        sizeof(struct copychunk_ioctl), (char **)&retbuf,
 645                        &ret_data_len);
 646                if (rc == 0) {
 647                        if (ret_data_len !=
 648                                        sizeof(struct copychunk_ioctl_rsp)) {
 649                                cifs_dbg(VFS, "invalid cchunk response size\n");
 650                                rc = -EIO;
 651                                goto cchunk_out;
 652                        }
 653                        if (retbuf->TotalBytesWritten == 0) {
 654                                cifs_dbg(FYI, "no bytes copied\n");
 655                                rc = -EIO;
 656                                goto cchunk_out;
 657                        }
 658                        /*
 659                         * Check if server claimed to write more than we asked
 660                         */
 661                        if (le32_to_cpu(retbuf->TotalBytesWritten) >
 662                            le32_to_cpu(pcchunk->Length)) {
 663                                cifs_dbg(VFS, "invalid copy chunk response\n");
 664                                rc = -EIO;
 665                                goto cchunk_out;
 666                        }
 667                        if (le32_to_cpu(retbuf->ChunksWritten) != 1) {
 668                                cifs_dbg(VFS, "invalid num chunks written\n");
 669                                rc = -EIO;
 670                                goto cchunk_out;
 671                        }
 672                        chunks_copied++;
 673
 674                        bytes_written = le32_to_cpu(retbuf->TotalBytesWritten);
 675                        src_off += bytes_written;
 676                        dest_off += bytes_written;
 677                        len -= bytes_written;
 678                        total_bytes_written += bytes_written;
 679
 680                        cifs_dbg(FYI, "Chunks %d PartialChunk %d Total %zu\n",
 681                                le32_to_cpu(retbuf->ChunksWritten),
 682                                le32_to_cpu(retbuf->ChunkBytesWritten),
 683                                bytes_written);
 684                } else if (rc == -EINVAL) {
 685                        if (ret_data_len != sizeof(struct copychunk_ioctl_rsp))
 686                                goto cchunk_out;
 687
 688                        cifs_dbg(FYI, "MaxChunks %d BytesChunk %d MaxCopy %d\n",
 689                                le32_to_cpu(retbuf->ChunksWritten),
 690                                le32_to_cpu(retbuf->ChunkBytesWritten),
 691                                le32_to_cpu(retbuf->TotalBytesWritten));
 692
 693                        /*
 694                         * Check if this is the first request using these sizes,
 695                         * (ie check if copy succeed once with original sizes
 696                         * and check if the server gave us different sizes after
 697                         * we already updated max sizes on previous request).
 698                         * if not then why is the server returning an error now
 699                         */
 700                        if ((chunks_copied != 0) || chunk_sizes_updated)
 701                                goto cchunk_out;
 702
 703                        /* Check that server is not asking us to grow size */
 704                        if (le32_to_cpu(retbuf->ChunkBytesWritten) <
 705                                        tcon->max_bytes_chunk)
 706                                tcon->max_bytes_chunk =
 707                                        le32_to_cpu(retbuf->ChunkBytesWritten);
 708                        else
 709                                goto cchunk_out; /* server gave us bogus size */
 710
 711                        /* No need to change MaxChunks since already set to 1 */
 712                        chunk_sizes_updated = true;
 713                } else
 714                        goto cchunk_out;
 715        }
 716
 717cchunk_out:
 718        kfree(pcchunk);
 719        kfree(retbuf);
 720        if (rc)
 721                return rc;
 722        else
 723                return total_bytes_written;
 724}
 725
 726static int
 727smb2_flush_file(const unsigned int xid, struct cifs_tcon *tcon,
 728                struct cifs_fid *fid)
 729{
 730        return SMB2_flush(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 731}
 732
 733static unsigned int
 734smb2_read_data_offset(char *buf)
 735{
 736        struct smb2_read_rsp *rsp = (struct smb2_read_rsp *)buf;
 737        return rsp->DataOffset;
 738}
 739
 740static unsigned int
 741smb2_read_data_length(char *buf)
 742{
 743        struct smb2_read_rsp *rsp = (struct smb2_read_rsp *)buf;
 744        return le32_to_cpu(rsp->DataLength);
 745}
 746
 747
 748static int
 749smb2_sync_read(const unsigned int xid, struct cifs_fid *pfid,
 750               struct cifs_io_parms *parms, unsigned int *bytes_read,
 751               char **buf, int *buf_type)
 752{
 753        parms->persistent_fid = pfid->persistent_fid;
 754        parms->volatile_fid = pfid->volatile_fid;
 755        return SMB2_read(xid, parms, bytes_read, buf, buf_type);
 756}
 757
 758static int
 759smb2_sync_write(const unsigned int xid, struct cifs_fid *pfid,
 760                struct cifs_io_parms *parms, unsigned int *written,
 761                struct kvec *iov, unsigned long nr_segs)
 762{
 763
 764        parms->persistent_fid = pfid->persistent_fid;
 765        parms->volatile_fid = pfid->volatile_fid;
 766        return SMB2_write(xid, parms, written, iov, nr_segs);
 767}
 768
 769/* Set or clear the SPARSE_FILE attribute based on value passed in setsparse */
 770static bool smb2_set_sparse(const unsigned int xid, struct cifs_tcon *tcon,
 771                struct cifsFileInfo *cfile, struct inode *inode, __u8 setsparse)
 772{
 773        struct cifsInodeInfo *cifsi;
 774        int rc;
 775
 776        cifsi = CIFS_I(inode);
 777
 778        /* if file already sparse don't bother setting sparse again */
 779        if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && setsparse)
 780                return true; /* already sparse */
 781
 782        if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) && !setsparse)
 783                return true; /* already not sparse */
 784
 785        /*
 786         * Can't check for sparse support on share the usual way via the
 787         * FS attribute info (FILE_SUPPORTS_SPARSE_FILES) on the share
 788         * since Samba server doesn't set the flag on the share, yet
 789         * supports the set sparse FSCTL and returns sparse correctly
 790         * in the file attributes. If we fail setting sparse though we
 791         * mark that server does not support sparse files for this share
 792         * to avoid repeatedly sending the unsupported fsctl to server
 793         * if the file is repeatedly extended.
 794         */
 795        if (tcon->broken_sparse_sup)
 796                return false;
 797
 798        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
 799                        cfile->fid.volatile_fid, FSCTL_SET_SPARSE,
 800                        true /* is_fctl */, false /* use_ipc */,
 801                        &setsparse, 1, NULL, NULL);
 802        if (rc) {
 803                tcon->broken_sparse_sup = true;
 804                cifs_dbg(FYI, "set sparse rc = %d\n", rc);
 805                return false;
 806        }
 807
 808        if (setsparse)
 809                cifsi->cifsAttrs |= FILE_ATTRIBUTE_SPARSE_FILE;
 810        else
 811                cifsi->cifsAttrs &= (~FILE_ATTRIBUTE_SPARSE_FILE);
 812
 813        return true;
 814}
 815
 816static int
 817smb2_set_file_size(const unsigned int xid, struct cifs_tcon *tcon,
 818                   struct cifsFileInfo *cfile, __u64 size, bool set_alloc)
 819{
 820        __le64 eof = cpu_to_le64(size);
 821        struct inode *inode;
 822
 823        /*
 824         * If extending file more than one page make sparse. Many Linux fs
 825         * make files sparse by default when extending via ftruncate
 826         */
 827        inode = d_inode(cfile->dentry);
 828
 829        if (!set_alloc && (size > inode->i_size + 8192)) {
 830                __u8 set_sparse = 1;
 831
 832                /* whether set sparse succeeds or not, extend the file */
 833                smb2_set_sparse(xid, tcon, cfile, inode, set_sparse);
 834        }
 835
 836        return SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
 837                            cfile->fid.volatile_fid, cfile->pid, &eof, false);
 838}
 839
 840static int
 841smb2_duplicate_extents(const unsigned int xid,
 842                        struct cifsFileInfo *srcfile,
 843                        struct cifsFileInfo *trgtfile, u64 src_off,
 844                        u64 len, u64 dest_off)
 845{
 846        int rc;
 847        unsigned int ret_data_len;
 848        struct duplicate_extents_to_file dup_ext_buf;
 849        struct cifs_tcon *tcon = tlink_tcon(trgtfile->tlink);
 850
 851        /* server fileays advertise duplicate extent support with this flag */
 852        if ((le32_to_cpu(tcon->fsAttrInfo.Attributes) &
 853             FILE_SUPPORTS_BLOCK_REFCOUNTING) == 0)
 854                return -EOPNOTSUPP;
 855
 856        dup_ext_buf.VolatileFileHandle = srcfile->fid.volatile_fid;
 857        dup_ext_buf.PersistentFileHandle = srcfile->fid.persistent_fid;
 858        dup_ext_buf.SourceFileOffset = cpu_to_le64(src_off);
 859        dup_ext_buf.TargetFileOffset = cpu_to_le64(dest_off);
 860        dup_ext_buf.ByteCount = cpu_to_le64(len);
 861        cifs_dbg(FYI, "duplicate extents: src off %lld dst off %lld len %lld",
 862                src_off, dest_off, len);
 863
 864        rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false);
 865        if (rc)
 866                goto duplicate_extents_out;
 867
 868        rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
 869                        trgtfile->fid.volatile_fid,
 870                        FSCTL_DUPLICATE_EXTENTS_TO_FILE,
 871                        true /* is_fsctl */, false /* use_ipc */,
 872                        (char *)&dup_ext_buf,
 873                        sizeof(struct duplicate_extents_to_file),
 874                        NULL,
 875                        &ret_data_len);
 876
 877        if (ret_data_len > 0)
 878                cifs_dbg(FYI, "non-zero response length in duplicate extents");
 879
 880duplicate_extents_out:
 881        return rc;
 882}
 883
 884static int
 885smb2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
 886                   struct cifsFileInfo *cfile)
 887{
 888        return SMB2_set_compression(xid, tcon, cfile->fid.persistent_fid,
 889                            cfile->fid.volatile_fid);
 890}
 891
 892static int
 893smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon,
 894                   struct cifsFileInfo *cfile)
 895{
 896        struct fsctl_set_integrity_information_req integr_info;
 897        unsigned int ret_data_len;
 898
 899        integr_info.ChecksumAlgorithm = cpu_to_le16(CHECKSUM_TYPE_UNCHANGED);
 900        integr_info.Flags = 0;
 901        integr_info.Reserved = 0;
 902
 903        return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
 904                        cfile->fid.volatile_fid,
 905                        FSCTL_SET_INTEGRITY_INFORMATION,
 906                        true /* is_fsctl */, false /* use_ipc */,
 907                        (char *)&integr_info,
 908                        sizeof(struct fsctl_set_integrity_information_req),
 909                        NULL,
 910                        &ret_data_len);
 911
 912}
 913
 914static int
 915smb3_enum_snapshots(const unsigned int xid, struct cifs_tcon *tcon,
 916                   struct cifsFileInfo *cfile, void __user *ioc_buf)
 917{
 918        char *retbuf = NULL;
 919        unsigned int ret_data_len = 0;
 920        int rc;
 921        struct smb_snapshot_array snapshot_in;
 922
 923        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
 924                        cfile->fid.volatile_fid,
 925                        FSCTL_SRV_ENUMERATE_SNAPSHOTS,
 926                        true /* is_fsctl */, false /* use_ipc */,
 927                        NULL, 0 /* no input data */,
 928                        (char **)&retbuf,
 929                        &ret_data_len);
 930        cifs_dbg(FYI, "enum snaphots ioctl returned %d and ret buflen is %d\n",
 931                        rc, ret_data_len);
 932        if (rc)
 933                return rc;
 934
 935        if (ret_data_len && (ioc_buf != NULL) && (retbuf != NULL)) {
 936                /* Fixup buffer */
 937                if (copy_from_user(&snapshot_in, ioc_buf,
 938                    sizeof(struct smb_snapshot_array))) {
 939                        rc = -EFAULT;
 940                        kfree(retbuf);
 941                        return rc;
 942                }
 943                if (snapshot_in.snapshot_array_size < sizeof(struct smb_snapshot_array)) {
 944                        rc = -ERANGE;
 945                        return rc;
 946                }
 947
 948                if (ret_data_len > snapshot_in.snapshot_array_size)
 949                        ret_data_len = snapshot_in.snapshot_array_size;
 950
 951                if (copy_to_user(ioc_buf, retbuf, ret_data_len))
 952                        rc = -EFAULT;
 953        }
 954
 955        kfree(retbuf);
 956        return rc;
 957}
 958
 959static int
 960smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
 961                     const char *path, struct cifs_sb_info *cifs_sb,
 962                     struct cifs_fid *fid, __u16 search_flags,
 963                     struct cifs_search_info *srch_inf)
 964{
 965        __le16 *utf16_path;
 966        int rc;
 967        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 968        struct cifs_open_parms oparms;
 969
 970        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
 971        if (!utf16_path)
 972                return -ENOMEM;
 973
 974        oparms.tcon = tcon;
 975        oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
 976        oparms.disposition = FILE_OPEN;
 977        oparms.create_options = 0;
 978        oparms.fid = fid;
 979        oparms.reconnect = false;
 980
 981        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL);
 982        kfree(utf16_path);
 983        if (rc) {
 984                cifs_dbg(VFS, "open dir failed\n");
 985                return rc;
 986        }
 987
 988        srch_inf->entries_in_buffer = 0;
 989        srch_inf->index_of_last_entry = 0;
 990
 991        rc = SMB2_query_directory(xid, tcon, fid->persistent_fid,
 992                                  fid->volatile_fid, 0, srch_inf);
 993        if (rc) {
 994                cifs_dbg(VFS, "query directory failed\n");
 995                SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 996        }
 997        return rc;
 998}
 999
1000static int
1001smb2_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon,
1002                    struct cifs_fid *fid, __u16 search_flags,
1003                    struct cifs_search_info *srch_inf)
1004{
1005        return SMB2_query_directory(xid, tcon, fid->persistent_fid,
1006                                    fid->volatile_fid, 0, srch_inf);
1007}
1008
1009static int
1010smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
1011               struct cifs_fid *fid)
1012{
1013        return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
1014}
1015
1016/*
1017* If we negotiate SMB2 protocol and get STATUS_PENDING - update
1018* the number of credits and return true. Otherwise - return false.
1019*/
1020static bool
1021smb2_is_status_pending(char *buf, struct TCP_Server_Info *server, int length)
1022{
1023        struct smb2_sync_hdr *shdr = get_sync_hdr(buf);
1024
1025        if (shdr->Status != STATUS_PENDING)
1026                return false;
1027
1028        if (!length) {
1029                spin_lock(&server->req_lock);
1030                server->credits += le16_to_cpu(shdr->CreditRequest);
1031                spin_unlock(&server->req_lock);
1032                wake_up(&server->request_q);
1033        }
1034
1035        return true;
1036}
1037
1038static int
1039smb2_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
1040                     struct cifsInodeInfo *cinode)
1041{
1042        if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING)
1043                return SMB2_lease_break(0, tcon, cinode->lease_key,
1044                                        smb2_get_lease_state(cinode));
1045
1046        return SMB2_oplock_break(0, tcon, fid->persistent_fid,
1047                                 fid->volatile_fid,
1048                                 CIFS_CACHE_READ(cinode) ? 1 : 0);
1049}
1050
1051static int
1052smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
1053             struct kstatfs *buf)
1054{
1055        int rc;
1056        __le16 srch_path = 0; /* Null - open root of share */
1057        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1058        struct cifs_open_parms oparms;
1059        struct cifs_fid fid;
1060
1061        oparms.tcon = tcon;
1062        oparms.desired_access = FILE_READ_ATTRIBUTES;
1063        oparms.disposition = FILE_OPEN;
1064        oparms.create_options = 0;
1065        oparms.fid = &fid;
1066        oparms.reconnect = false;
1067
1068        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL);
1069        if (rc)
1070                return rc;
1071        buf->f_type = SMB2_MAGIC_NUMBER;
1072        rc = SMB2_QFS_info(xid, tcon, fid.persistent_fid, fid.volatile_fid,
1073                           buf);
1074        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
1075        return rc;
1076}
1077
1078static bool
1079smb2_compare_fids(struct cifsFileInfo *ob1, struct cifsFileInfo *ob2)
1080{
1081        return ob1->fid.persistent_fid == ob2->fid.persistent_fid &&
1082               ob1->fid.volatile_fid == ob2->fid.volatile_fid;
1083}
1084
1085static int
1086smb2_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset,
1087               __u64 length, __u32 type, int lock, int unlock, bool wait)
1088{
1089        if (unlock && !lock)
1090                type = SMB2_LOCKFLAG_UNLOCK;
1091        return SMB2_lock(xid, tlink_tcon(cfile->tlink),
1092                         cfile->fid.persistent_fid, cfile->fid.volatile_fid,
1093                         current->tgid, length, offset, type, wait);
1094}
1095
1096static void
1097smb2_get_lease_key(struct inode *inode, struct cifs_fid *fid)
1098{
1099        memcpy(fid->lease_key, CIFS_I(inode)->lease_key, SMB2_LEASE_KEY_SIZE);
1100}
1101
1102static void
1103smb2_set_lease_key(struct inode *inode, struct cifs_fid *fid)
1104{
1105        memcpy(CIFS_I(inode)->lease_key, fid->lease_key, SMB2_LEASE_KEY_SIZE);
1106}
1107
1108static void
1109smb2_new_lease_key(struct cifs_fid *fid)
1110{
1111        generate_random_uuid(fid->lease_key);
1112}
1113
1114static int
1115smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,
1116                   const char *search_name,
1117                   struct dfs_info3_param **target_nodes,
1118                   unsigned int *num_of_nodes,
1119                   const struct nls_table *nls_codepage, int remap)
1120{
1121        int rc;
1122        __le16 *utf16_path = NULL;
1123        int utf16_path_len = 0;
1124        struct cifs_tcon *tcon;
1125        struct fsctl_get_dfs_referral_req *dfs_req = NULL;
1126        struct get_dfs_referral_rsp *dfs_rsp = NULL;
1127        u32 dfs_req_size = 0, dfs_rsp_size = 0;
1128
1129        cifs_dbg(FYI, "smb2_get_dfs_refer path <%s>\n", search_name);
1130
1131        /*
1132         * Use any tcon from the current session. Here, the first one.
1133         */
1134        spin_lock(&cifs_tcp_ses_lock);
1135        tcon = list_first_entry_or_null(&ses->tcon_list, struct cifs_tcon,
1136                                        tcon_list);
1137        if (tcon)
1138                tcon->tc_count++;
1139        spin_unlock(&cifs_tcp_ses_lock);
1140
1141        if (!tcon) {
1142                cifs_dbg(VFS, "session %p has no tcon available for a dfs referral request\n",
1143                         ses);
1144                rc = -ENOTCONN;
1145                goto out;
1146        }
1147
1148        utf16_path = cifs_strndup_to_utf16(search_name, PATH_MAX,
1149                                           &utf16_path_len,
1150                                           nls_codepage, remap);
1151        if (!utf16_path) {
1152                rc = -ENOMEM;
1153                goto out;
1154        }
1155
1156        dfs_req_size = sizeof(*dfs_req) + utf16_path_len;
1157        dfs_req = kzalloc(dfs_req_size, GFP_KERNEL);
1158        if (!dfs_req) {
1159                rc = -ENOMEM;
1160                goto out;
1161        }
1162
1163        /* Highest DFS referral version understood */
1164        dfs_req->MaxReferralLevel = DFS_VERSION;
1165
1166        /* Path to resolve in an UTF-16 null-terminated string */
1167        memcpy(dfs_req->RequestFileName, utf16_path, utf16_path_len);
1168
1169        do {
1170                /* try first with IPC */
1171                rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
1172                                FSCTL_DFS_GET_REFERRALS,
1173                                true /* is_fsctl */, true /* use_ipc */,
1174                                (char *)dfs_req, dfs_req_size,
1175                                (char **)&dfs_rsp, &dfs_rsp_size);
1176                if (rc == -ENOTCONN) {
1177                        /* try with normal tcon */
1178                        rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
1179                                        FSCTL_DFS_GET_REFERRALS,
1180                                        true /* is_fsctl */, false /*use_ipc*/,
1181                                        (char *)dfs_req, dfs_req_size,
1182                                        (char **)&dfs_rsp, &dfs_rsp_size);
1183                }
1184        } while (rc == -EAGAIN);
1185
1186        if (rc) {
1187                cifs_dbg(VFS, "ioctl error in smb2_get_dfs_refer rc=%d\n", rc);
1188                goto out;
1189        }
1190
1191        rc = parse_dfs_referrals(dfs_rsp, dfs_rsp_size,
1192                                 num_of_nodes, target_nodes,
1193                                 nls_codepage, remap, search_name,
1194                                 true /* is_unicode */);
1195        if (rc) {
1196                cifs_dbg(VFS, "parse error in smb2_get_dfs_refer rc=%d\n", rc);
1197                goto out;
1198        }
1199
1200 out:
1201        if (tcon) {
1202                spin_lock(&cifs_tcp_ses_lock);
1203                tcon->tc_count--;
1204                spin_unlock(&cifs_tcp_ses_lock);
1205        }
1206        kfree(utf16_path);
1207        kfree(dfs_req);
1208        kfree(dfs_rsp);
1209        return rc;
1210}
1211#define SMB2_SYMLINK_STRUCT_SIZE \
1212        (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp))
1213
1214static int
1215smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
1216                   const char *full_path, char **target_path,
1217                   struct cifs_sb_info *cifs_sb)
1218{
1219        int rc;
1220        __le16 *utf16_path;
1221        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1222        struct cifs_open_parms oparms;
1223        struct cifs_fid fid;
1224        struct smb2_err_rsp *err_buf = NULL;
1225        struct smb2_symlink_err_rsp *symlink;
1226        unsigned int sub_len;
1227        unsigned int sub_offset;
1228        unsigned int print_len;
1229        unsigned int print_offset;
1230
1231        cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
1232
1233        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
1234        if (!utf16_path)
1235                return -ENOMEM;
1236
1237        oparms.tcon = tcon;
1238        oparms.desired_access = FILE_READ_ATTRIBUTES;
1239        oparms.disposition = FILE_OPEN;
1240        oparms.create_options = 0;
1241        oparms.fid = &fid;
1242        oparms.reconnect = false;
1243
1244        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, &err_buf);
1245
1246        if (!rc || !err_buf) {
1247                kfree(utf16_path);
1248                return -ENOENT;
1249        }
1250
1251        if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) ||
1252            get_rfc1002_length(err_buf) + 4 < SMB2_SYMLINK_STRUCT_SIZE) {
1253                kfree(utf16_path);
1254                return -ENOENT;
1255        }
1256
1257        /* open must fail on symlink - reset rc */
1258        rc = 0;
1259        symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData;
1260        sub_len = le16_to_cpu(symlink->SubstituteNameLength);
1261        sub_offset = le16_to_cpu(symlink->SubstituteNameOffset);
1262        print_len = le16_to_cpu(symlink->PrintNameLength);
1263        print_offset = le16_to_cpu(symlink->PrintNameOffset);
1264
1265        if (get_rfc1002_length(err_buf) + 4 <
1266                        SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
1267                kfree(utf16_path);
1268                return -ENOENT;
1269        }
1270
1271        if (get_rfc1002_length(err_buf) + 4 <
1272                        SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
1273                kfree(utf16_path);
1274                return -ENOENT;
1275        }
1276
1277        *target_path = cifs_strndup_from_utf16(
1278                                (char *)symlink->PathBuffer + sub_offset,
1279                                sub_len, true, cifs_sb->local_nls);
1280        if (!(*target_path)) {
1281                kfree(utf16_path);
1282                return -ENOMEM;
1283        }
1284        convert_delimiter(*target_path, '/');
1285        cifs_dbg(FYI, "%s: target path: %s\n", __func__, *target_path);
1286        kfree(utf16_path);
1287        return rc;
1288}
1289
1290static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
1291                            loff_t offset, loff_t len, bool keep_size)
1292{
1293        struct inode *inode;
1294        struct cifsInodeInfo *cifsi;
1295        struct cifsFileInfo *cfile = file->private_data;
1296        struct file_zero_data_information fsctl_buf;
1297        long rc;
1298        unsigned int xid;
1299
1300        xid = get_xid();
1301
1302        inode = d_inode(cfile->dentry);
1303        cifsi = CIFS_I(inode);
1304
1305        /* if file not oplocked can't be sure whether asking to extend size */
1306        if (!CIFS_CACHE_READ(cifsi))
1307                if (keep_size == false)
1308                        return -EOPNOTSUPP;
1309
1310        /*
1311         * Must check if file sparse since fallocate -z (zero range) assumes
1312         * non-sparse allocation
1313         */
1314        if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE))
1315                return -EOPNOTSUPP;
1316
1317        /*
1318         * need to make sure we are not asked to extend the file since the SMB3
1319         * fsctl does not change the file size. In the future we could change
1320         * this to zero the first part of the range then set the file size
1321         * which for a non sparse file would zero the newly extended range
1322         */
1323        if (keep_size == false)
1324                if (i_size_read(inode) < offset + len)
1325                        return -EOPNOTSUPP;
1326
1327        cifs_dbg(FYI, "offset %lld len %lld", offset, len);
1328
1329        fsctl_buf.FileOffset = cpu_to_le64(offset);
1330        fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len);
1331
1332        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1333                        cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
1334                        true /* is_fctl */, false /* use_ipc */,
1335                        (char *)&fsctl_buf,
1336                        sizeof(struct file_zero_data_information), NULL, NULL);
1337        free_xid(xid);
1338        return rc;
1339}
1340
1341static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon,
1342                            loff_t offset, loff_t len)
1343{
1344        struct inode *inode;
1345        struct cifsInodeInfo *cifsi;
1346        struct cifsFileInfo *cfile = file->private_data;
1347        struct file_zero_data_information fsctl_buf;
1348        long rc;
1349        unsigned int xid;
1350        __u8 set_sparse = 1;
1351
1352        xid = get_xid();
1353
1354        inode = d_inode(cfile->dentry);
1355        cifsi = CIFS_I(inode);
1356
1357        /* Need to make file sparse, if not already, before freeing range. */
1358        /* Consider adding equivalent for compressed since it could also work */
1359        if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse))
1360                return -EOPNOTSUPP;
1361
1362        cifs_dbg(FYI, "offset %lld len %lld", offset, len);
1363
1364        fsctl_buf.FileOffset = cpu_to_le64(offset);
1365        fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len);
1366
1367        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1368                        cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
1369                        true /* is_fctl */, false /* use_ipc */,
1370                        (char *)&fsctl_buf,
1371                        sizeof(struct file_zero_data_information), NULL, NULL);
1372        free_xid(xid);
1373        return rc;
1374}
1375
1376static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
1377                            loff_t off, loff_t len, bool keep_size)
1378{
1379        struct inode *inode;
1380        struct cifsInodeInfo *cifsi;
1381        struct cifsFileInfo *cfile = file->private_data;
1382        long rc = -EOPNOTSUPP;
1383        unsigned int xid;
1384
1385        xid = get_xid();
1386
1387        inode = d_inode(cfile->dentry);
1388        cifsi = CIFS_I(inode);
1389
1390        /* if file not oplocked can't be sure whether asking to extend size */
1391        if (!CIFS_CACHE_READ(cifsi))
1392                if (keep_size == false)
1393                        return -EOPNOTSUPP;
1394
1395        /*
1396         * Files are non-sparse by default so falloc may be a no-op
1397         * Must check if file sparse. If not sparse, and not extending
1398         * then no need to do anything since file already allocated
1399         */
1400        if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) {
1401                if (keep_size == true)
1402                        return 0;
1403                /* check if extending file */
1404                else if (i_size_read(inode) >= off + len)
1405                        /* not extending file and already not sparse */
1406                        return 0;
1407                /* BB: in future add else clause to extend file */
1408                else
1409                        return -EOPNOTSUPP;
1410        }
1411
1412        if ((keep_size == true) || (i_size_read(inode) >= off + len)) {
1413                /*
1414                 * Check if falloc starts within first few pages of file
1415                 * and ends within a few pages of the end of file to
1416                 * ensure that most of file is being forced to be
1417                 * fallocated now. If so then setting whole file sparse
1418                 * ie potentially making a few extra pages at the beginning
1419                 * or end of the file non-sparse via set_sparse is harmless.
1420                 */
1421                if ((off > 8192) || (off + len + 8192 < i_size_read(inode)))
1422                        return -EOPNOTSUPP;
1423
1424                rc = smb2_set_sparse(xid, tcon, cfile, inode, false);
1425        }
1426        /* BB: else ... in future add code to extend file and set sparse */
1427
1428
1429        free_xid(xid);
1430        return rc;
1431}
1432
1433
1434static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode,
1435                           loff_t off, loff_t len)
1436{
1437        /* KEEP_SIZE already checked for by do_fallocate */
1438        if (mode & FALLOC_FL_PUNCH_HOLE)
1439                return smb3_punch_hole(file, tcon, off, len);
1440        else if (mode & FALLOC_FL_ZERO_RANGE) {
1441                if (mode & FALLOC_FL_KEEP_SIZE)
1442                        return smb3_zero_range(file, tcon, off, len, true);
1443                return smb3_zero_range(file, tcon, off, len, false);
1444        } else if (mode == FALLOC_FL_KEEP_SIZE)
1445                return smb3_simple_falloc(file, tcon, off, len, true);
1446        else if (mode == 0)
1447                return smb3_simple_falloc(file, tcon, off, len, false);
1448
1449        return -EOPNOTSUPP;
1450}
1451
1452static void
1453smb2_downgrade_oplock(struct TCP_Server_Info *server,
1454                        struct cifsInodeInfo *cinode, bool set_level2)
1455{
1456        if (set_level2)
1457                server->ops->set_oplock_level(cinode, SMB2_OPLOCK_LEVEL_II,
1458                                                0, NULL);
1459        else
1460                server->ops->set_oplock_level(cinode, 0, 0, NULL);
1461}
1462
1463static void
1464smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
1465                      unsigned int epoch, bool *purge_cache)
1466{
1467        oplock &= 0xFF;
1468        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
1469                return;
1470        if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
1471                cinode->oplock = CIFS_CACHE_RHW_FLG;
1472                cifs_dbg(FYI, "Batch Oplock granted on inode %p\n",
1473                         &cinode->vfs_inode);
1474        } else if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
1475                cinode->oplock = CIFS_CACHE_RW_FLG;
1476                cifs_dbg(FYI, "Exclusive Oplock granted on inode %p\n",
1477                         &cinode->vfs_inode);
1478        } else if (oplock == SMB2_OPLOCK_LEVEL_II) {
1479                cinode->oplock = CIFS_CACHE_READ_FLG;
1480                cifs_dbg(FYI, "Level II Oplock granted on inode %p\n",
1481                         &cinode->vfs_inode);
1482        } else
1483                cinode->oplock = 0;
1484}
1485
1486static void
1487smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
1488                       unsigned int epoch, bool *purge_cache)
1489{
1490        char message[5] = {0};
1491
1492        oplock &= 0xFF;
1493        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
1494                return;
1495
1496        cinode->oplock = 0;
1497        if (oplock & SMB2_LEASE_READ_CACHING_HE) {
1498                cinode->oplock |= CIFS_CACHE_READ_FLG;
1499                strcat(message, "R");
1500        }
1501        if (oplock & SMB2_LEASE_HANDLE_CACHING_HE) {
1502                cinode->oplock |= CIFS_CACHE_HANDLE_FLG;
1503                strcat(message, "H");
1504        }
1505        if (oplock & SMB2_LEASE_WRITE_CACHING_HE) {
1506                cinode->oplock |= CIFS_CACHE_WRITE_FLG;
1507                strcat(message, "W");
1508        }
1509        if (!cinode->oplock)
1510                strcat(message, "None");
1511        cifs_dbg(FYI, "%s Lease granted on inode %p\n", message,
1512                 &cinode->vfs_inode);
1513}
1514
1515static void
1516smb3_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
1517                      unsigned int epoch, bool *purge_cache)
1518{
1519        unsigned int old_oplock = cinode->oplock;
1520
1521        smb21_set_oplock_level(cinode, oplock, epoch, purge_cache);
1522
1523        if (purge_cache) {
1524                *purge_cache = false;
1525                if (old_oplock == CIFS_CACHE_READ_FLG) {
1526                        if (cinode->oplock == CIFS_CACHE_READ_FLG &&
1527                            (epoch - cinode->epoch > 0))
1528                                *purge_cache = true;
1529                        else if (cinode->oplock == CIFS_CACHE_RH_FLG &&
1530                                 (epoch - cinode->epoch > 1))
1531                                *purge_cache = true;
1532                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
1533                                 (epoch - cinode->epoch > 1))
1534                                *purge_cache = true;
1535                        else if (cinode->oplock == 0 &&
1536                                 (epoch - cinode->epoch > 0))
1537                                *purge_cache = true;
1538                } else if (old_oplock == CIFS_CACHE_RH_FLG) {
1539                        if (cinode->oplock == CIFS_CACHE_RH_FLG &&
1540                            (epoch - cinode->epoch > 0))
1541                                *purge_cache = true;
1542                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
1543                                 (epoch - cinode->epoch > 1))
1544                                *purge_cache = true;
1545                }
1546                cinode->epoch = epoch;
1547        }
1548}
1549
1550static bool
1551smb2_is_read_op(__u32 oplock)
1552{
1553        return oplock == SMB2_OPLOCK_LEVEL_II;
1554}
1555
1556static bool
1557smb21_is_read_op(__u32 oplock)
1558{
1559        return (oplock & SMB2_LEASE_READ_CACHING_HE) &&
1560               !(oplock & SMB2_LEASE_WRITE_CACHING_HE);
1561}
1562
1563static __le32
1564map_oplock_to_lease(u8 oplock)
1565{
1566        if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE)
1567                return SMB2_LEASE_WRITE_CACHING | SMB2_LEASE_READ_CACHING;
1568        else if (oplock == SMB2_OPLOCK_LEVEL_II)
1569                return SMB2_LEASE_READ_CACHING;
1570        else if (oplock == SMB2_OPLOCK_LEVEL_BATCH)
1571                return SMB2_LEASE_HANDLE_CACHING | SMB2_LEASE_READ_CACHING |
1572                       SMB2_LEASE_WRITE_CACHING;
1573        return 0;
1574}
1575
1576static char *
1577smb2_create_lease_buf(u8 *lease_key, u8 oplock)
1578{
1579        struct create_lease *buf;
1580
1581        buf = kzalloc(sizeof(struct create_lease), GFP_KERNEL);
1582        if (!buf)
1583                return NULL;
1584
1585        buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
1586        buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
1587        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
1588
1589        buf->ccontext.DataOffset = cpu_to_le16(offsetof
1590                                        (struct create_lease, lcontext));
1591        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context));
1592        buf->ccontext.NameOffset = cpu_to_le16(offsetof
1593                                (struct create_lease, Name));
1594        buf->ccontext.NameLength = cpu_to_le16(4);
1595        /* SMB2_CREATE_REQUEST_LEASE is "RqLs" */
1596        buf->Name[0] = 'R';
1597        buf->Name[1] = 'q';
1598        buf->Name[2] = 'L';
1599        buf->Name[3] = 's';
1600        return (char *)buf;
1601}
1602
1603static char *
1604smb3_create_lease_buf(u8 *lease_key, u8 oplock)
1605{
1606        struct create_lease_v2 *buf;
1607
1608        buf = kzalloc(sizeof(struct create_lease_v2), GFP_KERNEL);
1609        if (!buf)
1610                return NULL;
1611
1612        buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
1613        buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
1614        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
1615
1616        buf->ccontext.DataOffset = cpu_to_le16(offsetof
1617                                        (struct create_lease_v2, lcontext));
1618        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2));
1619        buf->ccontext.NameOffset = cpu_to_le16(offsetof
1620                                (struct create_lease_v2, Name));
1621        buf->ccontext.NameLength = cpu_to_le16(4);
1622        /* SMB2_CREATE_REQUEST_LEASE is "RqLs" */
1623        buf->Name[0] = 'R';
1624        buf->Name[1] = 'q';
1625        buf->Name[2] = 'L';
1626        buf->Name[3] = 's';
1627        return (char *)buf;
1628}
1629
1630static __u8
1631smb2_parse_lease_buf(void *buf, unsigned int *epoch)
1632{
1633        struct create_lease *lc = (struct create_lease *)buf;
1634
1635        *epoch = 0; /* not used */
1636        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
1637                return SMB2_OPLOCK_LEVEL_NOCHANGE;
1638        return le32_to_cpu(lc->lcontext.LeaseState);
1639}
1640
1641static __u8
1642smb3_parse_lease_buf(void *buf, unsigned int *epoch)
1643{
1644        struct create_lease_v2 *lc = (struct create_lease_v2 *)buf;
1645
1646        *epoch = le16_to_cpu(lc->lcontext.Epoch);
1647        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
1648                return SMB2_OPLOCK_LEVEL_NOCHANGE;
1649        return le32_to_cpu(lc->lcontext.LeaseState);
1650}
1651
1652static unsigned int
1653smb2_wp_retry_size(struct inode *inode)
1654{
1655        return min_t(unsigned int, CIFS_SB(inode->i_sb)->wsize,
1656                     SMB2_MAX_BUFFER_SIZE);
1657}
1658
1659static bool
1660smb2_dir_needs_close(struct cifsFileInfo *cfile)
1661{
1662        return !cfile->invalidHandle;
1663}
1664
1665static void
1666fill_transform_hdr(struct smb2_transform_hdr *tr_hdr, struct smb_rqst *old_rq)
1667{
1668        struct smb2_sync_hdr *shdr =
1669                        (struct smb2_sync_hdr *)old_rq->rq_iov[1].iov_base;
1670        unsigned int orig_len = get_rfc1002_length(old_rq->rq_iov[0].iov_base);
1671
1672        memset(tr_hdr, 0, sizeof(struct smb2_transform_hdr));
1673        tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM;
1674        tr_hdr->OriginalMessageSize = cpu_to_le32(orig_len);
1675        tr_hdr->Flags = cpu_to_le16(0x01);
1676        get_random_bytes(&tr_hdr->Nonce, SMB3_AES128CMM_NONCE);
1677        memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8);
1678        inc_rfc1001_len(tr_hdr, sizeof(struct smb2_transform_hdr) - 4);
1679        inc_rfc1001_len(tr_hdr, orig_len);
1680}
1681
1682static struct scatterlist *
1683init_sg(struct smb_rqst *rqst, u8 *sign)
1684{
1685        unsigned int sg_len = rqst->rq_nvec + rqst->rq_npages + 1;
1686        unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 24;
1687        struct scatterlist *sg;
1688        unsigned int i;
1689        unsigned int j;
1690
1691        sg = kmalloc_array(sg_len, sizeof(struct scatterlist), GFP_KERNEL);
1692        if (!sg)
1693                return NULL;
1694
1695        sg_init_table(sg, sg_len);
1696        sg_set_buf(&sg[0], rqst->rq_iov[0].iov_base + 24, assoc_data_len);
1697        for (i = 1; i < rqst->rq_nvec; i++)
1698                sg_set_buf(&sg[i], rqst->rq_iov[i].iov_base,
1699                                                rqst->rq_iov[i].iov_len);
1700        for (j = 0; i < sg_len - 1; i++, j++) {
1701                unsigned int len = (j < rqst->rq_npages - 1) ? rqst->rq_pagesz
1702                                                        : rqst->rq_tailsz;
1703                sg_set_page(&sg[i], rqst->rq_pages[j], len, 0);
1704        }
1705        sg_set_buf(&sg[sg_len - 1], sign, SMB2_SIGNATURE_SIZE);
1706        return sg;
1707}
1708
1709struct cifs_crypt_result {
1710        int err;
1711        struct completion completion;
1712};
1713
1714static void cifs_crypt_complete(struct crypto_async_request *req, int err)
1715{
1716        struct cifs_crypt_result *res = req->data;
1717
1718        if (err == -EINPROGRESS)
1719                return;
1720
1721        res->err = err;
1722        complete(&res->completion);
1723}
1724
1725static int
1726smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
1727{
1728        struct cifs_ses *ses;
1729        u8 *ses_enc_key;
1730
1731        spin_lock(&cifs_tcp_ses_lock);
1732        list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1733                if (ses->Suid != ses_id)
1734                        continue;
1735                ses_enc_key = enc ? ses->smb3encryptionkey :
1736                                                        ses->smb3decryptionkey;
1737                memcpy(key, ses_enc_key, SMB3_SIGN_KEY_SIZE);
1738                spin_unlock(&cifs_tcp_ses_lock);
1739                return 0;
1740        }
1741        spin_unlock(&cifs_tcp_ses_lock);
1742
1743        return 1;
1744}
1745/*
1746 * Encrypt or decrypt @rqst message. @rqst has the following format:
1747 * iov[0] - transform header (associate data),
1748 * iov[1-N] and pages - data to encrypt.
1749 * On success return encrypted data in iov[1-N] and pages, leave iov[0]
1750 * untouched.
1751 */
1752static int
1753crypt_message(struct TCP_Server_Info *server, struct smb_rqst *rqst, int enc)
1754{
1755        struct smb2_transform_hdr *tr_hdr =
1756                        (struct smb2_transform_hdr *)rqst->rq_iov[0].iov_base;
1757        unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 24;
1758        int rc = 0;
1759        struct scatterlist *sg;
1760        u8 sign[SMB2_SIGNATURE_SIZE] = {};
1761        u8 key[SMB3_SIGN_KEY_SIZE];
1762        struct aead_request *req;
1763        char *iv;
1764        unsigned int iv_len;
1765        struct cifs_crypt_result result = {0, };
1766        struct crypto_aead *tfm;
1767        unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
1768
1769        init_completion(&result.completion);
1770
1771        rc = smb2_get_enc_key(server, tr_hdr->SessionId, enc, key);
1772        if (rc) {
1773                cifs_dbg(VFS, "%s: Could not get %scryption key\n", __func__,
1774                         enc ? "en" : "de");
1775                return 0;
1776        }
1777
1778        rc = smb3_crypto_aead_allocate(server);
1779        if (rc) {
1780                cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
1781                return rc;
1782        }
1783
1784        tfm = enc ? server->secmech.ccmaesencrypt :
1785                                                server->secmech.ccmaesdecrypt;
1786        rc = crypto_aead_setkey(tfm, key, SMB3_SIGN_KEY_SIZE);
1787        if (rc) {
1788                cifs_dbg(VFS, "%s: Failed to set aead key %d\n", __func__, rc);
1789                return rc;
1790        }
1791
1792        rc = crypto_aead_setauthsize(tfm, SMB2_SIGNATURE_SIZE);
1793        if (rc) {
1794                cifs_dbg(VFS, "%s: Failed to set authsize %d\n", __func__, rc);
1795                return rc;
1796        }
1797
1798        req = aead_request_alloc(tfm, GFP_KERNEL);
1799        if (!req) {
1800                cifs_dbg(VFS, "%s: Failed to alloc aead request", __func__);
1801                return -ENOMEM;
1802        }
1803
1804        if (!enc) {
1805                memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE);
1806                crypt_len += SMB2_SIGNATURE_SIZE;
1807        }
1808
1809        sg = init_sg(rqst, sign);
1810        if (!sg) {
1811                cifs_dbg(VFS, "%s: Failed to init sg %d", __func__, rc);
1812                goto free_req;
1813        }
1814
1815        iv_len = crypto_aead_ivsize(tfm);
1816        iv = kzalloc(iv_len, GFP_KERNEL);
1817        if (!iv) {
1818                cifs_dbg(VFS, "%s: Failed to alloc IV", __func__);
1819                goto free_sg;
1820        }
1821        iv[0] = 3;
1822        memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES128CMM_NONCE);
1823
1824        aead_request_set_crypt(req, sg, sg, crypt_len, iv);
1825        aead_request_set_ad(req, assoc_data_len);
1826
1827        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1828                                  cifs_crypt_complete, &result);
1829
1830        rc = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
1831
1832        if (rc == -EINPROGRESS || rc == -EBUSY) {
1833                wait_for_completion(&result.completion);
1834                rc = result.err;
1835        }
1836
1837        if (!rc && enc)
1838                memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE);
1839
1840        kfree(iv);
1841free_sg:
1842        kfree(sg);
1843free_req:
1844        kfree(req);
1845        return rc;
1846}
1847
1848static int
1849smb3_init_transform_rq(struct TCP_Server_Info *server, struct smb_rqst *new_rq,
1850                       struct smb_rqst *old_rq)
1851{
1852        struct kvec *iov;
1853        struct page **pages;
1854        struct smb2_transform_hdr *tr_hdr;
1855        unsigned int npages = old_rq->rq_npages;
1856        int i;
1857        int rc = -ENOMEM;
1858
1859        pages = kmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
1860        if (!pages)
1861                return rc;
1862
1863        new_rq->rq_pages = pages;
1864        new_rq->rq_npages = old_rq->rq_npages;
1865        new_rq->rq_pagesz = old_rq->rq_pagesz;
1866        new_rq->rq_tailsz = old_rq->rq_tailsz;
1867
1868        for (i = 0; i < npages; i++) {
1869                pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
1870                if (!pages[i])
1871                        goto err_free_pages;
1872        }
1873
1874        iov = kmalloc_array(old_rq->rq_nvec, sizeof(struct kvec), GFP_KERNEL);
1875        if (!iov)
1876                goto err_free_pages;
1877
1878        /* copy all iovs from the old except the 1st one (rfc1002 length) */
1879        memcpy(&iov[1], &old_rq->rq_iov[1],
1880                                sizeof(struct kvec) * (old_rq->rq_nvec - 1));
1881        new_rq->rq_iov = iov;
1882        new_rq->rq_nvec = old_rq->rq_nvec;
1883
1884        tr_hdr = kmalloc(sizeof(struct smb2_transform_hdr), GFP_KERNEL);
1885        if (!tr_hdr)
1886                goto err_free_iov;
1887
1888        /* fill the 1st iov with a transform header */
1889        fill_transform_hdr(tr_hdr, old_rq);
1890        new_rq->rq_iov[0].iov_base = tr_hdr;
1891        new_rq->rq_iov[0].iov_len = sizeof(struct smb2_transform_hdr);
1892
1893        /* copy pages form the old */
1894        for (i = 0; i < npages; i++) {
1895                char *dst = kmap(new_rq->rq_pages[i]);
1896                char *src = kmap(old_rq->rq_pages[i]);
1897                unsigned int len = (i < npages - 1) ? new_rq->rq_pagesz :
1898                                                        new_rq->rq_tailsz;
1899                memcpy(dst, src, len);
1900                kunmap(new_rq->rq_pages[i]);
1901                kunmap(old_rq->rq_pages[i]);
1902        }
1903
1904        rc = crypt_message(server, new_rq, 1);
1905        cifs_dbg(FYI, "encrypt message returned %d", rc);
1906        if (rc)
1907                goto err_free_tr_hdr;
1908
1909        return rc;
1910
1911err_free_tr_hdr:
1912        kfree(tr_hdr);
1913err_free_iov:
1914        kfree(iov);
1915err_free_pages:
1916        for (i = i - 1; i >= 0; i--)
1917                put_page(pages[i]);
1918        kfree(pages);
1919        return rc;
1920}
1921
1922static void
1923smb3_free_transform_rq(struct smb_rqst *rqst)
1924{
1925        int i = rqst->rq_npages - 1;
1926
1927        for (; i >= 0; i--)
1928                put_page(rqst->rq_pages[i]);
1929        kfree(rqst->rq_pages);
1930        /* free transform header */
1931        kfree(rqst->rq_iov[0].iov_base);
1932        kfree(rqst->rq_iov);
1933}
1934
1935static int
1936smb3_is_transform_hdr(void *buf)
1937{
1938        struct smb2_transform_hdr *trhdr = buf;
1939
1940        return trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM;
1941}
1942
1943static int
1944decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
1945                 unsigned int buf_data_size, struct page **pages,
1946                 unsigned int npages, unsigned int page_data_size)
1947{
1948        struct kvec iov[2];
1949        struct smb_rqst rqst = {NULL};
1950        struct smb2_hdr *hdr;
1951        int rc;
1952
1953        iov[0].iov_base = buf;
1954        iov[0].iov_len = sizeof(struct smb2_transform_hdr);
1955        iov[1].iov_base = buf + sizeof(struct smb2_transform_hdr);
1956        iov[1].iov_len = buf_data_size;
1957
1958        rqst.rq_iov = iov;
1959        rqst.rq_nvec = 2;
1960        rqst.rq_pages = pages;
1961        rqst.rq_npages = npages;
1962        rqst.rq_pagesz = PAGE_SIZE;
1963        rqst.rq_tailsz = (page_data_size % PAGE_SIZE) ? : PAGE_SIZE;
1964
1965        rc = crypt_message(server, &rqst, 0);
1966        cifs_dbg(FYI, "decrypt message returned %d\n", rc);
1967
1968        if (rc)
1969                return rc;
1970
1971        memmove(buf + 4, iov[1].iov_base, buf_data_size);
1972        hdr = (struct smb2_hdr *)buf;
1973        hdr->smb2_buf_length = cpu_to_be32(buf_data_size + page_data_size);
1974        server->total_read = buf_data_size + page_data_size + 4;
1975
1976        return rc;
1977}
1978
1979static int
1980read_data_into_pages(struct TCP_Server_Info *server, struct page **pages,
1981                     unsigned int npages, unsigned int len)
1982{
1983        int i;
1984        int length;
1985
1986        for (i = 0; i < npages; i++) {
1987                struct page *page = pages[i];
1988                size_t n;
1989
1990                n = len;
1991                if (len >= PAGE_SIZE) {
1992                        /* enough data to fill the page */
1993                        n = PAGE_SIZE;
1994                        len -= n;
1995                } else {
1996                        zero_user(page, len, PAGE_SIZE - len);
1997                        len = 0;
1998                }
1999                length = cifs_read_page_from_socket(server, page, n);
2000                if (length < 0)
2001                        return length;
2002                server->total_read += length;
2003        }
2004
2005        return 0;
2006}
2007
2008static int
2009init_read_bvec(struct page **pages, unsigned int npages, unsigned int data_size,
2010               unsigned int cur_off, struct bio_vec **page_vec)
2011{
2012        struct bio_vec *bvec;
2013        int i;
2014
2015        bvec = kcalloc(npages, sizeof(struct bio_vec), GFP_KERNEL);
2016        if (!bvec)
2017                return -ENOMEM;
2018
2019        for (i = 0; i < npages; i++) {
2020                bvec[i].bv_page = pages[i];
2021                bvec[i].bv_offset = (i == 0) ? cur_off : 0;
2022                bvec[i].bv_len = min_t(unsigned int, PAGE_SIZE, data_size);
2023                data_size -= bvec[i].bv_len;
2024        }
2025
2026        if (data_size != 0) {
2027                cifs_dbg(VFS, "%s: something went wrong\n", __func__);
2028                kfree(bvec);
2029                return -EIO;
2030        }
2031
2032        *page_vec = bvec;
2033        return 0;
2034}
2035
2036static int
2037handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
2038                 char *buf, unsigned int buf_len, struct page **pages,
2039                 unsigned int npages, unsigned int page_data_size)
2040{
2041        unsigned int data_offset;
2042        unsigned int data_len;
2043        unsigned int cur_off;
2044        unsigned int cur_page_idx;
2045        unsigned int pad_len;
2046        struct cifs_readdata *rdata = mid->callback_data;
2047        struct smb2_sync_hdr *shdr = get_sync_hdr(buf);
2048        struct bio_vec *bvec = NULL;
2049        struct iov_iter iter;
2050        struct kvec iov;
2051        int length;
2052
2053        if (shdr->Command != SMB2_READ) {
2054                cifs_dbg(VFS, "only big read responses are supported\n");
2055                return -ENOTSUPP;
2056        }
2057
2058        if (server->ops->is_status_pending &&
2059                        server->ops->is_status_pending(buf, server, 0))
2060                return -1;
2061
2062        rdata->result = server->ops->map_error(buf, false);
2063        if (rdata->result != 0) {
2064                cifs_dbg(FYI, "%s: server returned error %d\n",
2065                         __func__, rdata->result);
2066                dequeue_mid(mid, rdata->result);
2067                return 0;
2068        }
2069
2070        data_offset = server->ops->read_data_offset(buf) + 4;
2071        data_len = server->ops->read_data_length(buf);
2072
2073        if (data_offset < server->vals->read_rsp_size) {
2074                /*
2075                 * win2k8 sometimes sends an offset of 0 when the read
2076                 * is beyond the EOF. Treat it as if the data starts just after
2077                 * the header.
2078                 */
2079                cifs_dbg(FYI, "%s: data offset (%u) inside read response header\n",
2080                         __func__, data_offset);
2081                data_offset = server->vals->read_rsp_size;
2082        } else if (data_offset > MAX_CIFS_SMALL_BUFFER_SIZE) {
2083                /* data_offset is beyond the end of smallbuf */
2084                cifs_dbg(FYI, "%s: data offset (%u) beyond end of smallbuf\n",
2085                         __func__, data_offset);
2086                rdata->result = -EIO;
2087                dequeue_mid(mid, rdata->result);
2088                return 0;
2089        }
2090
2091        pad_len = data_offset - server->vals->read_rsp_size;
2092
2093        if (buf_len <= data_offset) {
2094                /* read response payload is in pages */
2095                cur_page_idx = pad_len / PAGE_SIZE;
2096                cur_off = pad_len % PAGE_SIZE;
2097
2098                if (cur_page_idx != 0) {
2099                        /* data offset is beyond the 1st page of response */
2100                        cifs_dbg(FYI, "%s: data offset (%u) beyond 1st page of response\n",
2101                                 __func__, data_offset);
2102                        rdata->result = -EIO;
2103                        dequeue_mid(mid, rdata->result);
2104                        return 0;
2105                }
2106
2107                if (data_len > page_data_size - pad_len) {
2108                        /* data_len is corrupt -- discard frame */
2109                        rdata->result = -EIO;
2110                        dequeue_mid(mid, rdata->result);
2111                        return 0;
2112                }
2113
2114                rdata->result = init_read_bvec(pages, npages, page_data_size,
2115                                               cur_off, &bvec);
2116                if (rdata->result != 0) {
2117                        dequeue_mid(mid, rdata->result);
2118                        return 0;
2119                }
2120
2121                iov_iter_bvec(&iter, WRITE | ITER_BVEC, bvec, npages, data_len);
2122        } else if (buf_len >= data_offset + data_len) {
2123                /* read response payload is in buf */
2124                WARN_ONCE(npages > 0, "read data can be either in buf or in pages");
2125                iov.iov_base = buf + data_offset;
2126                iov.iov_len = data_len;
2127                iov_iter_kvec(&iter, WRITE | ITER_KVEC, &iov, 1, data_len);
2128        } else {
2129                /* read response payload cannot be in both buf and pages */
2130                WARN_ONCE(1, "buf can not contain only a part of read data");
2131                rdata->result = -EIO;
2132                dequeue_mid(mid, rdata->result);
2133                return 0;
2134        }
2135
2136        /* set up first iov for signature check */
2137        rdata->iov[0].iov_base = buf;
2138        rdata->iov[0].iov_len = 4;
2139        rdata->iov[1].iov_base = buf + 4;
2140        rdata->iov[1].iov_len = server->vals->read_rsp_size - 4;
2141        cifs_dbg(FYI, "0: iov_base=%p iov_len=%zu\n",
2142                 rdata->iov[0].iov_base, server->vals->read_rsp_size);
2143
2144        length = rdata->copy_into_pages(server, rdata, &iter);
2145
2146        kfree(bvec);
2147
2148        if (length < 0)
2149                return length;
2150
2151        dequeue_mid(mid, false);
2152        return length;
2153}
2154
2155static int
2156receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
2157{
2158        char *buf = server->smallbuf;
2159        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
2160        unsigned int npages;
2161        struct page **pages;
2162        unsigned int len;
2163        unsigned int buflen = get_rfc1002_length(buf) + 4;
2164        int rc;
2165        int i = 0;
2166
2167        len = min_t(unsigned int, buflen, server->vals->read_rsp_size - 4 +
2168                sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1;
2169
2170        rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len);
2171        if (rc < 0)
2172                return rc;
2173        server->total_read += rc;
2174
2175        len = le32_to_cpu(tr_hdr->OriginalMessageSize) + 4 -
2176                                                server->vals->read_rsp_size;
2177        npages = DIV_ROUND_UP(len, PAGE_SIZE);
2178
2179        pages = kmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
2180        if (!pages) {
2181                rc = -ENOMEM;
2182                goto discard_data;
2183        }
2184
2185        for (; i < npages; i++) {
2186                pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2187                if (!pages[i]) {
2188                        rc = -ENOMEM;
2189                        goto discard_data;
2190                }
2191        }
2192
2193        /* read read data into pages */
2194        rc = read_data_into_pages(server, pages, npages, len);
2195        if (rc)
2196                goto free_pages;
2197
2198        rc = cifs_discard_remaining_data(server);
2199        if (rc)
2200                goto free_pages;
2201
2202        rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size - 4,
2203                              pages, npages, len);
2204        if (rc)
2205                goto free_pages;
2206
2207        *mid = smb2_find_mid(server, buf);
2208        if (*mid == NULL)
2209                cifs_dbg(FYI, "mid not found\n");
2210        else {
2211                cifs_dbg(FYI, "mid found\n");
2212                (*mid)->decrypted = true;
2213                rc = handle_read_data(server, *mid, buf,
2214                                      server->vals->read_rsp_size,
2215                                      pages, npages, len);
2216        }
2217
2218free_pages:
2219        for (i = i - 1; i >= 0; i--)
2220                put_page(pages[i]);
2221        kfree(pages);
2222        return rc;
2223discard_data:
2224        cifs_discard_remaining_data(server);
2225        goto free_pages;
2226}
2227
2228static int
2229receive_encrypted_standard(struct TCP_Server_Info *server,
2230                           struct mid_q_entry **mid)
2231{
2232        int length;
2233        char *buf = server->smallbuf;
2234        unsigned int pdu_length = get_rfc1002_length(buf);
2235        unsigned int buf_size;
2236        struct mid_q_entry *mid_entry;
2237
2238        /* switch to large buffer if too big for a small one */
2239        if (pdu_length + 4 > MAX_CIFS_SMALL_BUFFER_SIZE) {
2240                server->large_buf = true;
2241                memcpy(server->bigbuf, buf, server->total_read);
2242                buf = server->bigbuf;
2243        }
2244
2245        /* now read the rest */
2246        length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
2247                                pdu_length - HEADER_SIZE(server) + 1 + 4);
2248        if (length < 0)
2249                return length;
2250        server->total_read += length;
2251
2252        buf_size = pdu_length + 4 - sizeof(struct smb2_transform_hdr);
2253        length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0);
2254        if (length)
2255                return length;
2256
2257        mid_entry = smb2_find_mid(server, buf);
2258        if (mid_entry == NULL)
2259                cifs_dbg(FYI, "mid not found\n");
2260        else {
2261                cifs_dbg(FYI, "mid found\n");
2262                mid_entry->decrypted = true;
2263        }
2264
2265        *mid = mid_entry;
2266
2267        if (mid_entry && mid_entry->handle)
2268                return mid_entry->handle(server, mid_entry);
2269
2270        return cifs_handle_standard(server, mid_entry);
2271}
2272
2273static int
2274smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
2275{
2276        char *buf = server->smallbuf;
2277        unsigned int pdu_length = get_rfc1002_length(buf);
2278        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
2279        unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
2280
2281        if (pdu_length + 4 < sizeof(struct smb2_transform_hdr) +
2282                                                sizeof(struct smb2_sync_hdr)) {
2283                cifs_dbg(VFS, "Transform message is too small (%u)\n",
2284                         pdu_length);
2285                cifs_reconnect(server);
2286                wake_up(&server->response_q);
2287                return -ECONNABORTED;
2288        }
2289
2290        if (pdu_length + 4 < orig_len + sizeof(struct smb2_transform_hdr)) {
2291                cifs_dbg(VFS, "Transform message is broken\n");
2292                cifs_reconnect(server);
2293                wake_up(&server->response_q);
2294                return -ECONNABORTED;
2295        }
2296
2297        if (pdu_length + 4 > CIFSMaxBufSize + MAX_HEADER_SIZE(server))
2298                return receive_encrypted_read(server, mid);
2299
2300        return receive_encrypted_standard(server, mid);
2301}
2302
2303int
2304smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
2305{
2306        char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
2307
2308        return handle_read_data(server, mid, buf, get_rfc1002_length(buf) + 4,
2309                                NULL, 0, 0);
2310}
2311
2312struct smb_version_operations smb20_operations = {
2313        .compare_fids = smb2_compare_fids,
2314        .setup_request = smb2_setup_request,
2315        .setup_async_request = smb2_setup_async_request,
2316        .check_receive = smb2_check_receive,
2317        .add_credits = smb2_add_credits,
2318        .set_credits = smb2_set_credits,
2319        .get_credits_field = smb2_get_credits_field,
2320        .get_credits = smb2_get_credits,
2321        .wait_mtu_credits = cifs_wait_mtu_credits,
2322        .get_next_mid = smb2_get_next_mid,
2323        .read_data_offset = smb2_read_data_offset,
2324        .read_data_length = smb2_read_data_length,
2325        .map_error = map_smb2_to_linux_error,
2326        .find_mid = smb2_find_mid,
2327        .check_message = smb2_check_message,
2328        .dump_detail = smb2_dump_detail,
2329        .clear_stats = smb2_clear_stats,
2330        .print_stats = smb2_print_stats,
2331        .is_oplock_break = smb2_is_valid_oplock_break,
2332        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2333        .downgrade_oplock = smb2_downgrade_oplock,
2334        .need_neg = smb2_need_neg,
2335        .negotiate = smb2_negotiate,
2336        .negotiate_wsize = smb2_negotiate_wsize,
2337        .negotiate_rsize = smb2_negotiate_rsize,
2338        .sess_setup = SMB2_sess_setup,
2339        .logoff = SMB2_logoff,
2340        .tree_connect = SMB2_tcon,
2341        .tree_disconnect = SMB2_tdis,
2342        .qfs_tcon = smb2_qfs_tcon,
2343        .is_path_accessible = smb2_is_path_accessible,
2344        .can_echo = smb2_can_echo,
2345        .echo = SMB2_echo,
2346        .query_path_info = smb2_query_path_info,
2347        .get_srv_inum = smb2_get_srv_inum,
2348        .query_file_info = smb2_query_file_info,
2349        .set_path_size = smb2_set_path_size,
2350        .set_file_size = smb2_set_file_size,
2351        .set_file_info = smb2_set_file_info,
2352        .set_compression = smb2_set_compression,
2353        .mkdir = smb2_mkdir,
2354        .mkdir_setinfo = smb2_mkdir_setinfo,
2355        .rmdir = smb2_rmdir,
2356        .unlink = smb2_unlink,
2357        .rename = smb2_rename_path,
2358        .create_hardlink = smb2_create_hardlink,
2359        .query_symlink = smb2_query_symlink,
2360        .query_mf_symlink = smb3_query_mf_symlink,
2361        .create_mf_symlink = smb3_create_mf_symlink,
2362        .open = smb2_open_file,
2363        .set_fid = smb2_set_fid,
2364        .close = smb2_close_file,
2365        .flush = smb2_flush_file,
2366        .async_readv = smb2_async_readv,
2367        .async_writev = smb2_async_writev,
2368        .sync_read = smb2_sync_read,
2369        .sync_write = smb2_sync_write,
2370        .query_dir_first = smb2_query_dir_first,
2371        .query_dir_next = smb2_query_dir_next,
2372        .close_dir = smb2_close_dir,
2373        .calc_smb_size = smb2_calc_size,
2374        .is_status_pending = smb2_is_status_pending,
2375        .oplock_response = smb2_oplock_response,
2376        .queryfs = smb2_queryfs,
2377        .mand_lock = smb2_mand_lock,
2378        .mand_unlock_range = smb2_unlock_range,
2379        .push_mand_locks = smb2_push_mandatory_locks,
2380        .get_lease_key = smb2_get_lease_key,
2381        .set_lease_key = smb2_set_lease_key,
2382        .new_lease_key = smb2_new_lease_key,
2383        .calc_signature = smb2_calc_signature,
2384        .is_read_op = smb2_is_read_op,
2385        .set_oplock_level = smb2_set_oplock_level,
2386        .create_lease_buf = smb2_create_lease_buf,
2387        .parse_lease_buf = smb2_parse_lease_buf,
2388        .copychunk_range = smb2_copychunk_range,
2389        .wp_retry_size = smb2_wp_retry_size,
2390        .dir_needs_close = smb2_dir_needs_close,
2391        .get_dfs_refer = smb2_get_dfs_refer,
2392        .select_sectype = smb2_select_sectype,
2393};
2394
2395struct smb_version_operations smb21_operations = {
2396        .compare_fids = smb2_compare_fids,
2397        .setup_request = smb2_setup_request,
2398        .setup_async_request = smb2_setup_async_request,
2399        .check_receive = smb2_check_receive,
2400        .add_credits = smb2_add_credits,
2401        .set_credits = smb2_set_credits,
2402        .get_credits_field = smb2_get_credits_field,
2403        .get_credits = smb2_get_credits,
2404        .wait_mtu_credits = smb2_wait_mtu_credits,
2405        .get_next_mid = smb2_get_next_mid,
2406        .read_data_offset = smb2_read_data_offset,
2407        .read_data_length = smb2_read_data_length,
2408        .map_error = map_smb2_to_linux_error,
2409        .find_mid = smb2_find_mid,
2410        .check_message = smb2_check_message,
2411        .dump_detail = smb2_dump_detail,
2412        .clear_stats = smb2_clear_stats,
2413        .print_stats = smb2_print_stats,
2414        .is_oplock_break = smb2_is_valid_oplock_break,
2415        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2416        .downgrade_oplock = smb2_downgrade_oplock,
2417        .need_neg = smb2_need_neg,
2418        .negotiate = smb2_negotiate,
2419        .negotiate_wsize = smb2_negotiate_wsize,
2420        .negotiate_rsize = smb2_negotiate_rsize,
2421        .sess_setup = SMB2_sess_setup,
2422        .logoff = SMB2_logoff,
2423        .tree_connect = SMB2_tcon,
2424        .tree_disconnect = SMB2_tdis,
2425        .qfs_tcon = smb2_qfs_tcon,
2426        .is_path_accessible = smb2_is_path_accessible,
2427        .can_echo = smb2_can_echo,
2428        .echo = SMB2_echo,
2429        .query_path_info = smb2_query_path_info,
2430        .get_srv_inum = smb2_get_srv_inum,
2431        .query_file_info = smb2_query_file_info,
2432        .set_path_size = smb2_set_path_size,
2433        .set_file_size = smb2_set_file_size,
2434        .set_file_info = smb2_set_file_info,
2435        .set_compression = smb2_set_compression,
2436        .mkdir = smb2_mkdir,
2437        .mkdir_setinfo = smb2_mkdir_setinfo,
2438        .rmdir = smb2_rmdir,
2439        .unlink = smb2_unlink,
2440        .rename = smb2_rename_path,
2441        .create_hardlink = smb2_create_hardlink,
2442        .query_symlink = smb2_query_symlink,
2443        .query_mf_symlink = smb3_query_mf_symlink,
2444        .create_mf_symlink = smb3_create_mf_symlink,
2445        .open = smb2_open_file,
2446        .set_fid = smb2_set_fid,
2447        .close = smb2_close_file,
2448        .flush = smb2_flush_file,
2449        .async_readv = smb2_async_readv,
2450        .async_writev = smb2_async_writev,
2451        .sync_read = smb2_sync_read,
2452        .sync_write = smb2_sync_write,
2453        .query_dir_first = smb2_query_dir_first,
2454        .query_dir_next = smb2_query_dir_next,
2455        .close_dir = smb2_close_dir,
2456        .calc_smb_size = smb2_calc_size,
2457        .is_status_pending = smb2_is_status_pending,
2458        .oplock_response = smb2_oplock_response,
2459        .queryfs = smb2_queryfs,
2460        .mand_lock = smb2_mand_lock,
2461        .mand_unlock_range = smb2_unlock_range,
2462        .push_mand_locks = smb2_push_mandatory_locks,
2463        .get_lease_key = smb2_get_lease_key,
2464        .set_lease_key = smb2_set_lease_key,
2465        .new_lease_key = smb2_new_lease_key,
2466        .calc_signature = smb2_calc_signature,
2467        .is_read_op = smb21_is_read_op,
2468        .set_oplock_level = smb21_set_oplock_level,
2469        .create_lease_buf = smb2_create_lease_buf,
2470        .parse_lease_buf = smb2_parse_lease_buf,
2471        .copychunk_range = smb2_copychunk_range,
2472        .wp_retry_size = smb2_wp_retry_size,
2473        .dir_needs_close = smb2_dir_needs_close,
2474        .enum_snapshots = smb3_enum_snapshots,
2475        .get_dfs_refer = smb2_get_dfs_refer,
2476        .select_sectype = smb2_select_sectype,
2477};
2478
2479struct smb_version_operations smb30_operations = {
2480        .compare_fids = smb2_compare_fids,
2481        .setup_request = smb2_setup_request,
2482        .setup_async_request = smb2_setup_async_request,
2483        .check_receive = smb2_check_receive,
2484        .add_credits = smb2_add_credits,
2485        .set_credits = smb2_set_credits,
2486        .get_credits_field = smb2_get_credits_field,
2487        .get_credits = smb2_get_credits,
2488        .wait_mtu_credits = smb2_wait_mtu_credits,
2489        .get_next_mid = smb2_get_next_mid,
2490        .read_data_offset = smb2_read_data_offset,
2491        .read_data_length = smb2_read_data_length,
2492        .map_error = map_smb2_to_linux_error,
2493        .find_mid = smb2_find_mid,
2494        .check_message = smb2_check_message,
2495        .dump_detail = smb2_dump_detail,
2496        .clear_stats = smb2_clear_stats,
2497        .print_stats = smb2_print_stats,
2498        .dump_share_caps = smb2_dump_share_caps,
2499        .is_oplock_break = smb2_is_valid_oplock_break,
2500        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2501        .downgrade_oplock = smb2_downgrade_oplock,
2502        .need_neg = smb2_need_neg,
2503        .negotiate = smb2_negotiate,
2504        .negotiate_wsize = smb2_negotiate_wsize,
2505        .negotiate_rsize = smb2_negotiate_rsize,
2506        .sess_setup = SMB2_sess_setup,
2507        .logoff = SMB2_logoff,
2508        .tree_connect = SMB2_tcon,
2509        .tree_disconnect = SMB2_tdis,
2510        .qfs_tcon = smb3_qfs_tcon,
2511        .is_path_accessible = smb2_is_path_accessible,
2512        .can_echo = smb2_can_echo,
2513        .echo = SMB2_echo,
2514        .query_path_info = smb2_query_path_info,
2515        .get_srv_inum = smb2_get_srv_inum,
2516        .query_file_info = smb2_query_file_info,
2517        .set_path_size = smb2_set_path_size,
2518        .set_file_size = smb2_set_file_size,
2519        .set_file_info = smb2_set_file_info,
2520        .set_compression = smb2_set_compression,
2521        .mkdir = smb2_mkdir,
2522        .mkdir_setinfo = smb2_mkdir_setinfo,
2523        .rmdir = smb2_rmdir,
2524        .unlink = smb2_unlink,
2525        .rename = smb2_rename_path,
2526        .create_hardlink = smb2_create_hardlink,
2527        .query_symlink = smb2_query_symlink,
2528        .query_mf_symlink = smb3_query_mf_symlink,
2529        .create_mf_symlink = smb3_create_mf_symlink,
2530        .open = smb2_open_file,
2531        .set_fid = smb2_set_fid,
2532        .close = smb2_close_file,
2533        .flush = smb2_flush_file,
2534        .async_readv = smb2_async_readv,
2535        .async_writev = smb2_async_writev,
2536        .sync_read = smb2_sync_read,
2537        .sync_write = smb2_sync_write,
2538        .query_dir_first = smb2_query_dir_first,
2539        .query_dir_next = smb2_query_dir_next,
2540        .close_dir = smb2_close_dir,
2541        .calc_smb_size = smb2_calc_size,
2542        .is_status_pending = smb2_is_status_pending,
2543        .oplock_response = smb2_oplock_response,
2544        .queryfs = smb2_queryfs,
2545        .mand_lock = smb2_mand_lock,
2546        .mand_unlock_range = smb2_unlock_range,
2547        .push_mand_locks = smb2_push_mandatory_locks,
2548        .get_lease_key = smb2_get_lease_key,
2549        .set_lease_key = smb2_set_lease_key,
2550        .new_lease_key = smb2_new_lease_key,
2551        .generate_signingkey = generate_smb30signingkey,
2552        .calc_signature = smb3_calc_signature,
2553        .set_integrity  = smb3_set_integrity,
2554        .is_read_op = smb21_is_read_op,
2555        .set_oplock_level = smb3_set_oplock_level,
2556        .create_lease_buf = smb3_create_lease_buf,
2557        .parse_lease_buf = smb3_parse_lease_buf,
2558        .copychunk_range = smb2_copychunk_range,
2559        .duplicate_extents = smb2_duplicate_extents,
2560        .validate_negotiate = smb3_validate_negotiate,
2561        .wp_retry_size = smb2_wp_retry_size,
2562        .dir_needs_close = smb2_dir_needs_close,
2563        .fallocate = smb3_fallocate,
2564        .enum_snapshots = smb3_enum_snapshots,
2565        .init_transform_rq = smb3_init_transform_rq,
2566        .free_transform_rq = smb3_free_transform_rq,
2567        .is_transform_hdr = smb3_is_transform_hdr,
2568        .receive_transform = smb3_receive_transform,
2569        .get_dfs_refer = smb2_get_dfs_refer,
2570        .select_sectype = smb2_select_sectype,
2571};
2572
2573#ifdef CONFIG_CIFS_SMB311
2574struct smb_version_operations smb311_operations = {
2575        .compare_fids = smb2_compare_fids,
2576        .setup_request = smb2_setup_request,
2577        .setup_async_request = smb2_setup_async_request,
2578        .check_receive = smb2_check_receive,
2579        .add_credits = smb2_add_credits,
2580        .set_credits = smb2_set_credits,
2581        .get_credits_field = smb2_get_credits_field,
2582        .get_credits = smb2_get_credits,
2583        .wait_mtu_credits = smb2_wait_mtu_credits,
2584        .get_next_mid = smb2_get_next_mid,
2585        .read_data_offset = smb2_read_data_offset,
2586        .read_data_length = smb2_read_data_length,
2587        .map_error = map_smb2_to_linux_error,
2588        .find_mid = smb2_find_mid,
2589        .check_message = smb2_check_message,
2590        .dump_detail = smb2_dump_detail,
2591        .clear_stats = smb2_clear_stats,
2592        .print_stats = smb2_print_stats,
2593        .dump_share_caps = smb2_dump_share_caps,
2594        .is_oplock_break = smb2_is_valid_oplock_break,
2595        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2596        .downgrade_oplock = smb2_downgrade_oplock,
2597        .need_neg = smb2_need_neg,
2598        .negotiate = smb2_negotiate,
2599        .negotiate_wsize = smb2_negotiate_wsize,
2600        .negotiate_rsize = smb2_negotiate_rsize,
2601        .sess_setup = SMB2_sess_setup,
2602        .logoff = SMB2_logoff,
2603        .tree_connect = SMB2_tcon,
2604        .tree_disconnect = SMB2_tdis,
2605        .qfs_tcon = smb3_qfs_tcon,
2606        .is_path_accessible = smb2_is_path_accessible,
2607        .can_echo = smb2_can_echo,
2608        .echo = SMB2_echo,
2609        .query_path_info = smb2_query_path_info,
2610        .get_srv_inum = smb2_get_srv_inum,
2611        .query_file_info = smb2_query_file_info,
2612        .set_path_size = smb2_set_path_size,
2613        .set_file_size = smb2_set_file_size,
2614        .set_file_info = smb2_set_file_info,
2615        .set_compression = smb2_set_compression,
2616        .mkdir = smb2_mkdir,
2617        .mkdir_setinfo = smb2_mkdir_setinfo,
2618        .rmdir = smb2_rmdir,
2619        .unlink = smb2_unlink,
2620        .rename = smb2_rename_path,
2621        .create_hardlink = smb2_create_hardlink,
2622        .query_symlink = smb2_query_symlink,
2623        .query_mf_symlink = smb3_query_mf_symlink,
2624        .create_mf_symlink = smb3_create_mf_symlink,
2625        .open = smb2_open_file,
2626        .set_fid = smb2_set_fid,
2627        .close = smb2_close_file,
2628        .flush = smb2_flush_file,
2629        .async_readv = smb2_async_readv,
2630        .async_writev = smb2_async_writev,
2631        .sync_read = smb2_sync_read,
2632        .sync_write = smb2_sync_write,
2633        .query_dir_first = smb2_query_dir_first,
2634        .query_dir_next = smb2_query_dir_next,
2635        .close_dir = smb2_close_dir,
2636        .calc_smb_size = smb2_calc_size,
2637        .is_status_pending = smb2_is_status_pending,
2638        .oplock_response = smb2_oplock_response,
2639        .queryfs = smb2_queryfs,
2640        .mand_lock = smb2_mand_lock,
2641        .mand_unlock_range = smb2_unlock_range,
2642        .push_mand_locks = smb2_push_mandatory_locks,
2643        .get_lease_key = smb2_get_lease_key,
2644        .set_lease_key = smb2_set_lease_key,
2645        .new_lease_key = smb2_new_lease_key,
2646        .generate_signingkey = generate_smb311signingkey,
2647        .calc_signature = smb3_calc_signature,
2648        .set_integrity  = smb3_set_integrity,
2649        .is_read_op = smb21_is_read_op,
2650        .set_oplock_level = smb3_set_oplock_level,
2651        .create_lease_buf = smb3_create_lease_buf,
2652        .parse_lease_buf = smb3_parse_lease_buf,
2653        .copychunk_range = smb2_copychunk_range,
2654        .duplicate_extents = smb2_duplicate_extents,
2655/*      .validate_negotiate = smb3_validate_negotiate, */ /* not used in 3.11 */
2656        .wp_retry_size = smb2_wp_retry_size,
2657        .dir_needs_close = smb2_dir_needs_close,
2658        .fallocate = smb3_fallocate,
2659        .enum_snapshots = smb3_enum_snapshots,
2660        .init_transform_rq = smb3_init_transform_rq,
2661        .free_transform_rq = smb3_free_transform_rq,
2662        .is_transform_hdr = smb3_is_transform_hdr,
2663        .receive_transform = smb3_receive_transform,
2664        .get_dfs_refer = smb2_get_dfs_refer,
2665        .select_sectype = smb2_select_sectype,
2666};
2667#endif /* CIFS_SMB311 */
2668
2669struct smb_version_values smb20_values = {
2670        .version_string = SMB20_VERSION_STRING,
2671        .protocol_id = SMB20_PROT_ID,
2672        .req_capabilities = 0, /* MBZ */
2673        .large_lock_type = 0,
2674        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2675        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2676        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2677        .header_size = sizeof(struct smb2_hdr),
2678        .max_header_size = MAX_SMB2_HDR_SIZE,
2679        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2680        .lock_cmd = SMB2_LOCK,
2681        .cap_unix = 0,
2682        .cap_nt_find = SMB2_NT_FIND,
2683        .cap_large_files = SMB2_LARGE_FILES,
2684        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2685        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2686        .create_lease_size = sizeof(struct create_lease),
2687};
2688
2689struct smb_version_values smb21_values = {
2690        .version_string = SMB21_VERSION_STRING,
2691        .protocol_id = SMB21_PROT_ID,
2692        .req_capabilities = 0, /* MBZ on negotiate req until SMB3 dialect */
2693        .large_lock_type = 0,
2694        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2695        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2696        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2697        .header_size = sizeof(struct smb2_hdr),
2698        .max_header_size = MAX_SMB2_HDR_SIZE,
2699        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2700        .lock_cmd = SMB2_LOCK,
2701        .cap_unix = 0,
2702        .cap_nt_find = SMB2_NT_FIND,
2703        .cap_large_files = SMB2_LARGE_FILES,
2704        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2705        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2706        .create_lease_size = sizeof(struct create_lease),
2707};
2708
2709struct smb_version_values smb30_values = {
2710        .version_string = SMB30_VERSION_STRING,
2711        .protocol_id = SMB30_PROT_ID,
2712        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION,
2713        .large_lock_type = 0,
2714        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2715        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2716        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2717        .header_size = sizeof(struct smb2_hdr),
2718        .max_header_size = MAX_SMB2_HDR_SIZE,
2719        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2720        .lock_cmd = SMB2_LOCK,
2721        .cap_unix = 0,
2722        .cap_nt_find = SMB2_NT_FIND,
2723        .cap_large_files = SMB2_LARGE_FILES,
2724        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2725        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2726        .create_lease_size = sizeof(struct create_lease_v2),
2727};
2728
2729struct smb_version_values smb302_values = {
2730        .version_string = SMB302_VERSION_STRING,
2731        .protocol_id = SMB302_PROT_ID,
2732        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION,
2733        .large_lock_type = 0,
2734        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2735        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2736        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2737        .header_size = sizeof(struct smb2_hdr),
2738        .max_header_size = MAX_SMB2_HDR_SIZE,
2739        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2740        .lock_cmd = SMB2_LOCK,
2741        .cap_unix = 0,
2742        .cap_nt_find = SMB2_NT_FIND,
2743        .cap_large_files = SMB2_LARGE_FILES,
2744        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2745        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2746        .create_lease_size = sizeof(struct create_lease_v2),
2747};
2748
2749#ifdef CONFIG_CIFS_SMB311
2750struct smb_version_values smb311_values = {
2751        .version_string = SMB311_VERSION_STRING,
2752        .protocol_id = SMB311_PROT_ID,
2753        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES,
2754        .large_lock_type = 0,
2755        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2756        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2757        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2758        .header_size = sizeof(struct smb2_hdr),
2759        .max_header_size = MAX_SMB2_HDR_SIZE,
2760        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2761        .lock_cmd = SMB2_LOCK,
2762        .cap_unix = 0,
2763        .cap_nt_find = SMB2_NT_FIND,
2764        .cap_large_files = SMB2_LARGE_FILES,
2765        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2766        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2767        .create_lease_size = sizeof(struct create_lease_v2),
2768};
2769#endif /* SMB311 */
2770