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                        kfree(retbuf);
 946                        return rc;
 947                }
 948
 949                if (ret_data_len > snapshot_in.snapshot_array_size)
 950                        ret_data_len = snapshot_in.snapshot_array_size;
 951
 952                if (copy_to_user(ioc_buf, retbuf, ret_data_len))
 953                        rc = -EFAULT;
 954        }
 955
 956        kfree(retbuf);
 957        return rc;
 958}
 959
 960static int
 961smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
 962                     const char *path, struct cifs_sb_info *cifs_sb,
 963                     struct cifs_fid *fid, __u16 search_flags,
 964                     struct cifs_search_info *srch_inf)
 965{
 966        __le16 *utf16_path;
 967        int rc;
 968        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 969        struct cifs_open_parms oparms;
 970
 971        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
 972        if (!utf16_path)
 973                return -ENOMEM;
 974
 975        oparms.tcon = tcon;
 976        oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
 977        oparms.disposition = FILE_OPEN;
 978        oparms.create_options = 0;
 979        oparms.fid = fid;
 980        oparms.reconnect = false;
 981
 982        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL);
 983        kfree(utf16_path);
 984        if (rc) {
 985                cifs_dbg(FYI, "open dir failed rc=%d\n", rc);
 986                return rc;
 987        }
 988
 989        srch_inf->entries_in_buffer = 0;
 990        srch_inf->index_of_last_entry = 0;
 991
 992        rc = SMB2_query_directory(xid, tcon, fid->persistent_fid,
 993                                  fid->volatile_fid, 0, srch_inf);
 994        if (rc) {
 995                cifs_dbg(FYI, "query directory failed rc=%d\n", rc);
 996                SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 997        }
 998        return rc;
 999}
1000
1001static int
1002smb2_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon,
1003                    struct cifs_fid *fid, __u16 search_flags,
1004                    struct cifs_search_info *srch_inf)
1005{
1006        return SMB2_query_directory(xid, tcon, fid->persistent_fid,
1007                                    fid->volatile_fid, 0, srch_inf);
1008}
1009
1010static int
1011smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
1012               struct cifs_fid *fid)
1013{
1014        return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
1015}
1016
1017/*
1018* If we negotiate SMB2 protocol and get STATUS_PENDING - update
1019* the number of credits and return true. Otherwise - return false.
1020*/
1021static bool
1022smb2_is_status_pending(char *buf, struct TCP_Server_Info *server, int length)
1023{
1024        struct smb2_sync_hdr *shdr = get_sync_hdr(buf);
1025
1026        if (shdr->Status != STATUS_PENDING)
1027                return false;
1028
1029        if (!length) {
1030                spin_lock(&server->req_lock);
1031                server->credits += le16_to_cpu(shdr->CreditRequest);
1032                spin_unlock(&server->req_lock);
1033                wake_up(&server->request_q);
1034        }
1035
1036        return true;
1037}
1038
1039static int
1040smb2_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
1041                     struct cifsInodeInfo *cinode)
1042{
1043        if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING)
1044                return SMB2_lease_break(0, tcon, cinode->lease_key,
1045                                        smb2_get_lease_state(cinode));
1046
1047        return SMB2_oplock_break(0, tcon, fid->persistent_fid,
1048                                 fid->volatile_fid,
1049                                 CIFS_CACHE_READ(cinode) ? 1 : 0);
1050}
1051
1052static int
1053smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
1054             struct kstatfs *buf)
1055{
1056        int rc;
1057        __le16 srch_path = 0; /* Null - open root of share */
1058        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1059        struct cifs_open_parms oparms;
1060        struct cifs_fid fid;
1061
1062        oparms.tcon = tcon;
1063        oparms.desired_access = FILE_READ_ATTRIBUTES;
1064        oparms.disposition = FILE_OPEN;
1065        oparms.create_options = 0;
1066        oparms.fid = &fid;
1067        oparms.reconnect = false;
1068
1069        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL);
1070        if (rc)
1071                return rc;
1072        buf->f_type = SMB2_MAGIC_NUMBER;
1073        rc = SMB2_QFS_info(xid, tcon, fid.persistent_fid, fid.volatile_fid,
1074                           buf);
1075        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
1076        return rc;
1077}
1078
1079static bool
1080smb2_compare_fids(struct cifsFileInfo *ob1, struct cifsFileInfo *ob2)
1081{
1082        return ob1->fid.persistent_fid == ob2->fid.persistent_fid &&
1083               ob1->fid.volatile_fid == ob2->fid.volatile_fid;
1084}
1085
1086static int
1087smb2_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset,
1088               __u64 length, __u32 type, int lock, int unlock, bool wait)
1089{
1090        if (unlock && !lock)
1091                type = SMB2_LOCKFLAG_UNLOCK;
1092        return SMB2_lock(xid, tlink_tcon(cfile->tlink),
1093                         cfile->fid.persistent_fid, cfile->fid.volatile_fid,
1094                         current->tgid, length, offset, type, wait);
1095}
1096
1097static void
1098smb2_get_lease_key(struct inode *inode, struct cifs_fid *fid)
1099{
1100        memcpy(fid->lease_key, CIFS_I(inode)->lease_key, SMB2_LEASE_KEY_SIZE);
1101}
1102
1103static void
1104smb2_set_lease_key(struct inode *inode, struct cifs_fid *fid)
1105{
1106        memcpy(CIFS_I(inode)->lease_key, fid->lease_key, SMB2_LEASE_KEY_SIZE);
1107}
1108
1109static void
1110smb2_new_lease_key(struct cifs_fid *fid)
1111{
1112        generate_random_uuid(fid->lease_key);
1113}
1114
1115static int
1116smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,
1117                   const char *search_name,
1118                   struct dfs_info3_param **target_nodes,
1119                   unsigned int *num_of_nodes,
1120                   const struct nls_table *nls_codepage, int remap)
1121{
1122        int rc;
1123        __le16 *utf16_path = NULL;
1124        int utf16_path_len = 0;
1125        struct cifs_tcon *tcon;
1126        struct fsctl_get_dfs_referral_req *dfs_req = NULL;
1127        struct get_dfs_referral_rsp *dfs_rsp = NULL;
1128        u32 dfs_req_size = 0, dfs_rsp_size = 0;
1129
1130        cifs_dbg(FYI, "smb2_get_dfs_refer path <%s>\n", search_name);
1131
1132        /*
1133         * Use any tcon from the current session. Here, the first one.
1134         */
1135        spin_lock(&cifs_tcp_ses_lock);
1136        tcon = list_first_entry_or_null(&ses->tcon_list, struct cifs_tcon,
1137                                        tcon_list);
1138        if (tcon)
1139                tcon->tc_count++;
1140        spin_unlock(&cifs_tcp_ses_lock);
1141
1142        if (!tcon) {
1143                cifs_dbg(VFS, "session %p has no tcon available for a dfs referral request\n",
1144                         ses);
1145                rc = -ENOTCONN;
1146                goto out;
1147        }
1148
1149        utf16_path = cifs_strndup_to_utf16(search_name, PATH_MAX,
1150                                           &utf16_path_len,
1151                                           nls_codepage, remap);
1152        if (!utf16_path) {
1153                rc = -ENOMEM;
1154                goto out;
1155        }
1156
1157        dfs_req_size = sizeof(*dfs_req) + utf16_path_len;
1158        dfs_req = kzalloc(dfs_req_size, GFP_KERNEL);
1159        if (!dfs_req) {
1160                rc = -ENOMEM;
1161                goto out;
1162        }
1163
1164        /* Highest DFS referral version understood */
1165        dfs_req->MaxReferralLevel = DFS_VERSION;
1166
1167        /* Path to resolve in an UTF-16 null-terminated string */
1168        memcpy(dfs_req->RequestFileName, utf16_path, utf16_path_len);
1169
1170        do {
1171                /* try first with IPC */
1172                rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
1173                                FSCTL_DFS_GET_REFERRALS,
1174                                true /* is_fsctl */, true /* use_ipc */,
1175                                (char *)dfs_req, dfs_req_size,
1176                                (char **)&dfs_rsp, &dfs_rsp_size);
1177                if (rc == -ENOTCONN) {
1178                        /* try with normal tcon */
1179                        rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
1180                                        FSCTL_DFS_GET_REFERRALS,
1181                                        true /* is_fsctl */, false /*use_ipc*/,
1182                                        (char *)dfs_req, dfs_req_size,
1183                                        (char **)&dfs_rsp, &dfs_rsp_size);
1184                }
1185        } while (rc == -EAGAIN);
1186
1187        if (rc) {
1188                cifs_dbg(VFS, "ioctl error in smb2_get_dfs_refer rc=%d\n", rc);
1189                goto out;
1190        }
1191
1192        rc = parse_dfs_referrals(dfs_rsp, dfs_rsp_size,
1193                                 num_of_nodes, target_nodes,
1194                                 nls_codepage, remap, search_name,
1195                                 true /* is_unicode */);
1196        if (rc) {
1197                cifs_dbg(VFS, "parse error in smb2_get_dfs_refer rc=%d\n", rc);
1198                goto out;
1199        }
1200
1201 out:
1202        if (tcon) {
1203                spin_lock(&cifs_tcp_ses_lock);
1204                tcon->tc_count--;
1205                spin_unlock(&cifs_tcp_ses_lock);
1206        }
1207        kfree(utf16_path);
1208        kfree(dfs_req);
1209        kfree(dfs_rsp);
1210        return rc;
1211}
1212#define SMB2_SYMLINK_STRUCT_SIZE \
1213        (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp))
1214
1215static int
1216smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
1217                   const char *full_path, char **target_path,
1218                   struct cifs_sb_info *cifs_sb)
1219{
1220        int rc;
1221        __le16 *utf16_path;
1222        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
1223        struct cifs_open_parms oparms;
1224        struct cifs_fid fid;
1225        struct smb2_err_rsp *err_buf = NULL;
1226        struct smb2_symlink_err_rsp *symlink;
1227        unsigned int sub_len;
1228        unsigned int sub_offset;
1229        unsigned int print_len;
1230        unsigned int print_offset;
1231
1232        cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
1233
1234        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
1235        if (!utf16_path)
1236                return -ENOMEM;
1237
1238        oparms.tcon = tcon;
1239        oparms.desired_access = FILE_READ_ATTRIBUTES;
1240        oparms.disposition = FILE_OPEN;
1241        oparms.create_options = 0;
1242        oparms.fid = &fid;
1243        oparms.reconnect = false;
1244
1245        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, &err_buf);
1246
1247        if (!rc || !err_buf) {
1248                kfree(utf16_path);
1249                return -ENOENT;
1250        }
1251
1252        if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) ||
1253            get_rfc1002_length(err_buf) + 4 < SMB2_SYMLINK_STRUCT_SIZE) {
1254                kfree(utf16_path);
1255                return -ENOENT;
1256        }
1257
1258        /* open must fail on symlink - reset rc */
1259        rc = 0;
1260        symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData;
1261        sub_len = le16_to_cpu(symlink->SubstituteNameLength);
1262        sub_offset = le16_to_cpu(symlink->SubstituteNameOffset);
1263        print_len = le16_to_cpu(symlink->PrintNameLength);
1264        print_offset = le16_to_cpu(symlink->PrintNameOffset);
1265
1266        if (get_rfc1002_length(err_buf) + 4 <
1267                        SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
1268                kfree(utf16_path);
1269                return -ENOENT;
1270        }
1271
1272        if (get_rfc1002_length(err_buf) + 4 <
1273                        SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
1274                kfree(utf16_path);
1275                return -ENOENT;
1276        }
1277
1278        *target_path = cifs_strndup_from_utf16(
1279                                (char *)symlink->PathBuffer + sub_offset,
1280                                sub_len, true, cifs_sb->local_nls);
1281        if (!(*target_path)) {
1282                kfree(utf16_path);
1283                return -ENOMEM;
1284        }
1285        convert_delimiter(*target_path, '/');
1286        cifs_dbg(FYI, "%s: target path: %s\n", __func__, *target_path);
1287        kfree(utf16_path);
1288        return rc;
1289}
1290
1291static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
1292                            loff_t offset, loff_t len, bool keep_size)
1293{
1294        struct inode *inode;
1295        struct cifsInodeInfo *cifsi;
1296        struct cifsFileInfo *cfile = file->private_data;
1297        struct file_zero_data_information fsctl_buf;
1298        long rc;
1299        unsigned int xid;
1300
1301        xid = get_xid();
1302
1303        inode = d_inode(cfile->dentry);
1304        cifsi = CIFS_I(inode);
1305
1306        /* if file not oplocked can't be sure whether asking to extend size */
1307        if (!CIFS_CACHE_READ(cifsi))
1308                if (keep_size == false)
1309                        return -EOPNOTSUPP;
1310
1311        /*
1312         * Must check if file sparse since fallocate -z (zero range) assumes
1313         * non-sparse allocation
1314         */
1315        if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE))
1316                return -EOPNOTSUPP;
1317
1318        /*
1319         * need to make sure we are not asked to extend the file since the SMB3
1320         * fsctl does not change the file size. In the future we could change
1321         * this to zero the first part of the range then set the file size
1322         * which for a non sparse file would zero the newly extended range
1323         */
1324        if (keep_size == false)
1325                if (i_size_read(inode) < offset + len)
1326                        return -EOPNOTSUPP;
1327
1328        cifs_dbg(FYI, "offset %lld len %lld", offset, len);
1329
1330        fsctl_buf.FileOffset = cpu_to_le64(offset);
1331        fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len);
1332
1333        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1334                        cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
1335                        true /* is_fctl */, false /* use_ipc */,
1336                        (char *)&fsctl_buf,
1337                        sizeof(struct file_zero_data_information), NULL, NULL);
1338        free_xid(xid);
1339        return rc;
1340}
1341
1342static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon,
1343                            loff_t offset, loff_t len)
1344{
1345        struct inode *inode;
1346        struct cifsInodeInfo *cifsi;
1347        struct cifsFileInfo *cfile = file->private_data;
1348        struct file_zero_data_information fsctl_buf;
1349        long rc;
1350        unsigned int xid;
1351        __u8 set_sparse = 1;
1352
1353        xid = get_xid();
1354
1355        inode = d_inode(cfile->dentry);
1356        cifsi = CIFS_I(inode);
1357
1358        /* Need to make file sparse, if not already, before freeing range. */
1359        /* Consider adding equivalent for compressed since it could also work */
1360        if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse))
1361                return -EOPNOTSUPP;
1362
1363        cifs_dbg(FYI, "offset %lld len %lld", offset, len);
1364
1365        fsctl_buf.FileOffset = cpu_to_le64(offset);
1366        fsctl_buf.BeyondFinalZero = cpu_to_le64(offset + len);
1367
1368        rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
1369                        cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
1370                        true /* is_fctl */, false /* use_ipc */,
1371                        (char *)&fsctl_buf,
1372                        sizeof(struct file_zero_data_information), NULL, NULL);
1373        free_xid(xid);
1374        return rc;
1375}
1376
1377static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
1378                            loff_t off, loff_t len, bool keep_size)
1379{
1380        struct inode *inode;
1381        struct cifsInodeInfo *cifsi;
1382        struct cifsFileInfo *cfile = file->private_data;
1383        long rc = -EOPNOTSUPP;
1384        unsigned int xid;
1385
1386        xid = get_xid();
1387
1388        inode = d_inode(cfile->dentry);
1389        cifsi = CIFS_I(inode);
1390
1391        /* if file not oplocked can't be sure whether asking to extend size */
1392        if (!CIFS_CACHE_READ(cifsi))
1393                if (keep_size == false)
1394                        return -EOPNOTSUPP;
1395
1396        /*
1397         * Files are non-sparse by default so falloc may be a no-op
1398         * Must check if file sparse. If not sparse, and not extending
1399         * then no need to do anything since file already allocated
1400         */
1401        if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) {
1402                if (keep_size == true)
1403                        return 0;
1404                /* check if extending file */
1405                else if (i_size_read(inode) >= off + len)
1406                        /* not extending file and already not sparse */
1407                        return 0;
1408                /* BB: in future add else clause to extend file */
1409                else
1410                        return -EOPNOTSUPP;
1411        }
1412
1413        if ((keep_size == true) || (i_size_read(inode) >= off + len)) {
1414                /*
1415                 * Check if falloc starts within first few pages of file
1416                 * and ends within a few pages of the end of file to
1417                 * ensure that most of file is being forced to be
1418                 * fallocated now. If so then setting whole file sparse
1419                 * ie potentially making a few extra pages at the beginning
1420                 * or end of the file non-sparse via set_sparse is harmless.
1421                 */
1422                if ((off > 8192) || (off + len + 8192 < i_size_read(inode)))
1423                        return -EOPNOTSUPP;
1424
1425                rc = smb2_set_sparse(xid, tcon, cfile, inode, false);
1426        }
1427        /* BB: else ... in future add code to extend file and set sparse */
1428
1429
1430        free_xid(xid);
1431        return rc;
1432}
1433
1434
1435static long smb3_fallocate(struct file *file, struct cifs_tcon *tcon, int mode,
1436                           loff_t off, loff_t len)
1437{
1438        /* KEEP_SIZE already checked for by do_fallocate */
1439        if (mode & FALLOC_FL_PUNCH_HOLE)
1440                return smb3_punch_hole(file, tcon, off, len);
1441        else if (mode & FALLOC_FL_ZERO_RANGE) {
1442                if (mode & FALLOC_FL_KEEP_SIZE)
1443                        return smb3_zero_range(file, tcon, off, len, true);
1444                return smb3_zero_range(file, tcon, off, len, false);
1445        } else if (mode == FALLOC_FL_KEEP_SIZE)
1446                return smb3_simple_falloc(file, tcon, off, len, true);
1447        else if (mode == 0)
1448                return smb3_simple_falloc(file, tcon, off, len, false);
1449
1450        return -EOPNOTSUPP;
1451}
1452
1453static void
1454smb2_downgrade_oplock(struct TCP_Server_Info *server,
1455                        struct cifsInodeInfo *cinode, bool set_level2)
1456{
1457        if (set_level2)
1458                server->ops->set_oplock_level(cinode, SMB2_OPLOCK_LEVEL_II,
1459                                                0, NULL);
1460        else
1461                server->ops->set_oplock_level(cinode, 0, 0, NULL);
1462}
1463
1464static void
1465smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
1466                      unsigned int epoch, bool *purge_cache)
1467{
1468        oplock &= 0xFF;
1469        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
1470                return;
1471        if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
1472                cinode->oplock = CIFS_CACHE_RHW_FLG;
1473                cifs_dbg(FYI, "Batch Oplock granted on inode %p\n",
1474                         &cinode->vfs_inode);
1475        } else if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
1476                cinode->oplock = CIFS_CACHE_RW_FLG;
1477                cifs_dbg(FYI, "Exclusive Oplock granted on inode %p\n",
1478                         &cinode->vfs_inode);
1479        } else if (oplock == SMB2_OPLOCK_LEVEL_II) {
1480                cinode->oplock = CIFS_CACHE_READ_FLG;
1481                cifs_dbg(FYI, "Level II Oplock granted on inode %p\n",
1482                         &cinode->vfs_inode);
1483        } else
1484                cinode->oplock = 0;
1485}
1486
1487static void
1488smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
1489                       unsigned int epoch, bool *purge_cache)
1490{
1491        char message[5] = {0};
1492
1493        oplock &= 0xFF;
1494        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
1495                return;
1496
1497        cinode->oplock = 0;
1498        if (oplock & SMB2_LEASE_READ_CACHING_HE) {
1499                cinode->oplock |= CIFS_CACHE_READ_FLG;
1500                strcat(message, "R");
1501        }
1502        if (oplock & SMB2_LEASE_HANDLE_CACHING_HE) {
1503                cinode->oplock |= CIFS_CACHE_HANDLE_FLG;
1504                strcat(message, "H");
1505        }
1506        if (oplock & SMB2_LEASE_WRITE_CACHING_HE) {
1507                cinode->oplock |= CIFS_CACHE_WRITE_FLG;
1508                strcat(message, "W");
1509        }
1510        if (!cinode->oplock)
1511                strcat(message, "None");
1512        cifs_dbg(FYI, "%s Lease granted on inode %p\n", message,
1513                 &cinode->vfs_inode);
1514}
1515
1516static void
1517smb3_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
1518                      unsigned int epoch, bool *purge_cache)
1519{
1520        unsigned int old_oplock = cinode->oplock;
1521
1522        smb21_set_oplock_level(cinode, oplock, epoch, purge_cache);
1523
1524        if (purge_cache) {
1525                *purge_cache = false;
1526                if (old_oplock == CIFS_CACHE_READ_FLG) {
1527                        if (cinode->oplock == CIFS_CACHE_READ_FLG &&
1528                            (epoch - cinode->epoch > 0))
1529                                *purge_cache = true;
1530                        else if (cinode->oplock == CIFS_CACHE_RH_FLG &&
1531                                 (epoch - cinode->epoch > 1))
1532                                *purge_cache = true;
1533                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
1534                                 (epoch - cinode->epoch > 1))
1535                                *purge_cache = true;
1536                        else if (cinode->oplock == 0 &&
1537                                 (epoch - cinode->epoch > 0))
1538                                *purge_cache = true;
1539                } else if (old_oplock == CIFS_CACHE_RH_FLG) {
1540                        if (cinode->oplock == CIFS_CACHE_RH_FLG &&
1541                            (epoch - cinode->epoch > 0))
1542                                *purge_cache = true;
1543                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
1544                                 (epoch - cinode->epoch > 1))
1545                                *purge_cache = true;
1546                }
1547                cinode->epoch = epoch;
1548        }
1549}
1550
1551static bool
1552smb2_is_read_op(__u32 oplock)
1553{
1554        return oplock == SMB2_OPLOCK_LEVEL_II;
1555}
1556
1557static bool
1558smb21_is_read_op(__u32 oplock)
1559{
1560        return (oplock & SMB2_LEASE_READ_CACHING_HE) &&
1561               !(oplock & SMB2_LEASE_WRITE_CACHING_HE);
1562}
1563
1564static __le32
1565map_oplock_to_lease(u8 oplock)
1566{
1567        if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE)
1568                return SMB2_LEASE_WRITE_CACHING | SMB2_LEASE_READ_CACHING;
1569        else if (oplock == SMB2_OPLOCK_LEVEL_II)
1570                return SMB2_LEASE_READ_CACHING;
1571        else if (oplock == SMB2_OPLOCK_LEVEL_BATCH)
1572                return SMB2_LEASE_HANDLE_CACHING | SMB2_LEASE_READ_CACHING |
1573                       SMB2_LEASE_WRITE_CACHING;
1574        return 0;
1575}
1576
1577static char *
1578smb2_create_lease_buf(u8 *lease_key, u8 oplock)
1579{
1580        struct create_lease *buf;
1581
1582        buf = kzalloc(sizeof(struct create_lease), GFP_KERNEL);
1583        if (!buf)
1584                return NULL;
1585
1586        buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
1587        buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
1588        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
1589
1590        buf->ccontext.DataOffset = cpu_to_le16(offsetof
1591                                        (struct create_lease, lcontext));
1592        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context));
1593        buf->ccontext.NameOffset = cpu_to_le16(offsetof
1594                                (struct create_lease, Name));
1595        buf->ccontext.NameLength = cpu_to_le16(4);
1596        /* SMB2_CREATE_REQUEST_LEASE is "RqLs" */
1597        buf->Name[0] = 'R';
1598        buf->Name[1] = 'q';
1599        buf->Name[2] = 'L';
1600        buf->Name[3] = 's';
1601        return (char *)buf;
1602}
1603
1604static char *
1605smb3_create_lease_buf(u8 *lease_key, u8 oplock)
1606{
1607        struct create_lease_v2 *buf;
1608
1609        buf = kzalloc(sizeof(struct create_lease_v2), GFP_KERNEL);
1610        if (!buf)
1611                return NULL;
1612
1613        buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
1614        buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
1615        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
1616
1617        buf->ccontext.DataOffset = cpu_to_le16(offsetof
1618                                        (struct create_lease_v2, lcontext));
1619        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2));
1620        buf->ccontext.NameOffset = cpu_to_le16(offsetof
1621                                (struct create_lease_v2, Name));
1622        buf->ccontext.NameLength = cpu_to_le16(4);
1623        /* SMB2_CREATE_REQUEST_LEASE is "RqLs" */
1624        buf->Name[0] = 'R';
1625        buf->Name[1] = 'q';
1626        buf->Name[2] = 'L';
1627        buf->Name[3] = 's';
1628        return (char *)buf;
1629}
1630
1631static __u8
1632smb2_parse_lease_buf(void *buf, unsigned int *epoch)
1633{
1634        struct create_lease *lc = (struct create_lease *)buf;
1635
1636        *epoch = 0; /* not used */
1637        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
1638                return SMB2_OPLOCK_LEVEL_NOCHANGE;
1639        return le32_to_cpu(lc->lcontext.LeaseState);
1640}
1641
1642static __u8
1643smb3_parse_lease_buf(void *buf, unsigned int *epoch)
1644{
1645        struct create_lease_v2 *lc = (struct create_lease_v2 *)buf;
1646
1647        *epoch = le16_to_cpu(lc->lcontext.Epoch);
1648        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
1649                return SMB2_OPLOCK_LEVEL_NOCHANGE;
1650        return le32_to_cpu(lc->lcontext.LeaseState);
1651}
1652
1653static unsigned int
1654smb2_wp_retry_size(struct inode *inode)
1655{
1656        return min_t(unsigned int, CIFS_SB(inode->i_sb)->wsize,
1657                     SMB2_MAX_BUFFER_SIZE);
1658}
1659
1660static bool
1661smb2_dir_needs_close(struct cifsFileInfo *cfile)
1662{
1663        return !cfile->invalidHandle;
1664}
1665
1666static void
1667fill_transform_hdr(struct smb2_transform_hdr *tr_hdr, struct smb_rqst *old_rq)
1668{
1669        struct smb2_sync_hdr *shdr =
1670                        (struct smb2_sync_hdr *)old_rq->rq_iov[1].iov_base;
1671        unsigned int orig_len = get_rfc1002_length(old_rq->rq_iov[0].iov_base);
1672
1673        memset(tr_hdr, 0, sizeof(struct smb2_transform_hdr));
1674        tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM;
1675        tr_hdr->OriginalMessageSize = cpu_to_le32(orig_len);
1676        tr_hdr->Flags = cpu_to_le16(0x01);
1677        get_random_bytes(&tr_hdr->Nonce, SMB3_AES128CMM_NONCE);
1678        memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8);
1679        inc_rfc1001_len(tr_hdr, sizeof(struct smb2_transform_hdr) - 4);
1680        inc_rfc1001_len(tr_hdr, orig_len);
1681}
1682
1683static struct scatterlist *
1684init_sg(struct smb_rqst *rqst, u8 *sign)
1685{
1686        unsigned int sg_len = rqst->rq_nvec + rqst->rq_npages + 1;
1687        unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 24;
1688        struct scatterlist *sg;
1689        unsigned int i;
1690        unsigned int j;
1691
1692        sg = kmalloc_array(sg_len, sizeof(struct scatterlist), GFP_KERNEL);
1693        if (!sg)
1694                return NULL;
1695
1696        sg_init_table(sg, sg_len);
1697        sg_set_buf(&sg[0], rqst->rq_iov[0].iov_base + 24, assoc_data_len);
1698        for (i = 1; i < rqst->rq_nvec; i++)
1699                sg_set_buf(&sg[i], rqst->rq_iov[i].iov_base,
1700                                                rqst->rq_iov[i].iov_len);
1701        for (j = 0; i < sg_len - 1; i++, j++) {
1702                unsigned int len = (j < rqst->rq_npages - 1) ? rqst->rq_pagesz
1703                                                        : rqst->rq_tailsz;
1704                sg_set_page(&sg[i], rqst->rq_pages[j], len, 0);
1705        }
1706        sg_set_buf(&sg[sg_len - 1], sign, SMB2_SIGNATURE_SIZE);
1707        return sg;
1708}
1709
1710struct cifs_crypt_result {
1711        int err;
1712        struct completion completion;
1713};
1714
1715static void cifs_crypt_complete(struct crypto_async_request *req, int err)
1716{
1717        struct cifs_crypt_result *res = req->data;
1718
1719        if (err == -EINPROGRESS)
1720                return;
1721
1722        res->err = err;
1723        complete(&res->completion);
1724}
1725
1726static int
1727smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
1728{
1729        struct cifs_ses *ses;
1730        u8 *ses_enc_key;
1731
1732        spin_lock(&cifs_tcp_ses_lock);
1733        list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1734                if (ses->Suid != ses_id)
1735                        continue;
1736                ses_enc_key = enc ? ses->smb3encryptionkey :
1737                                                        ses->smb3decryptionkey;
1738                memcpy(key, ses_enc_key, SMB3_SIGN_KEY_SIZE);
1739                spin_unlock(&cifs_tcp_ses_lock);
1740                return 0;
1741        }
1742        spin_unlock(&cifs_tcp_ses_lock);
1743
1744        return 1;
1745}
1746/*
1747 * Encrypt or decrypt @rqst message. @rqst has the following format:
1748 * iov[0] - transform header (associate data),
1749 * iov[1-N] and pages - data to encrypt.
1750 * On success return encrypted data in iov[1-N] and pages, leave iov[0]
1751 * untouched.
1752 */
1753static int
1754crypt_message(struct TCP_Server_Info *server, struct smb_rqst *rqst, int enc)
1755{
1756        struct smb2_transform_hdr *tr_hdr =
1757                        (struct smb2_transform_hdr *)rqst->rq_iov[0].iov_base;
1758        unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 24;
1759        int rc = 0;
1760        struct scatterlist *sg;
1761        u8 sign[SMB2_SIGNATURE_SIZE] = {};
1762        u8 key[SMB3_SIGN_KEY_SIZE];
1763        struct aead_request *req;
1764        char *iv;
1765        unsigned int iv_len;
1766        struct cifs_crypt_result result = {0, };
1767        struct crypto_aead *tfm;
1768        unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
1769
1770        init_completion(&result.completion);
1771
1772        rc = smb2_get_enc_key(server, tr_hdr->SessionId, enc, key);
1773        if (rc) {
1774                cifs_dbg(VFS, "%s: Could not get %scryption key\n", __func__,
1775                         enc ? "en" : "de");
1776                return 0;
1777        }
1778
1779        rc = smb3_crypto_aead_allocate(server);
1780        if (rc) {
1781                cifs_dbg(VFS, "%s: crypto alloc failed\n", __func__);
1782                return rc;
1783        }
1784
1785        tfm = enc ? server->secmech.ccmaesencrypt :
1786                                                server->secmech.ccmaesdecrypt;
1787        rc = crypto_aead_setkey(tfm, key, SMB3_SIGN_KEY_SIZE);
1788        if (rc) {
1789                cifs_dbg(VFS, "%s: Failed to set aead key %d\n", __func__, rc);
1790                return rc;
1791        }
1792
1793        rc = crypto_aead_setauthsize(tfm, SMB2_SIGNATURE_SIZE);
1794        if (rc) {
1795                cifs_dbg(VFS, "%s: Failed to set authsize %d\n", __func__, rc);
1796                return rc;
1797        }
1798
1799        req = aead_request_alloc(tfm, GFP_KERNEL);
1800        if (!req) {
1801                cifs_dbg(VFS, "%s: Failed to alloc aead request", __func__);
1802                return -ENOMEM;
1803        }
1804
1805        if (!enc) {
1806                memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE);
1807                crypt_len += SMB2_SIGNATURE_SIZE;
1808        }
1809
1810        sg = init_sg(rqst, sign);
1811        if (!sg) {
1812                cifs_dbg(VFS, "%s: Failed to init sg", __func__);
1813                rc = -ENOMEM;
1814                goto free_req;
1815        }
1816
1817        iv_len = crypto_aead_ivsize(tfm);
1818        iv = kzalloc(iv_len, GFP_KERNEL);
1819        if (!iv) {
1820                cifs_dbg(VFS, "%s: Failed to alloc IV", __func__);
1821                rc = -ENOMEM;
1822                goto free_sg;
1823        }
1824        iv[0] = 3;
1825        memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES128CMM_NONCE);
1826
1827        aead_request_set_crypt(req, sg, sg, crypt_len, iv);
1828        aead_request_set_ad(req, assoc_data_len);
1829
1830        aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1831                                  cifs_crypt_complete, &result);
1832
1833        rc = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
1834
1835        if (rc == -EINPROGRESS || rc == -EBUSY) {
1836                wait_for_completion(&result.completion);
1837                rc = result.err;
1838        }
1839
1840        if (!rc && enc)
1841                memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE);
1842
1843        kfree(iv);
1844free_sg:
1845        kfree(sg);
1846free_req:
1847        kfree(req);
1848        return rc;
1849}
1850
1851static int
1852smb3_init_transform_rq(struct TCP_Server_Info *server, struct smb_rqst *new_rq,
1853                       struct smb_rqst *old_rq)
1854{
1855        struct kvec *iov;
1856        struct page **pages;
1857        struct smb2_transform_hdr *tr_hdr;
1858        unsigned int npages = old_rq->rq_npages;
1859        int i;
1860        int rc = -ENOMEM;
1861
1862        pages = kmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
1863        if (!pages)
1864                return rc;
1865
1866        new_rq->rq_pages = pages;
1867        new_rq->rq_npages = old_rq->rq_npages;
1868        new_rq->rq_pagesz = old_rq->rq_pagesz;
1869        new_rq->rq_tailsz = old_rq->rq_tailsz;
1870
1871        for (i = 0; i < npages; i++) {
1872                pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
1873                if (!pages[i])
1874                        goto err_free_pages;
1875        }
1876
1877        iov = kmalloc_array(old_rq->rq_nvec, sizeof(struct kvec), GFP_KERNEL);
1878        if (!iov)
1879                goto err_free_pages;
1880
1881        /* copy all iovs from the old except the 1st one (rfc1002 length) */
1882        memcpy(&iov[1], &old_rq->rq_iov[1],
1883                                sizeof(struct kvec) * (old_rq->rq_nvec - 1));
1884        new_rq->rq_iov = iov;
1885        new_rq->rq_nvec = old_rq->rq_nvec;
1886
1887        tr_hdr = kmalloc(sizeof(struct smb2_transform_hdr), GFP_KERNEL);
1888        if (!tr_hdr)
1889                goto err_free_iov;
1890
1891        /* fill the 1st iov with a transform header */
1892        fill_transform_hdr(tr_hdr, old_rq);
1893        new_rq->rq_iov[0].iov_base = tr_hdr;
1894        new_rq->rq_iov[0].iov_len = sizeof(struct smb2_transform_hdr);
1895
1896        /* copy pages form the old */
1897        for (i = 0; i < npages; i++) {
1898                char *dst = kmap(new_rq->rq_pages[i]);
1899                char *src = kmap(old_rq->rq_pages[i]);
1900                unsigned int len = (i < npages - 1) ? new_rq->rq_pagesz :
1901                                                        new_rq->rq_tailsz;
1902                memcpy(dst, src, len);
1903                kunmap(new_rq->rq_pages[i]);
1904                kunmap(old_rq->rq_pages[i]);
1905        }
1906
1907        rc = crypt_message(server, new_rq, 1);
1908        cifs_dbg(FYI, "encrypt message returned %d", rc);
1909        if (rc)
1910                goto err_free_tr_hdr;
1911
1912        return rc;
1913
1914err_free_tr_hdr:
1915        kfree(tr_hdr);
1916err_free_iov:
1917        kfree(iov);
1918err_free_pages:
1919        for (i = i - 1; i >= 0; i--)
1920                put_page(pages[i]);
1921        kfree(pages);
1922        return rc;
1923}
1924
1925static void
1926smb3_free_transform_rq(struct smb_rqst *rqst)
1927{
1928        int i = rqst->rq_npages - 1;
1929
1930        for (; i >= 0; i--)
1931                put_page(rqst->rq_pages[i]);
1932        kfree(rqst->rq_pages);
1933        /* free transform header */
1934        kfree(rqst->rq_iov[0].iov_base);
1935        kfree(rqst->rq_iov);
1936}
1937
1938static int
1939smb3_is_transform_hdr(void *buf)
1940{
1941        struct smb2_transform_hdr *trhdr = buf;
1942
1943        return trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM;
1944}
1945
1946static int
1947decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
1948                 unsigned int buf_data_size, struct page **pages,
1949                 unsigned int npages, unsigned int page_data_size)
1950{
1951        struct kvec iov[2];
1952        struct smb_rqst rqst = {NULL};
1953        struct smb2_hdr *hdr;
1954        int rc;
1955
1956        iov[0].iov_base = buf;
1957        iov[0].iov_len = sizeof(struct smb2_transform_hdr);
1958        iov[1].iov_base = buf + sizeof(struct smb2_transform_hdr);
1959        iov[1].iov_len = buf_data_size;
1960
1961        rqst.rq_iov = iov;
1962        rqst.rq_nvec = 2;
1963        rqst.rq_pages = pages;
1964        rqst.rq_npages = npages;
1965        rqst.rq_pagesz = PAGE_SIZE;
1966        rqst.rq_tailsz = (page_data_size % PAGE_SIZE) ? : PAGE_SIZE;
1967
1968        rc = crypt_message(server, &rqst, 0);
1969        cifs_dbg(FYI, "decrypt message returned %d\n", rc);
1970
1971        if (rc)
1972                return rc;
1973
1974        memmove(buf + 4, iov[1].iov_base, buf_data_size);
1975        hdr = (struct smb2_hdr *)buf;
1976        hdr->smb2_buf_length = cpu_to_be32(buf_data_size + page_data_size);
1977        server->total_read = buf_data_size + page_data_size + 4;
1978
1979        return rc;
1980}
1981
1982static int
1983read_data_into_pages(struct TCP_Server_Info *server, struct page **pages,
1984                     unsigned int npages, unsigned int len)
1985{
1986        int i;
1987        int length;
1988
1989        for (i = 0; i < npages; i++) {
1990                struct page *page = pages[i];
1991                size_t n;
1992
1993                n = len;
1994                if (len >= PAGE_SIZE) {
1995                        /* enough data to fill the page */
1996                        n = PAGE_SIZE;
1997                        len -= n;
1998                } else {
1999                        zero_user(page, len, PAGE_SIZE - len);
2000                        len = 0;
2001                }
2002                length = cifs_read_page_from_socket(server, page, n);
2003                if (length < 0)
2004                        return length;
2005                server->total_read += length;
2006        }
2007
2008        return 0;
2009}
2010
2011static int
2012init_read_bvec(struct page **pages, unsigned int npages, unsigned int data_size,
2013               unsigned int cur_off, struct bio_vec **page_vec)
2014{
2015        struct bio_vec *bvec;
2016        int i;
2017
2018        bvec = kcalloc(npages, sizeof(struct bio_vec), GFP_KERNEL);
2019        if (!bvec)
2020                return -ENOMEM;
2021
2022        for (i = 0; i < npages; i++) {
2023                bvec[i].bv_page = pages[i];
2024                bvec[i].bv_offset = (i == 0) ? cur_off : 0;
2025                bvec[i].bv_len = min_t(unsigned int, PAGE_SIZE, data_size);
2026                data_size -= bvec[i].bv_len;
2027        }
2028
2029        if (data_size != 0) {
2030                cifs_dbg(VFS, "%s: something went wrong\n", __func__);
2031                kfree(bvec);
2032                return -EIO;
2033        }
2034
2035        *page_vec = bvec;
2036        return 0;
2037}
2038
2039static int
2040handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
2041                 char *buf, unsigned int buf_len, struct page **pages,
2042                 unsigned int npages, unsigned int page_data_size)
2043{
2044        unsigned int data_offset;
2045        unsigned int data_len;
2046        unsigned int cur_off;
2047        unsigned int cur_page_idx;
2048        unsigned int pad_len;
2049        struct cifs_readdata *rdata = mid->callback_data;
2050        struct smb2_sync_hdr *shdr = get_sync_hdr(buf);
2051        struct bio_vec *bvec = NULL;
2052        struct iov_iter iter;
2053        struct kvec iov;
2054        int length;
2055
2056        if (shdr->Command != SMB2_READ) {
2057                cifs_dbg(VFS, "only big read responses are supported\n");
2058                return -ENOTSUPP;
2059        }
2060
2061        if (server->ops->is_status_pending &&
2062                        server->ops->is_status_pending(buf, server, 0))
2063                return -1;
2064
2065        rdata->result = server->ops->map_error(buf, false);
2066        if (rdata->result != 0) {
2067                cifs_dbg(FYI, "%s: server returned error %d\n",
2068                         __func__, rdata->result);
2069                dequeue_mid(mid, rdata->result);
2070                return 0;
2071        }
2072
2073        data_offset = server->ops->read_data_offset(buf) + 4;
2074        data_len = server->ops->read_data_length(buf);
2075
2076        if (data_offset < server->vals->read_rsp_size) {
2077                /*
2078                 * win2k8 sometimes sends an offset of 0 when the read
2079                 * is beyond the EOF. Treat it as if the data starts just after
2080                 * the header.
2081                 */
2082                cifs_dbg(FYI, "%s: data offset (%u) inside read response header\n",
2083                         __func__, data_offset);
2084                data_offset = server->vals->read_rsp_size;
2085        } else if (data_offset > MAX_CIFS_SMALL_BUFFER_SIZE) {
2086                /* data_offset is beyond the end of smallbuf */
2087                cifs_dbg(FYI, "%s: data offset (%u) beyond end of smallbuf\n",
2088                         __func__, data_offset);
2089                rdata->result = -EIO;
2090                dequeue_mid(mid, rdata->result);
2091                return 0;
2092        }
2093
2094        pad_len = data_offset - server->vals->read_rsp_size;
2095
2096        if (buf_len <= data_offset) {
2097                /* read response payload is in pages */
2098                cur_page_idx = pad_len / PAGE_SIZE;
2099                cur_off = pad_len % PAGE_SIZE;
2100
2101                if (cur_page_idx != 0) {
2102                        /* data offset is beyond the 1st page of response */
2103                        cifs_dbg(FYI, "%s: data offset (%u) beyond 1st page of response\n",
2104                                 __func__, data_offset);
2105                        rdata->result = -EIO;
2106                        dequeue_mid(mid, rdata->result);
2107                        return 0;
2108                }
2109
2110                if (data_len > page_data_size - pad_len) {
2111                        /* data_len is corrupt -- discard frame */
2112                        rdata->result = -EIO;
2113                        dequeue_mid(mid, rdata->result);
2114                        return 0;
2115                }
2116
2117                rdata->result = init_read_bvec(pages, npages, page_data_size,
2118                                               cur_off, &bvec);
2119                if (rdata->result != 0) {
2120                        dequeue_mid(mid, rdata->result);
2121                        return 0;
2122                }
2123
2124                iov_iter_bvec(&iter, WRITE | ITER_BVEC, bvec, npages, data_len);
2125        } else if (buf_len >= data_offset + data_len) {
2126                /* read response payload is in buf */
2127                WARN_ONCE(npages > 0, "read data can be either in buf or in pages");
2128                iov.iov_base = buf + data_offset;
2129                iov.iov_len = data_len;
2130                iov_iter_kvec(&iter, WRITE | ITER_KVEC, &iov, 1, data_len);
2131        } else {
2132                /* read response payload cannot be in both buf and pages */
2133                WARN_ONCE(1, "buf can not contain only a part of read data");
2134                rdata->result = -EIO;
2135                dequeue_mid(mid, rdata->result);
2136                return 0;
2137        }
2138
2139        /* set up first iov for signature check */
2140        rdata->iov[0].iov_base = buf;
2141        rdata->iov[0].iov_len = 4;
2142        rdata->iov[1].iov_base = buf + 4;
2143        rdata->iov[1].iov_len = server->vals->read_rsp_size - 4;
2144        cifs_dbg(FYI, "0: iov_base=%p iov_len=%zu\n",
2145                 rdata->iov[0].iov_base, server->vals->read_rsp_size);
2146
2147        length = rdata->copy_into_pages(server, rdata, &iter);
2148
2149        kfree(bvec);
2150
2151        if (length < 0)
2152                return length;
2153
2154        dequeue_mid(mid, false);
2155        return length;
2156}
2157
2158static int
2159receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
2160{
2161        char *buf = server->smallbuf;
2162        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
2163        unsigned int npages;
2164        struct page **pages;
2165        unsigned int len;
2166        unsigned int buflen = get_rfc1002_length(buf) + 4;
2167        int rc;
2168        int i = 0;
2169
2170        len = min_t(unsigned int, buflen, server->vals->read_rsp_size - 4 +
2171                sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1;
2172
2173        rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len);
2174        if (rc < 0)
2175                return rc;
2176        server->total_read += rc;
2177
2178        len = le32_to_cpu(tr_hdr->OriginalMessageSize) + 4 -
2179                                                server->vals->read_rsp_size;
2180        npages = DIV_ROUND_UP(len, PAGE_SIZE);
2181
2182        pages = kmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
2183        if (!pages) {
2184                rc = -ENOMEM;
2185                goto discard_data;
2186        }
2187
2188        for (; i < npages; i++) {
2189                pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2190                if (!pages[i]) {
2191                        rc = -ENOMEM;
2192                        goto discard_data;
2193                }
2194        }
2195
2196        /* read read data into pages */
2197        rc = read_data_into_pages(server, pages, npages, len);
2198        if (rc)
2199                goto free_pages;
2200
2201        rc = cifs_discard_remaining_data(server);
2202        if (rc)
2203                goto free_pages;
2204
2205        rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size - 4,
2206                              pages, npages, len);
2207        if (rc)
2208                goto free_pages;
2209
2210        *mid = smb2_find_mid(server, buf);
2211        if (*mid == NULL)
2212                cifs_dbg(FYI, "mid not found\n");
2213        else {
2214                cifs_dbg(FYI, "mid found\n");
2215                (*mid)->decrypted = true;
2216                rc = handle_read_data(server, *mid, buf,
2217                                      server->vals->read_rsp_size,
2218                                      pages, npages, len);
2219        }
2220
2221free_pages:
2222        for (i = i - 1; i >= 0; i--)
2223                put_page(pages[i]);
2224        kfree(pages);
2225        return rc;
2226discard_data:
2227        cifs_discard_remaining_data(server);
2228        goto free_pages;
2229}
2230
2231static int
2232receive_encrypted_standard(struct TCP_Server_Info *server,
2233                           struct mid_q_entry **mid)
2234{
2235        int length;
2236        char *buf = server->smallbuf;
2237        unsigned int pdu_length = get_rfc1002_length(buf);
2238        unsigned int buf_size;
2239        struct mid_q_entry *mid_entry;
2240
2241        /* switch to large buffer if too big for a small one */
2242        if (pdu_length + 4 > MAX_CIFS_SMALL_BUFFER_SIZE) {
2243                server->large_buf = true;
2244                memcpy(server->bigbuf, buf, server->total_read);
2245                buf = server->bigbuf;
2246        }
2247
2248        /* now read the rest */
2249        length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
2250                                pdu_length - HEADER_SIZE(server) + 1 + 4);
2251        if (length < 0)
2252                return length;
2253        server->total_read += length;
2254
2255        buf_size = pdu_length + 4 - sizeof(struct smb2_transform_hdr);
2256        length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0);
2257        if (length)
2258                return length;
2259
2260        mid_entry = smb2_find_mid(server, buf);
2261        if (mid_entry == NULL)
2262                cifs_dbg(FYI, "mid not found\n");
2263        else {
2264                cifs_dbg(FYI, "mid found\n");
2265                mid_entry->decrypted = true;
2266        }
2267
2268        *mid = mid_entry;
2269
2270        if (mid_entry && mid_entry->handle)
2271                return mid_entry->handle(server, mid_entry);
2272
2273        return cifs_handle_standard(server, mid_entry);
2274}
2275
2276static int
2277smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
2278{
2279        char *buf = server->smallbuf;
2280        unsigned int pdu_length = get_rfc1002_length(buf);
2281        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
2282        unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
2283
2284        if (pdu_length + 4 < sizeof(struct smb2_transform_hdr) +
2285                                                sizeof(struct smb2_sync_hdr)) {
2286                cifs_dbg(VFS, "Transform message is too small (%u)\n",
2287                         pdu_length);
2288                cifs_reconnect(server);
2289                wake_up(&server->response_q);
2290                return -ECONNABORTED;
2291        }
2292
2293        if (pdu_length + 4 < orig_len + sizeof(struct smb2_transform_hdr)) {
2294                cifs_dbg(VFS, "Transform message is broken\n");
2295                cifs_reconnect(server);
2296                wake_up(&server->response_q);
2297                return -ECONNABORTED;
2298        }
2299
2300        if (pdu_length + 4 > CIFSMaxBufSize + MAX_HEADER_SIZE(server))
2301                return receive_encrypted_read(server, mid);
2302
2303        return receive_encrypted_standard(server, mid);
2304}
2305
2306int
2307smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
2308{
2309        char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
2310
2311        return handle_read_data(server, mid, buf, get_rfc1002_length(buf) + 4,
2312                                NULL, 0, 0);
2313}
2314
2315struct smb_version_operations smb20_operations = {
2316        .compare_fids = smb2_compare_fids,
2317        .setup_request = smb2_setup_request,
2318        .setup_async_request = smb2_setup_async_request,
2319        .check_receive = smb2_check_receive,
2320        .add_credits = smb2_add_credits,
2321        .set_credits = smb2_set_credits,
2322        .get_credits_field = smb2_get_credits_field,
2323        .get_credits = smb2_get_credits,
2324        .wait_mtu_credits = cifs_wait_mtu_credits,
2325        .get_next_mid = smb2_get_next_mid,
2326        .read_data_offset = smb2_read_data_offset,
2327        .read_data_length = smb2_read_data_length,
2328        .map_error = map_smb2_to_linux_error,
2329        .find_mid = smb2_find_mid,
2330        .check_message = smb2_check_message,
2331        .dump_detail = smb2_dump_detail,
2332        .clear_stats = smb2_clear_stats,
2333        .print_stats = smb2_print_stats,
2334        .is_oplock_break = smb2_is_valid_oplock_break,
2335        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2336        .downgrade_oplock = smb2_downgrade_oplock,
2337        .need_neg = smb2_need_neg,
2338        .negotiate = smb2_negotiate,
2339        .negotiate_wsize = smb2_negotiate_wsize,
2340        .negotiate_rsize = smb2_negotiate_rsize,
2341        .sess_setup = SMB2_sess_setup,
2342        .logoff = SMB2_logoff,
2343        .tree_connect = SMB2_tcon,
2344        .tree_disconnect = SMB2_tdis,
2345        .qfs_tcon = smb2_qfs_tcon,
2346        .is_path_accessible = smb2_is_path_accessible,
2347        .can_echo = smb2_can_echo,
2348        .echo = SMB2_echo,
2349        .query_path_info = smb2_query_path_info,
2350        .get_srv_inum = smb2_get_srv_inum,
2351        .query_file_info = smb2_query_file_info,
2352        .set_path_size = smb2_set_path_size,
2353        .set_file_size = smb2_set_file_size,
2354        .set_file_info = smb2_set_file_info,
2355        .set_compression = smb2_set_compression,
2356        .mkdir = smb2_mkdir,
2357        .mkdir_setinfo = smb2_mkdir_setinfo,
2358        .rmdir = smb2_rmdir,
2359        .unlink = smb2_unlink,
2360        .rename = smb2_rename_path,
2361        .create_hardlink = smb2_create_hardlink,
2362        .query_symlink = smb2_query_symlink,
2363        .query_mf_symlink = smb3_query_mf_symlink,
2364        .create_mf_symlink = smb3_create_mf_symlink,
2365        .open = smb2_open_file,
2366        .set_fid = smb2_set_fid,
2367        .close = smb2_close_file,
2368        .flush = smb2_flush_file,
2369        .async_readv = smb2_async_readv,
2370        .async_writev = smb2_async_writev,
2371        .sync_read = smb2_sync_read,
2372        .sync_write = smb2_sync_write,
2373        .query_dir_first = smb2_query_dir_first,
2374        .query_dir_next = smb2_query_dir_next,
2375        .close_dir = smb2_close_dir,
2376        .calc_smb_size = smb2_calc_size,
2377        .is_status_pending = smb2_is_status_pending,
2378        .oplock_response = smb2_oplock_response,
2379        .queryfs = smb2_queryfs,
2380        .mand_lock = smb2_mand_lock,
2381        .mand_unlock_range = smb2_unlock_range,
2382        .push_mand_locks = smb2_push_mandatory_locks,
2383        .get_lease_key = smb2_get_lease_key,
2384        .set_lease_key = smb2_set_lease_key,
2385        .new_lease_key = smb2_new_lease_key,
2386        .calc_signature = smb2_calc_signature,
2387        .is_read_op = smb2_is_read_op,
2388        .set_oplock_level = smb2_set_oplock_level,
2389        .create_lease_buf = smb2_create_lease_buf,
2390        .parse_lease_buf = smb2_parse_lease_buf,
2391        .copychunk_range = smb2_copychunk_range,
2392        .wp_retry_size = smb2_wp_retry_size,
2393        .dir_needs_close = smb2_dir_needs_close,
2394        .get_dfs_refer = smb2_get_dfs_refer,
2395        .select_sectype = smb2_select_sectype,
2396};
2397
2398struct smb_version_operations smb21_operations = {
2399        .compare_fids = smb2_compare_fids,
2400        .setup_request = smb2_setup_request,
2401        .setup_async_request = smb2_setup_async_request,
2402        .check_receive = smb2_check_receive,
2403        .add_credits = smb2_add_credits,
2404        .set_credits = smb2_set_credits,
2405        .get_credits_field = smb2_get_credits_field,
2406        .get_credits = smb2_get_credits,
2407        .wait_mtu_credits = smb2_wait_mtu_credits,
2408        .get_next_mid = smb2_get_next_mid,
2409        .read_data_offset = smb2_read_data_offset,
2410        .read_data_length = smb2_read_data_length,
2411        .map_error = map_smb2_to_linux_error,
2412        .find_mid = smb2_find_mid,
2413        .check_message = smb2_check_message,
2414        .dump_detail = smb2_dump_detail,
2415        .clear_stats = smb2_clear_stats,
2416        .print_stats = smb2_print_stats,
2417        .is_oplock_break = smb2_is_valid_oplock_break,
2418        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2419        .downgrade_oplock = smb2_downgrade_oplock,
2420        .need_neg = smb2_need_neg,
2421        .negotiate = smb2_negotiate,
2422        .negotiate_wsize = smb2_negotiate_wsize,
2423        .negotiate_rsize = smb2_negotiate_rsize,
2424        .sess_setup = SMB2_sess_setup,
2425        .logoff = SMB2_logoff,
2426        .tree_connect = SMB2_tcon,
2427        .tree_disconnect = SMB2_tdis,
2428        .qfs_tcon = smb2_qfs_tcon,
2429        .is_path_accessible = smb2_is_path_accessible,
2430        .can_echo = smb2_can_echo,
2431        .echo = SMB2_echo,
2432        .query_path_info = smb2_query_path_info,
2433        .get_srv_inum = smb2_get_srv_inum,
2434        .query_file_info = smb2_query_file_info,
2435        .set_path_size = smb2_set_path_size,
2436        .set_file_size = smb2_set_file_size,
2437        .set_file_info = smb2_set_file_info,
2438        .set_compression = smb2_set_compression,
2439        .mkdir = smb2_mkdir,
2440        .mkdir_setinfo = smb2_mkdir_setinfo,
2441        .rmdir = smb2_rmdir,
2442        .unlink = smb2_unlink,
2443        .rename = smb2_rename_path,
2444        .create_hardlink = smb2_create_hardlink,
2445        .query_symlink = smb2_query_symlink,
2446        .query_mf_symlink = smb3_query_mf_symlink,
2447        .create_mf_symlink = smb3_create_mf_symlink,
2448        .open = smb2_open_file,
2449        .set_fid = smb2_set_fid,
2450        .close = smb2_close_file,
2451        .flush = smb2_flush_file,
2452        .async_readv = smb2_async_readv,
2453        .async_writev = smb2_async_writev,
2454        .sync_read = smb2_sync_read,
2455        .sync_write = smb2_sync_write,
2456        .query_dir_first = smb2_query_dir_first,
2457        .query_dir_next = smb2_query_dir_next,
2458        .close_dir = smb2_close_dir,
2459        .calc_smb_size = smb2_calc_size,
2460        .is_status_pending = smb2_is_status_pending,
2461        .oplock_response = smb2_oplock_response,
2462        .queryfs = smb2_queryfs,
2463        .mand_lock = smb2_mand_lock,
2464        .mand_unlock_range = smb2_unlock_range,
2465        .push_mand_locks = smb2_push_mandatory_locks,
2466        .get_lease_key = smb2_get_lease_key,
2467        .set_lease_key = smb2_set_lease_key,
2468        .new_lease_key = smb2_new_lease_key,
2469        .calc_signature = smb2_calc_signature,
2470        .is_read_op = smb21_is_read_op,
2471        .set_oplock_level = smb21_set_oplock_level,
2472        .create_lease_buf = smb2_create_lease_buf,
2473        .parse_lease_buf = smb2_parse_lease_buf,
2474        .copychunk_range = smb2_copychunk_range,
2475        .wp_retry_size = smb2_wp_retry_size,
2476        .dir_needs_close = smb2_dir_needs_close,
2477        .enum_snapshots = smb3_enum_snapshots,
2478        .get_dfs_refer = smb2_get_dfs_refer,
2479        .select_sectype = smb2_select_sectype,
2480};
2481
2482struct smb_version_operations smb30_operations = {
2483        .compare_fids = smb2_compare_fids,
2484        .setup_request = smb2_setup_request,
2485        .setup_async_request = smb2_setup_async_request,
2486        .check_receive = smb2_check_receive,
2487        .add_credits = smb2_add_credits,
2488        .set_credits = smb2_set_credits,
2489        .get_credits_field = smb2_get_credits_field,
2490        .get_credits = smb2_get_credits,
2491        .wait_mtu_credits = smb2_wait_mtu_credits,
2492        .get_next_mid = smb2_get_next_mid,
2493        .read_data_offset = smb2_read_data_offset,
2494        .read_data_length = smb2_read_data_length,
2495        .map_error = map_smb2_to_linux_error,
2496        .find_mid = smb2_find_mid,
2497        .check_message = smb2_check_message,
2498        .dump_detail = smb2_dump_detail,
2499        .clear_stats = smb2_clear_stats,
2500        .print_stats = smb2_print_stats,
2501        .dump_share_caps = smb2_dump_share_caps,
2502        .is_oplock_break = smb2_is_valid_oplock_break,
2503        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2504        .downgrade_oplock = smb2_downgrade_oplock,
2505        .need_neg = smb2_need_neg,
2506        .negotiate = smb2_negotiate,
2507        .negotiate_wsize = smb2_negotiate_wsize,
2508        .negotiate_rsize = smb2_negotiate_rsize,
2509        .sess_setup = SMB2_sess_setup,
2510        .logoff = SMB2_logoff,
2511        .tree_connect = SMB2_tcon,
2512        .tree_disconnect = SMB2_tdis,
2513        .qfs_tcon = smb3_qfs_tcon,
2514        .is_path_accessible = smb2_is_path_accessible,
2515        .can_echo = smb2_can_echo,
2516        .echo = SMB2_echo,
2517        .query_path_info = smb2_query_path_info,
2518        .get_srv_inum = smb2_get_srv_inum,
2519        .query_file_info = smb2_query_file_info,
2520        .set_path_size = smb2_set_path_size,
2521        .set_file_size = smb2_set_file_size,
2522        .set_file_info = smb2_set_file_info,
2523        .set_compression = smb2_set_compression,
2524        .mkdir = smb2_mkdir,
2525        .mkdir_setinfo = smb2_mkdir_setinfo,
2526        .rmdir = smb2_rmdir,
2527        .unlink = smb2_unlink,
2528        .rename = smb2_rename_path,
2529        .create_hardlink = smb2_create_hardlink,
2530        .query_symlink = smb2_query_symlink,
2531        .query_mf_symlink = smb3_query_mf_symlink,
2532        .create_mf_symlink = smb3_create_mf_symlink,
2533        .open = smb2_open_file,
2534        .set_fid = smb2_set_fid,
2535        .close = smb2_close_file,
2536        .flush = smb2_flush_file,
2537        .async_readv = smb2_async_readv,
2538        .async_writev = smb2_async_writev,
2539        .sync_read = smb2_sync_read,
2540        .sync_write = smb2_sync_write,
2541        .query_dir_first = smb2_query_dir_first,
2542        .query_dir_next = smb2_query_dir_next,
2543        .close_dir = smb2_close_dir,
2544        .calc_smb_size = smb2_calc_size,
2545        .is_status_pending = smb2_is_status_pending,
2546        .oplock_response = smb2_oplock_response,
2547        .queryfs = smb2_queryfs,
2548        .mand_lock = smb2_mand_lock,
2549        .mand_unlock_range = smb2_unlock_range,
2550        .push_mand_locks = smb2_push_mandatory_locks,
2551        .get_lease_key = smb2_get_lease_key,
2552        .set_lease_key = smb2_set_lease_key,
2553        .new_lease_key = smb2_new_lease_key,
2554        .generate_signingkey = generate_smb30signingkey,
2555        .calc_signature = smb3_calc_signature,
2556        .set_integrity  = smb3_set_integrity,
2557        .is_read_op = smb21_is_read_op,
2558        .set_oplock_level = smb3_set_oplock_level,
2559        .create_lease_buf = smb3_create_lease_buf,
2560        .parse_lease_buf = smb3_parse_lease_buf,
2561        .copychunk_range = smb2_copychunk_range,
2562        .duplicate_extents = smb2_duplicate_extents,
2563        .validate_negotiate = smb3_validate_negotiate,
2564        .wp_retry_size = smb2_wp_retry_size,
2565        .dir_needs_close = smb2_dir_needs_close,
2566        .fallocate = smb3_fallocate,
2567        .enum_snapshots = smb3_enum_snapshots,
2568        .init_transform_rq = smb3_init_transform_rq,
2569        .free_transform_rq = smb3_free_transform_rq,
2570        .is_transform_hdr = smb3_is_transform_hdr,
2571        .receive_transform = smb3_receive_transform,
2572        .get_dfs_refer = smb2_get_dfs_refer,
2573        .select_sectype = smb2_select_sectype,
2574};
2575
2576#ifdef CONFIG_CIFS_SMB311
2577struct smb_version_operations smb311_operations = {
2578        .compare_fids = smb2_compare_fids,
2579        .setup_request = smb2_setup_request,
2580        .setup_async_request = smb2_setup_async_request,
2581        .check_receive = smb2_check_receive,
2582        .add_credits = smb2_add_credits,
2583        .set_credits = smb2_set_credits,
2584        .get_credits_field = smb2_get_credits_field,
2585        .get_credits = smb2_get_credits,
2586        .wait_mtu_credits = smb2_wait_mtu_credits,
2587        .get_next_mid = smb2_get_next_mid,
2588        .read_data_offset = smb2_read_data_offset,
2589        .read_data_length = smb2_read_data_length,
2590        .map_error = map_smb2_to_linux_error,
2591        .find_mid = smb2_find_mid,
2592        .check_message = smb2_check_message,
2593        .dump_detail = smb2_dump_detail,
2594        .clear_stats = smb2_clear_stats,
2595        .print_stats = smb2_print_stats,
2596        .dump_share_caps = smb2_dump_share_caps,
2597        .is_oplock_break = smb2_is_valid_oplock_break,
2598        .handle_cancelled_mid = smb2_handle_cancelled_mid,
2599        .downgrade_oplock = smb2_downgrade_oplock,
2600        .need_neg = smb2_need_neg,
2601        .negotiate = smb2_negotiate,
2602        .negotiate_wsize = smb2_negotiate_wsize,
2603        .negotiate_rsize = smb2_negotiate_rsize,
2604        .sess_setup = SMB2_sess_setup,
2605        .logoff = SMB2_logoff,
2606        .tree_connect = SMB2_tcon,
2607        .tree_disconnect = SMB2_tdis,
2608        .qfs_tcon = smb3_qfs_tcon,
2609        .is_path_accessible = smb2_is_path_accessible,
2610        .can_echo = smb2_can_echo,
2611        .echo = SMB2_echo,
2612        .query_path_info = smb2_query_path_info,
2613        .get_srv_inum = smb2_get_srv_inum,
2614        .query_file_info = smb2_query_file_info,
2615        .set_path_size = smb2_set_path_size,
2616        .set_file_size = smb2_set_file_size,
2617        .set_file_info = smb2_set_file_info,
2618        .set_compression = smb2_set_compression,
2619        .mkdir = smb2_mkdir,
2620        .mkdir_setinfo = smb2_mkdir_setinfo,
2621        .rmdir = smb2_rmdir,
2622        .unlink = smb2_unlink,
2623        .rename = smb2_rename_path,
2624        .create_hardlink = smb2_create_hardlink,
2625        .query_symlink = smb2_query_symlink,
2626        .query_mf_symlink = smb3_query_mf_symlink,
2627        .create_mf_symlink = smb3_create_mf_symlink,
2628        .open = smb2_open_file,
2629        .set_fid = smb2_set_fid,
2630        .close = smb2_close_file,
2631        .flush = smb2_flush_file,
2632        .async_readv = smb2_async_readv,
2633        .async_writev = smb2_async_writev,
2634        .sync_read = smb2_sync_read,
2635        .sync_write = smb2_sync_write,
2636        .query_dir_first = smb2_query_dir_first,
2637        .query_dir_next = smb2_query_dir_next,
2638        .close_dir = smb2_close_dir,
2639        .calc_smb_size = smb2_calc_size,
2640        .is_status_pending = smb2_is_status_pending,
2641        .oplock_response = smb2_oplock_response,
2642        .queryfs = smb2_queryfs,
2643        .mand_lock = smb2_mand_lock,
2644        .mand_unlock_range = smb2_unlock_range,
2645        .push_mand_locks = smb2_push_mandatory_locks,
2646        .get_lease_key = smb2_get_lease_key,
2647        .set_lease_key = smb2_set_lease_key,
2648        .new_lease_key = smb2_new_lease_key,
2649        .generate_signingkey = generate_smb311signingkey,
2650        .calc_signature = smb3_calc_signature,
2651        .set_integrity  = smb3_set_integrity,
2652        .is_read_op = smb21_is_read_op,
2653        .set_oplock_level = smb3_set_oplock_level,
2654        .create_lease_buf = smb3_create_lease_buf,
2655        .parse_lease_buf = smb3_parse_lease_buf,
2656        .copychunk_range = smb2_copychunk_range,
2657        .duplicate_extents = smb2_duplicate_extents,
2658/*      .validate_negotiate = smb3_validate_negotiate, */ /* not used in 3.11 */
2659        .wp_retry_size = smb2_wp_retry_size,
2660        .dir_needs_close = smb2_dir_needs_close,
2661        .fallocate = smb3_fallocate,
2662        .enum_snapshots = smb3_enum_snapshots,
2663        .init_transform_rq = smb3_init_transform_rq,
2664        .free_transform_rq = smb3_free_transform_rq,
2665        .is_transform_hdr = smb3_is_transform_hdr,
2666        .receive_transform = smb3_receive_transform,
2667        .get_dfs_refer = smb2_get_dfs_refer,
2668        .select_sectype = smb2_select_sectype,
2669};
2670#endif /* CIFS_SMB311 */
2671
2672struct smb_version_values smb20_values = {
2673        .version_string = SMB20_VERSION_STRING,
2674        .protocol_id = SMB20_PROT_ID,
2675        .req_capabilities = 0, /* MBZ */
2676        .large_lock_type = 0,
2677        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2678        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2679        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2680        .header_size = sizeof(struct smb2_hdr),
2681        .max_header_size = MAX_SMB2_HDR_SIZE,
2682        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2683        .lock_cmd = SMB2_LOCK,
2684        .cap_unix = 0,
2685        .cap_nt_find = SMB2_NT_FIND,
2686        .cap_large_files = SMB2_LARGE_FILES,
2687        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2688        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2689        .create_lease_size = sizeof(struct create_lease),
2690};
2691
2692struct smb_version_values smb21_values = {
2693        .version_string = SMB21_VERSION_STRING,
2694        .protocol_id = SMB21_PROT_ID,
2695        .req_capabilities = 0, /* MBZ on negotiate req until SMB3 dialect */
2696        .large_lock_type = 0,
2697        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2698        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2699        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2700        .header_size = sizeof(struct smb2_hdr),
2701        .max_header_size = MAX_SMB2_HDR_SIZE,
2702        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2703        .lock_cmd = SMB2_LOCK,
2704        .cap_unix = 0,
2705        .cap_nt_find = SMB2_NT_FIND,
2706        .cap_large_files = SMB2_LARGE_FILES,
2707        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2708        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2709        .create_lease_size = sizeof(struct create_lease),
2710};
2711
2712struct smb_version_values smb30_values = {
2713        .version_string = SMB30_VERSION_STRING,
2714        .protocol_id = SMB30_PROT_ID,
2715        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION,
2716        .large_lock_type = 0,
2717        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2718        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2719        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2720        .header_size = sizeof(struct smb2_hdr),
2721        .max_header_size = MAX_SMB2_HDR_SIZE,
2722        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2723        .lock_cmd = SMB2_LOCK,
2724        .cap_unix = 0,
2725        .cap_nt_find = SMB2_NT_FIND,
2726        .cap_large_files = SMB2_LARGE_FILES,
2727        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2728        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2729        .create_lease_size = sizeof(struct create_lease_v2),
2730};
2731
2732struct smb_version_values smb302_values = {
2733        .version_string = SMB302_VERSION_STRING,
2734        .protocol_id = SMB302_PROT_ID,
2735        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION,
2736        .large_lock_type = 0,
2737        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2738        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2739        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2740        .header_size = sizeof(struct smb2_hdr),
2741        .max_header_size = MAX_SMB2_HDR_SIZE,
2742        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2743        .lock_cmd = SMB2_LOCK,
2744        .cap_unix = 0,
2745        .cap_nt_find = SMB2_NT_FIND,
2746        .cap_large_files = SMB2_LARGE_FILES,
2747        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2748        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2749        .create_lease_size = sizeof(struct create_lease_v2),
2750};
2751
2752#ifdef CONFIG_CIFS_SMB311
2753struct smb_version_values smb311_values = {
2754        .version_string = SMB311_VERSION_STRING,
2755        .protocol_id = SMB311_PROT_ID,
2756        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES,
2757        .large_lock_type = 0,
2758        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
2759        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
2760        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2761        .header_size = sizeof(struct smb2_hdr),
2762        .max_header_size = MAX_SMB2_HDR_SIZE,
2763        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
2764        .lock_cmd = SMB2_LOCK,
2765        .cap_unix = 0,
2766        .cap_nt_find = SMB2_NT_FIND,
2767        .cap_large_files = SMB2_LARGE_FILES,
2768        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
2769        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
2770        .create_lease_size = sizeof(struct create_lease_v2),
2771};
2772#endif /* SMB311 */
2773