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 "cifsglob.h"
  23#include "smb2pdu.h"
  24#include "smb2proto.h"
  25#include "cifsproto.h"
  26#include "cifs_debug.h"
  27#include "cifs_unicode.h"
  28#include "smb2status.h"
  29#include "smb2glob.h"
  30
  31static int
  32change_conf(struct TCP_Server_Info *server)
  33{
  34        server->credits += server->echo_credits + server->oplock_credits;
  35        server->oplock_credits = server->echo_credits = 0;
  36        switch (server->credits) {
  37        case 0:
  38                return -1;
  39        case 1:
  40                server->echoes = false;
  41                server->oplocks = false;
  42                cifs_dbg(VFS, "disabling echoes and oplocks\n");
  43                break;
  44        case 2:
  45                server->echoes = true;
  46                server->oplocks = false;
  47                server->echo_credits = 1;
  48                cifs_dbg(FYI, "disabling oplocks\n");
  49                break;
  50        default:
  51                server->echoes = true;
  52                server->oplocks = true;
  53                server->echo_credits = 1;
  54                server->oplock_credits = 1;
  55        }
  56        server->credits -= server->echo_credits + server->oplock_credits;
  57        return 0;
  58}
  59
  60static void
  61smb2_add_credits(struct TCP_Server_Info *server, const unsigned int add,
  62                 const int optype)
  63{
  64        int *val, rc = 0;
  65        spin_lock(&server->req_lock);
  66        val = server->ops->get_credits_field(server, optype);
  67        *val += add;
  68        server->in_flight--;
  69        if (server->in_flight == 0 && (optype & CIFS_OP_MASK) != CIFS_NEG_OP)
  70                rc = change_conf(server);
  71        /*
  72         * Sometimes server returns 0 credits on oplock break ack - we need to
  73         * rebalance credits in this case.
  74         */
  75        else if (server->in_flight > 0 && server->oplock_credits == 0 &&
  76                 server->oplocks) {
  77                if (server->credits > 1) {
  78                        server->credits--;
  79                        server->oplock_credits++;
  80                }
  81        }
  82        spin_unlock(&server->req_lock);
  83        wake_up(&server->request_q);
  84        if (rc)
  85                cifs_reconnect(server);
  86}
  87
  88static void
  89smb2_set_credits(struct TCP_Server_Info *server, const int val)
  90{
  91        spin_lock(&server->req_lock);
  92        server->credits = val;
  93        spin_unlock(&server->req_lock);
  94}
  95
  96static int *
  97smb2_get_credits_field(struct TCP_Server_Info *server, const int optype)
  98{
  99        switch (optype) {
 100        case CIFS_ECHO_OP:
 101                return &server->echo_credits;
 102        case CIFS_OBREAK_OP:
 103                return &server->oplock_credits;
 104        default:
 105                return &server->credits;
 106        }
 107}
 108
 109static unsigned int
 110smb2_get_credits(struct mid_q_entry *mid)
 111{
 112        return le16_to_cpu(((struct smb2_hdr *)mid->resp_buf)->CreditRequest);
 113}
 114
 115static __u64
 116smb2_get_next_mid(struct TCP_Server_Info *server)
 117{
 118        __u64 mid;
 119        /* for SMB2 we need the current value */
 120        spin_lock(&GlobalMid_Lock);
 121        mid = server->CurrentMid++;
 122        spin_unlock(&GlobalMid_Lock);
 123        return mid;
 124}
 125
 126static struct mid_q_entry *
 127smb2_find_mid(struct TCP_Server_Info *server, char *buf)
 128{
 129        struct mid_q_entry *mid;
 130        struct smb2_hdr *hdr = (struct smb2_hdr *)buf;
 131
 132        spin_lock(&GlobalMid_Lock);
 133        list_for_each_entry(mid, &server->pending_mid_q, qhead) {
 134                if ((mid->mid == hdr->MessageId) &&
 135                    (mid->mid_state == MID_REQUEST_SUBMITTED) &&
 136                    (mid->command == hdr->Command)) {
 137                        spin_unlock(&GlobalMid_Lock);
 138                        return mid;
 139                }
 140        }
 141        spin_unlock(&GlobalMid_Lock);
 142        return NULL;
 143}
 144
 145static void
 146smb2_dump_detail(void *buf)
 147{
 148#ifdef CONFIG_CIFS_DEBUG2
 149        struct smb2_hdr *smb = (struct smb2_hdr *)buf;
 150
 151        cifs_dbg(VFS, "Cmd: %d Err: 0x%x Flags: 0x%x Mid: %llu Pid: %d\n",
 152                 smb->Command, smb->Status, smb->Flags, smb->MessageId,
 153                 smb->ProcessId);
 154        cifs_dbg(VFS, "smb buf %p len %u\n", smb, smb2_calc_size(smb));
 155#endif
 156}
 157
 158static bool
 159smb2_need_neg(struct TCP_Server_Info *server)
 160{
 161        return server->max_read == 0;
 162}
 163
 164static int
 165smb2_negotiate(const unsigned int xid, struct cifs_ses *ses)
 166{
 167        int rc;
 168        ses->server->CurrentMid = 0;
 169        rc = SMB2_negotiate(xid, ses);
 170        /* BB we probably don't need to retry with modern servers */
 171        if (rc == -EAGAIN)
 172                rc = -EHOSTDOWN;
 173        return rc;
 174}
 175
 176static unsigned int
 177smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 178{
 179        struct TCP_Server_Info *server = tcon->ses->server;
 180        unsigned int wsize;
 181
 182        /* start with specified wsize, or default */
 183        wsize = volume_info->wsize ? volume_info->wsize : CIFS_DEFAULT_IOSIZE;
 184        wsize = min_t(unsigned int, wsize, server->max_write);
 185        /*
 186         * limit write size to 2 ** 16, because we don't support multicredit
 187         * requests now.
 188         */
 189        wsize = min_t(unsigned int, wsize, 2 << 15);
 190
 191        return wsize;
 192}
 193
 194static unsigned int
 195smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 196{
 197        struct TCP_Server_Info *server = tcon->ses->server;
 198        unsigned int rsize;
 199
 200        /* start with specified rsize, or default */
 201        rsize = volume_info->rsize ? volume_info->rsize : CIFS_DEFAULT_IOSIZE;
 202        rsize = min_t(unsigned int, rsize, server->max_read);
 203        /*
 204         * limit write size to 2 ** 16, because we don't support multicredit
 205         * requests now.
 206         */
 207        rsize = min_t(unsigned int, rsize, 2 << 15);
 208
 209        return rsize;
 210}
 211
 212static int
 213smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
 214                        struct cifs_sb_info *cifs_sb, const char *full_path)
 215{
 216        int rc;
 217        __le16 *utf16_path;
 218        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 219        struct cifs_open_parms oparms;
 220        struct cifs_fid fid;
 221
 222        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
 223        if (!utf16_path)
 224                return -ENOMEM;
 225
 226        oparms.tcon = tcon;
 227        oparms.desired_access = FILE_READ_ATTRIBUTES;
 228        oparms.disposition = FILE_OPEN;
 229        oparms.create_options = 0;
 230        oparms.fid = &fid;
 231        oparms.reconnect = false;
 232
 233        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL);
 234        if (rc) {
 235                kfree(utf16_path);
 236                return rc;
 237        }
 238
 239        rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 240        kfree(utf16_path);
 241        return rc;
 242}
 243
 244static int
 245smb2_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon,
 246                  struct cifs_sb_info *cifs_sb, const char *full_path,
 247                  u64 *uniqueid, FILE_ALL_INFO *data)
 248{
 249        *uniqueid = le64_to_cpu(data->IndexNumber);
 250        return 0;
 251}
 252
 253static int
 254smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
 255                     struct cifs_fid *fid, FILE_ALL_INFO *data)
 256{
 257        int rc;
 258        struct smb2_file_all_info *smb2_data;
 259
 260        smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2,
 261                            GFP_KERNEL);
 262        if (smb2_data == NULL)
 263                return -ENOMEM;
 264
 265        rc = SMB2_query_info(xid, tcon, fid->persistent_fid, fid->volatile_fid,
 266                             smb2_data);
 267        if (!rc)
 268                move_smb2_info_to_cifs(data, smb2_data);
 269        kfree(smb2_data);
 270        return rc;
 271}
 272
 273static bool
 274smb2_can_echo(struct TCP_Server_Info *server)
 275{
 276        return server->echoes;
 277}
 278
 279static void
 280smb2_clear_stats(struct cifs_tcon *tcon)
 281{
 282#ifdef CONFIG_CIFS_STATS
 283        int i;
 284        for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) {
 285                atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0);
 286                atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0);
 287        }
 288#endif
 289}
 290
 291static void
 292smb2_dump_share_caps(struct seq_file *m, struct cifs_tcon *tcon)
 293{
 294        seq_puts(m, "\n\tShare Capabilities:");
 295        if (tcon->capabilities & SMB2_SHARE_CAP_DFS)
 296                seq_puts(m, " DFS,");
 297        if (tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
 298                seq_puts(m, " CONTINUOUS AVAILABILITY,");
 299        if (tcon->capabilities & SMB2_SHARE_CAP_SCALEOUT)
 300                seq_puts(m, " SCALEOUT,");
 301        if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER)
 302                seq_puts(m, " CLUSTER,");
 303        if (tcon->capabilities & SMB2_SHARE_CAP_ASYMMETRIC)
 304                seq_puts(m, " ASYMMETRIC,");
 305        if (tcon->capabilities == 0)
 306                seq_puts(m, " None");
 307        seq_printf(m, "\tShare Flags: 0x%x", tcon->share_flags);
 308}
 309
 310static void
 311smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
 312{
 313#ifdef CONFIG_CIFS_STATS
 314        atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent;
 315        atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed;
 316        seq_printf(m, "\nNegotiates: %d sent %d failed",
 317                   atomic_read(&sent[SMB2_NEGOTIATE_HE]),
 318                   atomic_read(&failed[SMB2_NEGOTIATE_HE]));
 319        seq_printf(m, "\nSessionSetups: %d sent %d failed",
 320                   atomic_read(&sent[SMB2_SESSION_SETUP_HE]),
 321                   atomic_read(&failed[SMB2_SESSION_SETUP_HE]));
 322        seq_printf(m, "\nLogoffs: %d sent %d failed",
 323                   atomic_read(&sent[SMB2_LOGOFF_HE]),
 324                   atomic_read(&failed[SMB2_LOGOFF_HE]));
 325        seq_printf(m, "\nTreeConnects: %d sent %d failed",
 326                   atomic_read(&sent[SMB2_TREE_CONNECT_HE]),
 327                   atomic_read(&failed[SMB2_TREE_CONNECT_HE]));
 328        seq_printf(m, "\nTreeDisconnects: %d sent %d failed",
 329                   atomic_read(&sent[SMB2_TREE_DISCONNECT_HE]),
 330                   atomic_read(&failed[SMB2_TREE_DISCONNECT_HE]));
 331        seq_printf(m, "\nCreates: %d sent %d failed",
 332                   atomic_read(&sent[SMB2_CREATE_HE]),
 333                   atomic_read(&failed[SMB2_CREATE_HE]));
 334        seq_printf(m, "\nCloses: %d sent %d failed",
 335                   atomic_read(&sent[SMB2_CLOSE_HE]),
 336                   atomic_read(&failed[SMB2_CLOSE_HE]));
 337        seq_printf(m, "\nFlushes: %d sent %d failed",
 338                   atomic_read(&sent[SMB2_FLUSH_HE]),
 339                   atomic_read(&failed[SMB2_FLUSH_HE]));
 340        seq_printf(m, "\nReads: %d sent %d failed",
 341                   atomic_read(&sent[SMB2_READ_HE]),
 342                   atomic_read(&failed[SMB2_READ_HE]));
 343        seq_printf(m, "\nWrites: %d sent %d failed",
 344                   atomic_read(&sent[SMB2_WRITE_HE]),
 345                   atomic_read(&failed[SMB2_WRITE_HE]));
 346        seq_printf(m, "\nLocks: %d sent %d failed",
 347                   atomic_read(&sent[SMB2_LOCK_HE]),
 348                   atomic_read(&failed[SMB2_LOCK_HE]));
 349        seq_printf(m, "\nIOCTLs: %d sent %d failed",
 350                   atomic_read(&sent[SMB2_IOCTL_HE]),
 351                   atomic_read(&failed[SMB2_IOCTL_HE]));
 352        seq_printf(m, "\nCancels: %d sent %d failed",
 353                   atomic_read(&sent[SMB2_CANCEL_HE]),
 354                   atomic_read(&failed[SMB2_CANCEL_HE]));
 355        seq_printf(m, "\nEchos: %d sent %d failed",
 356                   atomic_read(&sent[SMB2_ECHO_HE]),
 357                   atomic_read(&failed[SMB2_ECHO_HE]));
 358        seq_printf(m, "\nQueryDirectories: %d sent %d failed",
 359                   atomic_read(&sent[SMB2_QUERY_DIRECTORY_HE]),
 360                   atomic_read(&failed[SMB2_QUERY_DIRECTORY_HE]));
 361        seq_printf(m, "\nChangeNotifies: %d sent %d failed",
 362                   atomic_read(&sent[SMB2_CHANGE_NOTIFY_HE]),
 363                   atomic_read(&failed[SMB2_CHANGE_NOTIFY_HE]));
 364        seq_printf(m, "\nQueryInfos: %d sent %d failed",
 365                   atomic_read(&sent[SMB2_QUERY_INFO_HE]),
 366                   atomic_read(&failed[SMB2_QUERY_INFO_HE]));
 367        seq_printf(m, "\nSetInfos: %d sent %d failed",
 368                   atomic_read(&sent[SMB2_SET_INFO_HE]),
 369                   atomic_read(&failed[SMB2_SET_INFO_HE]));
 370        seq_printf(m, "\nOplockBreaks: %d sent %d failed",
 371                   atomic_read(&sent[SMB2_OPLOCK_BREAK_HE]),
 372                   atomic_read(&failed[SMB2_OPLOCK_BREAK_HE]));
 373#endif
 374}
 375
 376static void
 377smb2_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock)
 378{
 379        struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
 380        struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
 381
 382        cfile->fid.persistent_fid = fid->persistent_fid;
 383        cfile->fid.volatile_fid = fid->volatile_fid;
 384        server->ops->set_oplock_level(cinode, oplock, fid->epoch,
 385                                      &fid->purge_cache);
 386        cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode);
 387}
 388
 389static void
 390smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon,
 391                struct cifs_fid *fid)
 392{
 393        SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 394}
 395
 396static int
 397smb2_flush_file(const unsigned int xid, struct cifs_tcon *tcon,
 398                struct cifs_fid *fid)
 399{
 400        return SMB2_flush(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 401}
 402
 403static unsigned int
 404smb2_read_data_offset(char *buf)
 405{
 406        struct smb2_read_rsp *rsp = (struct smb2_read_rsp *)buf;
 407        return rsp->DataOffset;
 408}
 409
 410static unsigned int
 411smb2_read_data_length(char *buf)
 412{
 413        struct smb2_read_rsp *rsp = (struct smb2_read_rsp *)buf;
 414        return le32_to_cpu(rsp->DataLength);
 415}
 416
 417
 418static int
 419smb2_sync_read(const unsigned int xid, struct cifsFileInfo *cfile,
 420               struct cifs_io_parms *parms, unsigned int *bytes_read,
 421               char **buf, int *buf_type)
 422{
 423        parms->persistent_fid = cfile->fid.persistent_fid;
 424        parms->volatile_fid = cfile->fid.volatile_fid;
 425        return SMB2_read(xid, parms, bytes_read, buf, buf_type);
 426}
 427
 428static int
 429smb2_sync_write(const unsigned int xid, struct cifsFileInfo *cfile,
 430                struct cifs_io_parms *parms, unsigned int *written,
 431                struct kvec *iov, unsigned long nr_segs)
 432{
 433
 434        parms->persistent_fid = cfile->fid.persistent_fid;
 435        parms->volatile_fid = cfile->fid.volatile_fid;
 436        return SMB2_write(xid, parms, written, iov, nr_segs);
 437}
 438
 439static int
 440smb2_set_file_size(const unsigned int xid, struct cifs_tcon *tcon,
 441                   struct cifsFileInfo *cfile, __u64 size, bool set_alloc)
 442{
 443        __le64 eof = cpu_to_le64(size);
 444        return SMB2_set_eof(xid, tcon, cfile->fid.persistent_fid,
 445                            cfile->fid.volatile_fid, cfile->pid, &eof);
 446}
 447
 448static int
 449smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
 450                     const char *path, struct cifs_sb_info *cifs_sb,
 451                     struct cifs_fid *fid, __u16 search_flags,
 452                     struct cifs_search_info *srch_inf)
 453{
 454        __le16 *utf16_path;
 455        int rc;
 456        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 457        struct cifs_open_parms oparms;
 458
 459        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
 460        if (!utf16_path)
 461                return -ENOMEM;
 462
 463        oparms.tcon = tcon;
 464        oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
 465        oparms.disposition = FILE_OPEN;
 466        oparms.create_options = 0;
 467        oparms.fid = fid;
 468        oparms.reconnect = false;
 469
 470        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL);
 471        kfree(utf16_path);
 472        if (rc) {
 473                cifs_dbg(VFS, "open dir failed\n");
 474                return rc;
 475        }
 476
 477        srch_inf->entries_in_buffer = 0;
 478        srch_inf->index_of_last_entry = 0;
 479
 480        rc = SMB2_query_directory(xid, tcon, fid->persistent_fid,
 481                                  fid->volatile_fid, 0, srch_inf);
 482        if (rc) {
 483                cifs_dbg(VFS, "query directory failed\n");
 484                SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 485        }
 486        return rc;
 487}
 488
 489static int
 490smb2_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon,
 491                    struct cifs_fid *fid, __u16 search_flags,
 492                    struct cifs_search_info *srch_inf)
 493{
 494        return SMB2_query_directory(xid, tcon, fid->persistent_fid,
 495                                    fid->volatile_fid, 0, srch_inf);
 496}
 497
 498static int
 499smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
 500               struct cifs_fid *fid)
 501{
 502        return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
 503}
 504
 505/*
 506* If we negotiate SMB2 protocol and get STATUS_PENDING - update
 507* the number of credits and return true. Otherwise - return false.
 508*/
 509static bool
 510smb2_is_status_pending(char *buf, struct TCP_Server_Info *server, int length)
 511{
 512        struct smb2_hdr *hdr = (struct smb2_hdr *)buf;
 513
 514        if (hdr->Status != STATUS_PENDING)
 515                return false;
 516
 517        if (!length) {
 518                spin_lock(&server->req_lock);
 519                server->credits += le16_to_cpu(hdr->CreditRequest);
 520                spin_unlock(&server->req_lock);
 521                wake_up(&server->request_q);
 522        }
 523
 524        return true;
 525}
 526
 527static int
 528smb2_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
 529                     struct cifsInodeInfo *cinode)
 530{
 531        if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING)
 532                return SMB2_lease_break(0, tcon, cinode->lease_key,
 533                                        smb2_get_lease_state(cinode));
 534
 535        return SMB2_oplock_break(0, tcon, fid->persistent_fid,
 536                                 fid->volatile_fid,
 537                                 CIFS_CACHE_READ(cinode) ? 1 : 0);
 538}
 539
 540static int
 541smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
 542             struct kstatfs *buf)
 543{
 544        int rc;
 545        __le16 srch_path = 0; /* Null - open root of share */
 546        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 547        struct cifs_open_parms oparms;
 548        struct cifs_fid fid;
 549
 550        oparms.tcon = tcon;
 551        oparms.desired_access = FILE_READ_ATTRIBUTES;
 552        oparms.disposition = FILE_OPEN;
 553        oparms.create_options = 0;
 554        oparms.fid = &fid;
 555        oparms.reconnect = false;
 556
 557        rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL);
 558        if (rc)
 559                return rc;
 560        buf->f_type = SMB2_MAGIC_NUMBER;
 561        rc = SMB2_QFS_info(xid, tcon, fid.persistent_fid, fid.volatile_fid,
 562                           buf);
 563        SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
 564        return rc;
 565}
 566
 567static bool
 568smb2_compare_fids(struct cifsFileInfo *ob1, struct cifsFileInfo *ob2)
 569{
 570        return ob1->fid.persistent_fid == ob2->fid.persistent_fid &&
 571               ob1->fid.volatile_fid == ob2->fid.volatile_fid;
 572}
 573
 574static int
 575smb2_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset,
 576               __u64 length, __u32 type, int lock, int unlock, bool wait)
 577{
 578        if (unlock && !lock)
 579                type = SMB2_LOCKFLAG_UNLOCK;
 580        return SMB2_lock(xid, tlink_tcon(cfile->tlink),
 581                         cfile->fid.persistent_fid, cfile->fid.volatile_fid,
 582                         current->tgid, length, offset, type, wait);
 583}
 584
 585static void
 586smb2_get_lease_key(struct inode *inode, struct cifs_fid *fid)
 587{
 588        memcpy(fid->lease_key, CIFS_I(inode)->lease_key, SMB2_LEASE_KEY_SIZE);
 589}
 590
 591static void
 592smb2_set_lease_key(struct inode *inode, struct cifs_fid *fid)
 593{
 594        memcpy(CIFS_I(inode)->lease_key, fid->lease_key, SMB2_LEASE_KEY_SIZE);
 595}
 596
 597static void
 598smb2_new_lease_key(struct cifs_fid *fid)
 599{
 600        get_random_bytes(fid->lease_key, SMB2_LEASE_KEY_SIZE);
 601}
 602
 603static int
 604smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
 605                   const char *full_path, char **target_path,
 606                   struct cifs_sb_info *cifs_sb)
 607{
 608        int rc;
 609        __le16 *utf16_path;
 610        __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
 611        struct cifs_open_parms oparms;
 612        struct cifs_fid fid;
 613        struct smb2_err_rsp *err_buf = NULL;
 614        struct smb2_symlink_err_rsp *symlink;
 615        unsigned int sub_len, sub_offset;
 616
 617        cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
 618
 619        utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb);
 620        if (!utf16_path)
 621                return -ENOMEM;
 622
 623        oparms.tcon = tcon;
 624        oparms.desired_access = FILE_READ_ATTRIBUTES;
 625        oparms.disposition = FILE_OPEN;
 626        oparms.create_options = 0;
 627        oparms.fid = &fid;
 628        oparms.reconnect = false;
 629
 630        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, &err_buf);
 631
 632        if (!rc || !err_buf) {
 633                kfree(utf16_path);
 634                return -ENOENT;
 635        }
 636        /* open must fail on symlink - reset rc */
 637        rc = 0;
 638        symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData;
 639        sub_len = le16_to_cpu(symlink->SubstituteNameLength);
 640        sub_offset = le16_to_cpu(symlink->SubstituteNameOffset);
 641        *target_path = cifs_strndup_from_utf16(
 642                                (char *)symlink->PathBuffer + sub_offset,
 643                                sub_len, true, cifs_sb->local_nls);
 644        if (!(*target_path)) {
 645                kfree(utf16_path);
 646                return -ENOMEM;
 647        }
 648        convert_delimiter(*target_path, '/');
 649        cifs_dbg(FYI, "%s: target path: %s\n", __func__, *target_path);
 650        kfree(utf16_path);
 651        return rc;
 652}
 653
 654static void
 655smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
 656                      unsigned int epoch, bool *purge_cache)
 657{
 658        oplock &= 0xFF;
 659        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
 660                return;
 661        if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
 662                cinode->oplock = CIFS_CACHE_RHW_FLG;
 663                cifs_dbg(FYI, "Batch Oplock granted on inode %p\n",
 664                         &cinode->vfs_inode);
 665        } else if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
 666                cinode->oplock = CIFS_CACHE_RW_FLG;
 667                cifs_dbg(FYI, "Exclusive Oplock granted on inode %p\n",
 668                         &cinode->vfs_inode);
 669        } else if (oplock == SMB2_OPLOCK_LEVEL_II) {
 670                cinode->oplock = CIFS_CACHE_READ_FLG;
 671                cifs_dbg(FYI, "Level II Oplock granted on inode %p\n",
 672                         &cinode->vfs_inode);
 673        } else
 674                cinode->oplock = 0;
 675}
 676
 677static void
 678smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
 679                       unsigned int epoch, bool *purge_cache)
 680{
 681        char message[5] = {0};
 682
 683        oplock &= 0xFF;
 684        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
 685                return;
 686
 687        cinode->oplock = 0;
 688        if (oplock & SMB2_LEASE_READ_CACHING_HE) {
 689                cinode->oplock |= CIFS_CACHE_READ_FLG;
 690                strcat(message, "R");
 691        }
 692        if (oplock & SMB2_LEASE_HANDLE_CACHING_HE) {
 693                cinode->oplock |= CIFS_CACHE_HANDLE_FLG;
 694                strcat(message, "H");
 695        }
 696        if (oplock & SMB2_LEASE_WRITE_CACHING_HE) {
 697                cinode->oplock |= CIFS_CACHE_WRITE_FLG;
 698                strcat(message, "W");
 699        }
 700        if (!cinode->oplock)
 701                strcat(message, "None");
 702        cifs_dbg(FYI, "%s Lease granted on inode %p\n", message,
 703                 &cinode->vfs_inode);
 704}
 705
 706static void
 707smb3_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
 708                      unsigned int epoch, bool *purge_cache)
 709{
 710        unsigned int old_oplock = cinode->oplock;
 711
 712        smb21_set_oplock_level(cinode, oplock, epoch, purge_cache);
 713
 714        if (purge_cache) {
 715                *purge_cache = false;
 716                if (old_oplock == CIFS_CACHE_READ_FLG) {
 717                        if (cinode->oplock == CIFS_CACHE_READ_FLG &&
 718                            (epoch - cinode->epoch > 0))
 719                                *purge_cache = true;
 720                        else if (cinode->oplock == CIFS_CACHE_RH_FLG &&
 721                                 (epoch - cinode->epoch > 1))
 722                                *purge_cache = true;
 723                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
 724                                 (epoch - cinode->epoch > 1))
 725                                *purge_cache = true;
 726                        else if (cinode->oplock == 0 &&
 727                                 (epoch - cinode->epoch > 0))
 728                                *purge_cache = true;
 729                } else if (old_oplock == CIFS_CACHE_RH_FLG) {
 730                        if (cinode->oplock == CIFS_CACHE_RH_FLG &&
 731                            (epoch - cinode->epoch > 0))
 732                                *purge_cache = true;
 733                        else if (cinode->oplock == CIFS_CACHE_RHW_FLG &&
 734                                 (epoch - cinode->epoch > 1))
 735                                *purge_cache = true;
 736                }
 737                cinode->epoch = epoch;
 738        }
 739}
 740
 741static bool
 742smb2_is_read_op(__u32 oplock)
 743{
 744        return oplock == SMB2_OPLOCK_LEVEL_II;
 745}
 746
 747static bool
 748smb21_is_read_op(__u32 oplock)
 749{
 750        return (oplock & SMB2_LEASE_READ_CACHING_HE) &&
 751               !(oplock & SMB2_LEASE_WRITE_CACHING_HE);
 752}
 753
 754static __le32
 755map_oplock_to_lease(u8 oplock)
 756{
 757        if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE)
 758                return SMB2_LEASE_WRITE_CACHING | SMB2_LEASE_READ_CACHING;
 759        else if (oplock == SMB2_OPLOCK_LEVEL_II)
 760                return SMB2_LEASE_READ_CACHING;
 761        else if (oplock == SMB2_OPLOCK_LEVEL_BATCH)
 762                return SMB2_LEASE_HANDLE_CACHING | SMB2_LEASE_READ_CACHING |
 763                       SMB2_LEASE_WRITE_CACHING;
 764        return 0;
 765}
 766
 767static char *
 768smb2_create_lease_buf(u8 *lease_key, u8 oplock)
 769{
 770        struct create_lease *buf;
 771
 772        buf = kzalloc(sizeof(struct create_lease), GFP_KERNEL);
 773        if (!buf)
 774                return NULL;
 775
 776        buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
 777        buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
 778        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
 779
 780        buf->ccontext.DataOffset = cpu_to_le16(offsetof
 781                                        (struct create_lease, lcontext));
 782        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context));
 783        buf->ccontext.NameOffset = cpu_to_le16(offsetof
 784                                (struct create_lease, Name));
 785        buf->ccontext.NameLength = cpu_to_le16(4);
 786        buf->Name[0] = 'R';
 787        buf->Name[1] = 'q';
 788        buf->Name[2] = 'L';
 789        buf->Name[3] = 's';
 790        return (char *)buf;
 791}
 792
 793static char *
 794smb3_create_lease_buf(u8 *lease_key, u8 oplock)
 795{
 796        struct create_lease_v2 *buf;
 797
 798        buf = kzalloc(sizeof(struct create_lease_v2), GFP_KERNEL);
 799        if (!buf)
 800                return NULL;
 801
 802        buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
 803        buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
 804        buf->lcontext.LeaseState = map_oplock_to_lease(oplock);
 805
 806        buf->ccontext.DataOffset = cpu_to_le16(offsetof
 807                                        (struct create_lease_v2, lcontext));
 808        buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context_v2));
 809        buf->ccontext.NameOffset = cpu_to_le16(offsetof
 810                                (struct create_lease_v2, Name));
 811        buf->ccontext.NameLength = cpu_to_le16(4);
 812        buf->Name[0] = 'R';
 813        buf->Name[1] = 'q';
 814        buf->Name[2] = 'L';
 815        buf->Name[3] = 's';
 816        return (char *)buf;
 817}
 818
 819static __u8
 820smb2_parse_lease_buf(void *buf, unsigned int *epoch)
 821{
 822        struct create_lease *lc = (struct create_lease *)buf;
 823
 824        *epoch = 0; /* not used */
 825        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
 826                return SMB2_OPLOCK_LEVEL_NOCHANGE;
 827        return le32_to_cpu(lc->lcontext.LeaseState);
 828}
 829
 830static __u8
 831smb3_parse_lease_buf(void *buf, unsigned int *epoch)
 832{
 833        struct create_lease_v2 *lc = (struct create_lease_v2 *)buf;
 834
 835        *epoch = le16_to_cpu(lc->lcontext.Epoch);
 836        if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
 837                return SMB2_OPLOCK_LEVEL_NOCHANGE;
 838        return le32_to_cpu(lc->lcontext.LeaseState);
 839}
 840
 841struct smb_version_operations smb20_operations = {
 842        .compare_fids = smb2_compare_fids,
 843        .setup_request = smb2_setup_request,
 844        .setup_async_request = smb2_setup_async_request,
 845        .check_receive = smb2_check_receive,
 846        .add_credits = smb2_add_credits,
 847        .set_credits = smb2_set_credits,
 848        .get_credits_field = smb2_get_credits_field,
 849        .get_credits = smb2_get_credits,
 850        .get_next_mid = smb2_get_next_mid,
 851        .read_data_offset = smb2_read_data_offset,
 852        .read_data_length = smb2_read_data_length,
 853        .map_error = map_smb2_to_linux_error,
 854        .find_mid = smb2_find_mid,
 855        .check_message = smb2_check_message,
 856        .dump_detail = smb2_dump_detail,
 857        .clear_stats = smb2_clear_stats,
 858        .print_stats = smb2_print_stats,
 859        .is_oplock_break = smb2_is_valid_oplock_break,
 860        .need_neg = smb2_need_neg,
 861        .negotiate = smb2_negotiate,
 862        .negotiate_wsize = smb2_negotiate_wsize,
 863        .negotiate_rsize = smb2_negotiate_rsize,
 864        .sess_setup = SMB2_sess_setup,
 865        .logoff = SMB2_logoff,
 866        .tree_connect = SMB2_tcon,
 867        .tree_disconnect = SMB2_tdis,
 868        .is_path_accessible = smb2_is_path_accessible,
 869        .can_echo = smb2_can_echo,
 870        .echo = SMB2_echo,
 871        .query_path_info = smb2_query_path_info,
 872        .get_srv_inum = smb2_get_srv_inum,
 873        .query_file_info = smb2_query_file_info,
 874        .set_path_size = smb2_set_path_size,
 875        .set_file_size = smb2_set_file_size,
 876        .set_file_info = smb2_set_file_info,
 877        .mkdir = smb2_mkdir,
 878        .mkdir_setinfo = smb2_mkdir_setinfo,
 879        .rmdir = smb2_rmdir,
 880        .unlink = smb2_unlink,
 881        .rename = smb2_rename_path,
 882        .create_hardlink = smb2_create_hardlink,
 883        .query_symlink = smb2_query_symlink,
 884        .open = smb2_open_file,
 885        .set_fid = smb2_set_fid,
 886        .close = smb2_close_file,
 887        .flush = smb2_flush_file,
 888        .async_readv = smb2_async_readv,
 889        .async_writev = smb2_async_writev,
 890        .sync_read = smb2_sync_read,
 891        .sync_write = smb2_sync_write,
 892        .query_dir_first = smb2_query_dir_first,
 893        .query_dir_next = smb2_query_dir_next,
 894        .close_dir = smb2_close_dir,
 895        .calc_smb_size = smb2_calc_size,
 896        .is_status_pending = smb2_is_status_pending,
 897        .oplock_response = smb2_oplock_response,
 898        .queryfs = smb2_queryfs,
 899        .mand_lock = smb2_mand_lock,
 900        .mand_unlock_range = smb2_unlock_range,
 901        .push_mand_locks = smb2_push_mandatory_locks,
 902        .get_lease_key = smb2_get_lease_key,
 903        .set_lease_key = smb2_set_lease_key,
 904        .new_lease_key = smb2_new_lease_key,
 905        .calc_signature = smb2_calc_signature,
 906        .is_read_op = smb2_is_read_op,
 907        .set_oplock_level = smb2_set_oplock_level,
 908        .create_lease_buf = smb2_create_lease_buf,
 909        .parse_lease_buf = smb2_parse_lease_buf,
 910};
 911
 912struct smb_version_operations smb21_operations = {
 913        .compare_fids = smb2_compare_fids,
 914        .setup_request = smb2_setup_request,
 915        .setup_async_request = smb2_setup_async_request,
 916        .check_receive = smb2_check_receive,
 917        .add_credits = smb2_add_credits,
 918        .set_credits = smb2_set_credits,
 919        .get_credits_field = smb2_get_credits_field,
 920        .get_credits = smb2_get_credits,
 921        .get_next_mid = smb2_get_next_mid,
 922        .read_data_offset = smb2_read_data_offset,
 923        .read_data_length = smb2_read_data_length,
 924        .map_error = map_smb2_to_linux_error,
 925        .find_mid = smb2_find_mid,
 926        .check_message = smb2_check_message,
 927        .dump_detail = smb2_dump_detail,
 928        .clear_stats = smb2_clear_stats,
 929        .print_stats = smb2_print_stats,
 930        .is_oplock_break = smb2_is_valid_oplock_break,
 931        .need_neg = smb2_need_neg,
 932        .negotiate = smb2_negotiate,
 933        .negotiate_wsize = smb2_negotiate_wsize,
 934        .negotiate_rsize = smb2_negotiate_rsize,
 935        .sess_setup = SMB2_sess_setup,
 936        .logoff = SMB2_logoff,
 937        .tree_connect = SMB2_tcon,
 938        .tree_disconnect = SMB2_tdis,
 939        .is_path_accessible = smb2_is_path_accessible,
 940        .can_echo = smb2_can_echo,
 941        .echo = SMB2_echo,
 942        .query_path_info = smb2_query_path_info,
 943        .get_srv_inum = smb2_get_srv_inum,
 944        .query_file_info = smb2_query_file_info,
 945        .set_path_size = smb2_set_path_size,
 946        .set_file_size = smb2_set_file_size,
 947        .set_file_info = smb2_set_file_info,
 948        .mkdir = smb2_mkdir,
 949        .mkdir_setinfo = smb2_mkdir_setinfo,
 950        .rmdir = smb2_rmdir,
 951        .unlink = smb2_unlink,
 952        .rename = smb2_rename_path,
 953        .create_hardlink = smb2_create_hardlink,
 954        .query_symlink = smb2_query_symlink,
 955        .open = smb2_open_file,
 956        .set_fid = smb2_set_fid,
 957        .close = smb2_close_file,
 958        .flush = smb2_flush_file,
 959        .async_readv = smb2_async_readv,
 960        .async_writev = smb2_async_writev,
 961        .sync_read = smb2_sync_read,
 962        .sync_write = smb2_sync_write,
 963        .query_dir_first = smb2_query_dir_first,
 964        .query_dir_next = smb2_query_dir_next,
 965        .close_dir = smb2_close_dir,
 966        .calc_smb_size = smb2_calc_size,
 967        .is_status_pending = smb2_is_status_pending,
 968        .oplock_response = smb2_oplock_response,
 969        .queryfs = smb2_queryfs,
 970        .mand_lock = smb2_mand_lock,
 971        .mand_unlock_range = smb2_unlock_range,
 972        .push_mand_locks = smb2_push_mandatory_locks,
 973        .get_lease_key = smb2_get_lease_key,
 974        .set_lease_key = smb2_set_lease_key,
 975        .new_lease_key = smb2_new_lease_key,
 976        .calc_signature = smb2_calc_signature,
 977        .is_read_op = smb21_is_read_op,
 978        .set_oplock_level = smb21_set_oplock_level,
 979        .create_lease_buf = smb2_create_lease_buf,
 980        .parse_lease_buf = smb2_parse_lease_buf,
 981};
 982
 983struct smb_version_operations smb30_operations = {
 984        .compare_fids = smb2_compare_fids,
 985        .setup_request = smb2_setup_request,
 986        .setup_async_request = smb2_setup_async_request,
 987        .check_receive = smb2_check_receive,
 988        .add_credits = smb2_add_credits,
 989        .set_credits = smb2_set_credits,
 990        .get_credits_field = smb2_get_credits_field,
 991        .get_credits = smb2_get_credits,
 992        .get_next_mid = smb2_get_next_mid,
 993        .read_data_offset = smb2_read_data_offset,
 994        .read_data_length = smb2_read_data_length,
 995        .map_error = map_smb2_to_linux_error,
 996        .find_mid = smb2_find_mid,
 997        .check_message = smb2_check_message,
 998        .dump_detail = smb2_dump_detail,
 999        .clear_stats = smb2_clear_stats,
1000        .print_stats = smb2_print_stats,
1001        .dump_share_caps = smb2_dump_share_caps,
1002        .is_oplock_break = smb2_is_valid_oplock_break,
1003        .need_neg = smb2_need_neg,
1004        .negotiate = smb2_negotiate,
1005        .negotiate_wsize = smb2_negotiate_wsize,
1006        .negotiate_rsize = smb2_negotiate_rsize,
1007        .sess_setup = SMB2_sess_setup,
1008        .logoff = SMB2_logoff,
1009        .tree_connect = SMB2_tcon,
1010        .tree_disconnect = SMB2_tdis,
1011        .is_path_accessible = smb2_is_path_accessible,
1012        .can_echo = smb2_can_echo,
1013        .echo = SMB2_echo,
1014        .query_path_info = smb2_query_path_info,
1015        .get_srv_inum = smb2_get_srv_inum,
1016        .query_file_info = smb2_query_file_info,
1017        .set_path_size = smb2_set_path_size,
1018        .set_file_size = smb2_set_file_size,
1019        .set_file_info = smb2_set_file_info,
1020        .mkdir = smb2_mkdir,
1021        .mkdir_setinfo = smb2_mkdir_setinfo,
1022        .rmdir = smb2_rmdir,
1023        .unlink = smb2_unlink,
1024        .rename = smb2_rename_path,
1025        .create_hardlink = smb2_create_hardlink,
1026        .query_symlink = smb2_query_symlink,
1027        .open = smb2_open_file,
1028        .set_fid = smb2_set_fid,
1029        .close = smb2_close_file,
1030        .flush = smb2_flush_file,
1031        .async_readv = smb2_async_readv,
1032        .async_writev = smb2_async_writev,
1033        .sync_read = smb2_sync_read,
1034        .sync_write = smb2_sync_write,
1035        .query_dir_first = smb2_query_dir_first,
1036        .query_dir_next = smb2_query_dir_next,
1037        .close_dir = smb2_close_dir,
1038        .calc_smb_size = smb2_calc_size,
1039        .is_status_pending = smb2_is_status_pending,
1040        .oplock_response = smb2_oplock_response,
1041        .queryfs = smb2_queryfs,
1042        .mand_lock = smb2_mand_lock,
1043        .mand_unlock_range = smb2_unlock_range,
1044        .push_mand_locks = smb2_push_mandatory_locks,
1045        .get_lease_key = smb2_get_lease_key,
1046        .set_lease_key = smb2_set_lease_key,
1047        .new_lease_key = smb2_new_lease_key,
1048        .generate_signingkey = generate_smb3signingkey,
1049        .calc_signature = smb3_calc_signature,
1050        .is_read_op = smb21_is_read_op,
1051        .set_oplock_level = smb3_set_oplock_level,
1052        .create_lease_buf = smb3_create_lease_buf,
1053        .parse_lease_buf = smb3_parse_lease_buf,
1054};
1055
1056struct smb_version_values smb20_values = {
1057        .version_string = SMB20_VERSION_STRING,
1058        .protocol_id = SMB20_PROT_ID,
1059        .req_capabilities = 0, /* MBZ */
1060        .large_lock_type = 0,
1061        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
1062        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
1063        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
1064        .header_size = sizeof(struct smb2_hdr),
1065        .max_header_size = MAX_SMB2_HDR_SIZE,
1066        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
1067        .lock_cmd = SMB2_LOCK,
1068        .cap_unix = 0,
1069        .cap_nt_find = SMB2_NT_FIND,
1070        .cap_large_files = SMB2_LARGE_FILES,
1071        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
1072        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
1073        .create_lease_size = sizeof(struct create_lease),
1074};
1075
1076struct smb_version_values smb21_values = {
1077        .version_string = SMB21_VERSION_STRING,
1078        .protocol_id = SMB21_PROT_ID,
1079        .req_capabilities = 0, /* MBZ on negotiate req until SMB3 dialect */
1080        .large_lock_type = 0,
1081        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
1082        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
1083        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
1084        .header_size = sizeof(struct smb2_hdr),
1085        .max_header_size = MAX_SMB2_HDR_SIZE,
1086        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
1087        .lock_cmd = SMB2_LOCK,
1088        .cap_unix = 0,
1089        .cap_nt_find = SMB2_NT_FIND,
1090        .cap_large_files = SMB2_LARGE_FILES,
1091        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
1092        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
1093        .create_lease_size = sizeof(struct create_lease),
1094};
1095
1096struct smb_version_values smb30_values = {
1097        .version_string = SMB30_VERSION_STRING,
1098        .protocol_id = SMB30_PROT_ID,
1099        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU,
1100        .large_lock_type = 0,
1101        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
1102        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
1103        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
1104        .header_size = sizeof(struct smb2_hdr),
1105        .max_header_size = MAX_SMB2_HDR_SIZE,
1106        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
1107        .lock_cmd = SMB2_LOCK,
1108        .cap_unix = 0,
1109        .cap_nt_find = SMB2_NT_FIND,
1110        .cap_large_files = SMB2_LARGE_FILES,
1111        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
1112        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
1113        .create_lease_size = sizeof(struct create_lease_v2),
1114};
1115
1116struct smb_version_values smb302_values = {
1117        .version_string = SMB302_VERSION_STRING,
1118        .protocol_id = SMB302_PROT_ID,
1119        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU,
1120        .large_lock_type = 0,
1121        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
1122        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
1123        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
1124        .header_size = sizeof(struct smb2_hdr),
1125        .max_header_size = MAX_SMB2_HDR_SIZE,
1126        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
1127        .lock_cmd = SMB2_LOCK,
1128        .cap_unix = 0,
1129        .cap_nt_find = SMB2_NT_FIND,
1130        .cap_large_files = SMB2_LARGE_FILES,
1131        .signing_enabled = SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED,
1132        .signing_required = SMB2_NEGOTIATE_SIGNING_REQUIRED,
1133        .create_lease_size = sizeof(struct create_lease_v2),
1134};
1135