CIFS: Make SMB2_open use cifs_open_parms struct
[cascardo/linux.git] / fs / cifs / smb2pdu.c
1 /*
2  *   fs/cifs/smb2pdu.c
3  *
4  *   Copyright (C) International Business Machines  Corp., 2009, 2013
5  *                 Etersoft, 2012
6  *   Author(s): Steve French (sfrench@us.ibm.com)
7  *              Pavel Shilovsky (pshilovsky@samba.org) 2012
8  *
9  *   Contains the routines for constructing the SMB2 PDUs themselves
10  *
11  *   This library is free software; you can redistribute it and/or modify
12  *   it under the terms of the GNU Lesser General Public License as published
13  *   by the Free Software Foundation; either version 2.1 of the License, or
14  *   (at your option) any later version.
15  *
16  *   This library is distributed in the hope that it will be useful,
17  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
19  *   the GNU Lesser General Public License for more details.
20  *
21  *   You should have received a copy of the GNU Lesser General Public License
22  *   along with this library; if not, write to the Free Software
23  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24  */
25
26  /* SMB2 PDU handling routines here - except for leftovers (eg session setup) */
27  /* Note that there are handle based routines which must be                   */
28  /* treated slightly differently for reconnection purposes since we never     */
29  /* want to reuse a stale file handle and only the caller knows the file info */
30
31 #include <linux/fs.h>
32 #include <linux/kernel.h>
33 #include <linux/vfs.h>
34 #include <linux/task_io_accounting_ops.h>
35 #include <linux/uaccess.h>
36 #include <linux/pagemap.h>
37 #include <linux/xattr.h>
38 #include "smb2pdu.h"
39 #include "cifsglob.h"
40 #include "cifsacl.h"
41 #include "cifsproto.h"
42 #include "smb2proto.h"
43 #include "cifs_unicode.h"
44 #include "cifs_debug.h"
45 #include "ntlmssp.h"
46 #include "smb2status.h"
47 #include "smb2glob.h"
48 #include "cifspdu.h"
49
50 /*
51  *  The following table defines the expected "StructureSize" of SMB2 requests
52  *  in order by SMB2 command.  This is similar to "wct" in SMB/CIFS requests.
53  *
54  *  Note that commands are defined in smb2pdu.h in le16 but the array below is
55  *  indexed by command in host byte order.
56  */
57 static const int smb2_req_struct_sizes[NUMBER_OF_SMB2_COMMANDS] = {
58         /* SMB2_NEGOTIATE */ 36,
59         /* SMB2_SESSION_SETUP */ 25,
60         /* SMB2_LOGOFF */ 4,
61         /* SMB2_TREE_CONNECT */ 9,
62         /* SMB2_TREE_DISCONNECT */ 4,
63         /* SMB2_CREATE */ 57,
64         /* SMB2_CLOSE */ 24,
65         /* SMB2_FLUSH */ 24,
66         /* SMB2_READ */ 49,
67         /* SMB2_WRITE */ 49,
68         /* SMB2_LOCK */ 48,
69         /* SMB2_IOCTL */ 57,
70         /* SMB2_CANCEL */ 4,
71         /* SMB2_ECHO */ 4,
72         /* SMB2_QUERY_DIRECTORY */ 33,
73         /* SMB2_CHANGE_NOTIFY */ 32,
74         /* SMB2_QUERY_INFO */ 41,
75         /* SMB2_SET_INFO */ 33,
76         /* SMB2_OPLOCK_BREAK */ 24 /* BB this is 36 for LEASE_BREAK variant */
77 };
78
79
80 static void
81 smb2_hdr_assemble(struct smb2_hdr *hdr, __le16 smb2_cmd /* command */ ,
82                   const struct cifs_tcon *tcon)
83 {
84         struct smb2_pdu *pdu = (struct smb2_pdu *)hdr;
85         char *temp = (char *)hdr;
86         /* lookup word count ie StructureSize from table */
87         __u16 parmsize = smb2_req_struct_sizes[le16_to_cpu(smb2_cmd)];
88
89         /*
90          * smaller than SMALL_BUFFER_SIZE but bigger than fixed area of
91          * largest operations (Create)
92          */
93         memset(temp, 0, 256);
94
95         /* Note this is only network field converted to big endian */
96         hdr->smb2_buf_length = cpu_to_be32(parmsize + sizeof(struct smb2_hdr)
97                         - 4 /*  RFC 1001 length field itself not counted */);
98
99         hdr->ProtocolId[0] = 0xFE;
100         hdr->ProtocolId[1] = 'S';
101         hdr->ProtocolId[2] = 'M';
102         hdr->ProtocolId[3] = 'B';
103         hdr->StructureSize = cpu_to_le16(64);
104         hdr->Command = smb2_cmd;
105         hdr->CreditRequest = cpu_to_le16(2); /* BB make this dynamic */
106         hdr->ProcessId = cpu_to_le32((__u16)current->tgid);
107
108         if (!tcon)
109                 goto out;
110
111         /* BB FIXME when we do write > 64K add +1 for every 64K in req or rsp */
112         /* GLOBAL_CAP_LARGE_MTU will only be set if dialect > SMB2.02 */
113         /* See sections 2.2.4 and 3.2.4.1.5 of MS-SMB2 */
114         if ((tcon->ses) &&
115             (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU))
116                 hdr->CreditCharge = cpu_to_le16(1);
117         /* else CreditCharge MBZ */
118
119         hdr->TreeId = tcon->tid;
120         /* Uid is not converted */
121         if (tcon->ses)
122                 hdr->SessionId = tcon->ses->Suid;
123
124         /*
125          * If we would set SMB2_FLAGS_DFS_OPERATIONS on open we also would have
126          * to pass the path on the Open SMB prefixed by \\server\share.
127          * Not sure when we would need to do the augmented path (if ever) and
128          * setting this flag breaks the SMB2 open operation since it is
129          * illegal to send an empty path name (without \\server\share prefix)
130          * when the DFS flag is set in the SMB open header. We could
131          * consider setting the flag on all operations other than open
132          * but it is safer to net set it for now.
133          */
134 /*      if (tcon->share_flags & SHI1005_FLAGS_DFS)
135                 hdr->Flags |= SMB2_FLAGS_DFS_OPERATIONS; */
136
137         if (tcon->ses && tcon->ses->server && tcon->ses->server->sign)
138                 hdr->Flags |= SMB2_FLAGS_SIGNED;
139 out:
140         pdu->StructureSize2 = cpu_to_le16(parmsize);
141         return;
142 }
143
144 static int
145 smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon)
146 {
147         int rc = 0;
148         struct nls_table *nls_codepage;
149         struct cifs_ses *ses;
150         struct TCP_Server_Info *server;
151
152         /*
153          * SMB2s NegProt, SessSetup, Logoff do not have tcon yet so
154          * check for tcp and smb session status done differently
155          * for those three - in the calling routine.
156          */
157         if (tcon == NULL)
158                 return rc;
159
160         if (smb2_command == SMB2_TREE_CONNECT)
161                 return rc;
162
163         if (tcon->tidStatus == CifsExiting) {
164                 /*
165                  * only tree disconnect, open, and write,
166                  * (and ulogoff which does not have tcon)
167                  * are allowed as we start force umount.
168                  */
169                 if ((smb2_command != SMB2_WRITE) &&
170                    (smb2_command != SMB2_CREATE) &&
171                    (smb2_command != SMB2_TREE_DISCONNECT)) {
172                         cifs_dbg(FYI, "can not send cmd %d while umounting\n",
173                                  smb2_command);
174                         return -ENODEV;
175                 }
176         }
177         if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
178             (!tcon->ses->server))
179                 return -EIO;
180
181         ses = tcon->ses;
182         server = ses->server;
183
184         /*
185          * Give demultiplex thread up to 10 seconds to reconnect, should be
186          * greater than cifs socket timeout which is 7 seconds
187          */
188         while (server->tcpStatus == CifsNeedReconnect) {
189                 /*
190                  * Return to caller for TREE_DISCONNECT and LOGOFF and CLOSE
191                  * here since they are implicitly done when session drops.
192                  */
193                 switch (smb2_command) {
194                 /*
195                  * BB Should we keep oplock break and add flush to exceptions?
196                  */
197                 case SMB2_TREE_DISCONNECT:
198                 case SMB2_CANCEL:
199                 case SMB2_CLOSE:
200                 case SMB2_OPLOCK_BREAK:
201                         return -EAGAIN;
202                 }
203
204                 wait_event_interruptible_timeout(server->response_q,
205                         (server->tcpStatus != CifsNeedReconnect), 10 * HZ);
206
207                 /* are we still trying to reconnect? */
208                 if (server->tcpStatus != CifsNeedReconnect)
209                         break;
210
211                 /*
212                  * on "soft" mounts we wait once. Hard mounts keep
213                  * retrying until process is killed or server comes
214                  * back on-line
215                  */
216                 if (!tcon->retry) {
217                         cifs_dbg(FYI, "gave up waiting on reconnect in smb_init\n");
218                         return -EHOSTDOWN;
219                 }
220         }
221
222         if (!tcon->ses->need_reconnect && !tcon->need_reconnect)
223                 return rc;
224
225         nls_codepage = load_nls_default();
226
227         /*
228          * need to prevent multiple threads trying to simultaneously reconnect
229          * the same SMB session
230          */
231         mutex_lock(&tcon->ses->session_mutex);
232         rc = cifs_negotiate_protocol(0, tcon->ses);
233         if (!rc && tcon->ses->need_reconnect)
234                 rc = cifs_setup_session(0, tcon->ses, nls_codepage);
235
236         if (rc || !tcon->need_reconnect) {
237                 mutex_unlock(&tcon->ses->session_mutex);
238                 goto out;
239         }
240
241         cifs_mark_open_files_invalid(tcon);
242         rc = SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nls_codepage);
243         mutex_unlock(&tcon->ses->session_mutex);
244         cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc);
245         if (rc)
246                 goto out;
247         atomic_inc(&tconInfoReconnectCount);
248         /*
249          * BB FIXME add code to check if wsize needs update due to negotiated
250          * smb buffer size shrinking.
251          */
252 out:
253         /*
254          * Check if handle based operation so we know whether we can continue
255          * or not without returning to caller to reset file handle.
256          */
257         /*
258          * BB Is flush done by server on drop of tcp session? Should we special
259          * case it and skip above?
260          */
261         switch (smb2_command) {
262         case SMB2_FLUSH:
263         case SMB2_READ:
264         case SMB2_WRITE:
265         case SMB2_LOCK:
266         case SMB2_IOCTL:
267         case SMB2_QUERY_DIRECTORY:
268         case SMB2_CHANGE_NOTIFY:
269         case SMB2_QUERY_INFO:
270         case SMB2_SET_INFO:
271                 return -EAGAIN;
272         }
273         unload_nls(nls_codepage);
274         return rc;
275 }
276
277 /*
278  * Allocate and return pointer to an SMB request hdr, and set basic
279  * SMB information in the SMB header. If the return code is zero, this
280  * function must have filled in request_buf pointer.
281  */
282 static int
283 small_smb2_init(__le16 smb2_command, struct cifs_tcon *tcon,
284                 void **request_buf)
285 {
286         int rc = 0;
287
288         rc = smb2_reconnect(smb2_command, tcon);
289         if (rc)
290                 return rc;
291
292         /* BB eventually switch this to SMB2 specific small buf size */
293         *request_buf = cifs_small_buf_get();
294         if (*request_buf == NULL) {
295                 /* BB should we add a retry in here if not a writepage? */
296                 return -ENOMEM;
297         }
298
299         smb2_hdr_assemble((struct smb2_hdr *) *request_buf, smb2_command, tcon);
300
301         if (tcon != NULL) {
302 #ifdef CONFIG_CIFS_STATS2
303                 uint16_t com_code = le16_to_cpu(smb2_command);
304                 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]);
305 #endif
306                 cifs_stats_inc(&tcon->num_smbs_sent);
307         }
308
309         return rc;
310 }
311
312 static void
313 free_rsp_buf(int resp_buftype, void *rsp)
314 {
315         if (resp_buftype == CIFS_SMALL_BUFFER)
316                 cifs_small_buf_release(rsp);
317         else if (resp_buftype == CIFS_LARGE_BUFFER)
318                 cifs_buf_release(rsp);
319 }
320
321
322 /*
323  *
324  *      SMB2 Worker functions follow:
325  *
326  *      The general structure of the worker functions is:
327  *      1) Call smb2_init (assembles SMB2 header)
328  *      2) Initialize SMB2 command specific fields in fixed length area of SMB
329  *      3) Call smb_sendrcv2 (sends request on socket and waits for response)
330  *      4) Decode SMB2 command specific fields in the fixed length area
331  *      5) Decode variable length data area (if any for this SMB2 command type)
332  *      6) Call free smb buffer
333  *      7) return
334  *
335  */
336
337 int
338 SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
339 {
340         struct smb2_negotiate_req *req;
341         struct smb2_negotiate_rsp *rsp;
342         struct kvec iov[1];
343         int rc = 0;
344         int resp_buftype;
345         struct TCP_Server_Info *server = ses->server;
346         int blob_offset, blob_length;
347         char *security_blob;
348         int flags = CIFS_NEG_OP;
349
350         cifs_dbg(FYI, "Negotiate protocol\n");
351
352         if (!server) {
353                 WARN(1, "%s: server is NULL!\n", __func__);
354                 return -EIO;
355         }
356
357         rc = small_smb2_init(SMB2_NEGOTIATE, NULL, (void **) &req);
358         if (rc)
359                 return rc;
360
361         req->hdr.SessionId = 0;
362
363         req->Dialects[0] = cpu_to_le16(ses->server->vals->protocol_id);
364
365         req->DialectCount = cpu_to_le16(1); /* One vers= at a time for now */
366         inc_rfc1001_len(req, 2);
367
368         /* only one of SMB2 signing flags may be set in SMB2 request */
369         if (ses->sign)
370                 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_REQUIRED);
371         else if (global_secflags & CIFSSEC_MAY_SIGN)
372                 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_ENABLED);
373         else
374                 req->SecurityMode = 0;
375
376         req->Capabilities = cpu_to_le32(ses->server->vals->req_capabilities);
377
378         memcpy(req->ClientGUID, cifs_client_guid, SMB2_CLIENT_GUID_SIZE);
379
380         iov[0].iov_base = (char *)req;
381         /* 4 for rfc1002 length field */
382         iov[0].iov_len = get_rfc1002_length(req) + 4;
383
384         rc = SendReceive2(xid, ses, iov, 1, &resp_buftype, flags);
385
386         rsp = (struct smb2_negotiate_rsp *)iov[0].iov_base;
387         /*
388          * No tcon so can't do
389          * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]);
390          */
391         if (rc != 0)
392                 goto neg_exit;
393
394         cifs_dbg(FYI, "mode 0x%x\n", rsp->SecurityMode);
395
396         /* BB we may eventually want to match the negotiated vs. requested
397            dialect, even though we are only requesting one at a time */
398         if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID))
399                 cifs_dbg(FYI, "negotiated smb2.0 dialect\n");
400         else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID))
401                 cifs_dbg(FYI, "negotiated smb2.1 dialect\n");
402         else if (rsp->DialectRevision == cpu_to_le16(SMB30_PROT_ID))
403                 cifs_dbg(FYI, "negotiated smb3.0 dialect\n");
404         else if (rsp->DialectRevision == cpu_to_le16(SMB302_PROT_ID))
405                 cifs_dbg(FYI, "negotiated smb3.02 dialect\n");
406         else {
407                 cifs_dbg(VFS, "Illegal dialect returned by server %d\n",
408                          le16_to_cpu(rsp->DialectRevision));
409                 rc = -EIO;
410                 goto neg_exit;
411         }
412         server->dialect = le16_to_cpu(rsp->DialectRevision);
413
414         /* SMB2 only has an extended negflavor */
415         server->negflavor = CIFS_NEGFLAVOR_EXTENDED;
416         server->maxBuf = le32_to_cpu(rsp->MaxTransactSize);
417         server->max_read = le32_to_cpu(rsp->MaxReadSize);
418         server->max_write = le32_to_cpu(rsp->MaxWriteSize);
419         /* BB Do we need to validate the SecurityMode? */
420         server->sec_mode = le16_to_cpu(rsp->SecurityMode);
421         server->capabilities = le32_to_cpu(rsp->Capabilities);
422         /* Internal types */
423         server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES;
424
425         security_blob = smb2_get_data_area_len(&blob_offset, &blob_length,
426                                                &rsp->hdr);
427         /*
428          * See MS-SMB2 section 2.2.4: if no blob, client picks default which
429          * for us will be
430          *      ses->sectype = RawNTLMSSP;
431          * but for time being this is our only auth choice so doesn't matter.
432          * We just found a server which sets blob length to zero expecting raw.
433          */
434         if (blob_length == 0)
435                 cifs_dbg(FYI, "missing security blob on negprot\n");
436
437         rc = cifs_enable_signing(server, ses->sign);
438 #ifdef CONFIG_SMB2_ASN1  /* BB REMOVEME when updated asn1.c ready */
439         if (rc)
440                 goto neg_exit;
441         if (blob_length)
442                 rc = decode_neg_token_init(security_blob, blob_length,
443                                    &server->sec_type);
444         if (rc == 1)
445                 rc = 0;
446         else if (rc == 0) {
447                 rc = -EIO;
448                 goto neg_exit;
449         }
450 #endif
451
452 neg_exit:
453         free_rsp_buf(resp_buftype, rsp);
454         return rc;
455 }
456
457 int
458 SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses,
459                 const struct nls_table *nls_cp)
460 {
461         struct smb2_sess_setup_req *req;
462         struct smb2_sess_setup_rsp *rsp = NULL;
463         struct kvec iov[2];
464         int rc = 0;
465         int resp_buftype;
466         __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */
467         struct TCP_Server_Info *server = ses->server;
468         u16 blob_length = 0;
469         char *security_blob;
470         char *ntlmssp_blob = NULL;
471         bool use_spnego = false; /* else use raw ntlmssp */
472
473         cifs_dbg(FYI, "Session Setup\n");
474
475         if (!server) {
476                 WARN(1, "%s: server is NULL!\n", __func__);
477                 return -EIO;
478         }
479
480         /*
481          * If memory allocation is successful, caller of this function
482          * frees it.
483          */
484         ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL);
485         if (!ses->ntlmssp)
486                 return -ENOMEM;
487
488         /* FIXME: allow for other auth types besides NTLMSSP (e.g. krb5) */
489         ses->sectype = RawNTLMSSP;
490
491 ssetup_ntlmssp_authenticate:
492         if (phase == NtLmChallenge)
493                 phase = NtLmAuthenticate; /* if ntlmssp, now final phase */
494
495         rc = small_smb2_init(SMB2_SESSION_SETUP, NULL, (void **) &req);
496         if (rc)
497                 return rc;
498
499         req->hdr.SessionId = 0; /* First session, not a reauthenticate */
500         req->VcNumber = 0; /* MBZ */
501         /* to enable echos and oplocks */
502         req->hdr.CreditRequest = cpu_to_le16(3);
503
504         /* only one of SMB2 signing flags may be set in SMB2 request */
505         if (server->sign)
506                 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED;
507         else if (global_secflags & CIFSSEC_MAY_SIGN) /* one flag unlike MUST_ */
508                 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED;
509         else
510                 req->SecurityMode = 0;
511
512         req->Capabilities = 0;
513         req->Channel = 0; /* MBZ */
514
515         iov[0].iov_base = (char *)req;
516         /* 4 for rfc1002 length field and 1 for pad */
517         iov[0].iov_len = get_rfc1002_length(req) + 4 - 1;
518         if (phase == NtLmNegotiate) {
519                 ntlmssp_blob = kmalloc(sizeof(struct _NEGOTIATE_MESSAGE),
520                                        GFP_KERNEL);
521                 if (ntlmssp_blob == NULL) {
522                         rc = -ENOMEM;
523                         goto ssetup_exit;
524                 }
525                 build_ntlmssp_negotiate_blob(ntlmssp_blob, ses);
526                 if (use_spnego) {
527                         /* blob_length = build_spnego_ntlmssp_blob(
528                                         &security_blob,
529                                         sizeof(struct _NEGOTIATE_MESSAGE),
530                                         ntlmssp_blob); */
531                         /* BB eventually need to add this */
532                         cifs_dbg(VFS, "spnego not supported for SMB2 yet\n");
533                         rc = -EOPNOTSUPP;
534                         kfree(ntlmssp_blob);
535                         goto ssetup_exit;
536                 } else {
537                         blob_length = sizeof(struct _NEGOTIATE_MESSAGE);
538                         /* with raw NTLMSSP we don't encapsulate in SPNEGO */
539                         security_blob = ntlmssp_blob;
540                 }
541         } else if (phase == NtLmAuthenticate) {
542                 req->hdr.SessionId = ses->Suid;
543                 ntlmssp_blob = kzalloc(sizeof(struct _NEGOTIATE_MESSAGE) + 500,
544                                        GFP_KERNEL);
545                 if (ntlmssp_blob == NULL) {
546                         rc = -ENOMEM;
547                         goto ssetup_exit;
548                 }
549                 rc = build_ntlmssp_auth_blob(ntlmssp_blob, &blob_length, ses,
550                                              nls_cp);
551                 if (rc) {
552                         cifs_dbg(FYI, "build_ntlmssp_auth_blob failed %d\n",
553                                  rc);
554                         goto ssetup_exit; /* BB double check error handling */
555                 }
556                 if (use_spnego) {
557                         /* blob_length = build_spnego_ntlmssp_blob(
558                                                         &security_blob,
559                                                         blob_length,
560                                                         ntlmssp_blob); */
561                         cifs_dbg(VFS, "spnego not supported for SMB2 yet\n");
562                         rc = -EOPNOTSUPP;
563                         kfree(ntlmssp_blob);
564                         goto ssetup_exit;
565                 } else {
566                         security_blob = ntlmssp_blob;
567                 }
568         } else {
569                 cifs_dbg(VFS, "illegal ntlmssp phase\n");
570                 rc = -EIO;
571                 goto ssetup_exit;
572         }
573
574         /* Testing shows that buffer offset must be at location of Buffer[0] */
575         req->SecurityBufferOffset =
576                                 cpu_to_le16(sizeof(struct smb2_sess_setup_req) -
577                                             1 /* pad */ - 4 /* rfc1001 len */);
578         req->SecurityBufferLength = cpu_to_le16(blob_length);
579         iov[1].iov_base = security_blob;
580         iov[1].iov_len = blob_length;
581
582         inc_rfc1001_len(req, blob_length - 1 /* pad */);
583
584         /* BB add code to build os and lm fields */
585
586         rc = SendReceive2(xid, ses, iov, 2, &resp_buftype,
587                           CIFS_LOG_ERROR | CIFS_NEG_OP);
588
589         kfree(security_blob);
590         rsp = (struct smb2_sess_setup_rsp *)iov[0].iov_base;
591         if (resp_buftype != CIFS_NO_BUFFER &&
592             rsp->hdr.Status == STATUS_MORE_PROCESSING_REQUIRED) {
593                 if (phase != NtLmNegotiate) {
594                         cifs_dbg(VFS, "Unexpected more processing error\n");
595                         goto ssetup_exit;
596                 }
597                 if (offsetof(struct smb2_sess_setup_rsp, Buffer) - 4 !=
598                                 le16_to_cpu(rsp->SecurityBufferOffset)) {
599                         cifs_dbg(VFS, "Invalid security buffer offset %d\n",
600                                  le16_to_cpu(rsp->SecurityBufferOffset));
601                         rc = -EIO;
602                         goto ssetup_exit;
603                 }
604
605                 /* NTLMSSP Negotiate sent now processing challenge (response) */
606                 phase = NtLmChallenge; /* process ntlmssp challenge */
607                 rc = 0; /* MORE_PROCESSING is not an error here but expected */
608                 ses->Suid = rsp->hdr.SessionId;
609                 rc = decode_ntlmssp_challenge(rsp->Buffer,
610                                 le16_to_cpu(rsp->SecurityBufferLength), ses);
611         }
612
613         /*
614          * BB eventually add code for SPNEGO decoding of NtlmChallenge blob,
615          * but at least the raw NTLMSSP case works.
616          */
617         /*
618          * No tcon so can't do
619          * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]);
620          */
621         if (rc != 0)
622                 goto ssetup_exit;
623
624         ses->session_flags = le16_to_cpu(rsp->SessionFlags);
625 ssetup_exit:
626         free_rsp_buf(resp_buftype, rsp);
627
628         /* if ntlmssp, and negotiate succeeded, proceed to authenticate phase */
629         if ((phase == NtLmChallenge) && (rc == 0))
630                 goto ssetup_ntlmssp_authenticate;
631         return rc;
632 }
633
634 int
635 SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
636 {
637         struct smb2_logoff_req *req; /* response is also trivial struct */
638         int rc = 0;
639         struct TCP_Server_Info *server;
640
641         cifs_dbg(FYI, "disconnect session %p\n", ses);
642
643         if (ses && (ses->server))
644                 server = ses->server;
645         else
646                 return -EIO;
647
648         rc = small_smb2_init(SMB2_LOGOFF, NULL, (void **) &req);
649         if (rc)
650                 return rc;
651
652          /* since no tcon, smb2_init can not do this, so do here */
653         req->hdr.SessionId = ses->Suid;
654         if (server->sign)
655                 req->hdr.Flags |= SMB2_FLAGS_SIGNED;
656
657         rc = SendReceiveNoRsp(xid, ses, (char *) &req->hdr, 0);
658         /*
659          * No tcon so can't do
660          * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]);
661          */
662         return rc;
663 }
664
665 static inline void cifs_stats_fail_inc(struct cifs_tcon *tcon, uint16_t code)
666 {
667         cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_failed[code]);
668 }
669
670 #define MAX_SHARENAME_LENGTH (255 /* server */ + 80 /* share */ + 1 /* NULL */)
671
672 int
673 SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
674           struct cifs_tcon *tcon, const struct nls_table *cp)
675 {
676         struct smb2_tree_connect_req *req;
677         struct smb2_tree_connect_rsp *rsp = NULL;
678         struct kvec iov[2];
679         int rc = 0;
680         int resp_buftype;
681         int unc_path_len;
682         struct TCP_Server_Info *server;
683         __le16 *unc_path = NULL;
684
685         cifs_dbg(FYI, "TCON\n");
686
687         if ((ses->server) && tree)
688                 server = ses->server;
689         else
690                 return -EIO;
691
692         if (tcon && tcon->bad_network_name)
693                 return -ENOENT;
694
695         unc_path = kmalloc(MAX_SHARENAME_LENGTH * 2, GFP_KERNEL);
696         if (unc_path == NULL)
697                 return -ENOMEM;
698
699         unc_path_len = cifs_strtoUTF16(unc_path, tree, strlen(tree), cp) + 1;
700         unc_path_len *= 2;
701         if (unc_path_len < 2) {
702                 kfree(unc_path);
703                 return -EINVAL;
704         }
705
706         rc = small_smb2_init(SMB2_TREE_CONNECT, tcon, (void **) &req);
707         if (rc) {
708                 kfree(unc_path);
709                 return rc;
710         }
711
712         if (tcon == NULL) {
713                 /* since no tcon, smb2_init can not do this, so do here */
714                 req->hdr.SessionId = ses->Suid;
715                 /* if (ses->server->sec_mode & SECMODE_SIGN_REQUIRED)
716                         req->hdr.Flags |= SMB2_FLAGS_SIGNED; */
717         }
718
719         iov[0].iov_base = (char *)req;
720         /* 4 for rfc1002 length field and 1 for pad */
721         iov[0].iov_len = get_rfc1002_length(req) + 4 - 1;
722
723         /* Testing shows that buffer offset must be at location of Buffer[0] */
724         req->PathOffset = cpu_to_le16(sizeof(struct smb2_tree_connect_req)
725                         - 1 /* pad */ - 4 /* do not count rfc1001 len field */);
726         req->PathLength = cpu_to_le16(unc_path_len - 2);
727         iov[1].iov_base = unc_path;
728         iov[1].iov_len = unc_path_len;
729
730         inc_rfc1001_len(req, unc_path_len - 1 /* pad */);
731
732         rc = SendReceive2(xid, ses, iov, 2, &resp_buftype, 0);
733         rsp = (struct smb2_tree_connect_rsp *)iov[0].iov_base;
734
735         if (rc != 0) {
736                 if (tcon) {
737                         cifs_stats_fail_inc(tcon, SMB2_TREE_CONNECT_HE);
738                         tcon->need_reconnect = true;
739                 }
740                 goto tcon_error_exit;
741         }
742
743         if (tcon == NULL) {
744                 ses->ipc_tid = rsp->hdr.TreeId;
745                 goto tcon_exit;
746         }
747
748         if (rsp->ShareType & SMB2_SHARE_TYPE_DISK)
749                 cifs_dbg(FYI, "connection to disk share\n");
750         else if (rsp->ShareType & SMB2_SHARE_TYPE_PIPE) {
751                 tcon->ipc = true;
752                 cifs_dbg(FYI, "connection to pipe share\n");
753         } else if (rsp->ShareType & SMB2_SHARE_TYPE_PRINT) {
754                 tcon->print = true;
755                 cifs_dbg(FYI, "connection to printer\n");
756         } else {
757                 cifs_dbg(VFS, "unknown share type %d\n", rsp->ShareType);
758                 rc = -EOPNOTSUPP;
759                 goto tcon_error_exit;
760         }
761
762         tcon->share_flags = le32_to_cpu(rsp->ShareFlags);
763         tcon->capabilities = rsp->Capabilities; /* we keep caps little endian */
764         tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess);
765         tcon->tidStatus = CifsGood;
766         tcon->need_reconnect = false;
767         tcon->tid = rsp->hdr.TreeId;
768         strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
769
770         if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) &&
771             ((tcon->share_flags & SHI1005_FLAGS_DFS) == 0))
772                 cifs_dbg(VFS, "DFS capability contradicts DFS flag\n");
773
774 tcon_exit:
775         free_rsp_buf(resp_buftype, rsp);
776         kfree(unc_path);
777         return rc;
778
779 tcon_error_exit:
780         if (rsp->hdr.Status == STATUS_BAD_NETWORK_NAME) {
781                 cifs_dbg(VFS, "BAD_NETWORK_NAME: %s\n", tree);
782                 tcon->bad_network_name = true;
783         }
784         goto tcon_exit;
785 }
786
787 int
788 SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon)
789 {
790         struct smb2_tree_disconnect_req *req; /* response is trivial */
791         int rc = 0;
792         struct TCP_Server_Info *server;
793         struct cifs_ses *ses = tcon->ses;
794
795         cifs_dbg(FYI, "Tree Disconnect\n");
796
797         if (ses && (ses->server))
798                 server = ses->server;
799         else
800                 return -EIO;
801
802         if ((tcon->need_reconnect) || (tcon->ses->need_reconnect))
803                 return 0;
804
805         rc = small_smb2_init(SMB2_TREE_DISCONNECT, tcon, (void **) &req);
806         if (rc)
807                 return rc;
808
809         rc = SendReceiveNoRsp(xid, ses, (char *)&req->hdr, 0);
810         if (rc)
811                 cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE);
812
813         return rc;
814 }
815
816 static struct create_lease *
817 create_lease_buf(u8 *lease_key, u8 oplock)
818 {
819         struct create_lease *buf;
820
821         buf = kzalloc(sizeof(struct create_lease), GFP_KERNEL);
822         if (!buf)
823                 return NULL;
824
825         buf->lcontext.LeaseKeyLow = cpu_to_le64(*((u64 *)lease_key));
826         buf->lcontext.LeaseKeyHigh = cpu_to_le64(*((u64 *)(lease_key + 8)));
827         if (oplock == SMB2_OPLOCK_LEVEL_EXCLUSIVE)
828                 buf->lcontext.LeaseState = SMB2_LEASE_WRITE_CACHING |
829                                            SMB2_LEASE_READ_CACHING;
830         else if (oplock == SMB2_OPLOCK_LEVEL_II)
831                 buf->lcontext.LeaseState = SMB2_LEASE_READ_CACHING;
832         else if (oplock == SMB2_OPLOCK_LEVEL_BATCH)
833                 buf->lcontext.LeaseState = SMB2_LEASE_HANDLE_CACHING |
834                                            SMB2_LEASE_READ_CACHING |
835                                            SMB2_LEASE_WRITE_CACHING;
836
837         buf->ccontext.DataOffset = cpu_to_le16(offsetof
838                                         (struct create_lease, lcontext));
839         buf->ccontext.DataLength = cpu_to_le32(sizeof(struct lease_context));
840         buf->ccontext.NameOffset = cpu_to_le16(offsetof
841                                 (struct create_lease, Name));
842         buf->ccontext.NameLength = cpu_to_le16(4);
843         buf->Name[0] = 'R';
844         buf->Name[1] = 'q';
845         buf->Name[2] = 'L';
846         buf->Name[3] = 's';
847         return buf;
848 }
849
850 static struct create_durable *
851 create_durable_buf(void)
852 {
853         struct create_durable *buf;
854
855         buf = kzalloc(sizeof(struct create_durable), GFP_KERNEL);
856         if (!buf)
857                 return NULL;
858
859         buf->ccontext.DataOffset = cpu_to_le16(offsetof
860                                         (struct create_durable, Reserved));
861         buf->ccontext.DataLength = cpu_to_le32(16);
862         buf->ccontext.NameOffset = cpu_to_le16(offsetof
863                                 (struct create_durable, Name));
864         buf->ccontext.NameLength = cpu_to_le16(4);
865         buf->Name[0] = 'D';
866         buf->Name[1] = 'H';
867         buf->Name[2] = 'n';
868         buf->Name[3] = 'Q';
869         return buf;
870 }
871
872 static __u8
873 parse_lease_state(struct smb2_create_rsp *rsp)
874 {
875         char *data_offset;
876         struct create_lease *lc;
877         bool found = false;
878         unsigned int next = 0;
879         char *name;
880
881         data_offset = (char *)rsp + 4 + le32_to_cpu(rsp->CreateContextsOffset);
882         lc = (struct create_lease *)data_offset;
883         do {
884                 lc = (struct create_lease *)((char *)lc + next);
885                 name = le16_to_cpu(lc->ccontext.NameOffset) + (char *)lc;
886                 if (le16_to_cpu(lc->ccontext.NameLength) != 4 ||
887                     strncmp(name, "RqLs", 4)) {
888                         next = le32_to_cpu(lc->ccontext.Next);
889                         continue;
890                 }
891                 if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
892                         return SMB2_OPLOCK_LEVEL_NOCHANGE;
893                 found = true;
894                 break;
895         } while (next != 0);
896
897         if (!found)
898                 return 0;
899
900         return smb2_map_lease_to_oplock(lc->lcontext.LeaseState);
901 }
902
903 static int
904 add_lease_context(struct kvec *iov, unsigned int *num_iovec, __u8 *oplock)
905 {
906         struct smb2_create_req *req = iov[0].iov_base;
907         unsigned int num = *num_iovec;
908
909         iov[num].iov_base = create_lease_buf(oplock+1, *oplock);
910         if (iov[num].iov_base == NULL)
911                 return -ENOMEM;
912         iov[num].iov_len = sizeof(struct create_lease);
913         req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE;
914         if (!req->CreateContextsOffset)
915                 req->CreateContextsOffset = cpu_to_le32(
916                                 sizeof(struct smb2_create_req) - 4 +
917                                 iov[num - 1].iov_len);
918         req->CreateContextsLength = cpu_to_le32(
919                                 le32_to_cpu(req->CreateContextsLength) +
920                                 sizeof(struct create_lease));
921         inc_rfc1001_len(&req->hdr, sizeof(struct create_lease));
922         *num_iovec = num + 1;
923         return 0;
924 }
925
926 static int
927 add_durable_context(struct kvec *iov, unsigned int *num_iovec)
928 {
929         struct smb2_create_req *req = iov[0].iov_base;
930         unsigned int num = *num_iovec;
931
932         iov[num].iov_base = create_durable_buf();
933         if (iov[num].iov_base == NULL)
934                 return -ENOMEM;
935         iov[num].iov_len = sizeof(struct create_durable);
936         if (!req->CreateContextsOffset)
937                 req->CreateContextsOffset =
938                         cpu_to_le32(sizeof(struct smb2_create_req) - 4 +
939                                                                 iov[1].iov_len);
940         req->CreateContextsLength =
941                         cpu_to_le32(le32_to_cpu(req->CreateContextsLength) +
942                                                 sizeof(struct create_durable));
943         inc_rfc1001_len(&req->hdr, sizeof(struct create_durable));
944         *num_iovec = num + 1;
945         return 0;
946 }
947
948 int
949 SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
950           __u8 *oplock, struct smb2_file_all_info *buf)
951 {
952         struct smb2_create_req *req;
953         struct smb2_create_rsp *rsp;
954         struct TCP_Server_Info *server;
955         struct cifs_tcon *tcon = oparms->tcon;
956         struct cifs_ses *ses = tcon->ses;
957         struct kvec iov[4];
958         int resp_buftype;
959         int uni_path_len;
960         __le16 *copy_path = NULL;
961         int copy_size;
962         int rc = 0;
963         unsigned int num_iovecs = 2;
964         __u32 file_attributes = 0;
965
966         cifs_dbg(FYI, "create/open\n");
967
968         if (ses && (ses->server))
969                 server = ses->server;
970         else
971                 return -EIO;
972
973         rc = small_smb2_init(SMB2_CREATE, tcon, (void **) &req);
974         if (rc)
975                 return rc;
976
977         if (oparms->create_options & CREATE_OPTION_READONLY)
978                 file_attributes |= ATTR_READONLY;
979
980         req->ImpersonationLevel = IL_IMPERSONATION;
981         req->DesiredAccess = cpu_to_le32(oparms->desired_access);
982         /* File attributes ignored on open (used in create though) */
983         req->FileAttributes = cpu_to_le32(file_attributes);
984         req->ShareAccess = FILE_SHARE_ALL_LE;
985         req->CreateDisposition = cpu_to_le32(oparms->disposition);
986         req->CreateOptions = cpu_to_le32(oparms->create_options & CREATE_OPTIONS_MASK);
987         uni_path_len = (2 * UniStrnlen((wchar_t *)path, PATH_MAX)) + 2;
988         /* do not count rfc1001 len field */
989         req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req) - 4);
990
991         iov[0].iov_base = (char *)req;
992         /* 4 for rfc1002 length field */
993         iov[0].iov_len = get_rfc1002_length(req) + 4;
994
995         /* MUST set path len (NameLength) to 0 opening root of share */
996         req->NameLength = cpu_to_le16(uni_path_len - 2);
997         /* -1 since last byte is buf[0] which is sent below (path) */
998         iov[0].iov_len--;
999         if (uni_path_len % 8 != 0) {
1000                 copy_size = uni_path_len / 8 * 8;
1001                 if (copy_size < uni_path_len)
1002                         copy_size += 8;
1003
1004                 copy_path = kzalloc(copy_size, GFP_KERNEL);
1005                 if (!copy_path)
1006                         return -ENOMEM;
1007                 memcpy((char *)copy_path, (const char *)path,
1008                         uni_path_len);
1009                 uni_path_len = copy_size;
1010                 path = copy_path;
1011         }
1012
1013         iov[1].iov_len = uni_path_len;
1014         iov[1].iov_base = path;
1015         /* -1 since last byte is buf[0] which was counted in smb2_buf_len */
1016         inc_rfc1001_len(req, uni_path_len - 1);
1017
1018         if (!server->oplocks)
1019                 *oplock = SMB2_OPLOCK_LEVEL_NONE;
1020
1021         if (!(tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING) ||
1022             *oplock == SMB2_OPLOCK_LEVEL_NONE)
1023                 req->RequestedOplockLevel = *oplock;
1024         else {
1025                 rc = add_lease_context(iov, &num_iovecs, oplock);
1026                 if (rc) {
1027                         cifs_small_buf_release(req);
1028                         kfree(copy_path);
1029                         return rc;
1030                 }
1031         }
1032
1033         if (*oplock == SMB2_OPLOCK_LEVEL_BATCH) {
1034                 /* need to set Next field of lease context if we request it */
1035                 if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING) {
1036                         struct create_context *ccontext =
1037                             (struct create_context *)iov[num_iovecs-1].iov_base;
1038                         ccontext->Next = sizeof(struct create_lease);
1039                 }
1040                 rc = add_durable_context(iov, &num_iovecs);
1041                 if (rc) {
1042                         cifs_small_buf_release(req);
1043                         kfree(copy_path);
1044                         kfree(iov[num_iovecs-1].iov_base);
1045                         return rc;
1046                 }
1047         }
1048
1049         rc = SendReceive2(xid, ses, iov, num_iovecs, &resp_buftype, 0);
1050         rsp = (struct smb2_create_rsp *)iov[0].iov_base;
1051
1052         if (rc != 0) {
1053                 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE);
1054                 goto creat_exit;
1055         }
1056
1057         oparms->fid->persistent_fid = rsp->PersistentFileId;
1058         oparms->fid->volatile_fid = rsp->VolatileFileId;
1059
1060         if (buf) {
1061                 memcpy(buf, &rsp->CreationTime, 32);
1062                 buf->AllocationSize = rsp->AllocationSize;
1063                 buf->EndOfFile = rsp->EndofFile;
1064                 buf->Attributes = rsp->FileAttributes;
1065                 buf->NumberOfLinks = cpu_to_le32(1);
1066                 buf->DeletePending = 0;
1067         }
1068
1069         if (rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE)
1070                 *oplock = parse_lease_state(rsp);
1071         else
1072                 *oplock = rsp->OplockLevel;
1073 creat_exit:
1074         kfree(copy_path);
1075         free_rsp_buf(resp_buftype, rsp);
1076         return rc;
1077 }
1078
1079 /*
1080  *      SMB2 IOCTL is used for both IOCTLs and FSCTLs
1081  */
1082 int
1083 SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
1084            u64 volatile_fid, u32 opcode, bool is_fsctl, char *in_data,
1085            u32 indatalen, char **out_data, u32 *plen /* returned data len */)
1086 {
1087         struct smb2_ioctl_req *req;
1088         struct smb2_ioctl_rsp *rsp;
1089         struct TCP_Server_Info *server;
1090         struct cifs_ses *ses = tcon->ses;
1091         struct kvec iov[2];
1092         int resp_buftype;
1093         int num_iovecs;
1094         int rc = 0;
1095
1096         cifs_dbg(FYI, "SMB2 IOCTL\n");
1097
1098         /* zero out returned data len, in case of error */
1099         if (plen)
1100                 *plen = 0;
1101
1102         if (ses && (ses->server))
1103                 server = ses->server;
1104         else
1105                 return -EIO;
1106
1107         rc = small_smb2_init(SMB2_IOCTL, tcon, (void **) &req);
1108         if (rc)
1109                 return rc;
1110
1111         req->CtlCode = cpu_to_le32(opcode);
1112         req->PersistentFileId = persistent_fid;
1113         req->VolatileFileId = volatile_fid;
1114
1115         if (indatalen) {
1116                 req->InputCount = cpu_to_le32(indatalen);
1117                 /* do not set InputOffset if no input data */
1118                 req->InputOffset =
1119                        cpu_to_le32(offsetof(struct smb2_ioctl_req, Buffer) - 4);
1120                 iov[1].iov_base = in_data;
1121                 iov[1].iov_len = indatalen;
1122                 num_iovecs = 2;
1123         } else
1124                 num_iovecs = 1;
1125
1126         req->OutputOffset = 0;
1127         req->OutputCount = 0; /* MBZ */
1128
1129         /*
1130          * Could increase MaxOutputResponse, but that would require more
1131          * than one credit. Windows typically sets this smaller, but for some
1132          * ioctls it may be useful to allow server to send more. No point
1133          * limiting what the server can send as long as fits in one credit
1134          */
1135         req->MaxOutputResponse = cpu_to_le32(0xFF00); /* < 64K uses 1 credit */
1136
1137         if (is_fsctl)
1138                 req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL);
1139         else
1140                 req->Flags = 0;
1141
1142         iov[0].iov_base = (char *)req;
1143         /* 4 for rfc1002 length field */
1144         iov[0].iov_len = get_rfc1002_length(req) + 4;
1145
1146         if (indatalen)
1147                 inc_rfc1001_len(req, indatalen);
1148
1149         rc = SendReceive2(xid, ses, iov, num_iovecs, &resp_buftype, 0);
1150         rsp = (struct smb2_ioctl_rsp *)iov[0].iov_base;
1151
1152         if (rc != 0) {
1153                 if (tcon)
1154                         cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE);
1155                 goto ioctl_exit;
1156         }
1157
1158         /* check if caller wants to look at return data or just return rc */
1159         if ((plen == NULL) || (out_data == NULL))
1160                 goto ioctl_exit;
1161
1162         *plen = le32_to_cpu(rsp->OutputCount);
1163
1164         /* We check for obvious errors in the output buffer length and offset */
1165         if (*plen == 0)
1166                 goto ioctl_exit; /* server returned no data */
1167         else if (*plen > 0xFF00) {
1168                 cifs_dbg(VFS, "srv returned invalid ioctl length: %d\n", *plen);
1169                 *plen = 0;
1170                 rc = -EIO;
1171                 goto ioctl_exit;
1172         }
1173
1174         if (get_rfc1002_length(rsp) < le32_to_cpu(rsp->OutputOffset) + *plen) {
1175                 cifs_dbg(VFS, "Malformed ioctl resp: len %d offset %d\n", *plen,
1176                         le32_to_cpu(rsp->OutputOffset));
1177                 *plen = 0;
1178                 rc = -EIO;
1179                 goto ioctl_exit;
1180         }
1181
1182         *out_data = kmalloc(*plen, GFP_KERNEL);
1183         if (*out_data == NULL) {
1184                 rc = -ENOMEM;
1185                 goto ioctl_exit;
1186         }
1187
1188         memcpy(*out_data, rsp->hdr.ProtocolId + le32_to_cpu(rsp->OutputOffset),
1189                *plen);
1190 ioctl_exit:
1191         free_rsp_buf(resp_buftype, rsp);
1192         return rc;
1193 }
1194
1195 int
1196 SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
1197            u64 persistent_fid, u64 volatile_fid)
1198 {
1199         struct smb2_close_req *req;
1200         struct smb2_close_rsp *rsp;
1201         struct TCP_Server_Info *server;
1202         struct cifs_ses *ses = tcon->ses;
1203         struct kvec iov[1];
1204         int resp_buftype;
1205         int rc = 0;
1206
1207         cifs_dbg(FYI, "Close\n");
1208
1209         if (ses && (ses->server))
1210                 server = ses->server;
1211         else
1212                 return -EIO;
1213
1214         rc = small_smb2_init(SMB2_CLOSE, tcon, (void **) &req);
1215         if (rc)
1216                 return rc;
1217
1218         req->PersistentFileId = persistent_fid;
1219         req->VolatileFileId = volatile_fid;
1220
1221         iov[0].iov_base = (char *)req;
1222         /* 4 for rfc1002 length field */
1223         iov[0].iov_len = get_rfc1002_length(req) + 4;
1224
1225         rc = SendReceive2(xid, ses, iov, 1, &resp_buftype, 0);
1226         rsp = (struct smb2_close_rsp *)iov[0].iov_base;
1227
1228         if (rc != 0) {
1229                 if (tcon)
1230                         cifs_stats_fail_inc(tcon, SMB2_CLOSE_HE);
1231                 goto close_exit;
1232         }
1233
1234         /* BB FIXME - decode close response, update inode for caching */
1235
1236 close_exit:
1237         free_rsp_buf(resp_buftype, rsp);
1238         return rc;
1239 }
1240
1241 static int
1242 validate_buf(unsigned int offset, unsigned int buffer_length,
1243              struct smb2_hdr *hdr, unsigned int min_buf_size)
1244
1245 {
1246         unsigned int smb_len = be32_to_cpu(hdr->smb2_buf_length);
1247         char *end_of_smb = smb_len + 4 /* RFC1001 length field */ + (char *)hdr;
1248         char *begin_of_buf = 4 /* RFC1001 len field */ + offset + (char *)hdr;
1249         char *end_of_buf = begin_of_buf + buffer_length;
1250
1251
1252         if (buffer_length < min_buf_size) {
1253                 cifs_dbg(VFS, "buffer length %d smaller than minimum size %d\n",
1254                          buffer_length, min_buf_size);
1255                 return -EINVAL;
1256         }
1257
1258         /* check if beyond RFC1001 maximum length */
1259         if ((smb_len > 0x7FFFFF) || (buffer_length > 0x7FFFFF)) {
1260                 cifs_dbg(VFS, "buffer length %d or smb length %d too large\n",
1261                          buffer_length, smb_len);
1262                 return -EINVAL;
1263         }
1264
1265         if ((begin_of_buf > end_of_smb) || (end_of_buf > end_of_smb)) {
1266                 cifs_dbg(VFS, "illegal server response, bad offset to data\n");
1267                 return -EINVAL;
1268         }
1269
1270         return 0;
1271 }
1272
1273 /*
1274  * If SMB buffer fields are valid, copy into temporary buffer to hold result.
1275  * Caller must free buffer.
1276  */
1277 static int
1278 validate_and_copy_buf(unsigned int offset, unsigned int buffer_length,
1279                       struct smb2_hdr *hdr, unsigned int minbufsize,
1280                       char *data)
1281
1282 {
1283         char *begin_of_buf = 4 /* RFC1001 len field */ + offset + (char *)hdr;
1284         int rc;
1285
1286         if (!data)
1287                 return -EINVAL;
1288
1289         rc = validate_buf(offset, buffer_length, hdr, minbufsize);
1290         if (rc)
1291                 return rc;
1292
1293         memcpy(data, begin_of_buf, buffer_length);
1294
1295         return 0;
1296 }
1297
1298 static int
1299 query_info(const unsigned int xid, struct cifs_tcon *tcon,
1300            u64 persistent_fid, u64 volatile_fid, u8 info_class,
1301            size_t output_len, size_t min_len, void *data)
1302 {
1303         struct smb2_query_info_req *req;
1304         struct smb2_query_info_rsp *rsp = NULL;
1305         struct kvec iov[2];
1306         int rc = 0;
1307         int resp_buftype;
1308         struct TCP_Server_Info *server;
1309         struct cifs_ses *ses = tcon->ses;
1310
1311         cifs_dbg(FYI, "Query Info\n");
1312
1313         if (ses && (ses->server))
1314                 server = ses->server;
1315         else
1316                 return -EIO;
1317
1318         rc = small_smb2_init(SMB2_QUERY_INFO, tcon, (void **) &req);
1319         if (rc)
1320                 return rc;
1321
1322         req->InfoType = SMB2_O_INFO_FILE;
1323         req->FileInfoClass = info_class;
1324         req->PersistentFileId = persistent_fid;
1325         req->VolatileFileId = volatile_fid;
1326         /* 4 for rfc1002 length field and 1 for Buffer */
1327         req->InputBufferOffset =
1328                 cpu_to_le16(sizeof(struct smb2_query_info_req) - 1 - 4);
1329         req->OutputBufferLength = cpu_to_le32(output_len);
1330
1331         iov[0].iov_base = (char *)req;
1332         /* 4 for rfc1002 length field */
1333         iov[0].iov_len = get_rfc1002_length(req) + 4;
1334
1335         rc = SendReceive2(xid, ses, iov, 1, &resp_buftype, 0);
1336         rsp = (struct smb2_query_info_rsp *)iov[0].iov_base;
1337
1338         if (rc) {
1339                 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
1340                 goto qinf_exit;
1341         }
1342
1343         rc = validate_and_copy_buf(le16_to_cpu(rsp->OutputBufferOffset),
1344                                    le32_to_cpu(rsp->OutputBufferLength),
1345                                    &rsp->hdr, min_len, data);
1346
1347 qinf_exit:
1348         free_rsp_buf(resp_buftype, rsp);
1349         return rc;
1350 }
1351
1352 int
1353 SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
1354                 u64 persistent_fid, u64 volatile_fid,
1355                 struct smb2_file_all_info *data)
1356 {
1357         return query_info(xid, tcon, persistent_fid, volatile_fid,
1358                           FILE_ALL_INFORMATION,
1359                           sizeof(struct smb2_file_all_info) + MAX_NAME * 2,
1360                           sizeof(struct smb2_file_all_info), data);
1361 }
1362
1363 int
1364 SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon,
1365                  u64 persistent_fid, u64 volatile_fid, __le64 *uniqueid)
1366 {
1367         return query_info(xid, tcon, persistent_fid, volatile_fid,
1368                           FILE_INTERNAL_INFORMATION,
1369                           sizeof(struct smb2_file_internal_info),
1370                           sizeof(struct smb2_file_internal_info), uniqueid);
1371 }
1372
1373 /*
1374  * This is a no-op for now. We're not really interested in the reply, but
1375  * rather in the fact that the server sent one and that server->lstrp
1376  * gets updated.
1377  *
1378  * FIXME: maybe we should consider checking that the reply matches request?
1379  */
1380 static void
1381 smb2_echo_callback(struct mid_q_entry *mid)
1382 {
1383         struct TCP_Server_Info *server = mid->callback_data;
1384         struct smb2_echo_rsp *smb2 = (struct smb2_echo_rsp *)mid->resp_buf;
1385         unsigned int credits_received = 1;
1386
1387         if (mid->mid_state == MID_RESPONSE_RECEIVED)
1388                 credits_received = le16_to_cpu(smb2->hdr.CreditRequest);
1389
1390         DeleteMidQEntry(mid);
1391         add_credits(server, credits_received, CIFS_ECHO_OP);
1392 }
1393
1394 int
1395 SMB2_echo(struct TCP_Server_Info *server)
1396 {
1397         struct smb2_echo_req *req;
1398         int rc = 0;
1399         struct kvec iov;
1400         struct smb_rqst rqst = { .rq_iov = &iov,
1401                                  .rq_nvec = 1 };
1402
1403         cifs_dbg(FYI, "In echo request\n");
1404
1405         rc = small_smb2_init(SMB2_ECHO, NULL, (void **)&req);
1406         if (rc)
1407                 return rc;
1408
1409         req->hdr.CreditRequest = cpu_to_le16(1);
1410
1411         iov.iov_base = (char *)req;
1412         /* 4 for rfc1002 length field */
1413         iov.iov_len = get_rfc1002_length(req) + 4;
1414
1415         rc = cifs_call_async(server, &rqst, NULL, smb2_echo_callback, server,
1416                              CIFS_ECHO_OP);
1417         if (rc)
1418                 cifs_dbg(FYI, "Echo request failed: %d\n", rc);
1419
1420         cifs_small_buf_release(req);
1421         return rc;
1422 }
1423
1424 int
1425 SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
1426            u64 volatile_fid)
1427 {
1428         struct smb2_flush_req *req;
1429         struct TCP_Server_Info *server;
1430         struct cifs_ses *ses = tcon->ses;
1431         struct kvec iov[1];
1432         int resp_buftype;
1433         int rc = 0;
1434
1435         cifs_dbg(FYI, "Flush\n");
1436
1437         if (ses && (ses->server))
1438                 server = ses->server;
1439         else
1440                 return -EIO;
1441
1442         rc = small_smb2_init(SMB2_FLUSH, tcon, (void **) &req);
1443         if (rc)
1444                 return rc;
1445
1446         req->PersistentFileId = persistent_fid;
1447         req->VolatileFileId = volatile_fid;
1448
1449         iov[0].iov_base = (char *)req;
1450         /* 4 for rfc1002 length field */
1451         iov[0].iov_len = get_rfc1002_length(req) + 4;
1452
1453         rc = SendReceive2(xid, ses, iov, 1, &resp_buftype, 0);
1454
1455         if ((rc != 0) && tcon)
1456                 cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE);
1457
1458         free_rsp_buf(resp_buftype, iov[0].iov_base);
1459         return rc;
1460 }
1461
1462 /*
1463  * To form a chain of read requests, any read requests after the first should
1464  * have the end_of_chain boolean set to true.
1465  */
1466 static int
1467 smb2_new_read_req(struct kvec *iov, struct cifs_io_parms *io_parms,
1468                   unsigned int remaining_bytes, int request_type)
1469 {
1470         int rc = -EACCES;
1471         struct smb2_read_req *req = NULL;
1472
1473         rc = small_smb2_init(SMB2_READ, io_parms->tcon, (void **) &req);
1474         if (rc)
1475                 return rc;
1476         if (io_parms->tcon->ses->server == NULL)
1477                 return -ECONNABORTED;
1478
1479         req->hdr.ProcessId = cpu_to_le32(io_parms->pid);
1480
1481         req->PersistentFileId = io_parms->persistent_fid;
1482         req->VolatileFileId = io_parms->volatile_fid;
1483         req->ReadChannelInfoOffset = 0; /* reserved */
1484         req->ReadChannelInfoLength = 0; /* reserved */
1485         req->Channel = 0; /* reserved */
1486         req->MinimumCount = 0;
1487         req->Length = cpu_to_le32(io_parms->length);
1488         req->Offset = cpu_to_le64(io_parms->offset);
1489
1490         if (request_type & CHAINED_REQUEST) {
1491                 if (!(request_type & END_OF_CHAIN)) {
1492                         /* 4 for rfc1002 length field */
1493                         req->hdr.NextCommand =
1494                                 cpu_to_le32(get_rfc1002_length(req) + 4);
1495                 } else /* END_OF_CHAIN */
1496                         req->hdr.NextCommand = 0;
1497                 if (request_type & RELATED_REQUEST) {
1498                         req->hdr.Flags |= SMB2_FLAGS_RELATED_OPERATIONS;
1499                         /*
1500                          * Related requests use info from previous read request
1501                          * in chain.
1502                          */
1503                         req->hdr.SessionId = 0xFFFFFFFF;
1504                         req->hdr.TreeId = 0xFFFFFFFF;
1505                         req->PersistentFileId = 0xFFFFFFFF;
1506                         req->VolatileFileId = 0xFFFFFFFF;
1507                 }
1508         }
1509         if (remaining_bytes > io_parms->length)
1510                 req->RemainingBytes = cpu_to_le32(remaining_bytes);
1511         else
1512                 req->RemainingBytes = 0;
1513
1514         iov[0].iov_base = (char *)req;
1515         /* 4 for rfc1002 length field */
1516         iov[0].iov_len = get_rfc1002_length(req) + 4;
1517         return rc;
1518 }
1519
1520 static void
1521 smb2_readv_callback(struct mid_q_entry *mid)
1522 {
1523         struct cifs_readdata *rdata = mid->callback_data;
1524         struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink);
1525         struct TCP_Server_Info *server = tcon->ses->server;
1526         struct smb2_hdr *buf = (struct smb2_hdr *)rdata->iov.iov_base;
1527         unsigned int credits_received = 1;
1528         struct smb_rqst rqst = { .rq_iov = &rdata->iov,
1529                                  .rq_nvec = 1,
1530                                  .rq_pages = rdata->pages,
1531                                  .rq_npages = rdata->nr_pages,
1532                                  .rq_pagesz = rdata->pagesz,
1533                                  .rq_tailsz = rdata->tailsz };
1534
1535         cifs_dbg(FYI, "%s: mid=%llu state=%d result=%d bytes=%u\n",
1536                  __func__, mid->mid, mid->mid_state, rdata->result,
1537                  rdata->bytes);
1538
1539         switch (mid->mid_state) {
1540         case MID_RESPONSE_RECEIVED:
1541                 credits_received = le16_to_cpu(buf->CreditRequest);
1542                 /* result already set, check signature */
1543                 if (server->sign) {
1544                         int rc;
1545
1546                         rc = smb2_verify_signature(&rqst, server);
1547                         if (rc)
1548                                 cifs_dbg(VFS, "SMB signature verification returned error = %d\n",
1549                                          rc);
1550                 }
1551                 /* FIXME: should this be counted toward the initiating task? */
1552                 task_io_account_read(rdata->bytes);
1553                 cifs_stats_bytes_read(tcon, rdata->bytes);
1554                 break;
1555         case MID_REQUEST_SUBMITTED:
1556         case MID_RETRY_NEEDED:
1557                 rdata->result = -EAGAIN;
1558                 break;
1559         default:
1560                 if (rdata->result != -ENODATA)
1561                         rdata->result = -EIO;
1562         }
1563
1564         if (rdata->result)
1565                 cifs_stats_fail_inc(tcon, SMB2_READ_HE);
1566
1567         queue_work(cifsiod_wq, &rdata->work);
1568         DeleteMidQEntry(mid);
1569         add_credits(server, credits_received, 0);
1570 }
1571
1572 /* smb2_async_readv - send an async write, and set up mid to handle result */
1573 int
1574 smb2_async_readv(struct cifs_readdata *rdata)
1575 {
1576         int rc;
1577         struct smb2_hdr *buf;
1578         struct cifs_io_parms io_parms;
1579         struct smb_rqst rqst = { .rq_iov = &rdata->iov,
1580                                  .rq_nvec = 1 };
1581
1582         cifs_dbg(FYI, "%s: offset=%llu bytes=%u\n",
1583                  __func__, rdata->offset, rdata->bytes);
1584
1585         io_parms.tcon = tlink_tcon(rdata->cfile->tlink);
1586         io_parms.offset = rdata->offset;
1587         io_parms.length = rdata->bytes;
1588         io_parms.persistent_fid = rdata->cfile->fid.persistent_fid;
1589         io_parms.volatile_fid = rdata->cfile->fid.volatile_fid;
1590         io_parms.pid = rdata->pid;
1591         rc = smb2_new_read_req(&rdata->iov, &io_parms, 0, 0);
1592         if (rc)
1593                 return rc;
1594
1595         buf = (struct smb2_hdr *)rdata->iov.iov_base;
1596         /* 4 for rfc1002 length field */
1597         rdata->iov.iov_len = get_rfc1002_length(rdata->iov.iov_base) + 4;
1598
1599         kref_get(&rdata->refcount);
1600         rc = cifs_call_async(io_parms.tcon->ses->server, &rqst,
1601                              cifs_readv_receive, smb2_readv_callback,
1602                              rdata, 0);
1603         if (rc) {
1604                 kref_put(&rdata->refcount, cifs_readdata_release);
1605                 cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE);
1606         }
1607
1608         cifs_small_buf_release(buf);
1609         return rc;
1610 }
1611
1612 int
1613 SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parms,
1614           unsigned int *nbytes, char **buf, int *buf_type)
1615 {
1616         int resp_buftype, rc = -EACCES;
1617         struct smb2_read_rsp *rsp = NULL;
1618         struct kvec iov[1];
1619
1620         *nbytes = 0;
1621         rc = smb2_new_read_req(iov, io_parms, 0, 0);
1622         if (rc)
1623                 return rc;
1624
1625         rc = SendReceive2(xid, io_parms->tcon->ses, iov, 1,
1626                           &resp_buftype, CIFS_LOG_ERROR);
1627
1628         rsp = (struct smb2_read_rsp *)iov[0].iov_base;
1629
1630         if (rsp->hdr.Status == STATUS_END_OF_FILE) {
1631                 free_rsp_buf(resp_buftype, iov[0].iov_base);
1632                 return 0;
1633         }
1634
1635         if (rc) {
1636                 cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE);
1637                 cifs_dbg(VFS, "Send error in read = %d\n", rc);
1638         } else {
1639                 *nbytes = le32_to_cpu(rsp->DataLength);
1640                 if ((*nbytes > CIFS_MAX_MSGSIZE) ||
1641                     (*nbytes > io_parms->length)) {
1642                         cifs_dbg(FYI, "bad length %d for count %d\n",
1643                                  *nbytes, io_parms->length);
1644                         rc = -EIO;
1645                         *nbytes = 0;
1646                 }
1647         }
1648
1649         if (*buf) {
1650                 memcpy(*buf, (char *)rsp->hdr.ProtocolId + rsp->DataOffset,
1651                        *nbytes);
1652                 free_rsp_buf(resp_buftype, iov[0].iov_base);
1653         } else if (resp_buftype != CIFS_NO_BUFFER) {
1654                 *buf = iov[0].iov_base;
1655                 if (resp_buftype == CIFS_SMALL_BUFFER)
1656                         *buf_type = CIFS_SMALL_BUFFER;
1657                 else if (resp_buftype == CIFS_LARGE_BUFFER)
1658                         *buf_type = CIFS_LARGE_BUFFER;
1659         }
1660         return rc;
1661 }
1662
1663 /*
1664  * Check the mid_state and signature on received buffer (if any), and queue the
1665  * workqueue completion task.
1666  */
1667 static void
1668 smb2_writev_callback(struct mid_q_entry *mid)
1669 {
1670         struct cifs_writedata *wdata = mid->callback_data;
1671         struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
1672         unsigned int written;
1673         struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf;
1674         unsigned int credits_received = 1;
1675
1676         switch (mid->mid_state) {
1677         case MID_RESPONSE_RECEIVED:
1678                 credits_received = le16_to_cpu(rsp->hdr.CreditRequest);
1679                 wdata->result = smb2_check_receive(mid, tcon->ses->server, 0);
1680                 if (wdata->result != 0)
1681                         break;
1682
1683                 written = le32_to_cpu(rsp->DataLength);
1684                 /*
1685                  * Mask off high 16 bits when bytes written as returned
1686                  * by the server is greater than bytes requested by the
1687                  * client. OS/2 servers are known to set incorrect
1688                  * CountHigh values.
1689                  */
1690                 if (written > wdata->bytes)
1691                         written &= 0xFFFF;
1692
1693                 if (written < wdata->bytes)
1694                         wdata->result = -ENOSPC;
1695                 else
1696                         wdata->bytes = written;
1697                 break;
1698         case MID_REQUEST_SUBMITTED:
1699         case MID_RETRY_NEEDED:
1700                 wdata->result = -EAGAIN;
1701                 break;
1702         default:
1703                 wdata->result = -EIO;
1704                 break;
1705         }
1706
1707         if (wdata->result)
1708                 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
1709
1710         queue_work(cifsiod_wq, &wdata->work);
1711         DeleteMidQEntry(mid);
1712         add_credits(tcon->ses->server, credits_received, 0);
1713 }
1714
1715 /* smb2_async_writev - send an async write, and set up mid to handle result */
1716 int
1717 smb2_async_writev(struct cifs_writedata *wdata)
1718 {
1719         int rc = -EACCES;
1720         struct smb2_write_req *req = NULL;
1721         struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
1722         struct kvec iov;
1723         struct smb_rqst rqst;
1724
1725         rc = small_smb2_init(SMB2_WRITE, tcon, (void **) &req);
1726         if (rc)
1727                 goto async_writev_out;
1728
1729         req->hdr.ProcessId = cpu_to_le32(wdata->cfile->pid);
1730
1731         req->PersistentFileId = wdata->cfile->fid.persistent_fid;
1732         req->VolatileFileId = wdata->cfile->fid.volatile_fid;
1733         req->WriteChannelInfoOffset = 0;
1734         req->WriteChannelInfoLength = 0;
1735         req->Channel = 0;
1736         req->Offset = cpu_to_le64(wdata->offset);
1737         /* 4 for rfc1002 length field */
1738         req->DataOffset = cpu_to_le16(
1739                                 offsetof(struct smb2_write_req, Buffer) - 4);
1740         req->RemainingBytes = 0;
1741
1742         /* 4 for rfc1002 length field and 1 for Buffer */
1743         iov.iov_len = get_rfc1002_length(req) + 4 - 1;
1744         iov.iov_base = req;
1745
1746         rqst.rq_iov = &iov;
1747         rqst.rq_nvec = 1;
1748         rqst.rq_pages = wdata->pages;
1749         rqst.rq_npages = wdata->nr_pages;
1750         rqst.rq_pagesz = wdata->pagesz;
1751         rqst.rq_tailsz = wdata->tailsz;
1752
1753         cifs_dbg(FYI, "async write at %llu %u bytes\n",
1754                  wdata->offset, wdata->bytes);
1755
1756         req->Length = cpu_to_le32(wdata->bytes);
1757
1758         inc_rfc1001_len(&req->hdr, wdata->bytes - 1 /* Buffer */);
1759
1760         kref_get(&wdata->refcount);
1761         rc = cifs_call_async(tcon->ses->server, &rqst, NULL,
1762                                 smb2_writev_callback, wdata, 0);
1763
1764         if (rc) {
1765                 kref_put(&wdata->refcount, cifs_writedata_release);
1766                 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
1767         }
1768
1769 async_writev_out:
1770         cifs_small_buf_release(req);
1771         return rc;
1772 }
1773
1774 /*
1775  * SMB2_write function gets iov pointer to kvec array with n_vec as a length.
1776  * The length field from io_parms must be at least 1 and indicates a number of
1777  * elements with data to write that begins with position 1 in iov array. All
1778  * data length is specified by count.
1779  */
1780 int
1781 SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms,
1782            unsigned int *nbytes, struct kvec *iov, int n_vec)
1783 {
1784         int rc = 0;
1785         struct smb2_write_req *req = NULL;
1786         struct smb2_write_rsp *rsp = NULL;
1787         int resp_buftype;
1788         *nbytes = 0;
1789
1790         if (n_vec < 1)
1791                 return rc;
1792
1793         rc = small_smb2_init(SMB2_WRITE, io_parms->tcon, (void **) &req);
1794         if (rc)
1795                 return rc;
1796
1797         if (io_parms->tcon->ses->server == NULL)
1798                 return -ECONNABORTED;
1799
1800         req->hdr.ProcessId = cpu_to_le32(io_parms->pid);
1801
1802         req->PersistentFileId = io_parms->persistent_fid;
1803         req->VolatileFileId = io_parms->volatile_fid;
1804         req->WriteChannelInfoOffset = 0;
1805         req->WriteChannelInfoLength = 0;
1806         req->Channel = 0;
1807         req->Length = cpu_to_le32(io_parms->length);
1808         req->Offset = cpu_to_le64(io_parms->offset);
1809         /* 4 for rfc1002 length field */
1810         req->DataOffset = cpu_to_le16(
1811                                 offsetof(struct smb2_write_req, Buffer) - 4);
1812         req->RemainingBytes = 0;
1813
1814         iov[0].iov_base = (char *)req;
1815         /* 4 for rfc1002 length field and 1 for Buffer */
1816         iov[0].iov_len = get_rfc1002_length(req) + 4 - 1;
1817
1818         /* length of entire message including data to be written */
1819         inc_rfc1001_len(req, io_parms->length - 1 /* Buffer */);
1820
1821         rc = SendReceive2(xid, io_parms->tcon->ses, iov, n_vec + 1,
1822                           &resp_buftype, 0);
1823         rsp = (struct smb2_write_rsp *)iov[0].iov_base;
1824
1825         if (rc) {
1826                 cifs_stats_fail_inc(io_parms->tcon, SMB2_WRITE_HE);
1827                 cifs_dbg(VFS, "Send error in write = %d\n", rc);
1828         } else
1829                 *nbytes = le32_to_cpu(rsp->DataLength);
1830
1831         free_rsp_buf(resp_buftype, rsp);
1832         return rc;
1833 }
1834
1835 static unsigned int
1836 num_entries(char *bufstart, char *end_of_buf, char **lastentry, size_t size)
1837 {
1838         int len;
1839         unsigned int entrycount = 0;
1840         unsigned int next_offset = 0;
1841         FILE_DIRECTORY_INFO *entryptr;
1842
1843         if (bufstart == NULL)
1844                 return 0;
1845
1846         entryptr = (FILE_DIRECTORY_INFO *)bufstart;
1847
1848         while (1) {
1849                 entryptr = (FILE_DIRECTORY_INFO *)
1850                                         ((char *)entryptr + next_offset);
1851
1852                 if ((char *)entryptr + size > end_of_buf) {
1853                         cifs_dbg(VFS, "malformed search entry would overflow\n");
1854                         break;
1855                 }
1856
1857                 len = le32_to_cpu(entryptr->FileNameLength);
1858                 if ((char *)entryptr + len + size > end_of_buf) {
1859                         cifs_dbg(VFS, "directory entry name would overflow frame end of buf %p\n",
1860                                  end_of_buf);
1861                         break;
1862                 }
1863
1864                 *lastentry = (char *)entryptr;
1865                 entrycount++;
1866
1867                 next_offset = le32_to_cpu(entryptr->NextEntryOffset);
1868                 if (!next_offset)
1869                         break;
1870         }
1871
1872         return entrycount;
1873 }
1874
1875 /*
1876  * Readdir/FindFirst
1877  */
1878 int
1879 SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
1880                      u64 persistent_fid, u64 volatile_fid, int index,
1881                      struct cifs_search_info *srch_inf)
1882 {
1883         struct smb2_query_directory_req *req;
1884         struct smb2_query_directory_rsp *rsp = NULL;
1885         struct kvec iov[2];
1886         int rc = 0;
1887         int len;
1888         int resp_buftype;
1889         unsigned char *bufptr;
1890         struct TCP_Server_Info *server;
1891         struct cifs_ses *ses = tcon->ses;
1892         __le16 asteriks = cpu_to_le16('*');
1893         char *end_of_smb;
1894         unsigned int output_size = CIFSMaxBufSize;
1895         size_t info_buf_size;
1896
1897         if (ses && (ses->server))
1898                 server = ses->server;
1899         else
1900                 return -EIO;
1901
1902         rc = small_smb2_init(SMB2_QUERY_DIRECTORY, tcon, (void **) &req);
1903         if (rc)
1904                 return rc;
1905
1906         switch (srch_inf->info_level) {
1907         case SMB_FIND_FILE_DIRECTORY_INFO:
1908                 req->FileInformationClass = FILE_DIRECTORY_INFORMATION;
1909                 info_buf_size = sizeof(FILE_DIRECTORY_INFO) - 1;
1910                 break;
1911         case SMB_FIND_FILE_ID_FULL_DIR_INFO:
1912                 req->FileInformationClass = FILEID_FULL_DIRECTORY_INFORMATION;
1913                 info_buf_size = sizeof(SEARCH_ID_FULL_DIR_INFO) - 1;
1914                 break;
1915         default:
1916                 cifs_dbg(VFS, "info level %u isn't supported\n",
1917                          srch_inf->info_level);
1918                 rc = -EINVAL;
1919                 goto qdir_exit;
1920         }
1921
1922         req->FileIndex = cpu_to_le32(index);
1923         req->PersistentFileId = persistent_fid;
1924         req->VolatileFileId = volatile_fid;
1925
1926         len = 0x2;
1927         bufptr = req->Buffer;
1928         memcpy(bufptr, &asteriks, len);
1929
1930         req->FileNameOffset =
1931                 cpu_to_le16(sizeof(struct smb2_query_directory_req) - 1 - 4);
1932         req->FileNameLength = cpu_to_le16(len);
1933         /*
1934          * BB could be 30 bytes or so longer if we used SMB2 specific
1935          * buffer lengths, but this is safe and close enough.
1936          */
1937         output_size = min_t(unsigned int, output_size, server->maxBuf);
1938         output_size = min_t(unsigned int, output_size, 2 << 15);
1939         req->OutputBufferLength = cpu_to_le32(output_size);
1940
1941         iov[0].iov_base = (char *)req;
1942         /* 4 for RFC1001 length and 1 for Buffer */
1943         iov[0].iov_len = get_rfc1002_length(req) + 4 - 1;
1944
1945         iov[1].iov_base = (char *)(req->Buffer);
1946         iov[1].iov_len = len;
1947
1948         inc_rfc1001_len(req, len - 1 /* Buffer */);
1949
1950         rc = SendReceive2(xid, ses, iov, 2, &resp_buftype, 0);
1951         rsp = (struct smb2_query_directory_rsp *)iov[0].iov_base;
1952
1953         if (rc) {
1954                 cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE);
1955                 goto qdir_exit;
1956         }
1957
1958         rc = validate_buf(le16_to_cpu(rsp->OutputBufferOffset),
1959                           le32_to_cpu(rsp->OutputBufferLength), &rsp->hdr,
1960                           info_buf_size);
1961         if (rc)
1962                 goto qdir_exit;
1963
1964         srch_inf->unicode = true;
1965
1966         if (srch_inf->ntwrk_buf_start) {
1967                 if (srch_inf->smallBuf)
1968                         cifs_small_buf_release(srch_inf->ntwrk_buf_start);
1969                 else
1970                         cifs_buf_release(srch_inf->ntwrk_buf_start);
1971         }
1972         srch_inf->ntwrk_buf_start = (char *)rsp;
1973         srch_inf->srch_entries_start = srch_inf->last_entry = 4 /* rfclen */ +
1974                 (char *)&rsp->hdr + le16_to_cpu(rsp->OutputBufferOffset);
1975         /* 4 for rfc1002 length field */
1976         end_of_smb = get_rfc1002_length(rsp) + 4 + (char *)&rsp->hdr;
1977         srch_inf->entries_in_buffer =
1978                         num_entries(srch_inf->srch_entries_start, end_of_smb,
1979                                     &srch_inf->last_entry, info_buf_size);
1980         srch_inf->index_of_last_entry += srch_inf->entries_in_buffer;
1981         cifs_dbg(FYI, "num entries %d last_index %lld srch start %p srch end %p\n",
1982                  srch_inf->entries_in_buffer, srch_inf->index_of_last_entry,
1983                  srch_inf->srch_entries_start, srch_inf->last_entry);
1984         if (resp_buftype == CIFS_LARGE_BUFFER)
1985                 srch_inf->smallBuf = false;
1986         else if (resp_buftype == CIFS_SMALL_BUFFER)
1987                 srch_inf->smallBuf = true;
1988         else
1989                 cifs_dbg(VFS, "illegal search buffer type\n");
1990
1991         if (rsp->hdr.Status == STATUS_NO_MORE_FILES)
1992                 srch_inf->endOfSearch = 1;
1993         else
1994                 srch_inf->endOfSearch = 0;
1995
1996         return rc;
1997
1998 qdir_exit:
1999         free_rsp_buf(resp_buftype, rsp);
2000         return rc;
2001 }
2002
2003 static int
2004 send_set_info(const unsigned int xid, struct cifs_tcon *tcon,
2005                u64 persistent_fid, u64 volatile_fid, u32 pid, int info_class,
2006                unsigned int num, void **data, unsigned int *size)
2007 {
2008         struct smb2_set_info_req *req;
2009         struct smb2_set_info_rsp *rsp = NULL;
2010         struct kvec *iov;
2011         int rc = 0;
2012         int resp_buftype;
2013         unsigned int i;
2014         struct TCP_Server_Info *server;
2015         struct cifs_ses *ses = tcon->ses;
2016
2017         if (ses && (ses->server))
2018                 server = ses->server;
2019         else
2020                 return -EIO;
2021
2022         if (!num)
2023                 return -EINVAL;
2024
2025         iov = kmalloc(sizeof(struct kvec) * num, GFP_KERNEL);
2026         if (!iov)
2027                 return -ENOMEM;
2028
2029         rc = small_smb2_init(SMB2_SET_INFO, tcon, (void **) &req);
2030         if (rc) {
2031                 kfree(iov);
2032                 return rc;
2033         }
2034
2035         req->hdr.ProcessId = cpu_to_le32(pid);
2036
2037         req->InfoType = SMB2_O_INFO_FILE;
2038         req->FileInfoClass = info_class;
2039         req->PersistentFileId = persistent_fid;
2040         req->VolatileFileId = volatile_fid;
2041
2042         /* 4 for RFC1001 length and 1 for Buffer */
2043         req->BufferOffset =
2044                         cpu_to_le16(sizeof(struct smb2_set_info_req) - 1 - 4);
2045         req->BufferLength = cpu_to_le32(*size);
2046
2047         inc_rfc1001_len(req, *size - 1 /* Buffer */);
2048
2049         memcpy(req->Buffer, *data, *size);
2050
2051         iov[0].iov_base = (char *)req;
2052         /* 4 for RFC1001 length */
2053         iov[0].iov_len = get_rfc1002_length(req) + 4;
2054
2055         for (i = 1; i < num; i++) {
2056                 inc_rfc1001_len(req, size[i]);
2057                 le32_add_cpu(&req->BufferLength, size[i]);
2058                 iov[i].iov_base = (char *)data[i];
2059                 iov[i].iov_len = size[i];
2060         }
2061
2062         rc = SendReceive2(xid, ses, iov, num, &resp_buftype, 0);
2063         rsp = (struct smb2_set_info_rsp *)iov[0].iov_base;
2064
2065         if (rc != 0) {
2066                 cifs_stats_fail_inc(tcon, SMB2_SET_INFO_HE);
2067                 goto out;
2068         }
2069 out:
2070         free_rsp_buf(resp_buftype, rsp);
2071         kfree(iov);
2072         return rc;
2073 }
2074
2075 int
2076 SMB2_rename(const unsigned int xid, struct cifs_tcon *tcon,
2077             u64 persistent_fid, u64 volatile_fid, __le16 *target_file)
2078 {
2079         struct smb2_file_rename_info info;
2080         void **data;
2081         unsigned int size[2];
2082         int rc;
2083         int len = (2 * UniStrnlen((wchar_t *)target_file, PATH_MAX));
2084
2085         data = kmalloc(sizeof(void *) * 2, GFP_KERNEL);
2086         if (!data)
2087                 return -ENOMEM;
2088
2089         info.ReplaceIfExists = 1; /* 1 = replace existing target with new */
2090                               /* 0 = fail if target already exists */
2091         info.RootDirectory = 0;  /* MBZ for network ops (why does spec say?) */
2092         info.FileNameLength = cpu_to_le32(len);
2093
2094         data[0] = &info;
2095         size[0] = sizeof(struct smb2_file_rename_info);
2096
2097         data[1] = target_file;
2098         size[1] = len + 2 /* null */;
2099
2100         rc = send_set_info(xid, tcon, persistent_fid, volatile_fid,
2101                            current->tgid, FILE_RENAME_INFORMATION, 2, data,
2102                            size);
2103         kfree(data);
2104         return rc;
2105 }
2106
2107 int
2108 SMB2_set_hardlink(const unsigned int xid, struct cifs_tcon *tcon,
2109                   u64 persistent_fid, u64 volatile_fid, __le16 *target_file)
2110 {
2111         struct smb2_file_link_info info;
2112         void **data;
2113         unsigned int size[2];
2114         int rc;
2115         int len = (2 * UniStrnlen((wchar_t *)target_file, PATH_MAX));
2116
2117         data = kmalloc(sizeof(void *) * 2, GFP_KERNEL);
2118         if (!data)
2119                 return -ENOMEM;
2120
2121         info.ReplaceIfExists = 0; /* 1 = replace existing link with new */
2122                               /* 0 = fail if link already exists */
2123         info.RootDirectory = 0;  /* MBZ for network ops (why does spec say?) */
2124         info.FileNameLength = cpu_to_le32(len);
2125
2126         data[0] = &info;
2127         size[0] = sizeof(struct smb2_file_link_info);
2128
2129         data[1] = target_file;
2130         size[1] = len + 2 /* null */;
2131
2132         rc = send_set_info(xid, tcon, persistent_fid, volatile_fid,
2133                            current->tgid, FILE_LINK_INFORMATION, 2, data, size);
2134         kfree(data);
2135         return rc;
2136 }
2137
2138 int
2139 SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
2140              u64 volatile_fid, u32 pid, __le64 *eof)
2141 {
2142         struct smb2_file_eof_info info;
2143         void *data;
2144         unsigned int size;
2145
2146         info.EndOfFile = *eof;
2147
2148         data = &info;
2149         size = sizeof(struct smb2_file_eof_info);
2150
2151         return send_set_info(xid, tcon, persistent_fid, volatile_fid, pid,
2152                              FILE_END_OF_FILE_INFORMATION, 1, &data, &size);
2153 }
2154
2155 int
2156 SMB2_set_info(const unsigned int xid, struct cifs_tcon *tcon,
2157               u64 persistent_fid, u64 volatile_fid, FILE_BASIC_INFO *buf)
2158 {
2159         unsigned int size;
2160         size = sizeof(FILE_BASIC_INFO);
2161         return send_set_info(xid, tcon, persistent_fid, volatile_fid,
2162                              current->tgid, FILE_BASIC_INFORMATION, 1,
2163                              (void **)&buf, &size);
2164 }
2165
2166 int
2167 SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon,
2168                   const u64 persistent_fid, const u64 volatile_fid,
2169                   __u8 oplock_level)
2170 {
2171         int rc;
2172         struct smb2_oplock_break *req = NULL;
2173
2174         cifs_dbg(FYI, "SMB2_oplock_break\n");
2175         rc = small_smb2_init(SMB2_OPLOCK_BREAK, tcon, (void **) &req);
2176
2177         if (rc)
2178                 return rc;
2179
2180         req->VolatileFid = volatile_fid;
2181         req->PersistentFid = persistent_fid;
2182         req->OplockLevel = oplock_level;
2183         req->hdr.CreditRequest = cpu_to_le16(1);
2184
2185         rc = SendReceiveNoRsp(xid, tcon->ses, (char *) req, CIFS_OBREAK_OP);
2186         /* SMB2 buffer freed by function above */
2187
2188         if (rc) {
2189                 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE);
2190                 cifs_dbg(FYI, "Send error in Oplock Break = %d\n", rc);
2191         }
2192
2193         return rc;
2194 }
2195
2196 static void
2197 copy_fs_info_to_kstatfs(struct smb2_fs_full_size_info *pfs_inf,
2198                         struct kstatfs *kst)
2199 {
2200         kst->f_bsize = le32_to_cpu(pfs_inf->BytesPerSector) *
2201                           le32_to_cpu(pfs_inf->SectorsPerAllocationUnit);
2202         kst->f_blocks = le64_to_cpu(pfs_inf->TotalAllocationUnits);
2203         kst->f_bfree  = le64_to_cpu(pfs_inf->ActualAvailableAllocationUnits);
2204         kst->f_bavail = le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits);
2205         return;
2206 }
2207
2208 static int
2209 build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, int level,
2210                    int outbuf_len, u64 persistent_fid, u64 volatile_fid)
2211 {
2212         int rc;
2213         struct smb2_query_info_req *req;
2214
2215         cifs_dbg(FYI, "Query FSInfo level %d\n", level);
2216
2217         if ((tcon->ses == NULL) || (tcon->ses->server == NULL))
2218                 return -EIO;
2219
2220         rc = small_smb2_init(SMB2_QUERY_INFO, tcon, (void **) &req);
2221         if (rc)
2222                 return rc;
2223
2224         req->InfoType = SMB2_O_INFO_FILESYSTEM;
2225         req->FileInfoClass = level;
2226         req->PersistentFileId = persistent_fid;
2227         req->VolatileFileId = volatile_fid;
2228         /* 4 for rfc1002 length field and 1 for pad */
2229         req->InputBufferOffset =
2230                         cpu_to_le16(sizeof(struct smb2_query_info_req) - 1 - 4);
2231         req->OutputBufferLength = cpu_to_le32(
2232                 outbuf_len + sizeof(struct smb2_query_info_rsp) - 1 - 4);
2233
2234         iov->iov_base = (char *)req;
2235         /* 4 for rfc1002 length field */
2236         iov->iov_len = get_rfc1002_length(req) + 4;
2237         return 0;
2238 }
2239
2240 int
2241 SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
2242               u64 persistent_fid, u64 volatile_fid, struct kstatfs *fsdata)
2243 {
2244         struct smb2_query_info_rsp *rsp = NULL;
2245         struct kvec iov;
2246         int rc = 0;
2247         int resp_buftype;
2248         struct cifs_ses *ses = tcon->ses;
2249         struct smb2_fs_full_size_info *info = NULL;
2250
2251         rc = build_qfs_info_req(&iov, tcon, FS_FULL_SIZE_INFORMATION,
2252                                 sizeof(struct smb2_fs_full_size_info),
2253                                 persistent_fid, volatile_fid);
2254         if (rc)
2255                 return rc;
2256
2257         rc = SendReceive2(xid, ses, &iov, 1, &resp_buftype, 0);
2258         if (rc) {
2259                 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
2260                 goto qinf_exit;
2261         }
2262         rsp = (struct smb2_query_info_rsp *)iov.iov_base;
2263
2264         info = (struct smb2_fs_full_size_info *)(4 /* RFC1001 len */ +
2265                 le16_to_cpu(rsp->OutputBufferOffset) + (char *)&rsp->hdr);
2266         rc = validate_buf(le16_to_cpu(rsp->OutputBufferOffset),
2267                           le32_to_cpu(rsp->OutputBufferLength), &rsp->hdr,
2268                           sizeof(struct smb2_fs_full_size_info));
2269         if (!rc)
2270                 copy_fs_info_to_kstatfs(info, fsdata);
2271
2272 qinf_exit:
2273         free_rsp_buf(resp_buftype, iov.iov_base);
2274         return rc;
2275 }
2276
2277 int
2278 smb2_lockv(const unsigned int xid, struct cifs_tcon *tcon,
2279            const __u64 persist_fid, const __u64 volatile_fid, const __u32 pid,
2280            const __u32 num_lock, struct smb2_lock_element *buf)
2281 {
2282         int rc = 0;
2283         struct smb2_lock_req *req = NULL;
2284         struct kvec iov[2];
2285         int resp_buf_type;
2286         unsigned int count;
2287
2288         cifs_dbg(FYI, "smb2_lockv num lock %d\n", num_lock);
2289
2290         rc = small_smb2_init(SMB2_LOCK, tcon, (void **) &req);
2291         if (rc)
2292                 return rc;
2293
2294         req->hdr.ProcessId = cpu_to_le32(pid);
2295         req->LockCount = cpu_to_le16(num_lock);
2296
2297         req->PersistentFileId = persist_fid;
2298         req->VolatileFileId = volatile_fid;
2299
2300         count = num_lock * sizeof(struct smb2_lock_element);
2301         inc_rfc1001_len(req, count - sizeof(struct smb2_lock_element));
2302
2303         iov[0].iov_base = (char *)req;
2304         /* 4 for rfc1002 length field and count for all locks */
2305         iov[0].iov_len = get_rfc1002_length(req) + 4 - count;
2306         iov[1].iov_base = (char *)buf;
2307         iov[1].iov_len = count;
2308
2309         cifs_stats_inc(&tcon->stats.cifs_stats.num_locks);
2310         rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, CIFS_NO_RESP);
2311         if (rc) {
2312                 cifs_dbg(FYI, "Send error in smb2_lockv = %d\n", rc);
2313                 cifs_stats_fail_inc(tcon, SMB2_LOCK_HE);
2314         }
2315
2316         return rc;
2317 }
2318
2319 int
2320 SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon,
2321           const __u64 persist_fid, const __u64 volatile_fid, const __u32 pid,
2322           const __u64 length, const __u64 offset, const __u32 lock_flags,
2323           const bool wait)
2324 {
2325         struct smb2_lock_element lock;
2326
2327         lock.Offset = cpu_to_le64(offset);
2328         lock.Length = cpu_to_le64(length);
2329         lock.Flags = cpu_to_le32(lock_flags);
2330         if (!wait && lock_flags != SMB2_LOCKFLAG_UNLOCK)
2331                 lock.Flags |= cpu_to_le32(SMB2_LOCKFLAG_FAIL_IMMEDIATELY);
2332
2333         return smb2_lockv(xid, tcon, persist_fid, volatile_fid, pid, 1, &lock);
2334 }
2335
2336 int
2337 SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon,
2338                  __u8 *lease_key, const __le32 lease_state)
2339 {
2340         int rc;
2341         struct smb2_lease_ack *req = NULL;
2342
2343         cifs_dbg(FYI, "SMB2_lease_break\n");
2344         rc = small_smb2_init(SMB2_OPLOCK_BREAK, tcon, (void **) &req);
2345
2346         if (rc)
2347                 return rc;
2348
2349         req->hdr.CreditRequest = cpu_to_le16(1);
2350         req->StructureSize = cpu_to_le16(36);
2351         inc_rfc1001_len(req, 12);
2352
2353         memcpy(req->LeaseKey, lease_key, 16);
2354         req->LeaseState = lease_state;
2355
2356         rc = SendReceiveNoRsp(xid, tcon->ses, (char *) req, CIFS_OBREAK_OP);
2357         /* SMB2 buffer freed by function above */
2358
2359         if (rc) {
2360                 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE);
2361                 cifs_dbg(FYI, "Send error in Lease Break = %d\n", rc);
2362         }
2363
2364         return rc;
2365 }