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