Merge tag 'docs-5.10-2' of git://git.lwn.net/linux
[linux-2.6-microblaze.git] / fs / cifs / connect.c
1 /*
2  *   fs/cifs/connect.c
3  *
4  *   Copyright (C) International Business Machines  Corp., 2002,2011
5  *   Author(s): Steve French (sfrench@us.ibm.com)
6  *
7  *   This library is free software; you can redistribute it and/or modify
8  *   it under the terms of the GNU Lesser General Public License as published
9  *   by the Free Software Foundation; either version 2.1 of the License, or
10  *   (at your option) any later version.
11  *
12  *   This library is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15  *   the GNU Lesser General Public License for more details.
16  *
17  *   You should have received a copy of the GNU Lesser General Public License
18  *   along with this library; if not, write to the Free Software
19  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 #include <linux/fs.h>
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/mm.h>
25 #include <linux/sched/signal.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/slab.h>
29 #include <linux/pagemap.h>
30 #include <linux/ctype.h>
31 #include <linux/utsname.h>
32 #include <linux/mempool.h>
33 #include <linux/delay.h>
34 #include <linux/completion.h>
35 #include <linux/kthread.h>
36 #include <linux/pagevec.h>
37 #include <linux/freezer.h>
38 #include <linux/namei.h>
39 #include <linux/uuid.h>
40 #include <linux/uaccess.h>
41 #include <asm/processor.h>
42 #include <linux/inet.h>
43 #include <linux/module.h>
44 #include <keys/user-type.h>
45 #include <net/ipv6.h>
46 #include <linux/parser.h>
47 #include <linux/bvec.h>
48 #include "cifspdu.h"
49 #include "cifsglob.h"
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
54 #include "ntlmssp.h"
55 #include "nterr.h"
56 #include "rfc1002pdu.h"
57 #include "fscache.h"
58 #include "smb2proto.h"
59 #include "smbdirect.h"
60 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
63 #endif
64 #include "fs_context.h"
65
66 extern mempool_t *cifs_req_poolp;
67 extern bool disable_legacy_dialects;
68
69 /* FIXME: should these be tunable? */
70 #define TLINK_ERROR_EXPIRE      (1 * HZ)
71 #define TLINK_IDLE_EXPIRE       (600 * HZ)
72
73 /* Drop the connection to not overload the server */
74 #define NUM_STATUS_IO_TIMEOUT   5
75
76 enum {
77         /* Mount options that take no arguments */
78         Opt_user_xattr, Opt_nouser_xattr,
79         Opt_forceuid, Opt_noforceuid,
80         Opt_forcegid, Opt_noforcegid,
81         Opt_noblocksend, Opt_noautotune, Opt_nolease,
82         Opt_hard, Opt_soft, Opt_perm, Opt_noperm, Opt_nodelete,
83         Opt_mapposix, Opt_nomapposix,
84         Opt_mapchars, Opt_nomapchars, Opt_sfu,
85         Opt_nosfu, Opt_nodfs, Opt_posixpaths,
86         Opt_noposixpaths, Opt_nounix, Opt_unix,
87         Opt_nocase,
88         Opt_brl, Opt_nobrl,
89         Opt_handlecache, Opt_nohandlecache,
90         Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
91         Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
92         Opt_nohard, Opt_nosoft,
93         Opt_nointr, Opt_intr,
94         Opt_nostrictsync, Opt_strictsync,
95         Opt_serverino, Opt_noserverino,
96         Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
97         Opt_acl, Opt_noacl, Opt_locallease,
98         Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
99         Opt_fsc, Opt_mfsymlinks,
100         Opt_multiuser, Opt_sloppy, Opt_nosharesock,
101         Opt_persistent, Opt_nopersistent,
102         Opt_resilient, Opt_noresilient,
103         Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
104         Opt_multichannel, Opt_nomultichannel,
105         Opt_compress,
106
107         /* Mount options which take numeric value */
108         Opt_backupuid, Opt_backupgid, Opt_uid,
109         Opt_cruid, Opt_gid, Opt_file_mode,
110         Opt_dirmode, Opt_port,
111         Opt_min_enc_offload,
112         Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
113         Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
114         Opt_snapshot, Opt_max_channels,
115
116         /* Mount options which take string value */
117         Opt_user, Opt_pass, Opt_ip,
118         Opt_domain, Opt_srcaddr, Opt_iocharset,
119         Opt_netbiosname, Opt_servern,
120         Opt_ver, Opt_vers, Opt_sec, Opt_cache,
121
122         /* Mount options to be ignored */
123         Opt_ignore,
124
125         /* Options which could be blank */
126         Opt_blank_pass,
127         Opt_blank_user,
128         Opt_blank_ip,
129
130         Opt_err
131 };
132
133 static const match_table_t cifs_mount_option_tokens = {
134
135         { Opt_user_xattr, "user_xattr" },
136         { Opt_nouser_xattr, "nouser_xattr" },
137         { Opt_forceuid, "forceuid" },
138         { Opt_noforceuid, "noforceuid" },
139         { Opt_forcegid, "forcegid" },
140         { Opt_noforcegid, "noforcegid" },
141         { Opt_noblocksend, "noblocksend" },
142         { Opt_noautotune, "noautotune" },
143         { Opt_nolease, "nolease" },
144         { Opt_hard, "hard" },
145         { Opt_soft, "soft" },
146         { Opt_perm, "perm" },
147         { Opt_noperm, "noperm" },
148         { Opt_nodelete, "nodelete" },
149         { Opt_mapchars, "mapchars" }, /* SFU style */
150         { Opt_nomapchars, "nomapchars" },
151         { Opt_mapposix, "mapposix" }, /* SFM style */
152         { Opt_nomapposix, "nomapposix" },
153         { Opt_sfu, "sfu" },
154         { Opt_nosfu, "nosfu" },
155         { Opt_nodfs, "nodfs" },
156         { Opt_posixpaths, "posixpaths" },
157         { Opt_noposixpaths, "noposixpaths" },
158         { Opt_nounix, "nounix" },
159         { Opt_nounix, "nolinux" },
160         { Opt_nounix, "noposix" },
161         { Opt_unix, "unix" },
162         { Opt_unix, "linux" },
163         { Opt_unix, "posix" },
164         { Opt_nocase, "nocase" },
165         { Opt_nocase, "ignorecase" },
166         { Opt_brl, "brl" },
167         { Opt_nobrl, "nobrl" },
168         { Opt_handlecache, "handlecache" },
169         { Opt_nohandlecache, "nohandlecache" },
170         { Opt_nobrl, "nolock" },
171         { Opt_forcemandatorylock, "forcemandatorylock" },
172         { Opt_forcemandatorylock, "forcemand" },
173         { Opt_setuids, "setuids" },
174         { Opt_nosetuids, "nosetuids" },
175         { Opt_setuidfromacl, "idsfromsid" },
176         { Opt_dynperm, "dynperm" },
177         { Opt_nodynperm, "nodynperm" },
178         { Opt_nohard, "nohard" },
179         { Opt_nosoft, "nosoft" },
180         { Opt_nointr, "nointr" },
181         { Opt_intr, "intr" },
182         { Opt_nostrictsync, "nostrictsync" },
183         { Opt_strictsync, "strictsync" },
184         { Opt_serverino, "serverino" },
185         { Opt_noserverino, "noserverino" },
186         { Opt_rwpidforward, "rwpidforward" },
187         { Opt_modesid, "modefromsid" },
188         { Opt_cifsacl, "cifsacl" },
189         { Opt_nocifsacl, "nocifsacl" },
190         { Opt_acl, "acl" },
191         { Opt_noacl, "noacl" },
192         { Opt_locallease, "locallease" },
193         { Opt_sign, "sign" },
194         { Opt_ignore_signature, "signloosely" },
195         { Opt_seal, "seal" },
196         { Opt_noac, "noac" },
197         { Opt_fsc, "fsc" },
198         { Opt_mfsymlinks, "mfsymlinks" },
199         { Opt_multiuser, "multiuser" },
200         { Opt_sloppy, "sloppy" },
201         { Opt_nosharesock, "nosharesock" },
202         { Opt_persistent, "persistenthandles"},
203         { Opt_nopersistent, "nopersistenthandles"},
204         { Opt_resilient, "resilienthandles"},
205         { Opt_noresilient, "noresilienthandles"},
206         { Opt_domainauto, "domainauto"},
207         { Opt_rdma, "rdma"},
208         { Opt_multichannel, "multichannel" },
209         { Opt_nomultichannel, "nomultichannel" },
210
211         { Opt_backupuid, "backupuid=%s" },
212         { Opt_backupgid, "backupgid=%s" },
213         { Opt_uid, "uid=%s" },
214         { Opt_cruid, "cruid=%s" },
215         { Opt_gid, "gid=%s" },
216         { Opt_file_mode, "file_mode=%s" },
217         { Opt_dirmode, "dirmode=%s" },
218         { Opt_dirmode, "dir_mode=%s" },
219         { Opt_port, "port=%s" },
220         { Opt_min_enc_offload, "esize=%s" },
221         { Opt_blocksize, "bsize=%s" },
222         { Opt_rsize, "rsize=%s" },
223         { Opt_wsize, "wsize=%s" },
224         { Opt_actimeo, "actimeo=%s" },
225         { Opt_handletimeout, "handletimeout=%s" },
226         { Opt_echo_interval, "echo_interval=%s" },
227         { Opt_max_credits, "max_credits=%s" },
228         { Opt_snapshot, "snapshot=%s" },
229         { Opt_max_channels, "max_channels=%s" },
230         { Opt_compress, "compress=%s" },
231
232         { Opt_blank_user, "user=" },
233         { Opt_blank_user, "username=" },
234         { Opt_user, "user=%s" },
235         { Opt_user, "username=%s" },
236         { Opt_blank_pass, "pass=" },
237         { Opt_blank_pass, "password=" },
238         { Opt_pass, "pass=%s" },
239         { Opt_pass, "password=%s" },
240         { Opt_blank_ip, "ip=" },
241         { Opt_blank_ip, "addr=" },
242         { Opt_ip, "ip=%s" },
243         { Opt_ip, "addr=%s" },
244         { Opt_ignore, "unc=%s" },
245         { Opt_ignore, "target=%s" },
246         { Opt_ignore, "path=%s" },
247         { Opt_domain, "dom=%s" },
248         { Opt_domain, "domain=%s" },
249         { Opt_domain, "workgroup=%s" },
250         { Opt_srcaddr, "srcaddr=%s" },
251         { Opt_ignore, "prefixpath=%s" },
252         { Opt_iocharset, "iocharset=%s" },
253         { Opt_netbiosname, "netbiosname=%s" },
254         { Opt_servern, "servern=%s" },
255         { Opt_ver, "ver=%s" },
256         { Opt_vers, "vers=%s" },
257         { Opt_sec, "sec=%s" },
258         { Opt_cache, "cache=%s" },
259
260         { Opt_ignore, "cred" },
261         { Opt_ignore, "credentials" },
262         { Opt_ignore, "cred=%s" },
263         { Opt_ignore, "credentials=%s" },
264         { Opt_ignore, "guest" },
265         { Opt_ignore, "rw" },
266         { Opt_ignore, "ro" },
267         { Opt_ignore, "suid" },
268         { Opt_ignore, "nosuid" },
269         { Opt_ignore, "exec" },
270         { Opt_ignore, "noexec" },
271         { Opt_ignore, "nodev" },
272         { Opt_ignore, "noauto" },
273         { Opt_ignore, "dev" },
274         { Opt_ignore, "mand" },
275         { Opt_ignore, "nomand" },
276         { Opt_ignore, "relatime" },
277         { Opt_ignore, "_netdev" },
278         { Opt_rootfs, "rootfs" },
279
280         { Opt_err, NULL }
281 };
282
283 static int ip_connect(struct TCP_Server_Info *server);
284 static int generic_ip_connect(struct TCP_Server_Info *server);
285 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
286 static void cifs_prune_tlinks(struct work_struct *work);
287 static char *extract_hostname(const char *unc);
288
289 /*
290  * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
291  * get their ip addresses changed at some point.
292  *
293  * This should be called with server->srv_mutex held.
294  */
295 #ifdef CONFIG_CIFS_DFS_UPCALL
296 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
297 {
298         int rc;
299         int len;
300         char *unc, *ipaddr = NULL;
301
302         if (!server->hostname)
303                 return -EINVAL;
304
305         len = strlen(server->hostname) + 3;
306
307         unc = kmalloc(len, GFP_KERNEL);
308         if (!unc) {
309                 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
310                 return -ENOMEM;
311         }
312         scnprintf(unc, len, "\\\\%s", server->hostname);
313
314         rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
315         kfree(unc);
316
317         if (rc < 0) {
318                 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
319                          __func__, server->hostname, rc);
320                 return rc;
321         }
322
323         spin_lock(&cifs_tcp_ses_lock);
324         rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
325                                   strlen(ipaddr));
326         spin_unlock(&cifs_tcp_ses_lock);
327         kfree(ipaddr);
328
329         return !rc ? -1 : 0;
330 }
331 #else
332 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
333 {
334         return 0;
335 }
336 #endif
337
338 #ifdef CONFIG_CIFS_DFS_UPCALL
339 /* These functions must be called with server->srv_mutex held */
340 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
341                                        struct cifs_sb_info *cifs_sb,
342                                        struct dfs_cache_tgt_list *tgt_list,
343                                        struct dfs_cache_tgt_iterator **tgt_it)
344 {
345         const char *name;
346
347         if (!cifs_sb || !cifs_sb->origin_fullpath)
348                 return;
349
350         if (!*tgt_it) {
351                 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
352         } else {
353                 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
354                 if (!*tgt_it)
355                         *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
356         }
357
358         cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
359
360         name = dfs_cache_get_tgt_name(*tgt_it);
361
362         kfree(server->hostname);
363
364         server->hostname = extract_hostname(name);
365         if (IS_ERR(server->hostname)) {
366                 cifs_dbg(FYI,
367                          "%s: failed to extract hostname from target: %ld\n",
368                          __func__, PTR_ERR(server->hostname));
369         }
370 }
371
372 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
373                                            struct dfs_cache_tgt_list *tl)
374 {
375         if (!cifs_sb->origin_fullpath)
376                 return -EOPNOTSUPP;
377         return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
378 }
379 #endif
380
381 /*
382  * cifs tcp session reconnection
383  *
384  * mark tcp session as reconnecting so temporarily locked
385  * mark all smb sessions as reconnecting for tcp session
386  * reconnect tcp session
387  * wake up waiters on reconnection? - (not needed currently)
388  */
389 int
390 cifs_reconnect(struct TCP_Server_Info *server)
391 {
392         int rc = 0;
393         struct list_head *tmp, *tmp2;
394         struct cifs_ses *ses;
395         struct cifs_tcon *tcon;
396         struct mid_q_entry *mid_entry;
397         struct list_head retry_list;
398 #ifdef CONFIG_CIFS_DFS_UPCALL
399         struct super_block *sb = NULL;
400         struct cifs_sb_info *cifs_sb = NULL;
401         struct dfs_cache_tgt_list tgt_list = {0};
402         struct dfs_cache_tgt_iterator *tgt_it = NULL;
403 #endif
404
405         spin_lock(&GlobalMid_Lock);
406         server->nr_targets = 1;
407 #ifdef CONFIG_CIFS_DFS_UPCALL
408         spin_unlock(&GlobalMid_Lock);
409         sb = cifs_get_tcp_super(server);
410         if (IS_ERR(sb)) {
411                 rc = PTR_ERR(sb);
412                 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
413                          __func__, rc);
414                 sb = NULL;
415         } else {
416                 cifs_sb = CIFS_SB(sb);
417                 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
418                 if (rc) {
419                         cifs_sb = NULL;
420                         if (rc != -EOPNOTSUPP) {
421                                 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
422                                                 __func__);
423                         }
424                 } else {
425                         server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
426                 }
427         }
428         cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
429                  server->nr_targets);
430         spin_lock(&GlobalMid_Lock);
431 #endif
432         if (server->tcpStatus == CifsExiting) {
433                 /* the demux thread will exit normally
434                 next time through the loop */
435                 spin_unlock(&GlobalMid_Lock);
436 #ifdef CONFIG_CIFS_DFS_UPCALL
437                 dfs_cache_free_tgts(&tgt_list);
438                 cifs_put_tcp_super(sb);
439 #endif
440                 wake_up(&server->response_q);
441                 return rc;
442         } else
443                 server->tcpStatus = CifsNeedReconnect;
444         spin_unlock(&GlobalMid_Lock);
445         server->maxBuf = 0;
446         server->max_read = 0;
447
448         cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
449         trace_smb3_reconnect(server->CurrentMid, server->hostname);
450
451         /* before reconnecting the tcp session, mark the smb session (uid)
452                 and the tid bad so they are not used until reconnected */
453         cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
454                  __func__);
455         spin_lock(&cifs_tcp_ses_lock);
456         list_for_each(tmp, &server->smb_ses_list) {
457                 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
458                 ses->need_reconnect = true;
459                 list_for_each(tmp2, &ses->tcon_list) {
460                         tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
461                         tcon->need_reconnect = true;
462                 }
463                 if (ses->tcon_ipc)
464                         ses->tcon_ipc->need_reconnect = true;
465         }
466         spin_unlock(&cifs_tcp_ses_lock);
467
468         /* do not want to be sending data on a socket we are freeing */
469         cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
470         mutex_lock(&server->srv_mutex);
471         if (server->ssocket) {
472                 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
473                          server->ssocket->state, server->ssocket->flags);
474                 kernel_sock_shutdown(server->ssocket, SHUT_WR);
475                 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
476                          server->ssocket->state, server->ssocket->flags);
477                 sock_release(server->ssocket);
478                 server->ssocket = NULL;
479         }
480         server->sequence_number = 0;
481         server->session_estab = false;
482         kfree(server->session_key.response);
483         server->session_key.response = NULL;
484         server->session_key.len = 0;
485         server->lstrp = jiffies;
486
487         /* mark submitted MIDs for retry and issue callback */
488         INIT_LIST_HEAD(&retry_list);
489         cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
490         spin_lock(&GlobalMid_Lock);
491         list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
492                 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
493                 kref_get(&mid_entry->refcount);
494                 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
495                         mid_entry->mid_state = MID_RETRY_NEEDED;
496                 list_move(&mid_entry->qhead, &retry_list);
497                 mid_entry->mid_flags |= MID_DELETED;
498         }
499         spin_unlock(&GlobalMid_Lock);
500         mutex_unlock(&server->srv_mutex);
501
502         cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
503         list_for_each_safe(tmp, tmp2, &retry_list) {
504                 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
505                 list_del_init(&mid_entry->qhead);
506                 mid_entry->callback(mid_entry);
507                 cifs_mid_q_entry_release(mid_entry);
508         }
509
510         if (cifs_rdma_enabled(server)) {
511                 mutex_lock(&server->srv_mutex);
512                 smbd_destroy(server);
513                 mutex_unlock(&server->srv_mutex);
514         }
515
516         do {
517                 try_to_freeze();
518
519                 mutex_lock(&server->srv_mutex);
520 #ifdef CONFIG_CIFS_DFS_UPCALL
521                 /*
522                  * Set up next DFS target server (if any) for reconnect. If DFS
523                  * feature is disabled, then we will retry last server we
524                  * connected to before.
525                  */
526                 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
527 #endif
528                 rc = reconn_set_ipaddr(server);
529                 if (rc) {
530                         cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
531                                  __func__, rc);
532                 }
533
534                 if (cifs_rdma_enabled(server))
535                         rc = smbd_reconnect(server);
536                 else
537                         rc = generic_ip_connect(server);
538                 if (rc) {
539                         cifs_dbg(FYI, "reconnect error %d\n", rc);
540                         mutex_unlock(&server->srv_mutex);
541                         msleep(3000);
542                 } else {
543                         atomic_inc(&tcpSesReconnectCount);
544                         set_credits(server, 1);
545                         spin_lock(&GlobalMid_Lock);
546                         if (server->tcpStatus != CifsExiting)
547                                 server->tcpStatus = CifsNeedNegotiate;
548                         spin_unlock(&GlobalMid_Lock);
549                         mutex_unlock(&server->srv_mutex);
550                 }
551         } while (server->tcpStatus == CifsNeedReconnect);
552
553 #ifdef CONFIG_CIFS_DFS_UPCALL
554         if (tgt_it) {
555                 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
556                                                     tgt_it);
557                 if (rc) {
558                         cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
559                                  __func__, rc);
560                 }
561                 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
562                 if (rc) {
563                         cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
564                                  __func__, rc);
565                 }
566                 dfs_cache_free_tgts(&tgt_list);
567
568         }
569
570         cifs_put_tcp_super(sb);
571 #endif
572         if (server->tcpStatus == CifsNeedNegotiate)
573                 mod_delayed_work(cifsiod_wq, &server->echo, 0);
574
575         wake_up(&server->response_q);
576         return rc;
577 }
578
579 static void
580 cifs_echo_request(struct work_struct *work)
581 {
582         int rc;
583         struct TCP_Server_Info *server = container_of(work,
584                                         struct TCP_Server_Info, echo.work);
585         unsigned long echo_interval;
586
587         /*
588          * If we need to renegotiate, set echo interval to zero to
589          * immediately call echo service where we can renegotiate.
590          */
591         if (server->tcpStatus == CifsNeedNegotiate)
592                 echo_interval = 0;
593         else
594                 echo_interval = server->echo_interval;
595
596         /*
597          * We cannot send an echo if it is disabled.
598          * Also, no need to ping if we got a response recently.
599          */
600
601         if (server->tcpStatus == CifsNeedReconnect ||
602             server->tcpStatus == CifsExiting ||
603             server->tcpStatus == CifsNew ||
604             (server->ops->can_echo && !server->ops->can_echo(server)) ||
605             time_before(jiffies, server->lstrp + echo_interval - HZ))
606                 goto requeue_echo;
607
608         rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
609         if (rc)
610                 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
611                          server->hostname);
612
613 requeue_echo:
614         queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
615 }
616
617 static bool
618 allocate_buffers(struct TCP_Server_Info *server)
619 {
620         if (!server->bigbuf) {
621                 server->bigbuf = (char *)cifs_buf_get();
622                 if (!server->bigbuf) {
623                         cifs_server_dbg(VFS, "No memory for large SMB response\n");
624                         msleep(3000);
625                         /* retry will check if exiting */
626                         return false;
627                 }
628         } else if (server->large_buf) {
629                 /* we are reusing a dirty large buf, clear its start */
630                 memset(server->bigbuf, 0, HEADER_SIZE(server));
631         }
632
633         if (!server->smallbuf) {
634                 server->smallbuf = (char *)cifs_small_buf_get();
635                 if (!server->smallbuf) {
636                         cifs_server_dbg(VFS, "No memory for SMB response\n");
637                         msleep(1000);
638                         /* retry will check if exiting */
639                         return false;
640                 }
641                 /* beginning of smb buffer is cleared in our buf_get */
642         } else {
643                 /* if existing small buf clear beginning */
644                 memset(server->smallbuf, 0, HEADER_SIZE(server));
645         }
646
647         return true;
648 }
649
650 static bool
651 server_unresponsive(struct TCP_Server_Info *server)
652 {
653         /*
654          * We need to wait 3 echo intervals to make sure we handle such
655          * situations right:
656          * 1s  client sends a normal SMB request
657          * 2s  client gets a response
658          * 30s echo workqueue job pops, and decides we got a response recently
659          *     and don't need to send another
660          * ...
661          * 65s kernel_recvmsg times out, and we see that we haven't gotten
662          *     a response in >60s.
663          */
664         if ((server->tcpStatus == CifsGood ||
665             server->tcpStatus == CifsNeedNegotiate) &&
666             time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
667                 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
668                          (3 * server->echo_interval) / HZ);
669                 cifs_reconnect(server);
670                 return true;
671         }
672
673         return false;
674 }
675
676 static inline bool
677 zero_credits(struct TCP_Server_Info *server)
678 {
679         int val;
680
681         spin_lock(&server->req_lock);
682         val = server->credits + server->echo_credits + server->oplock_credits;
683         if (server->in_flight == 0 && val == 0) {
684                 spin_unlock(&server->req_lock);
685                 return true;
686         }
687         spin_unlock(&server->req_lock);
688         return false;
689 }
690
691 static int
692 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
693 {
694         int length = 0;
695         int total_read;
696
697         smb_msg->msg_control = NULL;
698         smb_msg->msg_controllen = 0;
699
700         for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
701                 try_to_freeze();
702
703                 /* reconnect if no credits and no requests in flight */
704                 if (zero_credits(server)) {
705                         cifs_reconnect(server);
706                         return -ECONNABORTED;
707                 }
708
709                 if (server_unresponsive(server))
710                         return -ECONNABORTED;
711                 if (cifs_rdma_enabled(server) && server->smbd_conn)
712                         length = smbd_recv(server->smbd_conn, smb_msg);
713                 else
714                         length = sock_recvmsg(server->ssocket, smb_msg, 0);
715
716                 if (server->tcpStatus == CifsExiting)
717                         return -ESHUTDOWN;
718
719                 if (server->tcpStatus == CifsNeedReconnect) {
720                         cifs_reconnect(server);
721                         return -ECONNABORTED;
722                 }
723
724                 if (length == -ERESTARTSYS ||
725                     length == -EAGAIN ||
726                     length == -EINTR) {
727                         /*
728                          * Minimum sleep to prevent looping, allowing socket
729                          * to clear and app threads to set tcpStatus
730                          * CifsNeedReconnect if server hung.
731                          */
732                         usleep_range(1000, 2000);
733                         length = 0;
734                         continue;
735                 }
736
737                 if (length <= 0) {
738                         cifs_dbg(FYI, "Received no data or error: %d\n", length);
739                         cifs_reconnect(server);
740                         return -ECONNABORTED;
741                 }
742         }
743         return total_read;
744 }
745
746 int
747 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
748                       unsigned int to_read)
749 {
750         struct msghdr smb_msg;
751         struct kvec iov = {.iov_base = buf, .iov_len = to_read};
752         iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
753
754         return cifs_readv_from_socket(server, &smb_msg);
755 }
756
757 int
758 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
759         unsigned int page_offset, unsigned int to_read)
760 {
761         struct msghdr smb_msg;
762         struct bio_vec bv = {
763                 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
764         iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
765         return cifs_readv_from_socket(server, &smb_msg);
766 }
767
768 static bool
769 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
770 {
771         /*
772          * The first byte big endian of the length field,
773          * is actually not part of the length but the type
774          * with the most common, zero, as regular data.
775          */
776         switch (type) {
777         case RFC1002_SESSION_MESSAGE:
778                 /* Regular SMB response */
779                 return true;
780         case RFC1002_SESSION_KEEP_ALIVE:
781                 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
782                 break;
783         case RFC1002_POSITIVE_SESSION_RESPONSE:
784                 cifs_dbg(FYI, "RFC 1002 positive session response\n");
785                 break;
786         case RFC1002_NEGATIVE_SESSION_RESPONSE:
787                 /*
788                  * We get this from Windows 98 instead of an error on
789                  * SMB negprot response.
790                  */
791                 cifs_dbg(FYI, "RFC 1002 negative session response\n");
792                 /* give server a second to clean up */
793                 msleep(1000);
794                 /*
795                  * Always try 445 first on reconnect since we get NACK
796                  * on some if we ever connected to port 139 (the NACK
797                  * is since we do not begin with RFC1001 session
798                  * initialize frame).
799                  */
800                 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
801                 cifs_reconnect(server);
802                 break;
803         default:
804                 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
805                 cifs_reconnect(server);
806         }
807
808         return false;
809 }
810
811 void
812 dequeue_mid(struct mid_q_entry *mid, bool malformed)
813 {
814 #ifdef CONFIG_CIFS_STATS2
815         mid->when_received = jiffies;
816 #endif
817         spin_lock(&GlobalMid_Lock);
818         if (!malformed)
819                 mid->mid_state = MID_RESPONSE_RECEIVED;
820         else
821                 mid->mid_state = MID_RESPONSE_MALFORMED;
822         /*
823          * Trying to handle/dequeue a mid after the send_recv()
824          * function has finished processing it is a bug.
825          */
826         if (mid->mid_flags & MID_DELETED)
827                 pr_warn_once("trying to dequeue a deleted mid\n");
828         else {
829                 list_del_init(&mid->qhead);
830                 mid->mid_flags |= MID_DELETED;
831         }
832         spin_unlock(&GlobalMid_Lock);
833 }
834
835 static unsigned int
836 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
837 {
838         struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
839
840         /*
841          * SMB1 does not use credits.
842          */
843         if (server->vals->header_preamble_size)
844                 return 0;
845
846         return le16_to_cpu(shdr->CreditRequest);
847 }
848
849 static void
850 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
851            char *buf, int malformed)
852 {
853         if (server->ops->check_trans2 &&
854             server->ops->check_trans2(mid, server, buf, malformed))
855                 return;
856         mid->credits_received = smb2_get_credits_from_hdr(buf, server);
857         mid->resp_buf = buf;
858         mid->large_buf = server->large_buf;
859         /* Was previous buf put in mpx struct for multi-rsp? */
860         if (!mid->multiRsp) {
861                 /* smb buffer will be freed by user thread */
862                 if (server->large_buf)
863                         server->bigbuf = NULL;
864                 else
865                         server->smallbuf = NULL;
866         }
867         dequeue_mid(mid, malformed);
868 }
869
870 static void clean_demultiplex_info(struct TCP_Server_Info *server)
871 {
872         int length;
873
874         /* take it off the list, if it's not already */
875         spin_lock(&cifs_tcp_ses_lock);
876         list_del_init(&server->tcp_ses_list);
877         spin_unlock(&cifs_tcp_ses_lock);
878
879         spin_lock(&GlobalMid_Lock);
880         server->tcpStatus = CifsExiting;
881         spin_unlock(&GlobalMid_Lock);
882         wake_up_all(&server->response_q);
883
884         /* check if we have blocked requests that need to free */
885         spin_lock(&server->req_lock);
886         if (server->credits <= 0)
887                 server->credits = 1;
888         spin_unlock(&server->req_lock);
889         /*
890          * Although there should not be any requests blocked on this queue it
891          * can not hurt to be paranoid and try to wake up requests that may
892          * haven been blocked when more than 50 at time were on the wire to the
893          * same server - they now will see the session is in exit state and get
894          * out of SendReceive.
895          */
896         wake_up_all(&server->request_q);
897         /* give those requests time to exit */
898         msleep(125);
899         if (cifs_rdma_enabled(server))
900                 smbd_destroy(server);
901         if (server->ssocket) {
902                 sock_release(server->ssocket);
903                 server->ssocket = NULL;
904         }
905
906         if (!list_empty(&server->pending_mid_q)) {
907                 struct list_head dispose_list;
908                 struct mid_q_entry *mid_entry;
909                 struct list_head *tmp, *tmp2;
910
911                 INIT_LIST_HEAD(&dispose_list);
912                 spin_lock(&GlobalMid_Lock);
913                 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
914                         mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
915                         cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
916                         kref_get(&mid_entry->refcount);
917                         mid_entry->mid_state = MID_SHUTDOWN;
918                         list_move(&mid_entry->qhead, &dispose_list);
919                         mid_entry->mid_flags |= MID_DELETED;
920                 }
921                 spin_unlock(&GlobalMid_Lock);
922
923                 /* now walk dispose list and issue callbacks */
924                 list_for_each_safe(tmp, tmp2, &dispose_list) {
925                         mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
926                         cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
927                         list_del_init(&mid_entry->qhead);
928                         mid_entry->callback(mid_entry);
929                         cifs_mid_q_entry_release(mid_entry);
930                 }
931                 /* 1/8th of sec is more than enough time for them to exit */
932                 msleep(125);
933         }
934
935         if (!list_empty(&server->pending_mid_q)) {
936                 /*
937                  * mpx threads have not exited yet give them at least the smb
938                  * send timeout time for long ops.
939                  *
940                  * Due to delays on oplock break requests, we need to wait at
941                  * least 45 seconds before giving up on a request getting a
942                  * response and going ahead and killing cifsd.
943                  */
944                 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
945                 msleep(46000);
946                 /*
947                  * If threads still have not exited they are probably never
948                  * coming home not much else we can do but free the memory.
949                  */
950         }
951
952         kfree(server->hostname);
953         kfree(server);
954
955         length = atomic_dec_return(&tcpSesAllocCount);
956         if (length > 0)
957                 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
958 }
959
960 static int
961 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
962 {
963         int length;
964         char *buf = server->smallbuf;
965         unsigned int pdu_length = server->pdu_size;
966
967         /* make sure this will fit in a large buffer */
968         if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
969                 server->vals->header_preamble_size) {
970                 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
971                 cifs_reconnect(server);
972                 return -ECONNABORTED;
973         }
974
975         /* switch to large buffer if too big for a small one */
976         if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
977                 server->large_buf = true;
978                 memcpy(server->bigbuf, buf, server->total_read);
979                 buf = server->bigbuf;
980         }
981
982         /* now read the rest */
983         length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
984                                        pdu_length - HEADER_SIZE(server) + 1
985                                        + server->vals->header_preamble_size);
986
987         if (length < 0)
988                 return length;
989         server->total_read += length;
990
991         dump_smb(buf, server->total_read);
992
993         return cifs_handle_standard(server, mid);
994 }
995
996 int
997 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
998 {
999         char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1000         int length;
1001
1002         /*
1003          * We know that we received enough to get to the MID as we
1004          * checked the pdu_length earlier. Now check to see
1005          * if the rest of the header is OK. We borrow the length
1006          * var for the rest of the loop to avoid a new stack var.
1007          *
1008          * 48 bytes is enough to display the header and a little bit
1009          * into the payload for debugging purposes.
1010          */
1011         length = server->ops->check_message(buf, server->total_read, server);
1012         if (length != 0)
1013                 cifs_dump_mem("Bad SMB: ", buf,
1014                         min_t(unsigned int, server->total_read, 48));
1015
1016         if (server->ops->is_session_expired &&
1017             server->ops->is_session_expired(buf)) {
1018                 cifs_reconnect(server);
1019                 return -1;
1020         }
1021
1022         if (server->ops->is_status_pending &&
1023             server->ops->is_status_pending(buf, server))
1024                 return -1;
1025
1026         if (!mid)
1027                 return length;
1028
1029         handle_mid(mid, server, buf, length);
1030         return 0;
1031 }
1032
1033 static void
1034 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1035 {
1036         struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1037
1038         /*
1039          * SMB1 does not use credits.
1040          */
1041         if (server->vals->header_preamble_size)
1042                 return;
1043
1044         if (shdr->CreditRequest) {
1045                 spin_lock(&server->req_lock);
1046                 server->credits += le16_to_cpu(shdr->CreditRequest);
1047                 spin_unlock(&server->req_lock);
1048                 wake_up(&server->request_q);
1049         }
1050 }
1051
1052
1053 static int
1054 cifs_demultiplex_thread(void *p)
1055 {
1056         int i, num_mids, length;
1057         struct TCP_Server_Info *server = p;
1058         unsigned int pdu_length;
1059         unsigned int next_offset;
1060         char *buf = NULL;
1061         struct task_struct *task_to_wake = NULL;
1062         struct mid_q_entry *mids[MAX_COMPOUND];
1063         char *bufs[MAX_COMPOUND];
1064         unsigned int noreclaim_flag, num_io_timeout = 0;
1065
1066         noreclaim_flag = memalloc_noreclaim_save();
1067         cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1068
1069         length = atomic_inc_return(&tcpSesAllocCount);
1070         if (length > 1)
1071                 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1072
1073         set_freezable();
1074         allow_kernel_signal(SIGKILL);
1075         while (server->tcpStatus != CifsExiting) {
1076                 if (try_to_freeze())
1077                         continue;
1078
1079                 if (!allocate_buffers(server))
1080                         continue;
1081
1082                 server->large_buf = false;
1083                 buf = server->smallbuf;
1084                 pdu_length = 4; /* enough to get RFC1001 header */
1085
1086                 length = cifs_read_from_socket(server, buf, pdu_length);
1087                 if (length < 0)
1088                         continue;
1089
1090                 if (server->vals->header_preamble_size == 0)
1091                         server->total_read = 0;
1092                 else
1093                         server->total_read = length;
1094
1095                 /*
1096                  * The right amount was read from socket - 4 bytes,
1097                  * so we can now interpret the length field.
1098                  */
1099                 pdu_length = get_rfc1002_length(buf);
1100
1101                 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1102                 if (!is_smb_response(server, buf[0]))
1103                         continue;
1104 next_pdu:
1105                 server->pdu_size = pdu_length;
1106
1107                 /* make sure we have enough to get to the MID */
1108                 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1109                     server->vals->header_preamble_size) {
1110                         cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1111                                  server->pdu_size);
1112                         cifs_reconnect(server);
1113                         continue;
1114                 }
1115
1116                 /* read down to the MID */
1117                 length = cifs_read_from_socket(server,
1118                              buf + server->vals->header_preamble_size,
1119                              HEADER_SIZE(server) - 1
1120                              - server->vals->header_preamble_size);
1121                 if (length < 0)
1122                         continue;
1123                 server->total_read += length;
1124
1125                 if (server->ops->next_header) {
1126                         next_offset = server->ops->next_header(buf);
1127                         if (next_offset)
1128                                 server->pdu_size = next_offset;
1129                 }
1130
1131                 memset(mids, 0, sizeof(mids));
1132                 memset(bufs, 0, sizeof(bufs));
1133                 num_mids = 0;
1134
1135                 if (server->ops->is_transform_hdr &&
1136                     server->ops->receive_transform &&
1137                     server->ops->is_transform_hdr(buf)) {
1138                         length = server->ops->receive_transform(server,
1139                                                                 mids,
1140                                                                 bufs,
1141                                                                 &num_mids);
1142                 } else {
1143                         mids[0] = server->ops->find_mid(server, buf);
1144                         bufs[0] = buf;
1145                         num_mids = 1;
1146
1147                         if (!mids[0] || !mids[0]->receive)
1148                                 length = standard_receive3(server, mids[0]);
1149                         else
1150                                 length = mids[0]->receive(server, mids[0]);
1151                 }
1152
1153                 if (length < 0) {
1154                         for (i = 0; i < num_mids; i++)
1155                                 if (mids[i])
1156                                         cifs_mid_q_entry_release(mids[i]);
1157                         continue;
1158                 }
1159
1160                 if (server->ops->is_status_io_timeout &&
1161                     server->ops->is_status_io_timeout(buf)) {
1162                         num_io_timeout++;
1163                         if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
1164                                 cifs_reconnect(server);
1165                                 num_io_timeout = 0;
1166                                 continue;
1167                         }
1168                 }
1169
1170                 server->lstrp = jiffies;
1171
1172                 for (i = 0; i < num_mids; i++) {
1173                         if (mids[i] != NULL) {
1174                                 mids[i]->resp_buf_size = server->pdu_size;
1175
1176                                 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1177                                         mids[i]->callback(mids[i]);
1178
1179                                 cifs_mid_q_entry_release(mids[i]);
1180                         } else if (server->ops->is_oplock_break &&
1181                                    server->ops->is_oplock_break(bufs[i],
1182                                                                 server)) {
1183                                 smb2_add_credits_from_hdr(bufs[i], server);
1184                                 cifs_dbg(FYI, "Received oplock break\n");
1185                         } else {
1186                                 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1187                                                 atomic_read(&midCount));
1188                                 cifs_dump_mem("Received Data is: ", bufs[i],
1189                                               HEADER_SIZE(server));
1190                                 smb2_add_credits_from_hdr(bufs[i], server);
1191 #ifdef CONFIG_CIFS_DEBUG2
1192                                 if (server->ops->dump_detail)
1193                                         server->ops->dump_detail(bufs[i],
1194                                                                  server);
1195                                 cifs_dump_mids(server);
1196 #endif /* CIFS_DEBUG2 */
1197                         }
1198                 }
1199
1200                 if (pdu_length > server->pdu_size) {
1201                         if (!allocate_buffers(server))
1202                                 continue;
1203                         pdu_length -= server->pdu_size;
1204                         server->total_read = 0;
1205                         server->large_buf = false;
1206                         buf = server->smallbuf;
1207                         goto next_pdu;
1208                 }
1209         } /* end while !EXITING */
1210
1211         /* buffer usually freed in free_mid - need to free it here on exit */
1212         cifs_buf_release(server->bigbuf);
1213         if (server->smallbuf) /* no sense logging a debug message if NULL */
1214                 cifs_small_buf_release(server->smallbuf);
1215
1216         task_to_wake = xchg(&server->tsk, NULL);
1217         clean_demultiplex_info(server);
1218
1219         /* if server->tsk was NULL then wait for a signal before exiting */
1220         if (!task_to_wake) {
1221                 set_current_state(TASK_INTERRUPTIBLE);
1222                 while (!signal_pending(current)) {
1223                         schedule();
1224                         set_current_state(TASK_INTERRUPTIBLE);
1225                 }
1226                 set_current_state(TASK_RUNNING);
1227         }
1228
1229         memalloc_noreclaim_restore(noreclaim_flag);
1230         module_put_and_exit(0);
1231 }
1232
1233 /* extract the host portion of the UNC string */
1234 static char *
1235 extract_hostname(const char *unc)
1236 {
1237         const char *src;
1238         char *dst, *delim;
1239         unsigned int len;
1240
1241         /* skip double chars at beginning of string */
1242         /* BB: check validity of these bytes? */
1243         if (strlen(unc) < 3)
1244                 return ERR_PTR(-EINVAL);
1245         for (src = unc; *src && *src == '\\'; src++)
1246                 ;
1247         if (!*src)
1248                 return ERR_PTR(-EINVAL);
1249
1250         /* delimiter between hostname and sharename is always '\\' now */
1251         delim = strchr(src, '\\');
1252         if (!delim)
1253                 return ERR_PTR(-EINVAL);
1254
1255         len = delim - src;
1256         dst = kmalloc((len + 1), GFP_KERNEL);
1257         if (dst == NULL)
1258                 return ERR_PTR(-ENOMEM);
1259
1260         memcpy(dst, src, len);
1261         dst[len] = '\0';
1262
1263         return dst;
1264 }
1265
1266 static int get_option_ul(substring_t args[], unsigned long *option)
1267 {
1268         int rc;
1269         char *string;
1270
1271         string = match_strdup(args);
1272         if (string == NULL)
1273                 return -ENOMEM;
1274         rc = kstrtoul(string, 0, option);
1275         kfree(string);
1276
1277         return rc;
1278 }
1279
1280 static int get_option_uid(substring_t args[], kuid_t *result)
1281 {
1282         unsigned long value;
1283         kuid_t uid;
1284         int rc;
1285
1286         rc = get_option_ul(args, &value);
1287         if (rc)
1288                 return rc;
1289
1290         uid = make_kuid(current_user_ns(), value);
1291         if (!uid_valid(uid))
1292                 return -EINVAL;
1293
1294         *result = uid;
1295         return 0;
1296 }
1297
1298 static int get_option_gid(substring_t args[], kgid_t *result)
1299 {
1300         unsigned long value;
1301         kgid_t gid;
1302         int rc;
1303
1304         rc = get_option_ul(args, &value);
1305         if (rc)
1306                 return rc;
1307
1308         gid = make_kgid(current_user_ns(), value);
1309         if (!gid_valid(gid))
1310                 return -EINVAL;
1311
1312         *result = gid;
1313         return 0;
1314 }
1315
1316 /*
1317  * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1318  * fields with the result. Returns 0 on success and an error otherwise.
1319  */
1320 static int
1321 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1322 {
1323         char *pos;
1324         const char *delims = "/\\";
1325         size_t len;
1326
1327         if (unlikely(!devname || !*devname)) {
1328                 cifs_dbg(VFS, "Device name not specified\n");
1329                 return -EINVAL;
1330         }
1331
1332         /* make sure we have a valid UNC double delimiter prefix */
1333         len = strspn(devname, delims);
1334         if (len != 2)
1335                 return -EINVAL;
1336
1337         /* find delimiter between host and sharename */
1338         pos = strpbrk(devname + 2, delims);
1339         if (!pos)
1340                 return -EINVAL;
1341
1342         /* skip past delimiter */
1343         ++pos;
1344
1345         /* now go until next delimiter or end of string */
1346         len = strcspn(pos, delims);
1347
1348         /* move "pos" up to delimiter or NULL */
1349         pos += len;
1350         vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1351         if (!vol->UNC)
1352                 return -ENOMEM;
1353
1354         convert_delimiter(vol->UNC, '\\');
1355
1356         /* skip any delimiter */
1357         if (*pos == '/' || *pos == '\\')
1358                 pos++;
1359
1360         /* If pos is NULL then no prepath */
1361         if (!*pos)
1362                 return 0;
1363
1364         vol->prepath = kstrdup(pos, GFP_KERNEL);
1365         if (!vol->prepath)
1366                 return -ENOMEM;
1367
1368         return 0;
1369 }
1370
1371 static int
1372 cifs_parse_mount_options(const char *mountdata, const char *devname,
1373                          struct smb_vol *vol, bool is_smb3)
1374 {
1375         char *data, *end;
1376         char *mountdata_copy = NULL, *options;
1377         unsigned int  temp_len, i, j;
1378         char separator[2];
1379         short int override_uid = -1;
1380         short int override_gid = -1;
1381         bool uid_specified = false;
1382         bool gid_specified = false;
1383         bool sloppy = false;
1384         char *invalid = NULL;
1385         char *nodename = utsname()->nodename;
1386         char *string = NULL;
1387         char *tmp_end, *value;
1388         char delim;
1389         bool got_ip = false;
1390         bool got_version = false;
1391         unsigned short port = 0;
1392         struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1393
1394         separator[0] = ',';
1395         separator[1] = 0;
1396         delim = separator[0];
1397
1398         /* ensure we always start with zeroed-out smb_vol */
1399         memset(vol, 0, sizeof(*vol));
1400
1401         /*
1402          * does not have to be perfect mapping since field is
1403          * informational, only used for servers that do not support
1404          * port 445 and it can be overridden at mount time
1405          */
1406         memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1407         for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1408                 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1409
1410         vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1411         /* null target name indicates to use *SMBSERVR default called name
1412            if we end up sending RFC1001 session initialize */
1413         vol->target_rfc1001_name[0] = 0;
1414         vol->cred_uid = current_uid();
1415         vol->linux_uid = current_uid();
1416         vol->linux_gid = current_gid();
1417         vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1418         /*
1419          * default to SFM style remapping of seven reserved characters
1420          * unless user overrides it or we negotiate CIFS POSIX where
1421          * it is unnecessary.  Can not simultaneously use more than one mapping
1422          * since then readdir could list files that open could not open
1423          */
1424         vol->remap = true;
1425
1426         /* default to only allowing write access to owner of the mount */
1427         vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1428
1429         /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1430         /* default is always to request posix paths. */
1431         vol->posix_paths = 1;
1432         /* default to using server inode numbers where available */
1433         vol->server_ino = 1;
1434
1435         /* default is to use strict cifs caching semantics */
1436         vol->strict_io = true;
1437
1438         vol->actimeo = CIFS_DEF_ACTIMEO;
1439
1440         /* Most clients set timeout to 0, allows server to use its default */
1441         vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1442
1443         /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1444         vol->ops = &smb30_operations;
1445         vol->vals = &smbdefault_values;
1446
1447         vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1448
1449         /* default to no multichannel (single server connection) */
1450         vol->multichannel = false;
1451         vol->max_channels = 1;
1452
1453         if (!mountdata)
1454                 goto cifs_parse_mount_err;
1455
1456         mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1457         if (!mountdata_copy)
1458                 goto cifs_parse_mount_err;
1459
1460         options = mountdata_copy;
1461         end = options + strlen(options);
1462
1463         if (strncmp(options, "sep=", 4) == 0) {
1464                 if (options[4] != 0) {
1465                         separator[0] = options[4];
1466                         options += 5;
1467                 } else {
1468                         cifs_dbg(FYI, "Null separator not allowed\n");
1469                 }
1470         }
1471         vol->backupuid_specified = false; /* no backup intent for a user */
1472         vol->backupgid_specified = false; /* no backup intent for a group */
1473
1474         switch (cifs_parse_devname(devname, vol)) {
1475         case 0:
1476                 break;
1477         case -ENOMEM:
1478                 cifs_dbg(VFS, "Unable to allocate memory for devname\n");
1479                 goto cifs_parse_mount_err;
1480         case -EINVAL:
1481                 cifs_dbg(VFS, "Malformed UNC in devname\n");
1482                 goto cifs_parse_mount_err;
1483         default:
1484                 cifs_dbg(VFS, "Unknown error parsing devname\n");
1485                 goto cifs_parse_mount_err;
1486         }
1487
1488         while ((data = strsep(&options, separator)) != NULL) {
1489                 substring_t args[MAX_OPT_ARGS];
1490                 unsigned long option;
1491                 int token;
1492
1493                 if (!*data)
1494                         continue;
1495
1496                 token = match_token(data, cifs_mount_option_tokens, args);
1497
1498                 switch (token) {
1499
1500                 /* Ingnore the following */
1501                 case Opt_ignore:
1502                         break;
1503
1504                 /* Boolean values */
1505                 case Opt_user_xattr:
1506                         vol->no_xattr = 0;
1507                         break;
1508                 case Opt_nouser_xattr:
1509                         vol->no_xattr = 1;
1510                         break;
1511                 case Opt_forceuid:
1512                         override_uid = 1;
1513                         break;
1514                 case Opt_noforceuid:
1515                         override_uid = 0;
1516                         break;
1517                 case Opt_forcegid:
1518                         override_gid = 1;
1519                         break;
1520                 case Opt_noforcegid:
1521                         override_gid = 0;
1522                         break;
1523                 case Opt_noblocksend:
1524                         vol->noblocksnd = 1;
1525                         break;
1526                 case Opt_noautotune:
1527                         vol->noautotune = 1;
1528                         break;
1529                 case Opt_nolease:
1530                         vol->no_lease = 1;
1531                         break;
1532                 case Opt_hard:
1533                         vol->retry = 1;
1534                         break;
1535                 case Opt_soft:
1536                         vol->retry = 0;
1537                         break;
1538                 case Opt_perm:
1539                         vol->noperm = 0;
1540                         break;
1541                 case Opt_noperm:
1542                         vol->noperm = 1;
1543                         break;
1544                 case Opt_nodelete:
1545                         vol->nodelete = 1;
1546                         break;
1547                 case Opt_mapchars:
1548                         vol->sfu_remap = true;
1549                         vol->remap = false; /* disable SFM mapping */
1550                         break;
1551                 case Opt_nomapchars:
1552                         vol->sfu_remap = false;
1553                         break;
1554                 case Opt_mapposix:
1555                         vol->remap = true;
1556                         vol->sfu_remap = false; /* disable SFU mapping */
1557                         break;
1558                 case Opt_nomapposix:
1559                         vol->remap = false;
1560                         break;
1561                 case Opt_sfu:
1562                         vol->sfu_emul = 1;
1563                         break;
1564                 case Opt_nosfu:
1565                         vol->sfu_emul = 0;
1566                         break;
1567                 case Opt_nodfs:
1568                         vol->nodfs = 1;
1569                         break;
1570                 case Opt_rootfs:
1571 #ifdef CONFIG_CIFS_ROOT
1572                         vol->rootfs = true;
1573 #endif
1574                         break;
1575                 case Opt_posixpaths:
1576                         vol->posix_paths = 1;
1577                         break;
1578                 case Opt_noposixpaths:
1579                         vol->posix_paths = 0;
1580                         break;
1581                 case Opt_nounix:
1582                         if (vol->linux_ext)
1583                                 cifs_dbg(VFS,
1584                                         "conflicting unix mount options\n");
1585                         vol->no_linux_ext = 1;
1586                         break;
1587                 case Opt_unix:
1588                         if (vol->no_linux_ext)
1589                                 cifs_dbg(VFS,
1590                                         "conflicting unix mount options\n");
1591                         vol->linux_ext = 1;
1592                         break;
1593                 case Opt_nocase:
1594                         vol->nocase = 1;
1595                         break;
1596                 case Opt_brl:
1597                         vol->nobrl =  0;
1598                         break;
1599                 case Opt_nobrl:
1600                         vol->nobrl =  1;
1601                         /*
1602                          * turn off mandatory locking in mode
1603                          * if remote locking is turned off since the
1604                          * local vfs will do advisory
1605                          */
1606                         if (vol->file_mode ==
1607                                 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1608                                 vol->file_mode = S_IALLUGO;
1609                         break;
1610                 case Opt_nohandlecache:
1611                         vol->nohandlecache = 1;
1612                         break;
1613                 case Opt_handlecache:
1614                         vol->nohandlecache = 0;
1615                         break;
1616                 case Opt_forcemandatorylock:
1617                         vol->mand_lock = 1;
1618                         break;
1619                 case Opt_setuids:
1620                         vol->setuids = 1;
1621                         break;
1622                 case Opt_nosetuids:
1623                         vol->setuids = 0;
1624                         break;
1625                 case Opt_setuidfromacl:
1626                         vol->setuidfromacl = 1;
1627                         break;
1628                 case Opt_dynperm:
1629                         vol->dynperm = true;
1630                         break;
1631                 case Opt_nodynperm:
1632                         vol->dynperm = false;
1633                         break;
1634                 case Opt_nohard:
1635                         vol->retry = 0;
1636                         break;
1637                 case Opt_nosoft:
1638                         vol->retry = 1;
1639                         break;
1640                 case Opt_nointr:
1641                         vol->intr = 0;
1642                         break;
1643                 case Opt_intr:
1644                         vol->intr = 1;
1645                         break;
1646                 case Opt_nostrictsync:
1647                         vol->nostrictsync = 1;
1648                         break;
1649                 case Opt_strictsync:
1650                         vol->nostrictsync = 0;
1651                         break;
1652                 case Opt_serverino:
1653                         vol->server_ino = 1;
1654                         break;
1655                 case Opt_noserverino:
1656                         vol->server_ino = 0;
1657                         break;
1658                 case Opt_rwpidforward:
1659                         vol->rwpidforward = 1;
1660                         break;
1661                 case Opt_modesid:
1662                         vol->mode_ace = 1;
1663                         break;
1664                 case Opt_cifsacl:
1665                         vol->cifs_acl = 1;
1666                         break;
1667                 case Opt_nocifsacl:
1668                         vol->cifs_acl = 0;
1669                         break;
1670                 case Opt_acl:
1671                         vol->no_psx_acl = 0;
1672                         break;
1673                 case Opt_noacl:
1674                         vol->no_psx_acl = 1;
1675                         break;
1676                 case Opt_locallease:
1677                         vol->local_lease = 1;
1678                         break;
1679                 case Opt_sign:
1680                         vol->sign = true;
1681                         break;
1682                 case Opt_ignore_signature:
1683                         vol->sign = true;
1684                         vol->ignore_signature = true;
1685                         break;
1686                 case Opt_seal:
1687                         /* we do not do the following in secFlags because seal
1688                          * is a per tree connection (mount) not a per socket
1689                          * or per-smb connection option in the protocol
1690                          * vol->secFlg |= CIFSSEC_MUST_SEAL;
1691                          */
1692                         vol->seal = 1;
1693                         break;
1694                 case Opt_noac:
1695                         pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1696                         break;
1697                 case Opt_fsc:
1698 #ifndef CONFIG_CIFS_FSCACHE
1699                         cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1700                         goto cifs_parse_mount_err;
1701 #endif
1702                         vol->fsc = true;
1703                         break;
1704                 case Opt_mfsymlinks:
1705                         vol->mfsymlinks = true;
1706                         break;
1707                 case Opt_multiuser:
1708                         vol->multiuser = true;
1709                         break;
1710                 case Opt_sloppy:
1711                         sloppy = true;
1712                         break;
1713                 case Opt_nosharesock:
1714                         vol->nosharesock = true;
1715                         break;
1716                 case Opt_nopersistent:
1717                         vol->nopersistent = true;
1718                         if (vol->persistent) {
1719                                 cifs_dbg(VFS,
1720                                   "persistenthandles mount options conflict\n");
1721                                 goto cifs_parse_mount_err;
1722                         }
1723                         break;
1724                 case Opt_persistent:
1725                         vol->persistent = true;
1726                         if ((vol->nopersistent) || (vol->resilient)) {
1727                                 cifs_dbg(VFS,
1728                                   "persistenthandles mount options conflict\n");
1729                                 goto cifs_parse_mount_err;
1730                         }
1731                         break;
1732                 case Opt_resilient:
1733                         vol->resilient = true;
1734                         if (vol->persistent) {
1735                                 cifs_dbg(VFS,
1736                                   "persistenthandles mount options conflict\n");
1737                                 goto cifs_parse_mount_err;
1738                         }
1739                         break;
1740                 case Opt_noresilient:
1741                         vol->resilient = false; /* already the default */
1742                         break;
1743                 case Opt_domainauto:
1744                         vol->domainauto = true;
1745                         break;
1746                 case Opt_rdma:
1747                         vol->rdma = true;
1748                         break;
1749                 case Opt_multichannel:
1750                         vol->multichannel = true;
1751                         /* if number of channels not specified, default to 2 */
1752                         if (vol->max_channels < 2)
1753                                 vol->max_channels = 2;
1754                         break;
1755                 case Opt_nomultichannel:
1756                         vol->multichannel = false;
1757                         vol->max_channels = 1;
1758                         break;
1759                 case Opt_compress:
1760                         vol->compression = UNKNOWN_TYPE;
1761                         cifs_dbg(VFS,
1762                                 "SMB3 compression support is experimental\n");
1763                         break;
1764
1765                 /* Numeric Values */
1766                 case Opt_backupuid:
1767                         if (get_option_uid(args, &vol->backupuid)) {
1768                                 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1769                                          __func__);
1770                                 goto cifs_parse_mount_err;
1771                         }
1772                         vol->backupuid_specified = true;
1773                         break;
1774                 case Opt_backupgid:
1775                         if (get_option_gid(args, &vol->backupgid)) {
1776                                 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1777                                          __func__);
1778                                 goto cifs_parse_mount_err;
1779                         }
1780                         vol->backupgid_specified = true;
1781                         break;
1782                 case Opt_uid:
1783                         if (get_option_uid(args, &vol->linux_uid)) {
1784                                 cifs_dbg(VFS, "%s: Invalid uid value\n",
1785                                          __func__);
1786                                 goto cifs_parse_mount_err;
1787                         }
1788                         uid_specified = true;
1789                         break;
1790                 case Opt_cruid:
1791                         if (get_option_uid(args, &vol->cred_uid)) {
1792                                 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1793                                          __func__);
1794                                 goto cifs_parse_mount_err;
1795                         }
1796                         break;
1797                 case Opt_gid:
1798                         if (get_option_gid(args, &vol->linux_gid)) {
1799                                 cifs_dbg(VFS, "%s: Invalid gid value\n",
1800                                          __func__);
1801                                 goto cifs_parse_mount_err;
1802                         }
1803                         gid_specified = true;
1804                         break;
1805                 case Opt_file_mode:
1806                         if (get_option_ul(args, &option)) {
1807                                 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1808                                          __func__);
1809                                 goto cifs_parse_mount_err;
1810                         }
1811                         vol->file_mode = option;
1812                         break;
1813                 case Opt_dirmode:
1814                         if (get_option_ul(args, &option)) {
1815                                 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1816                                          __func__);
1817                                 goto cifs_parse_mount_err;
1818                         }
1819                         vol->dir_mode = option;
1820                         break;
1821                 case Opt_port:
1822                         if (get_option_ul(args, &option) ||
1823                             option > USHRT_MAX) {
1824                                 cifs_dbg(VFS, "%s: Invalid port value\n",
1825                                          __func__);
1826                                 goto cifs_parse_mount_err;
1827                         }
1828                         port = (unsigned short)option;
1829                         break;
1830                 case Opt_min_enc_offload:
1831                         if (get_option_ul(args, &option)) {
1832                                 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
1833                                 goto cifs_parse_mount_err;
1834                         }
1835                         vol->min_offload = option;
1836                         break;
1837                 case Opt_blocksize:
1838                         if (get_option_ul(args, &option)) {
1839                                 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
1840                                         __func__);
1841                                 goto cifs_parse_mount_err;
1842                         }
1843                         /*
1844                          * inode blocksize realistically should never need to be
1845                          * less than 16K or greater than 16M and default is 1MB.
1846                          * Note that small inode block sizes (e.g. 64K) can lead
1847                          * to very poor performance of common tools like cp and scp
1848                          */
1849                         if ((option < CIFS_MAX_MSGSIZE) ||
1850                            (option > (4 * SMB3_DEFAULT_IOSIZE))) {
1851                                 cifs_dbg(VFS, "%s: Invalid blocksize\n",
1852                                         __func__);
1853                                 goto cifs_parse_mount_err;
1854                         }
1855                         vol->bsize = option;
1856                         break;
1857                 case Opt_rsize:
1858                         if (get_option_ul(args, &option)) {
1859                                 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1860                                          __func__);
1861                                 goto cifs_parse_mount_err;
1862                         }
1863                         vol->rsize = option;
1864                         break;
1865                 case Opt_wsize:
1866                         if (get_option_ul(args, &option)) {
1867                                 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1868                                          __func__);
1869                                 goto cifs_parse_mount_err;
1870                         }
1871                         vol->wsize = option;
1872                         break;
1873                 case Opt_actimeo:
1874                         if (get_option_ul(args, &option)) {
1875                                 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1876                                          __func__);
1877                                 goto cifs_parse_mount_err;
1878                         }
1879                         vol->actimeo = HZ * option;
1880                         if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1881                                 cifs_dbg(VFS, "attribute cache timeout too large\n");
1882                                 goto cifs_parse_mount_err;
1883                         }
1884                         break;
1885                 case Opt_handletimeout:
1886                         if (get_option_ul(args, &option)) {
1887                                 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
1888                                          __func__);
1889                                 goto cifs_parse_mount_err;
1890                         }
1891                         vol->handle_timeout = option;
1892                         if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
1893                                 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
1894                                 goto cifs_parse_mount_err;
1895                         }
1896                         break;
1897                 case Opt_echo_interval:
1898                         if (get_option_ul(args, &option)) {
1899                                 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1900                                          __func__);
1901                                 goto cifs_parse_mount_err;
1902                         }
1903                         vol->echo_interval = option;
1904                         break;
1905                 case Opt_snapshot:
1906                         if (get_option_ul(args, &option)) {
1907                                 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1908                                          __func__);
1909                                 goto cifs_parse_mount_err;
1910                         }
1911                         vol->snapshot_time = option;
1912                         break;
1913                 case Opt_max_credits:
1914                         if (get_option_ul(args, &option) || (option < 20) ||
1915                             (option > 60000)) {
1916                                 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1917                                          __func__);
1918                                 goto cifs_parse_mount_err;
1919                         }
1920                         vol->max_credits = option;
1921                         break;
1922                 case Opt_max_channels:
1923                         if (get_option_ul(args, &option) || option < 1 ||
1924                                 option > CIFS_MAX_CHANNELS) {
1925                                 cifs_dbg(VFS, "%s: Invalid max_channels value, needs to be 1-%d\n",
1926                                          __func__, CIFS_MAX_CHANNELS);
1927                                 goto cifs_parse_mount_err;
1928                         }
1929                         vol->max_channels = option;
1930                         break;
1931
1932                 /* String Arguments */
1933
1934                 case Opt_blank_user:
1935                         /* null user, ie. anonymous authentication */
1936                         vol->nullauth = 1;
1937                         vol->username = NULL;
1938                         break;
1939                 case Opt_user:
1940                         string = match_strdup(args);
1941                         if (string == NULL)
1942                                 goto out_nomem;
1943
1944                         if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1945                                                         CIFS_MAX_USERNAME_LEN) {
1946                                 pr_warn("username too long\n");
1947                                 goto cifs_parse_mount_err;
1948                         }
1949
1950                         kfree(vol->username);
1951                         vol->username = kstrdup(string, GFP_KERNEL);
1952                         if (!vol->username)
1953                                 goto cifs_parse_mount_err;
1954                         break;
1955                 case Opt_blank_pass:
1956                         /* passwords have to be handled differently
1957                          * to allow the character used for deliminator
1958                          * to be passed within them
1959                          */
1960
1961                         /*
1962                          * Check if this is a case where the  password
1963                          * starts with a delimiter
1964                          */
1965                         tmp_end = strchr(data, '=');
1966                         tmp_end++;
1967                         if (!(tmp_end < end && tmp_end[1] == delim)) {
1968                                 /* No it is not. Set the password to NULL */
1969                                 kfree_sensitive(vol->password);
1970                                 vol->password = NULL;
1971                                 break;
1972                         }
1973                         fallthrough;    /* to Opt_pass below */
1974                 case Opt_pass:
1975                         /* Obtain the value string */
1976                         value = strchr(data, '=');
1977                         value++;
1978
1979                         /* Set tmp_end to end of the string */
1980                         tmp_end = (char *) value + strlen(value);
1981
1982                         /* Check if following character is the deliminator
1983                          * If yes, we have encountered a double deliminator
1984                          * reset the NULL character to the deliminator
1985                          */
1986                         if (tmp_end < end && tmp_end[1] == delim) {
1987                                 tmp_end[0] = delim;
1988
1989                                 /* Keep iterating until we get to a single
1990                                  * deliminator OR the end
1991                                  */
1992                                 while ((tmp_end = strchr(tmp_end, delim))
1993                                         != NULL && (tmp_end[1] == delim)) {
1994                                                 tmp_end = (char *) &tmp_end[2];
1995                                 }
1996
1997                                 /* Reset var options to point to next element */
1998                                 if (tmp_end) {
1999                                         tmp_end[0] = '\0';
2000                                         options = (char *) &tmp_end[1];
2001                                 } else
2002                                         /* Reached the end of the mount option
2003                                          * string */
2004                                         options = end;
2005                         }
2006
2007                         kfree_sensitive(vol->password);
2008                         /* Now build new password string */
2009                         temp_len = strlen(value);
2010                         vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2011                         if (vol->password == NULL) {
2012                                 pr_warn("no memory for password\n");
2013                                 goto cifs_parse_mount_err;
2014                         }
2015
2016                         for (i = 0, j = 0; i < temp_len; i++, j++) {
2017                                 vol->password[j] = value[i];
2018                                 if ((value[i] == delim) &&
2019                                      value[i+1] == delim)
2020                                         /* skip the second deliminator */
2021                                         i++;
2022                         }
2023                         vol->password[j] = '\0';
2024                         break;
2025                 case Opt_blank_ip:
2026                         /* FIXME: should this be an error instead? */
2027                         got_ip = false;
2028                         break;
2029                 case Opt_ip:
2030                         string = match_strdup(args);
2031                         if (string == NULL)
2032                                 goto out_nomem;
2033
2034                         if (!cifs_convert_address(dstaddr, string,
2035                                         strlen(string))) {
2036                                 pr_err("bad ip= option (%s)\n", string);
2037                                 goto cifs_parse_mount_err;
2038                         }
2039                         got_ip = true;
2040                         break;
2041                 case Opt_domain:
2042                         string = match_strdup(args);
2043                         if (string == NULL)
2044                                 goto out_nomem;
2045
2046                         if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2047                                         == CIFS_MAX_DOMAINNAME_LEN) {
2048                                 pr_warn("domain name too long\n");
2049                                 goto cifs_parse_mount_err;
2050                         }
2051
2052                         kfree(vol->domainname);
2053                         vol->domainname = kstrdup(string, GFP_KERNEL);
2054                         if (!vol->domainname) {
2055                                 pr_warn("no memory for domainname\n");
2056                                 goto cifs_parse_mount_err;
2057                         }
2058                         cifs_dbg(FYI, "Domain name set\n");
2059                         break;
2060                 case Opt_srcaddr:
2061                         string = match_strdup(args);
2062                         if (string == NULL)
2063                                 goto out_nomem;
2064
2065                         if (!cifs_convert_address(
2066                                         (struct sockaddr *)&vol->srcaddr,
2067                                         string, strlen(string))) {
2068                                 pr_warn("Could not parse srcaddr: %s\n",
2069                                         string);
2070                                 goto cifs_parse_mount_err;
2071                         }
2072                         break;
2073                 case Opt_iocharset:
2074                         string = match_strdup(args);
2075                         if (string == NULL)
2076                                 goto out_nomem;
2077
2078                         if (strnlen(string, 1024) >= 65) {
2079                                 pr_warn("iocharset name too long\n");
2080                                 goto cifs_parse_mount_err;
2081                         }
2082
2083                          if (strncasecmp(string, "default", 7) != 0) {
2084                                 kfree(vol->iocharset);
2085                                 vol->iocharset = kstrdup(string,
2086                                                          GFP_KERNEL);
2087                                 if (!vol->iocharset) {
2088                                         pr_warn("no memory for charset\n");
2089                                         goto cifs_parse_mount_err;
2090                                 }
2091                         }
2092                         /* if iocharset not set then load_nls_default
2093                          * is used by caller
2094                          */
2095                          cifs_dbg(FYI, "iocharset set to %s\n", string);
2096                         break;
2097                 case Opt_netbiosname:
2098                         string = match_strdup(args);
2099                         if (string == NULL)
2100                                 goto out_nomem;
2101
2102                         memset(vol->source_rfc1001_name, 0x20,
2103                                 RFC1001_NAME_LEN);
2104                         /*
2105                          * FIXME: are there cases in which a comma can
2106                          * be valid in workstation netbios name (and
2107                          * need special handling)?
2108                          */
2109                         for (i = 0; i < RFC1001_NAME_LEN; i++) {
2110                                 /* don't ucase netbiosname for user */
2111                                 if (string[i] == 0)
2112                                         break;
2113                                 vol->source_rfc1001_name[i] = string[i];
2114                         }
2115                         /* The string has 16th byte zero still from
2116                          * set at top of the function
2117                          */
2118                         if (i == RFC1001_NAME_LEN && string[i] != 0)
2119                                 pr_warn("netbiosname longer than 15 truncated\n");
2120                         break;
2121                 case Opt_servern:
2122                         /* servernetbiosname specified override *SMBSERVER */
2123                         string = match_strdup(args);
2124                         if (string == NULL)
2125                                 goto out_nomem;
2126
2127                         /* last byte, type, is 0x20 for servr type */
2128                         memset(vol->target_rfc1001_name, 0x20,
2129                                 RFC1001_NAME_LEN_WITH_NULL);
2130
2131                         /* BB are there cases in which a comma can be
2132                            valid in this workstation netbios name
2133                            (and need special handling)? */
2134
2135                         /* user or mount helper must uppercase the
2136                            netbios name */
2137                         for (i = 0; i < 15; i++) {
2138                                 if (string[i] == 0)
2139                                         break;
2140                                 vol->target_rfc1001_name[i] = string[i];
2141                         }
2142                         /* The string has 16th byte zero still from
2143                            set at top of the function  */
2144                         if (i == RFC1001_NAME_LEN && string[i] != 0)
2145                                 pr_warn("server netbiosname longer than 15 truncated\n");
2146                         break;
2147                 case Opt_ver:
2148                         /* version of mount userspace tools, not dialect */
2149                         string = match_strdup(args);
2150                         if (string == NULL)
2151                                 goto out_nomem;
2152
2153                         /* If interface changes in mount.cifs bump to new ver */
2154                         if (strncasecmp(string, "1", 1) == 0) {
2155                                 if (strlen(string) > 1) {
2156                                         pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
2157                                                 string);
2158                                         goto cifs_parse_mount_err;
2159                                 }
2160                                 /* This is the default */
2161                                 break;
2162                         }
2163                         /* For all other value, error */
2164                         pr_warn("Invalid mount helper version specified\n");
2165                         goto cifs_parse_mount_err;
2166                 case Opt_vers:
2167                         /* protocol version (dialect) */
2168                         string = match_strdup(args);
2169                         if (string == NULL)
2170                                 goto out_nomem;
2171
2172                         if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2173                                 goto cifs_parse_mount_err;
2174                         got_version = true;
2175                         break;
2176                 case Opt_sec:
2177                         string = match_strdup(args);
2178                         if (string == NULL)
2179                                 goto out_nomem;
2180
2181                         if (cifs_parse_security_flavors(string, vol) != 0)
2182                                 goto cifs_parse_mount_err;
2183                         break;
2184                 case Opt_cache:
2185                         string = match_strdup(args);
2186                         if (string == NULL)
2187                                 goto out_nomem;
2188
2189                         if (cifs_parse_cache_flavor(string, vol) != 0)
2190                                 goto cifs_parse_mount_err;
2191                         break;
2192                 default:
2193                         /*
2194                          * An option we don't recognize. Save it off for later
2195                          * if we haven't already found one
2196                          */
2197                         if (!invalid)
2198                                 invalid = data;
2199                         break;
2200                 }
2201                 /* Free up any allocated string */
2202                 kfree(string);
2203                 string = NULL;
2204         }
2205
2206         if (!sloppy && invalid) {
2207                 pr_err("Unknown mount option \"%s\"\n", invalid);
2208                 goto cifs_parse_mount_err;
2209         }
2210
2211         if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2212                 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2213                 goto cifs_parse_mount_err;
2214         }
2215
2216 #ifndef CONFIG_KEYS
2217         /* Muliuser mounts require CONFIG_KEYS support */
2218         if (vol->multiuser) {
2219                 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2220                 goto cifs_parse_mount_err;
2221         }
2222 #endif
2223         if (!vol->UNC) {
2224                 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2225                 goto cifs_parse_mount_err;
2226         }
2227
2228         /* make sure UNC has a share name */
2229         if (!strchr(vol->UNC + 3, '\\')) {
2230                 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2231                 goto cifs_parse_mount_err;
2232         }
2233
2234         if (!got_ip) {
2235                 int len;
2236                 const char *slash;
2237
2238                 /* No ip= option specified? Try to get it from UNC */
2239                 /* Use the address part of the UNC. */
2240                 slash = strchr(&vol->UNC[2], '\\');
2241                 len = slash - &vol->UNC[2];
2242                 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2243                         pr_err("Unable to determine destination address\n");
2244                         goto cifs_parse_mount_err;
2245                 }
2246         }
2247
2248         /* set the port that we got earlier */
2249         cifs_set_port(dstaddr, port);
2250
2251         if (uid_specified)
2252                 vol->override_uid = override_uid;
2253         else if (override_uid == 1)
2254                 pr_notice("ignoring forceuid mount option specified with no uid= option\n");
2255
2256         if (gid_specified)
2257                 vol->override_gid = override_gid;
2258         else if (override_gid == 1)
2259                 pr_notice("ignoring forcegid mount option specified with no gid= option\n");
2260
2261         if (got_version == false)
2262                 pr_warn_once("No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.\n");
2263
2264         kfree(mountdata_copy);
2265         return 0;
2266
2267 out_nomem:
2268         pr_warn("Could not allocate temporary buffer\n");
2269 cifs_parse_mount_err:
2270         kfree(string);
2271         kfree(mountdata_copy);
2272         return 1;
2273 }
2274
2275 /** Returns true if srcaddr isn't specified and rhs isn't
2276  * specified, or if srcaddr is specified and
2277  * matches the IP address of the rhs argument.
2278  */
2279 bool
2280 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
2281 {
2282         switch (srcaddr->sa_family) {
2283         case AF_UNSPEC:
2284                 return (rhs->sa_family == AF_UNSPEC);
2285         case AF_INET: {
2286                 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2287                 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2288                 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2289         }
2290         case AF_INET6: {
2291                 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2292                 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2293                 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2294         }
2295         default:
2296                 WARN_ON(1);
2297                 return false; /* don't expect to be here */
2298         }
2299 }
2300
2301 /*
2302  * If no port is specified in addr structure, we try to match with 445 port
2303  * and if it fails - with 139 ports. It should be called only if address
2304  * families of server and addr are equal.
2305  */
2306 static bool
2307 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2308 {
2309         __be16 port, *sport;
2310
2311         /* SMBDirect manages its own ports, don't match it here */
2312         if (server->rdma)
2313                 return true;
2314
2315         switch (addr->sa_family) {
2316         case AF_INET:
2317                 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2318                 port = ((struct sockaddr_in *) addr)->sin_port;
2319                 break;
2320         case AF_INET6:
2321                 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2322                 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2323                 break;
2324         default:
2325                 WARN_ON(1);
2326                 return false;
2327         }
2328
2329         if (!port) {
2330                 port = htons(CIFS_PORT);
2331                 if (port == *sport)
2332                         return true;
2333
2334                 port = htons(RFC1001_PORT);
2335         }
2336
2337         return port == *sport;
2338 }
2339
2340 static bool
2341 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2342               struct sockaddr *srcaddr)
2343 {
2344         switch (addr->sa_family) {
2345         case AF_INET: {
2346                 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2347                 struct sockaddr_in *srv_addr4 =
2348                                         (struct sockaddr_in *)&server->dstaddr;
2349
2350                 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2351                         return false;
2352                 break;
2353         }
2354         case AF_INET6: {
2355                 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2356                 struct sockaddr_in6 *srv_addr6 =
2357                                         (struct sockaddr_in6 *)&server->dstaddr;
2358
2359                 if (!ipv6_addr_equal(&addr6->sin6_addr,
2360                                      &srv_addr6->sin6_addr))
2361                         return false;
2362                 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2363                         return false;
2364                 break;
2365         }
2366         default:
2367                 WARN_ON(1);
2368                 return false; /* don't expect to be here */
2369         }
2370
2371         if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
2372                 return false;
2373
2374         return true;
2375 }
2376
2377 static bool
2378 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2379 {
2380         /*
2381          * The select_sectype function should either return the vol->sectype
2382          * that was specified, or "Unspecified" if that sectype was not
2383          * compatible with the given NEGOTIATE request.
2384          */
2385         if (server->ops->select_sectype(server, vol->sectype)
2386              == Unspecified)
2387                 return false;
2388
2389         /*
2390          * Now check if signing mode is acceptable. No need to check
2391          * global_secflags at this point since if MUST_SIGN is set then
2392          * the server->sign had better be too.
2393          */
2394         if (vol->sign && !server->sign)
2395                 return false;
2396
2397         return true;
2398 }
2399
2400 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2401 {
2402         struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2403
2404         if (vol->nosharesock)
2405                 return 0;
2406
2407         /* If multidialect negotiation see if existing sessions match one */
2408         if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2409                 if (server->vals->protocol_id < SMB30_PROT_ID)
2410                         return 0;
2411         } else if (strcmp(vol->vals->version_string,
2412                    SMBDEFAULT_VERSION_STRING) == 0) {
2413                 if (server->vals->protocol_id < SMB21_PROT_ID)
2414                         return 0;
2415         } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2416                 return 0;
2417
2418         if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2419                 return 0;
2420
2421         if (!match_address(server, addr,
2422                            (struct sockaddr *)&vol->srcaddr))
2423                 return 0;
2424
2425         if (!match_port(server, addr))
2426                 return 0;
2427
2428         if (!match_security(server, vol))
2429                 return 0;
2430
2431         if (server->echo_interval != vol->echo_interval * HZ)
2432                 return 0;
2433
2434         if (server->rdma != vol->rdma)
2435                 return 0;
2436
2437         if (server->ignore_signature != vol->ignore_signature)
2438                 return 0;
2439
2440         if (server->min_offload != vol->min_offload)
2441                 return 0;
2442
2443         return 1;
2444 }
2445
2446 struct TCP_Server_Info *
2447 cifs_find_tcp_session(struct smb_vol *vol)
2448 {
2449         struct TCP_Server_Info *server;
2450
2451         spin_lock(&cifs_tcp_ses_lock);
2452         list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2453                 /*
2454                  * Skip ses channels since they're only handled in lower layers
2455                  * (e.g. cifs_send_recv).
2456                  */
2457                 if (server->is_channel || !match_server(server, vol))
2458                         continue;
2459
2460                 ++server->srv_count;
2461                 spin_unlock(&cifs_tcp_ses_lock);
2462                 cifs_dbg(FYI, "Existing tcp session with server found\n");
2463                 return server;
2464         }
2465         spin_unlock(&cifs_tcp_ses_lock);
2466         return NULL;
2467 }
2468
2469 void
2470 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2471 {
2472         struct task_struct *task;
2473
2474         spin_lock(&cifs_tcp_ses_lock);
2475         if (--server->srv_count > 0) {
2476                 spin_unlock(&cifs_tcp_ses_lock);
2477                 return;
2478         }
2479
2480         put_net(cifs_net_ns(server));
2481
2482         list_del_init(&server->tcp_ses_list);
2483         spin_unlock(&cifs_tcp_ses_lock);
2484
2485         cancel_delayed_work_sync(&server->echo);
2486
2487         if (from_reconnect)
2488                 /*
2489                  * Avoid deadlock here: reconnect work calls
2490                  * cifs_put_tcp_session() at its end. Need to be sure
2491                  * that reconnect work does nothing with server pointer after
2492                  * that step.
2493                  */
2494                 cancel_delayed_work(&server->reconnect);
2495         else
2496                 cancel_delayed_work_sync(&server->reconnect);
2497
2498         spin_lock(&GlobalMid_Lock);
2499         server->tcpStatus = CifsExiting;
2500         spin_unlock(&GlobalMid_Lock);
2501
2502         cifs_crypto_secmech_release(server);
2503         cifs_fscache_release_client_cookie(server);
2504
2505         kfree(server->session_key.response);
2506         server->session_key.response = NULL;
2507         server->session_key.len = 0;
2508
2509         task = xchg(&server->tsk, NULL);
2510         if (task)
2511                 send_sig(SIGKILL, task, 1);
2512 }
2513
2514 struct TCP_Server_Info *
2515 cifs_get_tcp_session(struct smb_vol *volume_info)
2516 {
2517         struct TCP_Server_Info *tcp_ses = NULL;
2518         int rc;
2519
2520         cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2521
2522         /* see if we already have a matching tcp_ses */
2523         tcp_ses = cifs_find_tcp_session(volume_info);
2524         if (tcp_ses)
2525                 return tcp_ses;
2526
2527         tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2528         if (!tcp_ses) {
2529                 rc = -ENOMEM;
2530                 goto out_err;
2531         }
2532
2533         tcp_ses->ops = volume_info->ops;
2534         tcp_ses->vals = volume_info->vals;
2535         cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2536         tcp_ses->hostname = extract_hostname(volume_info->UNC);
2537         if (IS_ERR(tcp_ses->hostname)) {
2538                 rc = PTR_ERR(tcp_ses->hostname);
2539                 goto out_err_crypto_release;
2540         }
2541
2542         tcp_ses->noblockcnt = volume_info->rootfs;
2543         tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2544         tcp_ses->noautotune = volume_info->noautotune;
2545         tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2546         tcp_ses->rdma = volume_info->rdma;
2547         tcp_ses->in_flight = 0;
2548         tcp_ses->max_in_flight = 0;
2549         tcp_ses->credits = 1;
2550         init_waitqueue_head(&tcp_ses->response_q);
2551         init_waitqueue_head(&tcp_ses->request_q);
2552         INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2553         mutex_init(&tcp_ses->srv_mutex);
2554         memcpy(tcp_ses->workstation_RFC1001_name,
2555                 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2556         memcpy(tcp_ses->server_RFC1001_name,
2557                 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2558         tcp_ses->session_estab = false;
2559         tcp_ses->sequence_number = 0;
2560         tcp_ses->reconnect_instance = 1;
2561         tcp_ses->lstrp = jiffies;
2562         tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2563         spin_lock_init(&tcp_ses->req_lock);
2564         INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2565         INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2566         INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2567         INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2568         mutex_init(&tcp_ses->reconnect_mutex);
2569         memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2570                sizeof(tcp_ses->srcaddr));
2571         memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2572                 sizeof(tcp_ses->dstaddr));
2573         if (volume_info->use_client_guid)
2574                 memcpy(tcp_ses->client_guid, volume_info->client_guid,
2575                        SMB2_CLIENT_GUID_SIZE);
2576         else
2577                 generate_random_uuid(tcp_ses->client_guid);
2578         /*
2579          * at this point we are the only ones with the pointer
2580          * to the struct since the kernel thread not created yet
2581          * no need to spinlock this init of tcpStatus or srv_count
2582          */
2583         tcp_ses->tcpStatus = CifsNew;
2584         ++tcp_ses->srv_count;
2585
2586         if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2587                 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2588                 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2589         else
2590                 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2591         if (tcp_ses->rdma) {
2592 #ifndef CONFIG_CIFS_SMB_DIRECT
2593                 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2594                 rc = -ENOENT;
2595                 goto out_err_crypto_release;
2596 #endif
2597                 tcp_ses->smbd_conn = smbd_get_connection(
2598                         tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2599                 if (tcp_ses->smbd_conn) {
2600                         cifs_dbg(VFS, "RDMA transport established\n");
2601                         rc = 0;
2602                         goto smbd_connected;
2603                 } else {
2604                         rc = -ENOENT;
2605                         goto out_err_crypto_release;
2606                 }
2607         }
2608         rc = ip_connect(tcp_ses);
2609         if (rc < 0) {
2610                 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2611                 goto out_err_crypto_release;
2612         }
2613 smbd_connected:
2614         /*
2615          * since we're in a cifs function already, we know that
2616          * this will succeed. No need for try_module_get().
2617          */
2618         __module_get(THIS_MODULE);
2619         tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2620                                   tcp_ses, "cifsd");
2621         if (IS_ERR(tcp_ses->tsk)) {
2622                 rc = PTR_ERR(tcp_ses->tsk);
2623                 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2624                 module_put(THIS_MODULE);
2625                 goto out_err_crypto_release;
2626         }
2627         tcp_ses->min_offload = volume_info->min_offload;
2628         tcp_ses->tcpStatus = CifsNeedNegotiate;
2629
2630         tcp_ses->nr_targets = 1;
2631         tcp_ses->ignore_signature = volume_info->ignore_signature;
2632         /* thread spawned, put it on the list */
2633         spin_lock(&cifs_tcp_ses_lock);
2634         list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2635         spin_unlock(&cifs_tcp_ses_lock);
2636
2637         cifs_fscache_get_client_cookie(tcp_ses);
2638
2639         /* queue echo request delayed work */
2640         queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2641
2642         return tcp_ses;
2643
2644 out_err_crypto_release:
2645         cifs_crypto_secmech_release(tcp_ses);
2646
2647         put_net(cifs_net_ns(tcp_ses));
2648
2649 out_err:
2650         if (tcp_ses) {
2651                 if (!IS_ERR(tcp_ses->hostname))
2652                         kfree(tcp_ses->hostname);
2653                 if (tcp_ses->ssocket)
2654                         sock_release(tcp_ses->ssocket);
2655                 kfree(tcp_ses);
2656         }
2657         return ERR_PTR(rc);
2658 }
2659
2660 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2661 {
2662         if (vol->sectype != Unspecified &&
2663             vol->sectype != ses->sectype)
2664                 return 0;
2665
2666         /*
2667          * If an existing session is limited to less channels than
2668          * requested, it should not be reused
2669          */
2670         if (ses->chan_max < vol->max_channels)
2671                 return 0;
2672
2673         switch (ses->sectype) {
2674         case Kerberos:
2675                 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2676                         return 0;
2677                 break;
2678         default:
2679                 /* NULL username means anonymous session */
2680                 if (ses->user_name == NULL) {
2681                         if (!vol->nullauth)
2682                                 return 0;
2683                         break;
2684                 }
2685
2686                 /* anything else takes username/password */
2687                 if (strncmp(ses->user_name,
2688                             vol->username ? vol->username : "",
2689                             CIFS_MAX_USERNAME_LEN))
2690                         return 0;
2691                 if ((vol->username && strlen(vol->username) != 0) &&
2692                     ses->password != NULL &&
2693                     strncmp(ses->password,
2694                             vol->password ? vol->password : "",
2695                             CIFS_MAX_PASSWORD_LEN))
2696                         return 0;
2697         }
2698         return 1;
2699 }
2700
2701 /**
2702  * cifs_setup_ipc - helper to setup the IPC tcon for the session
2703  *
2704  * A new IPC connection is made and stored in the session
2705  * tcon_ipc. The IPC tcon has the same lifetime as the session.
2706  */
2707 static int
2708 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2709 {
2710         int rc = 0, xid;
2711         struct cifs_tcon *tcon;
2712         struct nls_table *nls_codepage;
2713         char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2714         bool seal = false;
2715         struct TCP_Server_Info *server = ses->server;
2716
2717         /*
2718          * If the mount request that resulted in the creation of the
2719          * session requires encryption, force IPC to be encrypted too.
2720          */
2721         if (volume_info->seal) {
2722                 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2723                         seal = true;
2724                 else {
2725                         cifs_server_dbg(VFS,
2726                                  "IPC: server doesn't support encryption\n");
2727                         return -EOPNOTSUPP;
2728                 }
2729         }
2730
2731         tcon = tconInfoAlloc();
2732         if (tcon == NULL)
2733                 return -ENOMEM;
2734
2735         scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2736
2737         /* cannot fail */
2738         nls_codepage = load_nls_default();
2739
2740         xid = get_xid();
2741         tcon->ses = ses;
2742         tcon->ipc = true;
2743         tcon->seal = seal;
2744         rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2745         free_xid(xid);
2746
2747         if (rc) {
2748                 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2749                 tconInfoFree(tcon);
2750                 goto out;
2751         }
2752
2753         cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2754
2755         ses->tcon_ipc = tcon;
2756 out:
2757         unload_nls(nls_codepage);
2758         return rc;
2759 }
2760
2761 /**
2762  * cifs_free_ipc - helper to release the session IPC tcon
2763  *
2764  * Needs to be called everytime a session is destroyed
2765  */
2766 static int
2767 cifs_free_ipc(struct cifs_ses *ses)
2768 {
2769         int rc = 0, xid;
2770         struct cifs_tcon *tcon = ses->tcon_ipc;
2771
2772         if (tcon == NULL)
2773                 return 0;
2774
2775         if (ses->server->ops->tree_disconnect) {
2776                 xid = get_xid();
2777                 rc = ses->server->ops->tree_disconnect(xid, tcon);
2778                 free_xid(xid);
2779         }
2780
2781         if (rc)
2782                 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2783
2784         tconInfoFree(tcon);
2785         ses->tcon_ipc = NULL;
2786         return rc;
2787 }
2788
2789 static struct cifs_ses *
2790 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2791 {
2792         struct cifs_ses *ses;
2793
2794         spin_lock(&cifs_tcp_ses_lock);
2795         list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2796                 if (ses->status == CifsExiting)
2797                         continue;
2798                 if (!match_session(ses, vol))
2799                         continue;
2800                 ++ses->ses_count;
2801                 spin_unlock(&cifs_tcp_ses_lock);
2802                 return ses;
2803         }
2804         spin_unlock(&cifs_tcp_ses_lock);
2805         return NULL;
2806 }
2807
2808 void cifs_put_smb_ses(struct cifs_ses *ses)
2809 {
2810         unsigned int rc, xid;
2811         struct TCP_Server_Info *server = ses->server;
2812
2813         cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2814
2815         spin_lock(&cifs_tcp_ses_lock);
2816         if (ses->status == CifsExiting) {
2817                 spin_unlock(&cifs_tcp_ses_lock);
2818                 return;
2819         }
2820         if (--ses->ses_count > 0) {
2821                 spin_unlock(&cifs_tcp_ses_lock);
2822                 return;
2823         }
2824         if (ses->status == CifsGood)
2825                 ses->status = CifsExiting;
2826         spin_unlock(&cifs_tcp_ses_lock);
2827
2828         cifs_free_ipc(ses);
2829
2830         if (ses->status == CifsExiting && server->ops->logoff) {
2831                 xid = get_xid();
2832                 rc = server->ops->logoff(xid, ses);
2833                 if (rc)
2834                         cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2835                                 __func__, rc);
2836                 _free_xid(xid);
2837         }
2838
2839         spin_lock(&cifs_tcp_ses_lock);
2840         list_del_init(&ses->smb_ses_list);
2841         spin_unlock(&cifs_tcp_ses_lock);
2842
2843         /* close any extra channels */
2844         if (ses->chan_count > 1) {
2845                 int i;
2846
2847                 for (i = 1; i < ses->chan_count; i++)
2848                         cifs_put_tcp_session(ses->chans[i].server, 0);
2849         }
2850
2851         sesInfoFree(ses);
2852         cifs_put_tcp_session(server, 0);
2853 }
2854
2855 #ifdef CONFIG_KEYS
2856
2857 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2858 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2859
2860 /* Populate username and pw fields from keyring if possible */
2861 static int
2862 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2863 {
2864         int rc = 0;
2865         int is_domain = 0;
2866         const char *delim, *payload;
2867         char *desc;
2868         ssize_t len;
2869         struct key *key;
2870         struct TCP_Server_Info *server = ses->server;
2871         struct sockaddr_in *sa;
2872         struct sockaddr_in6 *sa6;
2873         const struct user_key_payload *upayload;
2874
2875         desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2876         if (!desc)
2877                 return -ENOMEM;
2878
2879         /* try to find an address key first */
2880         switch (server->dstaddr.ss_family) {
2881         case AF_INET:
2882                 sa = (struct sockaddr_in *)&server->dstaddr;
2883                 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2884                 break;
2885         case AF_INET6:
2886                 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2887                 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2888                 break;
2889         default:
2890                 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2891                          server->dstaddr.ss_family);
2892                 rc = -EINVAL;
2893                 goto out_err;
2894         }
2895
2896         cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2897         key = request_key(&key_type_logon, desc, "");
2898         if (IS_ERR(key)) {
2899                 if (!ses->domainName) {
2900                         cifs_dbg(FYI, "domainName is NULL\n");
2901                         rc = PTR_ERR(key);
2902                         goto out_err;
2903                 }
2904
2905                 /* didn't work, try to find a domain key */
2906                 sprintf(desc, "cifs:d:%s", ses->domainName);
2907                 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2908                 key = request_key(&key_type_logon, desc, "");
2909                 if (IS_ERR(key)) {
2910                         rc = PTR_ERR(key);
2911                         goto out_err;
2912                 }
2913                 is_domain = 1;
2914         }
2915
2916         down_read(&key->sem);
2917         upayload = user_key_payload_locked(key);
2918         if (IS_ERR_OR_NULL(upayload)) {
2919                 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2920                 goto out_key_put;
2921         }
2922
2923         /* find first : in payload */
2924         payload = upayload->data;
2925         delim = strnchr(payload, upayload->datalen, ':');
2926         cifs_dbg(FYI, "payload=%s\n", payload);
2927         if (!delim) {
2928                 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2929                          upayload->datalen);
2930                 rc = -EINVAL;
2931                 goto out_key_put;
2932         }
2933
2934         len = delim - payload;
2935         if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2936                 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2937                          len);
2938                 rc = -EINVAL;
2939                 goto out_key_put;
2940         }
2941
2942         vol->username = kstrndup(payload, len, GFP_KERNEL);
2943         if (!vol->username) {
2944                 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2945                          len);
2946                 rc = -ENOMEM;
2947                 goto out_key_put;
2948         }
2949         cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2950
2951         len = key->datalen - (len + 1);
2952         if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2953                 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2954                 rc = -EINVAL;
2955                 kfree(vol->username);
2956                 vol->username = NULL;
2957                 goto out_key_put;
2958         }
2959
2960         ++delim;
2961         vol->password = kstrndup(delim, len, GFP_KERNEL);
2962         if (!vol->password) {
2963                 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2964                          len);
2965                 rc = -ENOMEM;
2966                 kfree(vol->username);
2967                 vol->username = NULL;
2968                 goto out_key_put;
2969         }
2970
2971         /*
2972          * If we have a domain key then we must set the domainName in the
2973          * for the request.
2974          */
2975         if (is_domain && ses->domainName) {
2976                 vol->domainname = kstrndup(ses->domainName,
2977                                            strlen(ses->domainName),
2978                                            GFP_KERNEL);
2979                 if (!vol->domainname) {
2980                         cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
2981                                  len);
2982                         rc = -ENOMEM;
2983                         kfree(vol->username);
2984                         vol->username = NULL;
2985                         kfree_sensitive(vol->password);
2986                         vol->password = NULL;
2987                         goto out_key_put;
2988                 }
2989         }
2990
2991 out_key_put:
2992         up_read(&key->sem);
2993         key_put(key);
2994 out_err:
2995         kfree(desc);
2996         cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2997         return rc;
2998 }
2999 #else /* ! CONFIG_KEYS */
3000 static inline int
3001 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3002                    struct cifs_ses *ses __attribute__((unused)))
3003 {
3004         return -ENOSYS;
3005 }
3006 #endif /* CONFIG_KEYS */
3007
3008 /**
3009  * cifs_get_smb_ses - get a session matching @volume_info data from @server
3010  *
3011  * This function assumes it is being called from cifs_mount() where we
3012  * already got a server reference (server refcount +1). See
3013  * cifs_get_tcon() for refcount explanations.
3014  */
3015 struct cifs_ses *
3016 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3017 {
3018         int rc = -ENOMEM;
3019         unsigned int xid;
3020         struct cifs_ses *ses;
3021         struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3022         struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3023
3024         xid = get_xid();
3025
3026         ses = cifs_find_smb_ses(server, volume_info);
3027         if (ses) {
3028                 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3029                          ses->status);
3030
3031                 mutex_lock(&ses->session_mutex);
3032                 rc = cifs_negotiate_protocol(xid, ses);
3033                 if (rc) {
3034                         mutex_unlock(&ses->session_mutex);
3035                         /* problem -- put our ses reference */
3036                         cifs_put_smb_ses(ses);
3037                         free_xid(xid);
3038                         return ERR_PTR(rc);
3039                 }
3040                 if (ses->need_reconnect) {
3041                         cifs_dbg(FYI, "Session needs reconnect\n");
3042                         rc = cifs_setup_session(xid, ses,
3043                                                 volume_info->local_nls);
3044                         if (rc) {
3045                                 mutex_unlock(&ses->session_mutex);
3046                                 /* problem -- put our reference */
3047                                 cifs_put_smb_ses(ses);
3048                                 free_xid(xid);
3049                                 return ERR_PTR(rc);
3050                         }
3051                 }
3052                 mutex_unlock(&ses->session_mutex);
3053
3054                 /* existing SMB ses has a server reference already */
3055                 cifs_put_tcp_session(server, 0);
3056                 free_xid(xid);
3057                 return ses;
3058         }
3059
3060         cifs_dbg(FYI, "Existing smb sess not found\n");
3061         ses = sesInfoAlloc();
3062         if (ses == NULL)
3063                 goto get_ses_fail;
3064
3065         /* new SMB session uses our server ref */
3066         ses->server = server;
3067         if (server->dstaddr.ss_family == AF_INET6)
3068                 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3069         else
3070                 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3071
3072         if (volume_info->username) {
3073                 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3074                 if (!ses->user_name)
3075                         goto get_ses_fail;
3076         }
3077
3078         /* volume_info->password freed at unmount */
3079         if (volume_info->password) {
3080                 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3081                 if (!ses->password)
3082                         goto get_ses_fail;
3083         }
3084         if (volume_info->domainname) {
3085                 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3086                 if (!ses->domainName)
3087                         goto get_ses_fail;
3088         }
3089         if (volume_info->domainauto)
3090                 ses->domainAuto = volume_info->domainauto;
3091         ses->cred_uid = volume_info->cred_uid;
3092         ses->linux_uid = volume_info->linux_uid;
3093
3094         ses->sectype = volume_info->sectype;
3095         ses->sign = volume_info->sign;
3096         mutex_lock(&ses->session_mutex);
3097
3098         /* add server as first channel */
3099         ses->chans[0].server = server;
3100         ses->chan_count = 1;
3101         ses->chan_max = volume_info->multichannel ? volume_info->max_channels:1;
3102
3103         rc = cifs_negotiate_protocol(xid, ses);
3104         if (!rc)
3105                 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3106
3107         /* each channel uses a different signing key */
3108         memcpy(ses->chans[0].signkey, ses->smb3signingkey,
3109                sizeof(ses->smb3signingkey));
3110
3111         mutex_unlock(&ses->session_mutex);
3112         if (rc)
3113                 goto get_ses_fail;
3114
3115         /* success, put it on the list and add it as first channel */
3116         spin_lock(&cifs_tcp_ses_lock);
3117         list_add(&ses->smb_ses_list, &server->smb_ses_list);
3118         spin_unlock(&cifs_tcp_ses_lock);
3119
3120         free_xid(xid);
3121
3122         cifs_setup_ipc(ses, volume_info);
3123
3124         return ses;
3125
3126 get_ses_fail:
3127         sesInfoFree(ses);
3128         free_xid(xid);
3129         return ERR_PTR(rc);
3130 }
3131
3132 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3133 {
3134         if (tcon->tidStatus == CifsExiting)
3135                 return 0;
3136         if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3137                 return 0;
3138         if (tcon->seal != volume_info->seal)
3139                 return 0;
3140         if (tcon->snapshot_time != volume_info->snapshot_time)
3141                 return 0;
3142         if (tcon->handle_timeout != volume_info->handle_timeout)
3143                 return 0;
3144         if (tcon->no_lease != volume_info->no_lease)
3145                 return 0;
3146         if (tcon->nodelete != volume_info->nodelete)
3147                 return 0;
3148         return 1;
3149 }
3150
3151 static struct cifs_tcon *
3152 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3153 {
3154         struct list_head *tmp;
3155         struct cifs_tcon *tcon;
3156
3157         spin_lock(&cifs_tcp_ses_lock);
3158         list_for_each(tmp, &ses->tcon_list) {
3159                 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3160 #ifdef CONFIG_CIFS_DFS_UPCALL
3161                 if (tcon->dfs_path)
3162                         continue;
3163 #endif
3164                 if (!match_tcon(tcon, volume_info))
3165                         continue;
3166                 ++tcon->tc_count;
3167                 spin_unlock(&cifs_tcp_ses_lock);
3168                 return tcon;
3169         }
3170         spin_unlock(&cifs_tcp_ses_lock);
3171         return NULL;
3172 }
3173
3174 void
3175 cifs_put_tcon(struct cifs_tcon *tcon)
3176 {
3177         unsigned int xid;
3178         struct cifs_ses *ses;
3179
3180         /*
3181          * IPC tcon share the lifetime of their session and are
3182          * destroyed in the session put function
3183          */
3184         if (tcon == NULL || tcon->ipc)
3185                 return;
3186
3187         ses = tcon->ses;
3188         cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3189         spin_lock(&cifs_tcp_ses_lock);
3190         if (--tcon->tc_count > 0) {
3191                 spin_unlock(&cifs_tcp_ses_lock);
3192                 return;
3193         }
3194
3195         list_del_init(&tcon->tcon_list);
3196         spin_unlock(&cifs_tcp_ses_lock);
3197
3198         xid = get_xid();
3199         if (ses->server->ops->tree_disconnect)
3200                 ses->server->ops->tree_disconnect(xid, tcon);
3201         _free_xid(xid);
3202
3203         cifs_fscache_release_super_cookie(tcon);
3204         tconInfoFree(tcon);
3205         cifs_put_smb_ses(ses);
3206 }
3207
3208 /**
3209  * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3210  *
3211  * - tcon refcount is the number of mount points using the tcon.
3212  * - ses refcount is the number of tcon using the session.
3213  *
3214  * 1. This function assumes it is being called from cifs_mount() where
3215  *    we already got a session reference (ses refcount +1).
3216  *
3217  * 2. Since we're in the context of adding a mount point, the end
3218  *    result should be either:
3219  *
3220  * a) a new tcon already allocated with refcount=1 (1 mount point) and
3221  *    its session refcount incremented (1 new tcon). This +1 was
3222  *    already done in (1).
3223  *
3224  * b) an existing tcon with refcount+1 (add a mount point to it) and
3225  *    identical ses refcount (no new tcon). Because of (1) we need to
3226  *    decrement the ses refcount.
3227  */
3228 static struct cifs_tcon *
3229 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3230 {
3231         int rc, xid;
3232         struct cifs_tcon *tcon;
3233
3234         tcon = cifs_find_tcon(ses, volume_info);
3235         if (tcon) {
3236                 /*
3237                  * tcon has refcount already incremented but we need to
3238                  * decrement extra ses reference gotten by caller (case b)
3239                  */
3240                 cifs_dbg(FYI, "Found match on UNC path\n");
3241                 cifs_put_smb_ses(ses);
3242                 return tcon;
3243         }
3244
3245         if (!ses->server->ops->tree_connect) {
3246                 rc = -ENOSYS;
3247                 goto out_fail;
3248         }
3249
3250         tcon = tconInfoAlloc();
3251         if (tcon == NULL) {
3252                 rc = -ENOMEM;
3253                 goto out_fail;
3254         }
3255
3256         if (volume_info->snapshot_time) {
3257                 if (ses->server->vals->protocol_id == 0) {
3258                         cifs_dbg(VFS,
3259                              "Use SMB2 or later for snapshot mount option\n");
3260                         rc = -EOPNOTSUPP;
3261                         goto out_fail;
3262                 } else
3263                         tcon->snapshot_time = volume_info->snapshot_time;
3264         }
3265
3266         if (volume_info->handle_timeout) {
3267                 if (ses->server->vals->protocol_id == 0) {
3268                         cifs_dbg(VFS,
3269                              "Use SMB2.1 or later for handle timeout option\n");
3270                         rc = -EOPNOTSUPP;
3271                         goto out_fail;
3272                 } else
3273                         tcon->handle_timeout = volume_info->handle_timeout;
3274         }
3275
3276         tcon->ses = ses;
3277         if (volume_info->password) {
3278                 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3279                 if (!tcon->password) {
3280                         rc = -ENOMEM;
3281                         goto out_fail;
3282                 }
3283         }
3284
3285         if (volume_info->seal) {
3286                 if (ses->server->vals->protocol_id == 0) {
3287                         cifs_dbg(VFS,
3288                                  "SMB3 or later required for encryption\n");
3289                         rc = -EOPNOTSUPP;
3290                         goto out_fail;
3291                 } else if (tcon->ses->server->capabilities &
3292                                         SMB2_GLOBAL_CAP_ENCRYPTION)
3293                         tcon->seal = true;
3294                 else {
3295                         cifs_dbg(VFS, "Encryption is not supported on share\n");
3296                         rc = -EOPNOTSUPP;
3297                         goto out_fail;
3298                 }
3299         }
3300
3301         if (volume_info->linux_ext) {
3302                 if (ses->server->posix_ext_supported) {
3303                         tcon->posix_extensions = true;
3304                         pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
3305                 } else {
3306                         cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
3307                         rc = -EOPNOTSUPP;
3308                         goto out_fail;
3309                 }
3310         }
3311
3312         /*
3313          * BB Do we need to wrap session_mutex around this TCon call and Unix
3314          * SetFS as we do on SessSetup and reconnect?
3315          */
3316         xid = get_xid();
3317         rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3318                                             volume_info->local_nls);
3319         free_xid(xid);
3320         cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3321         if (rc)
3322                 goto out_fail;
3323
3324         tcon->use_persistent = false;
3325         /* check if SMB2 or later, CIFS does not support persistent handles */
3326         if (volume_info->persistent) {
3327                 if (ses->server->vals->protocol_id == 0) {
3328                         cifs_dbg(VFS,
3329                              "SMB3 or later required for persistent handles\n");
3330                         rc = -EOPNOTSUPP;
3331                         goto out_fail;
3332                 } else if (ses->server->capabilities &
3333                            SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3334                         tcon->use_persistent = true;
3335                 else /* persistent handles requested but not supported */ {
3336                         cifs_dbg(VFS,
3337                                 "Persistent handles not supported on share\n");
3338                         rc = -EOPNOTSUPP;
3339                         goto out_fail;
3340                 }
3341         } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3342              && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3343              && (volume_info->nopersistent == false)) {
3344                 cifs_dbg(FYI, "enabling persistent handles\n");
3345                 tcon->use_persistent = true;
3346         } else if (volume_info->resilient) {
3347                 if (ses->server->vals->protocol_id == 0) {
3348                         cifs_dbg(VFS,
3349                              "SMB2.1 or later required for resilient handles\n");
3350                         rc = -EOPNOTSUPP;
3351                         goto out_fail;
3352                 }
3353                 tcon->use_resilient = true;
3354         }
3355
3356         /* If the user really knows what they are doing they can override */
3357         if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3358                 if (volume_info->cache_ro)
3359                         cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3360                 else if (volume_info->cache_rw)
3361                         cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3362         }
3363
3364         if (volume_info->no_lease) {
3365                 if (ses->server->vals->protocol_id == 0) {
3366                         cifs_dbg(VFS,
3367                                 "SMB2 or later required for nolease option\n");
3368                         rc = -EOPNOTSUPP;
3369                         goto out_fail;
3370                 } else
3371                         tcon->no_lease = volume_info->no_lease;
3372         }
3373
3374         /*
3375          * We can have only one retry value for a connection to a share so for
3376          * resources mounted more than once to the same server share the last
3377          * value passed in for the retry flag is used.
3378          */
3379         tcon->retry = volume_info->retry;
3380         tcon->nocase = volume_info->nocase;
3381         if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
3382                 tcon->nohandlecache = volume_info->nohandlecache;
3383         else
3384                 tcon->nohandlecache = 1;
3385         tcon->nodelete = volume_info->nodelete;
3386         tcon->local_lease = volume_info->local_lease;
3387         INIT_LIST_HEAD(&tcon->pending_opens);
3388
3389         spin_lock(&cifs_tcp_ses_lock);
3390         list_add(&tcon->tcon_list, &ses->tcon_list);
3391         spin_unlock(&cifs_tcp_ses_lock);
3392
3393         cifs_fscache_get_super_cookie(tcon);
3394
3395         return tcon;
3396
3397 out_fail:
3398         tconInfoFree(tcon);
3399         return ERR_PTR(rc);
3400 }
3401
3402 void
3403 cifs_put_tlink(struct tcon_link *tlink)
3404 {
3405         if (!tlink || IS_ERR(tlink))
3406                 return;
3407
3408         if (!atomic_dec_and_test(&tlink->tl_count) ||
3409             test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3410                 tlink->tl_time = jiffies;
3411                 return;
3412         }
3413
3414         if (!IS_ERR(tlink_tcon(tlink)))
3415                 cifs_put_tcon(tlink_tcon(tlink));
3416         kfree(tlink);
3417         return;
3418 }
3419
3420 static int
3421 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3422 {
3423         struct cifs_sb_info *old = CIFS_SB(sb);
3424         struct cifs_sb_info *new = mnt_data->cifs_sb;
3425         unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3426         unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3427
3428         if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3429                 return 0;
3430
3431         if (old->mnt_cifs_serverino_autodisabled)
3432                 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3433
3434         if (oldflags != newflags)
3435                 return 0;
3436
3437         /*
3438          * We want to share sb only if we don't specify an r/wsize or
3439          * specified r/wsize is greater than or equal to existing one.
3440          */
3441         if (new->wsize && new->wsize < old->wsize)
3442                 return 0;
3443
3444         if (new->rsize && new->rsize < old->rsize)
3445                 return 0;
3446
3447         if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3448                 return 0;
3449
3450         if (old->mnt_file_mode != new->mnt_file_mode ||
3451             old->mnt_dir_mode != new->mnt_dir_mode)
3452                 return 0;
3453
3454         if (strcmp(old->local_nls->charset, new->local_nls->charset))
3455                 return 0;
3456
3457         if (old->actimeo != new->actimeo)
3458                 return 0;
3459
3460         return 1;
3461 }
3462
3463 static int
3464 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3465 {
3466         struct cifs_sb_info *old = CIFS_SB(sb);
3467         struct cifs_sb_info *new = mnt_data->cifs_sb;
3468         bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3469                 old->prepath;
3470         bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3471                 new->prepath;
3472
3473         if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3474                 return 1;
3475         else if (!old_set && !new_set)
3476                 return 1;
3477
3478         return 0;
3479 }
3480
3481 int
3482 cifs_match_super(struct super_block *sb, void *data)
3483 {
3484         struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3485         struct smb_vol *volume_info;
3486         struct cifs_sb_info *cifs_sb;
3487         struct TCP_Server_Info *tcp_srv;
3488         struct cifs_ses *ses;
3489         struct cifs_tcon *tcon;
3490         struct tcon_link *tlink;
3491         int rc = 0;
3492
3493         spin_lock(&cifs_tcp_ses_lock);
3494         cifs_sb = CIFS_SB(sb);
3495         tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3496         if (IS_ERR(tlink)) {
3497                 spin_unlock(&cifs_tcp_ses_lock);
3498                 return rc;
3499         }
3500         tcon = tlink_tcon(tlink);
3501         ses = tcon->ses;
3502         tcp_srv = ses->server;
3503
3504         volume_info = mnt_data->vol;
3505
3506         if (!match_server(tcp_srv, volume_info) ||
3507             !match_session(ses, volume_info) ||
3508             !match_tcon(tcon, volume_info) ||
3509             !match_prepath(sb, mnt_data)) {
3510                 rc = 0;
3511                 goto out;
3512         }
3513
3514         rc = compare_mount_options(sb, mnt_data);
3515 out:
3516         spin_unlock(&cifs_tcp_ses_lock);
3517         cifs_put_tlink(tlink);
3518         return rc;
3519 }
3520
3521 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3522 static struct lock_class_key cifs_key[2];
3523 static struct lock_class_key cifs_slock_key[2];
3524
3525 static inline void
3526 cifs_reclassify_socket4(struct socket *sock)
3527 {
3528         struct sock *sk = sock->sk;
3529         BUG_ON(!sock_allow_reclassification(sk));
3530         sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3531                 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3532 }
3533
3534 static inline void
3535 cifs_reclassify_socket6(struct socket *sock)
3536 {
3537         struct sock *sk = sock->sk;
3538         BUG_ON(!sock_allow_reclassification(sk));
3539         sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3540                 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3541 }
3542 #else
3543 static inline void
3544 cifs_reclassify_socket4(struct socket *sock)
3545 {
3546 }
3547
3548 static inline void
3549 cifs_reclassify_socket6(struct socket *sock)
3550 {
3551 }
3552 #endif
3553
3554 /* See RFC1001 section 14 on representation of Netbios names */
3555 static void rfc1002mangle(char *target, char *source, unsigned int length)
3556 {
3557         unsigned int i, j;
3558
3559         for (i = 0, j = 0; i < (length); i++) {
3560                 /* mask a nibble at a time and encode */
3561                 target[j] = 'A' + (0x0F & (source[i] >> 4));
3562                 target[j+1] = 'A' + (0x0F & source[i]);
3563                 j += 2;
3564         }
3565
3566 }
3567
3568 static int
3569 bind_socket(struct TCP_Server_Info *server)
3570 {
3571         int rc = 0;
3572         if (server->srcaddr.ss_family != AF_UNSPEC) {
3573                 /* Bind to the specified local IP address */
3574                 struct socket *socket = server->ssocket;
3575                 rc = socket->ops->bind(socket,
3576                                        (struct sockaddr *) &server->srcaddr,
3577                                        sizeof(server->srcaddr));
3578                 if (rc < 0) {
3579                         struct sockaddr_in *saddr4;
3580                         struct sockaddr_in6 *saddr6;
3581                         saddr4 = (struct sockaddr_in *)&server->srcaddr;
3582                         saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3583                         if (saddr6->sin6_family == AF_INET6)
3584                                 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3585                                          &saddr6->sin6_addr, rc);
3586                         else
3587                                 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3588                                          &saddr4->sin_addr.s_addr, rc);
3589                 }
3590         }
3591         return rc;
3592 }
3593
3594 static int
3595 ip_rfc1001_connect(struct TCP_Server_Info *server)
3596 {
3597         int rc = 0;
3598         /*
3599          * some servers require RFC1001 sessinit before sending
3600          * negprot - BB check reconnection in case where second
3601          * sessinit is sent but no second negprot
3602          */
3603         struct rfc1002_session_packet *ses_init_buf;
3604         struct smb_hdr *smb_buf;
3605         ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3606                                GFP_KERNEL);
3607         if (ses_init_buf) {
3608                 ses_init_buf->trailer.session_req.called_len = 32;
3609
3610                 if (server->server_RFC1001_name[0] != 0)
3611                         rfc1002mangle(ses_init_buf->trailer.
3612                                       session_req.called_name,
3613                                       server->server_RFC1001_name,
3614                                       RFC1001_NAME_LEN_WITH_NULL);
3615                 else
3616                         rfc1002mangle(ses_init_buf->trailer.
3617                                       session_req.called_name,
3618                                       DEFAULT_CIFS_CALLED_NAME,
3619                                       RFC1001_NAME_LEN_WITH_NULL);
3620
3621                 ses_init_buf->trailer.session_req.calling_len = 32;
3622
3623                 /*
3624                  * calling name ends in null (byte 16) from old smb
3625                  * convention.
3626                  */
3627                 if (server->workstation_RFC1001_name[0] != 0)
3628                         rfc1002mangle(ses_init_buf->trailer.
3629                                       session_req.calling_name,
3630                                       server->workstation_RFC1001_name,
3631                                       RFC1001_NAME_LEN_WITH_NULL);
3632                 else
3633                         rfc1002mangle(ses_init_buf->trailer.
3634                                       session_req.calling_name,
3635                                       "LINUX_CIFS_CLNT",
3636                                       RFC1001_NAME_LEN_WITH_NULL);
3637
3638                 ses_init_buf->trailer.session_req.scope1 = 0;
3639                 ses_init_buf->trailer.session_req.scope2 = 0;
3640                 smb_buf = (struct smb_hdr *)ses_init_buf;
3641
3642                 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3643                 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3644                 rc = smb_send(server, smb_buf, 0x44);
3645                 kfree(ses_init_buf);
3646                 /*
3647                  * RFC1001 layer in at least one server
3648                  * requires very short break before negprot
3649                  * presumably because not expecting negprot
3650                  * to follow so fast.  This is a simple
3651                  * solution that works without
3652                  * complicating the code and causes no
3653                  * significant slowing down on mount
3654                  * for everyone else
3655                  */
3656                 usleep_range(1000, 2000);
3657         }
3658         /*
3659          * else the negprot may still work without this
3660          * even though malloc failed
3661          */
3662
3663         return rc;
3664 }
3665
3666 static int
3667 generic_ip_connect(struct TCP_Server_Info *server)
3668 {
3669         int rc = 0;
3670         __be16 sport;
3671         int slen, sfamily;
3672         struct socket *socket = server->ssocket;
3673         struct sockaddr *saddr;
3674
3675         saddr = (struct sockaddr *) &server->dstaddr;
3676
3677         if (server->dstaddr.ss_family == AF_INET6) {
3678                 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
3679
3680                 sport = ipv6->sin6_port;
3681                 slen = sizeof(struct sockaddr_in6);
3682                 sfamily = AF_INET6;
3683                 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
3684                                 ntohs(sport));
3685         } else {
3686                 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
3687
3688                 sport = ipv4->sin_port;
3689                 slen = sizeof(struct sockaddr_in);
3690                 sfamily = AF_INET;
3691                 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
3692                                 ntohs(sport));
3693         }
3694
3695         if (socket == NULL) {
3696                 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3697                                    IPPROTO_TCP, &socket, 1);
3698                 if (rc < 0) {
3699                         cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3700                         server->ssocket = NULL;
3701                         return rc;
3702                 }
3703
3704                 /* BB other socket options to set KEEPALIVE, NODELAY? */
3705                 cifs_dbg(FYI, "Socket created\n");
3706                 server->ssocket = socket;
3707                 socket->sk->sk_allocation = GFP_NOFS;
3708                 if (sfamily == AF_INET6)
3709                         cifs_reclassify_socket6(socket);
3710                 else
3711                         cifs_reclassify_socket4(socket);
3712         }
3713
3714         rc = bind_socket(server);
3715         if (rc < 0)
3716                 return rc;
3717
3718         /*
3719          * Eventually check for other socket options to change from
3720          * the default. sock_setsockopt not used because it expects
3721          * user space buffer
3722          */
3723         socket->sk->sk_rcvtimeo = 7 * HZ;
3724         socket->sk->sk_sndtimeo = 5 * HZ;
3725
3726         /* make the bufsizes depend on wsize/rsize and max requests */
3727         if (server->noautotune) {
3728                 if (socket->sk->sk_sndbuf < (200 * 1024))
3729                         socket->sk->sk_sndbuf = 200 * 1024;
3730                 if (socket->sk->sk_rcvbuf < (140 * 1024))
3731                         socket->sk->sk_rcvbuf = 140 * 1024;
3732         }
3733
3734         if (server->tcp_nodelay)
3735                 tcp_sock_set_nodelay(socket->sk);
3736
3737         cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3738                  socket->sk->sk_sndbuf,
3739                  socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3740
3741         rc = socket->ops->connect(socket, saddr, slen,
3742                                   server->noblockcnt ? O_NONBLOCK : 0);
3743         /*
3744          * When mounting SMB root file systems, we do not want to block in
3745          * connect. Otherwise bail out and then let cifs_reconnect() perform
3746          * reconnect failover - if possible.
3747          */
3748         if (server->noblockcnt && rc == -EINPROGRESS)
3749                 rc = 0;
3750         if (rc < 0) {
3751                 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3752                 sock_release(socket);
3753                 server->ssocket = NULL;
3754                 return rc;
3755         }
3756
3757         if (sport == htons(RFC1001_PORT))
3758                 rc = ip_rfc1001_connect(server);
3759
3760         return rc;
3761 }
3762
3763 static int
3764 ip_connect(struct TCP_Server_Info *server)
3765 {
3766         __be16 *sport;
3767         struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3768         struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3769
3770         if (server->dstaddr.ss_family == AF_INET6)
3771                 sport = &addr6->sin6_port;
3772         else
3773                 sport = &addr->sin_port;
3774
3775         if (*sport == 0) {
3776                 int rc;
3777
3778                 /* try with 445 port at first */
3779                 *sport = htons(CIFS_PORT);
3780
3781                 rc = generic_ip_connect(server);
3782                 if (rc >= 0)
3783                         return rc;
3784
3785                 /* if it failed, try with 139 port */
3786                 *sport = htons(RFC1001_PORT);
3787         }
3788
3789         return generic_ip_connect(server);
3790 }
3791
3792 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3793                           struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3794 {
3795         /* if we are reconnecting then should we check to see if
3796          * any requested capabilities changed locally e.g. via
3797          * remount but we can not do much about it here
3798          * if they have (even if we could detect it by the following)
3799          * Perhaps we could add a backpointer to array of sb from tcon
3800          * or if we change to make all sb to same share the same
3801          * sb as NFS - then we only have one backpointer to sb.
3802          * What if we wanted to mount the server share twice once with
3803          * and once without posixacls or posix paths? */
3804         __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3805
3806         if (vol_info && vol_info->no_linux_ext) {
3807                 tcon->fsUnixInfo.Capability = 0;
3808                 tcon->unix_ext = 0; /* Unix Extensions disabled */
3809                 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3810                 return;
3811         } else if (vol_info)
3812                 tcon->unix_ext = 1; /* Unix Extensions supported */
3813
3814         if (tcon->unix_ext == 0) {
3815                 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3816                 return;
3817         }
3818
3819         if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3820                 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3821                 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3822                 /* check for reconnect case in which we do not
3823                    want to change the mount behavior if we can avoid it */
3824                 if (vol_info == NULL) {
3825                         /* turn off POSIX ACL and PATHNAMES if not set
3826                            originally at mount time */
3827                         if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3828                                 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3829                         if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3830                                 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3831                                         cifs_dbg(VFS, "POSIXPATH support change\n");
3832                                 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3833                         } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3834                                 cifs_dbg(VFS, "possible reconnect error\n");
3835                                 cifs_dbg(VFS, "server disabled POSIX path support\n");
3836                         }
3837                 }
3838
3839                 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3840                         cifs_dbg(VFS, "per-share encryption not supported yet\n");
3841
3842                 cap &= CIFS_UNIX_CAP_MASK;
3843                 if (vol_info && vol_info->no_psx_acl)
3844                         cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3845                 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3846                         cifs_dbg(FYI, "negotiated posix acl support\n");
3847                         if (cifs_sb)
3848                                 cifs_sb->mnt_cifs_flags |=
3849                                         CIFS_MOUNT_POSIXACL;
3850                 }
3851
3852                 if (vol_info && vol_info->posix_paths == 0)
3853                         cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3854                 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3855                         cifs_dbg(FYI, "negotiate posix pathnames\n");
3856                         if (cifs_sb)
3857                                 cifs_sb->mnt_cifs_flags |=
3858                                         CIFS_MOUNT_POSIX_PATHS;
3859                 }
3860
3861                 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3862 #ifdef CONFIG_CIFS_DEBUG2
3863                 if (cap & CIFS_UNIX_FCNTL_CAP)
3864                         cifs_dbg(FYI, "FCNTL cap\n");
3865                 if (cap & CIFS_UNIX_EXTATTR_CAP)
3866                         cifs_dbg(FYI, "EXTATTR cap\n");
3867                 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3868                         cifs_dbg(FYI, "POSIX path cap\n");
3869                 if (cap & CIFS_UNIX_XATTR_CAP)
3870                         cifs_dbg(FYI, "XATTR cap\n");
3871                 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3872                         cifs_dbg(FYI, "POSIX ACL cap\n");
3873                 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3874                         cifs_dbg(FYI, "very large read cap\n");
3875                 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3876                         cifs_dbg(FYI, "very large write cap\n");
3877                 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3878                         cifs_dbg(FYI, "transport encryption cap\n");
3879                 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3880                         cifs_dbg(FYI, "mandatory transport encryption cap\n");
3881 #endif /* CIFS_DEBUG2 */
3882                 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3883                         if (vol_info == NULL) {
3884                                 cifs_dbg(FYI, "resetting capabilities failed\n");
3885                         } else
3886                                 cifs_dbg(VFS, "Negotiating Unix capabilities with the server failed. Consider mounting with the Unix Extensions disabled if problems are found by specifying the nounix mount option.\n");
3887
3888                 }
3889         }
3890 }
3891
3892 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3893                         struct cifs_sb_info *cifs_sb)
3894 {
3895         INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3896
3897         spin_lock_init(&cifs_sb->tlink_tree_lock);
3898         cifs_sb->tlink_tree = RB_ROOT;
3899
3900         cifs_sb->bsize = pvolume_info->bsize;
3901         /*
3902          * Temporarily set r/wsize for matching superblock. If we end up using
3903          * new sb then client will later negotiate it downward if needed.
3904          */
3905         cifs_sb->rsize = pvolume_info->rsize;
3906         cifs_sb->wsize = pvolume_info->wsize;
3907
3908         cifs_sb->mnt_uid = pvolume_info->linux_uid;
3909         cifs_sb->mnt_gid = pvolume_info->linux_gid;
3910         cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3911         cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3912         cifs_dbg(FYI, "file mode: %04ho  dir mode: %04ho\n",
3913                  cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3914
3915         cifs_sb->actimeo = pvolume_info->actimeo;
3916         cifs_sb->local_nls = pvolume_info->local_nls;
3917
3918         if (pvolume_info->nodfs)
3919                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
3920         if (pvolume_info->noperm)
3921                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3922         if (pvolume_info->setuids)
3923                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3924         if (pvolume_info->setuidfromacl)
3925                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3926         if (pvolume_info->server_ino)
3927                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3928         if (pvolume_info->remap)
3929                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3930         if (pvolume_info->sfu_remap)
3931                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3932         if (pvolume_info->no_xattr)
3933                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3934         if (pvolume_info->sfu_emul)
3935                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3936         if (pvolume_info->nobrl)
3937                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3938         if (pvolume_info->nohandlecache)
3939                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3940         if (pvolume_info->nostrictsync)
3941                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3942         if (pvolume_info->mand_lock)
3943                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3944         if (pvolume_info->rwpidforward)
3945                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3946         if (pvolume_info->mode_ace)
3947                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
3948         if (pvolume_info->cifs_acl)
3949                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3950         if (pvolume_info->backupuid_specified) {
3951                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3952                 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3953         }
3954         if (pvolume_info->backupgid_specified) {
3955                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3956                 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3957         }
3958         if (pvolume_info->override_uid)
3959                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3960         if (pvolume_info->override_gid)
3961                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3962         if (pvolume_info->dynperm)
3963                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3964         if (pvolume_info->fsc)
3965                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3966         if (pvolume_info->multiuser)
3967                 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3968                                             CIFS_MOUNT_NO_PERM);
3969         if (pvolume_info->strict_io)
3970                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3971         if (pvolume_info->direct_io) {
3972                 cifs_dbg(FYI, "mounting share using direct i/o\n");
3973                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3974         }
3975         if (pvolume_info->cache_ro) {
3976                 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
3977                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
3978         } else if (pvolume_info->cache_rw) {
3979                 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
3980                 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
3981                                             CIFS_MOUNT_RW_CACHE);
3982         }
3983         if (pvolume_info->mfsymlinks) {
3984                 if (pvolume_info->sfu_emul) {
3985                         /*
3986                          * Our SFU ("Services for Unix" emulation does not allow
3987                          * creating symlinks but does allow reading existing SFU
3988                          * symlinks (it does allow both creating and reading SFU
3989                          * style mknod and FIFOs though). When "mfsymlinks" and
3990                          * "sfu" are both enabled at the same time, it allows
3991                          * reading both types of symlinks, but will only create
3992                          * them with mfsymlinks format. This allows better
3993                          * Apple compatibility (probably better for Samba too)
3994                          * while still recognizing old Windows style symlinks.
3995                          */
3996                         cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3997                 }
3998                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3999         }
4000
4001         if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4002                 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4003
4004         if (pvolume_info->prepath) {
4005                 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4006                 if (cifs_sb->prepath == NULL)
4007                         return -ENOMEM;
4008         }
4009
4010         return 0;
4011 }
4012
4013 void
4014 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4015 {
4016         kfree(volume_info->username);
4017         kfree_sensitive(volume_info->password);
4018         kfree(volume_info->UNC);
4019         kfree(volume_info->domainname);
4020         kfree(volume_info->iocharset);
4021         kfree(volume_info->prepath);
4022 }
4023
4024 void
4025 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4026 {
4027         if (!volume_info)
4028                 return;
4029         cifs_cleanup_volume_info_contents(volume_info);
4030         kfree(volume_info);
4031 }
4032
4033 /* Release all succeed connections */
4034 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4035                                    unsigned int xid,
4036                                    struct TCP_Server_Info *server,
4037                                    struct cifs_ses *ses, struct cifs_tcon *tcon)
4038 {
4039         int rc = 0;
4040
4041         if (tcon)
4042                 cifs_put_tcon(tcon);
4043         else if (ses)
4044                 cifs_put_smb_ses(ses);
4045         else if (server)
4046                 cifs_put_tcp_session(server, 0);
4047         cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4048         free_xid(xid);
4049 }
4050
4051 /* Get connections for tcp, ses and tcon */
4052 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4053                            unsigned int *xid,
4054                            struct TCP_Server_Info **nserver,
4055                            struct cifs_ses **nses, struct cifs_tcon **ntcon)
4056 {
4057         int rc = 0;
4058         struct TCP_Server_Info *server;
4059         struct cifs_ses *ses;
4060         struct cifs_tcon *tcon;
4061
4062         *nserver = NULL;
4063         *nses = NULL;
4064         *ntcon = NULL;
4065
4066         *xid = get_xid();
4067
4068         /* get a reference to a tcp session */
4069         server = cifs_get_tcp_session(vol);
4070         if (IS_ERR(server)) {
4071                 rc = PTR_ERR(server);
4072                 return rc;
4073         }
4074
4075         *nserver = server;
4076
4077         if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4078                 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4079         else
4080                 server->max_credits = vol->max_credits;
4081
4082         /* get a reference to a SMB session */
4083         ses = cifs_get_smb_ses(server, vol);
4084         if (IS_ERR(ses)) {
4085                 rc = PTR_ERR(ses);
4086                 return rc;
4087         }
4088
4089         *nses = ses;
4090
4091         if ((vol->persistent == true) && (!(ses->server->capabilities &
4092                                             SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4093                 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4094                 return -EOPNOTSUPP;
4095         }
4096
4097         /* search for existing tcon to this server share */
4098         tcon = cifs_get_tcon(ses, vol);
4099         if (IS_ERR(tcon)) {
4100                 rc = PTR_ERR(tcon);
4101                 return rc;
4102         }
4103
4104         *ntcon = tcon;
4105
4106         /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4107         if (tcon->posix_extensions)
4108                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4109
4110         /* tell server which Unix caps we support */
4111         if (cap_unix(tcon->ses)) {
4112                 /*
4113                  * reset of caps checks mount to see if unix extensions disabled
4114                  * for just this mount.
4115                  */
4116                 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4117                 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4118                     (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4119                      CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4120                         return -EACCES;
4121         } else
4122                 tcon->unix_ext = 0; /* server does not support them */
4123
4124         /* do not care if a following call succeed - informational */
4125         if (!tcon->pipe && server->ops->qfs_tcon) {
4126                 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
4127                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4128                         if (tcon->fsDevInfo.DeviceCharacteristics &
4129                             cpu_to_le32(FILE_READ_ONLY_DEVICE))
4130                                 cifs_dbg(VFS, "mounted to read only share\n");
4131                         else if ((cifs_sb->mnt_cifs_flags &
4132                                   CIFS_MOUNT_RW_CACHE) == 0)
4133                                 cifs_dbg(VFS, "read only mount of RW share\n");
4134                         /* no need to log a RW mount of a typical RW share */
4135                 }
4136         }
4137
4138         cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4139         cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4140
4141         return 0;
4142 }
4143
4144 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4145                              struct cifs_tcon *tcon)
4146 {
4147         struct tcon_link *tlink;
4148
4149         /* hang the tcon off of the superblock */
4150         tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4151         if (tlink == NULL)
4152                 return -ENOMEM;
4153
4154         tlink->tl_uid = ses->linux_uid;
4155         tlink->tl_tcon = tcon;
4156         tlink->tl_time = jiffies;
4157         set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4158         set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4159
4160         cifs_sb->master_tlink = tlink;
4161         spin_lock(&cifs_sb->tlink_tree_lock);
4162         tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4163         spin_unlock(&cifs_sb->tlink_tree_lock);
4164
4165         queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4166                                 TLINK_IDLE_EXPIRE);
4167         return 0;
4168 }
4169
4170 #ifdef CONFIG_CIFS_DFS_UPCALL
4171 /*
4172  * cifs_build_path_to_root returns full path to root when we do not have an
4173  * exiting connection (tcon)
4174  */
4175 static char *
4176 build_unc_path_to_root(const struct smb_vol *vol,
4177                        const struct cifs_sb_info *cifs_sb, bool useppath)
4178 {
4179         char *full_path, *pos;
4180         unsigned int pplen = useppath && vol->prepath ?
4181                 strlen(vol->prepath) + 1 : 0;
4182         unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4183
4184         if (unc_len > MAX_TREE_SIZE)
4185                 return ERR_PTR(-EINVAL);
4186
4187         full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4188         if (full_path == NULL)
4189                 return ERR_PTR(-ENOMEM);
4190
4191         memcpy(full_path, vol->UNC, unc_len);
4192         pos = full_path + unc_len;
4193
4194         if (pplen) {
4195                 *pos = CIFS_DIR_SEP(cifs_sb);
4196                 memcpy(pos + 1, vol->prepath, pplen);
4197                 pos += pplen;
4198         }
4199
4200         *pos = '\0'; /* add trailing null */
4201         convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4202         cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4203         return full_path;
4204 }
4205
4206 /**
4207  * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4208  *
4209  *
4210  * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4211  * to a string containing updated options for the submount.  Otherwise it
4212  * will be left untouched.
4213  *
4214  * Returns the rc from get_dfs_path to the caller, which can be used to
4215  * determine whether there were referrals.
4216  */
4217 static int
4218 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4219                     struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4220                     char *ref_path)
4221 {
4222         int rc;
4223         struct dfs_info3_param referral = {0};
4224         char *full_path = NULL, *mdata = NULL;
4225
4226         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4227                 return -EREMOTE;
4228
4229         full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4230         if (IS_ERR(full_path))
4231                 return PTR_ERR(full_path);
4232
4233         rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4234                             ref_path, &referral, NULL);
4235         if (!rc) {
4236                 char *fake_devname = NULL;
4237
4238                 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4239                                                    full_path + 1, &referral,
4240                                                    &fake_devname);
4241                 free_dfs_info_param(&referral);
4242
4243                 if (IS_ERR(mdata)) {
4244                         rc = PTR_ERR(mdata);
4245                         mdata = NULL;
4246                 } else {
4247                         cifs_cleanup_volume_info_contents(volume_info);
4248                         rc = cifs_setup_volume_info(volume_info, mdata,
4249                                                     fake_devname, false);
4250                 }
4251                 kfree(fake_devname);
4252                 kfree(cifs_sb->mountdata);
4253                 cifs_sb->mountdata = mdata;
4254         }
4255         kfree(full_path);
4256         return rc;
4257 }
4258
4259 static inline int get_next_dfs_tgt(const char *path,
4260                                    struct dfs_cache_tgt_list *tgt_list,
4261                                    struct dfs_cache_tgt_iterator **tgt_it)
4262 {
4263         if (!*tgt_it)
4264                 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4265         else
4266                 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4267         return !*tgt_it ? -EHOSTDOWN : 0;
4268 }
4269
4270 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4271                            struct smb_vol *fake_vol, struct smb_vol *vol)
4272 {
4273         const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4274         int len = strlen(tgt) + 2;
4275         char *new_unc;
4276
4277         new_unc = kmalloc(len, GFP_KERNEL);
4278         if (!new_unc)
4279                 return -ENOMEM;
4280         scnprintf(new_unc, len, "\\%s", tgt);
4281
4282         kfree(vol->UNC);
4283         vol->UNC = new_unc;
4284
4285         if (fake_vol->prepath) {
4286                 kfree(vol->prepath);
4287                 vol->prepath = fake_vol->prepath;
4288                 fake_vol->prepath = NULL;
4289         }
4290         memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4291
4292         return 0;
4293 }
4294
4295 static int setup_dfs_tgt_conn(const char *path, const char *full_path,
4296                               const struct dfs_cache_tgt_iterator *tgt_it,
4297                               struct cifs_sb_info *cifs_sb, struct smb_vol *vol, unsigned int *xid,
4298                               struct TCP_Server_Info **server, struct cifs_ses **ses,
4299                               struct cifs_tcon **tcon)
4300 {
4301         int rc;
4302         struct dfs_info3_param ref = {0};
4303         char *mdata = NULL, *fake_devname = NULL;
4304         struct smb_vol fake_vol = {NULL};
4305
4306         cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4307
4308         rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4309         if (rc)
4310                 return rc;
4311
4312         mdata = cifs_compose_mount_options(cifs_sb->mountdata, full_path + 1, &ref, &fake_devname);
4313         free_dfs_info_param(&ref);
4314
4315         if (IS_ERR(mdata)) {
4316                 rc = PTR_ERR(mdata);
4317                 mdata = NULL;
4318         } else {
4319                 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4320                 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4321                                             false);
4322         }
4323         kfree(mdata);
4324         kfree(fake_devname);
4325
4326         if (!rc) {
4327                 /*
4328                  * We use a 'fake_vol' here because we need pass it down to the
4329                  * mount_{get,put} functions to test connection against new DFS
4330                  * targets.
4331                  */
4332                 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4333                 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4334                                      tcon);
4335                 if (!rc || (*server && *ses)) {
4336                         /*
4337                          * We were able to connect to new target server.
4338                          * Update current volume info with new target server.
4339                          */
4340                         rc = update_vol_info(tgt_it, &fake_vol, vol);
4341                 }
4342         }
4343         cifs_cleanup_volume_info_contents(&fake_vol);
4344         return rc;
4345 }
4346
4347 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
4348                            struct smb_vol *vol, struct cifs_ses *root_ses, unsigned int *xid,
4349                            struct TCP_Server_Info **server, struct cifs_ses **ses,
4350                            struct cifs_tcon **tcon)
4351 {
4352         int rc;
4353         struct dfs_cache_tgt_list tgt_list;
4354         struct dfs_cache_tgt_iterator *tgt_it = NULL;
4355
4356         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4357                 return -EOPNOTSUPP;
4358
4359         rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4360         if (rc)
4361                 return rc;
4362
4363         for (;;) {
4364                 /* Get next DFS target server - if any */
4365                 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4366                 if (rc)
4367                         break;
4368                 /* Connect to next DFS target */
4369                 rc = setup_dfs_tgt_conn(path, full_path, tgt_it, cifs_sb, vol, xid, server, ses,
4370                                         tcon);
4371                 if (!rc || (*server && *ses))
4372                         break;
4373         }
4374         if (!rc) {
4375                 /*
4376                  * Update DFS target hint in DFS referral cache with the target
4377                  * server we successfully reconnected to.
4378                  */
4379                 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4380                                               cifs_sb->local_nls,
4381                                               cifs_remap(cifs_sb), path,
4382                                               tgt_it);
4383         }
4384         dfs_cache_free_tgts(&tgt_list);
4385         return rc;
4386 }
4387 #endif
4388
4389 int
4390 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4391                         const char *devname, bool is_smb3)
4392 {
4393         int rc = 0;
4394
4395         if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4396                 return -EINVAL;
4397
4398         if (volume_info->nullauth) {
4399                 cifs_dbg(FYI, "Anonymous login\n");
4400                 kfree(volume_info->username);
4401                 volume_info->username = NULL;
4402         } else if (volume_info->username) {
4403                 /* BB fixme parse for domain name here */
4404                 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4405         } else {
4406                 cifs_dbg(VFS, "No username specified\n");
4407         /* In userspace mount helper we can get user name from alternate
4408            locations such as env variables and files on disk */
4409                 return -EINVAL;
4410         }
4411
4412         /* this is needed for ASCII cp to Unicode converts */
4413         if (volume_info->iocharset == NULL) {
4414                 /* load_nls_default cannot return null */
4415                 volume_info->local_nls = load_nls_default();
4416         } else {
4417                 volume_info->local_nls = load_nls(volume_info->iocharset);
4418                 if (volume_info->local_nls == NULL) {
4419                         cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4420                                  volume_info->iocharset);
4421                         return -ELIBACC;
4422                 }
4423         }
4424
4425         return rc;
4426 }
4427
4428 struct smb_vol *
4429 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4430 {
4431         int rc;
4432         struct smb_vol *volume_info;
4433
4434         volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4435         if (!volume_info)
4436                 return ERR_PTR(-ENOMEM);
4437
4438         rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4439         if (rc) {
4440                 cifs_cleanup_volume_info(volume_info);
4441                 volume_info = ERR_PTR(rc);
4442         }
4443
4444         return volume_info;
4445 }
4446
4447 static int
4448 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4449                                         unsigned int xid,
4450                                         struct cifs_tcon *tcon,
4451                                         struct cifs_sb_info *cifs_sb,
4452                                         char *full_path,
4453                                         int added_treename)
4454 {
4455         int rc;
4456         char *s;
4457         char sep, tmp;
4458         int skip = added_treename ? 1 : 0;
4459
4460         sep = CIFS_DIR_SEP(cifs_sb);
4461         s = full_path;
4462
4463         rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4464         while (rc == 0) {
4465                 /* skip separators */
4466                 while (*s == sep)
4467                         s++;
4468                 if (!*s)
4469                         break;
4470                 /* next separator */
4471                 while (*s && *s != sep)
4472                         s++;
4473                 /*
4474                  * if the treename is added, we then have to skip the first
4475                  * part within the separators
4476                  */
4477                 if (skip) {
4478                         skip = 0;
4479                         continue;
4480                 }
4481                 /*
4482                  * temporarily null-terminate the path at the end of
4483                  * the current component
4484                  */
4485                 tmp = *s;
4486                 *s = 0;
4487                 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4488                                                      full_path);
4489                 *s = tmp;
4490         }
4491         return rc;
4492 }
4493
4494 /*
4495  * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4496  * otherwise 0.
4497  */
4498 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4499                           const unsigned int xid,
4500                           struct TCP_Server_Info *server,
4501                           struct cifs_tcon *tcon)
4502 {
4503         int rc;
4504         char *full_path;
4505
4506         if (!server->ops->is_path_accessible)
4507                 return -EOPNOTSUPP;
4508
4509         /*
4510          * cifs_build_path_to_root works only when we have a valid tcon
4511          */
4512         full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4513                                             tcon->Flags & SMB_SHARE_IS_IN_DFS);
4514         if (full_path == NULL)
4515                 return -ENOMEM;
4516
4517         cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4518
4519         rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4520                                              full_path);
4521         if (rc != 0 && rc != -EREMOTE) {
4522                 kfree(full_path);
4523                 return rc;
4524         }
4525
4526         if (rc != -EREMOTE) {
4527                 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4528                         cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4529                 if (rc != 0) {
4530                         cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4531                         cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4532                         rc = 0;
4533                 }
4534         }
4535
4536         kfree(full_path);
4537         return rc;
4538 }
4539
4540 #ifdef CONFIG_CIFS_DFS_UPCALL
4541 static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4542                          struct cifs_ses **root_ses)
4543 {
4544         if (ses) {
4545                 spin_lock(&cifs_tcp_ses_lock);
4546                 ses->ses_count++;
4547                 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
4548                 spin_unlock(&cifs_tcp_ses_lock);
4549         }
4550         *root_ses = ses;
4551 }
4552
4553 static void put_root_ses(struct cifs_ses *ses)
4554 {
4555         if (ses)
4556                 cifs_put_smb_ses(ses);
4557 }
4558
4559 /* Check if a path component is remote and then update @dfs_path accordingly */
4560 static int check_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4561                              const unsigned int xid, struct TCP_Server_Info *server,
4562                              struct cifs_tcon *tcon, char **dfs_path)
4563 {
4564         char *path, *s;
4565         char sep = CIFS_DIR_SEP(cifs_sb), tmp;
4566         char *npath;
4567         int rc = 0;
4568         int added_treename = tcon->Flags & SMB_SHARE_IS_IN_DFS;
4569         int skip = added_treename;
4570
4571         path = cifs_build_path_to_root(vol, cifs_sb, tcon, added_treename);
4572         if (!path)
4573                 return -ENOMEM;
4574
4575         /*
4576          * Walk through the path components in @path and check if they're accessible. In case any of
4577          * the components is -EREMOTE, then update @dfs_path with the next DFS referral request path
4578          * (NOT including the remaining components).
4579          */
4580         s = path;
4581         do {
4582                 /* skip separators */
4583                 while (*s && *s == sep)
4584                         s++;
4585                 if (!*s)
4586                         break;
4587                 /* next separator */
4588                 while (*s && *s != sep)
4589                         s++;
4590                 /*
4591                  * if the treename is added, we then have to skip the first
4592                  * part within the separators
4593                  */
4594                 if (skip) {
4595                         skip = 0;
4596                         continue;
4597                 }
4598                 tmp = *s;
4599                 *s = 0;
4600                 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, path);
4601                 if (rc && rc == -EREMOTE) {
4602                         struct smb_vol v = {NULL};
4603                         /* if @path contains a tree name, skip it in the prefix path */
4604                         if (added_treename) {
4605                                 rc = cifs_parse_devname(path, &v);
4606                                 if (rc)
4607                                         break;
4608                                 rc = -EREMOTE;
4609                                 npath = build_unc_path_to_root(&v, cifs_sb, true);
4610                                 cifs_cleanup_volume_info_contents(&v);
4611                         } else {
4612                                 v.UNC = vol->UNC;
4613                                 v.prepath = path + 1;
4614                                 npath = build_unc_path_to_root(&v, cifs_sb, true);
4615                         }
4616                         if (IS_ERR(npath)) {
4617                                 rc = PTR_ERR(npath);
4618                                 break;
4619                         }
4620                         kfree(*dfs_path);
4621                         *dfs_path = npath;
4622                 }
4623                 *s = tmp;
4624         } while (rc == 0);
4625
4626         kfree(path);
4627         return rc;
4628 }
4629
4630 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4631 {
4632         int rc = 0;
4633         unsigned int xid;
4634         struct TCP_Server_Info *server = NULL;
4635         struct cifs_ses *ses = NULL, *root_ses = NULL;
4636         struct cifs_tcon *tcon = NULL;
4637         int count = 0;
4638         char *ref_path = NULL, *full_path = NULL;
4639         char *oldmnt = NULL;
4640         char *mntdata = NULL;
4641
4642         rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4643         /*
4644          * Unconditionally try to get an DFS referral (even cached) to determine whether it is an
4645          * DFS mount.
4646          *
4647          * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
4648          * to respond with PATH_NOT_COVERED to requests that include the prefix.
4649          */
4650         if (dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4651                            NULL)) {
4652                 /* No DFS referral was returned.  Looks like a regular share. */
4653                 if (rc)
4654                         goto error;
4655                 /* Check if it is fully accessible and then mount it */
4656                 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4657                 if (!rc)
4658                         goto out;
4659                 if (rc != -EREMOTE)
4660                         goto error;
4661         }
4662         /* Save mount options */
4663         mntdata = kstrndup(cifs_sb->mountdata, strlen(cifs_sb->mountdata), GFP_KERNEL);
4664         if (!mntdata) {
4665                 rc = -ENOMEM;
4666                 goto error;
4667         }
4668         /* Get path of DFS root */
4669         ref_path = build_unc_path_to_root(vol, cifs_sb, false);
4670         if (IS_ERR(ref_path)) {
4671                 rc = PTR_ERR(ref_path);
4672                 ref_path = NULL;
4673                 goto error;
4674         }
4675
4676         set_root_ses(cifs_sb, ses, &root_ses);
4677         do {
4678                 /* Save full path of last DFS path we used to resolve final target server */
4679                 kfree(full_path);
4680                 full_path = build_unc_path_to_root(vol, cifs_sb, !!count);
4681                 if (IS_ERR(full_path)) {
4682                         rc = PTR_ERR(full_path);
4683                         full_path = NULL;
4684                         break;
4685                 }
4686                 /* Chase referral */
4687                 oldmnt = cifs_sb->mountdata;
4688                 rc = expand_dfs_referral(xid, root_ses, vol, cifs_sb, ref_path + 1);
4689                 if (rc)
4690                         break;
4691                 /* Connect to new DFS target only if we were redirected */
4692                 if (oldmnt != cifs_sb->mountdata) {
4693                         mount_put_conns(cifs_sb, xid, server, ses, tcon);
4694                         rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4695                 }
4696                 if (rc && !server && !ses) {
4697                         /* Failed to connect. Try to connect to other targets in the referral. */
4698                         rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, vol, root_ses, &xid,
4699                                              &server, &ses, &tcon);
4700                 }
4701                 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
4702                         break;
4703                 if (!tcon)
4704                         continue;
4705                 /* Make sure that requests go through new root servers */
4706                 if (is_tcon_dfs(tcon)) {
4707                         put_root_ses(root_ses);
4708                         set_root_ses(cifs_sb, ses, &root_ses);
4709                 }
4710                 /* Check for remaining path components and then continue chasing them (-EREMOTE) */
4711                 rc = check_dfs_prepath(cifs_sb, vol, xid, server, tcon, &ref_path);
4712                 /* Prevent recursion on broken link referrals */
4713                 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
4714                         rc = -ELOOP;
4715         } while (rc == -EREMOTE);
4716
4717         if (rc)
4718                 goto error;
4719         put_root_ses(root_ses);
4720         root_ses = NULL;
4721         kfree(ref_path);
4722         ref_path = NULL;
4723         /*
4724          * Store DFS full path in both superblock and tree connect structures.
4725          *
4726          * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
4727          * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
4728          * links, the prefix path is included in both and may be changed during reconnect.  See
4729          * cifs_tree_connect().
4730          */
4731         cifs_sb->origin_fullpath = kstrndup(full_path, strlen(full_path), GFP_KERNEL);
4732         if (!cifs_sb->origin_fullpath) {
4733                 rc = -ENOMEM;
4734                 goto error;
4735         }
4736         spin_lock(&cifs_tcp_ses_lock);
4737         tcon->dfs_path = full_path;
4738         full_path = NULL;
4739         tcon->remap = cifs_remap(cifs_sb);
4740         spin_unlock(&cifs_tcp_ses_lock);
4741
4742         /* Add original volume information for DFS cache to be used when refreshing referrals */
4743         rc = dfs_cache_add_vol(mntdata, vol, cifs_sb->origin_fullpath);
4744         if (rc)
4745                 goto error;
4746         /*
4747          * After reconnecting to a different server, unique ids won't
4748          * match anymore, so we disable serverino. This prevents
4749          * dentry revalidation to think the dentry are stale (ESTALE).
4750          */
4751         cifs_autodisable_serverino(cifs_sb);
4752         /*
4753          * Force the use of prefix path to support failover on DFS paths that
4754          * resolve to targets that have different prefix paths.
4755          */
4756         cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4757         kfree(cifs_sb->prepath);
4758         cifs_sb->prepath = vol->prepath;
4759         vol->prepath = NULL;
4760
4761 out:
4762         free_xid(xid);
4763         cifs_try_adding_channels(ses);
4764         return mount_setup_tlink(cifs_sb, ses, tcon);
4765
4766 error:
4767         kfree(ref_path);
4768         kfree(full_path);
4769         kfree(mntdata);
4770         kfree(cifs_sb->origin_fullpath);
4771         put_root_ses(root_ses);
4772         mount_put_conns(cifs_sb, xid, server, ses, tcon);
4773         return rc;
4774 }
4775 #else
4776 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4777 {
4778         int rc = 0;
4779         unsigned int xid;
4780         struct cifs_ses *ses;
4781         struct cifs_tcon *tcon;
4782         struct TCP_Server_Info *server;
4783
4784         rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4785         if (rc)
4786                 goto error;
4787
4788         if (tcon) {
4789                 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4790                 if (rc == -EREMOTE)
4791                         rc = -EOPNOTSUPP;
4792                 if (rc)
4793                         goto error;
4794         }
4795
4796         free_xid(xid);
4797
4798         return mount_setup_tlink(cifs_sb, ses, tcon);
4799
4800 error:
4801         mount_put_conns(cifs_sb, xid, server, ses, tcon);
4802         return rc;
4803 }
4804 #endif
4805
4806 /*
4807  * Issue a TREE_CONNECT request.
4808  */
4809 int
4810 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4811          const char *tree, struct cifs_tcon *tcon,
4812          const struct nls_table *nls_codepage)
4813 {
4814         struct smb_hdr *smb_buffer;
4815         struct smb_hdr *smb_buffer_response;
4816         TCONX_REQ *pSMB;
4817         TCONX_RSP *pSMBr;
4818         unsigned char *bcc_ptr;
4819         int rc = 0;
4820         int length;
4821         __u16 bytes_left, count;
4822
4823         if (ses == NULL)
4824                 return -EIO;
4825
4826         smb_buffer = cifs_buf_get();
4827         if (smb_buffer == NULL)
4828                 return -ENOMEM;
4829
4830         smb_buffer_response = smb_buffer;
4831
4832         header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4833                         NULL /*no tid */ , 4 /*wct */ );
4834
4835         smb_buffer->Mid = get_next_mid(ses->server);
4836         smb_buffer->Uid = ses->Suid;
4837         pSMB = (TCONX_REQ *) smb_buffer;
4838         pSMBr = (TCONX_RSP *) smb_buffer_response;
4839
4840         pSMB->AndXCommand = 0xFF;
4841         pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4842         bcc_ptr = &pSMB->Password[0];
4843         if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4844                 pSMB->PasswordLength = cpu_to_le16(1);  /* minimum */
4845                 *bcc_ptr = 0; /* password is null byte */
4846                 bcc_ptr++;              /* skip password */
4847                 /* already aligned so no need to do it below */
4848         } else {
4849                 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4850                 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4851                    specified as required (when that support is added to
4852                    the vfs in the future) as only NTLM or the much
4853                    weaker LANMAN (which we do not send by default) is accepted
4854                    by Samba (not sure whether other servers allow
4855                    NTLMv2 password here) */
4856 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4857                 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4858                     (ses->sectype == LANMAN))
4859                         calc_lanman_hash(tcon->password, ses->server->cryptkey,
4860                                          ses->server->sec_mode &
4861                                             SECMODE_PW_ENCRYPT ? true : false,
4862                                          bcc_ptr);
4863                 else
4864 #endif /* CIFS_WEAK_PW_HASH */
4865                 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4866                                         bcc_ptr, nls_codepage);
4867                 if (rc) {
4868                         cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4869                                  __func__, rc);
4870                         cifs_buf_release(smb_buffer);
4871                         return rc;
4872                 }
4873
4874                 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4875                 if (ses->capabilities & CAP_UNICODE) {
4876                         /* must align unicode strings */
4877                         *bcc_ptr = 0; /* null byte password */
4878                         bcc_ptr++;
4879                 }
4880         }
4881
4882         if (ses->server->sign)
4883                 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4884
4885         if (ses->capabilities & CAP_STATUS32) {
4886                 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4887         }
4888         if (ses->capabilities & CAP_DFS) {
4889                 smb_buffer->Flags2 |= SMBFLG2_DFS;
4890         }
4891         if (ses->capabilities & CAP_UNICODE) {
4892                 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4893                 length =
4894                     cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4895                         6 /* max utf8 char length in bytes */ *
4896                         (/* server len*/ + 256 /* share len */), nls_codepage);
4897                 bcc_ptr += 2 * length;  /* convert num 16 bit words to bytes */
4898                 bcc_ptr += 2;   /* skip trailing null */
4899         } else {                /* ASCII */
4900                 strcpy(bcc_ptr, tree);
4901                 bcc_ptr += strlen(tree) + 1;
4902         }
4903         strcpy(bcc_ptr, "?????");
4904         bcc_ptr += strlen("?????");
4905         bcc_ptr += 1;
4906         count = bcc_ptr - &pSMB->Password[0];
4907         be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
4908         pSMB->ByteCount = cpu_to_le16(count);
4909
4910         rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4911                          0);
4912
4913         /* above now done in SendReceive */
4914         if (rc == 0) {
4915                 bool is_unicode;
4916
4917                 tcon->tidStatus = CifsGood;
4918                 tcon->need_reconnect = false;
4919                 tcon->tid = smb_buffer_response->Tid;
4920                 bcc_ptr = pByteArea(smb_buffer_response);
4921                 bytes_left = get_bcc(smb_buffer_response);
4922                 length = strnlen(bcc_ptr, bytes_left - 2);
4923                 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4924                         is_unicode = true;
4925                 else
4926                         is_unicode = false;
4927
4928
4929                 /* skip service field (NB: this field is always ASCII) */
4930                 if (length == 3) {
4931                         if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4932                             (bcc_ptr[2] == 'C')) {
4933                                 cifs_dbg(FYI, "IPC connection\n");
4934                                 tcon->ipc = true;
4935                                 tcon->pipe = true;
4936                         }
4937                 } else if (length == 2) {
4938                         if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4939                                 /* the most common case */
4940                                 cifs_dbg(FYI, "disk share connection\n");
4941                         }
4942                 }
4943                 bcc_ptr += length + 1;
4944                 bytes_left -= (length + 1);
4945                 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4946
4947                 /* mostly informational -- no need to fail on error here */
4948                 kfree(tcon->nativeFileSystem);
4949                 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4950                                                       bytes_left, is_unicode,
4951                                                       nls_codepage);
4952
4953                 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4954
4955                 if ((smb_buffer_response->WordCount == 3) ||
4956                          (smb_buffer_response->WordCount == 7))
4957                         /* field is in same location */
4958                         tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4959                 else
4960                         tcon->Flags = 0;
4961                 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4962         }
4963
4964         cifs_buf_release(smb_buffer);
4965         return rc;
4966 }
4967
4968 static void delayed_free(struct rcu_head *p)
4969 {
4970         struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4971         unload_nls(sbi->local_nls);
4972         kfree(sbi);
4973 }
4974
4975 void
4976 cifs_umount(struct cifs_sb_info *cifs_sb)
4977 {
4978         struct rb_root *root = &cifs_sb->tlink_tree;
4979         struct rb_node *node;
4980         struct tcon_link *tlink;
4981
4982         cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4983
4984         spin_lock(&cifs_sb->tlink_tree_lock);
4985         while ((node = rb_first(root))) {
4986                 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4987                 cifs_get_tlink(tlink);
4988                 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4989                 rb_erase(node, root);
4990
4991                 spin_unlock(&cifs_sb->tlink_tree_lock);
4992                 cifs_put_tlink(tlink);
4993                 spin_lock(&cifs_sb->tlink_tree_lock);
4994         }
4995         spin_unlock(&cifs_sb->tlink_tree_lock);
4996
4997         kfree(cifs_sb->mountdata);
4998         kfree(cifs_sb->prepath);
4999 #ifdef CONFIG_CIFS_DFS_UPCALL
5000         dfs_cache_del_vol(cifs_sb->origin_fullpath);
5001         kfree(cifs_sb->origin_fullpath);
5002 #endif
5003         call_rcu(&cifs_sb->rcu, delayed_free);
5004 }
5005
5006 int
5007 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5008 {
5009         int rc = 0;
5010         struct TCP_Server_Info *server = cifs_ses_server(ses);
5011
5012         if (!server->ops->need_neg || !server->ops->negotiate)
5013                 return -ENOSYS;
5014
5015         /* only send once per connect */
5016         if (!server->ops->need_neg(server))
5017                 return 0;
5018
5019         rc = server->ops->negotiate(xid, ses);
5020         if (rc == 0) {
5021                 spin_lock(&GlobalMid_Lock);
5022                 if (server->tcpStatus == CifsNeedNegotiate)
5023                         server->tcpStatus = CifsGood;
5024                 else
5025                         rc = -EHOSTDOWN;
5026                 spin_unlock(&GlobalMid_Lock);
5027         }
5028
5029         return rc;
5030 }
5031
5032 int
5033 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5034                    struct nls_table *nls_info)
5035 {
5036         int rc = -ENOSYS;
5037         struct TCP_Server_Info *server = cifs_ses_server(ses);
5038
5039         if (!ses->binding) {
5040                 ses->capabilities = server->capabilities;
5041                 if (linuxExtEnabled == 0)
5042                         ses->capabilities &= (~server->vals->cap_unix);
5043
5044                 if (ses->auth_key.response) {
5045                         cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5046                                  ses->auth_key.response);
5047                         kfree(ses->auth_key.response);
5048                         ses->auth_key.response = NULL;
5049                         ses->auth_key.len = 0;
5050                 }
5051         }
5052
5053         cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5054                  server->sec_mode, server->capabilities, server->timeAdj);
5055
5056         if (server->ops->sess_setup)
5057                 rc = server->ops->sess_setup(xid, ses, nls_info);
5058
5059         if (rc)
5060                 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5061
5062         return rc;
5063 }
5064
5065 static int
5066 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5067 {
5068         vol->sectype = ses->sectype;
5069
5070         /* krb5 is special, since we don't need username or pw */
5071         if (vol->sectype == Kerberos)
5072                 return 0;
5073
5074         return cifs_set_cifscreds(vol, ses);
5075 }
5076
5077 static struct cifs_tcon *
5078 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5079 {
5080         int rc;
5081         struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5082         struct cifs_ses *ses;
5083         struct cifs_tcon *tcon = NULL;
5084         struct smb_vol *vol_info;
5085
5086         vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5087         if (vol_info == NULL)
5088                 return ERR_PTR(-ENOMEM);
5089
5090         vol_info->local_nls = cifs_sb->local_nls;
5091         vol_info->linux_uid = fsuid;
5092         vol_info->cred_uid = fsuid;
5093         vol_info->UNC = master_tcon->treeName;
5094         vol_info->retry = master_tcon->retry;
5095         vol_info->nocase = master_tcon->nocase;
5096         vol_info->nohandlecache = master_tcon->nohandlecache;
5097         vol_info->local_lease = master_tcon->local_lease;
5098         vol_info->no_lease = master_tcon->no_lease;
5099         vol_info->resilient = master_tcon->use_resilient;
5100         vol_info->persistent = master_tcon->use_persistent;
5101         vol_info->handle_timeout = master_tcon->handle_timeout;
5102         vol_info->no_linux_ext = !master_tcon->unix_ext;
5103         vol_info->linux_ext = master_tcon->posix_extensions;
5104         vol_info->sectype = master_tcon->ses->sectype;
5105         vol_info->sign = master_tcon->ses->sign;
5106         vol_info->seal = master_tcon->seal;
5107
5108         rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5109         if (rc) {
5110                 tcon = ERR_PTR(rc);
5111                 goto out;
5112         }
5113
5114         /* get a reference for the same TCP session */
5115         spin_lock(&cifs_tcp_ses_lock);
5116         ++master_tcon->ses->server->srv_count;
5117         spin_unlock(&cifs_tcp_ses_lock);
5118
5119         ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5120         if (IS_ERR(ses)) {
5121                 tcon = (struct cifs_tcon *)ses;
5122                 cifs_put_tcp_session(master_tcon->ses->server, 0);
5123                 goto out;
5124         }
5125
5126         tcon = cifs_get_tcon(ses, vol_info);
5127         if (IS_ERR(tcon)) {
5128                 cifs_put_smb_ses(ses);
5129                 goto out;
5130         }
5131
5132         if (cap_unix(ses))
5133                 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5134
5135 out:
5136         kfree(vol_info->username);
5137         kfree_sensitive(vol_info->password);
5138         kfree(vol_info);
5139
5140         return tcon;
5141 }
5142
5143 struct cifs_tcon *
5144 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5145 {
5146         return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5147 }
5148
5149 /* find and return a tlink with given uid */
5150 static struct tcon_link *
5151 tlink_rb_search(struct rb_root *root, kuid_t uid)
5152 {
5153         struct rb_node *node = root->rb_node;
5154         struct tcon_link *tlink;
5155
5156         while (node) {
5157                 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5158
5159                 if (uid_gt(tlink->tl_uid, uid))
5160                         node = node->rb_left;
5161                 else if (uid_lt(tlink->tl_uid, uid))
5162                         node = node->rb_right;
5163                 else
5164                         return tlink;
5165         }
5166         return NULL;
5167 }
5168
5169 /* insert a tcon_link into the tree */
5170 static void
5171 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5172 {
5173         struct rb_node **new = &(root->rb_node), *parent = NULL;
5174         struct tcon_link *tlink;
5175
5176         while (*new) {
5177                 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5178                 parent = *new;
5179
5180                 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5181                         new = &((*new)->rb_left);
5182                 else
5183                         new = &((*new)->rb_right);
5184         }
5185
5186         rb_link_node(&new_tlink->tl_rbnode, parent, new);
5187         rb_insert_color(&new_tlink->tl_rbnode, root);
5188 }
5189
5190 /*
5191  * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5192  * current task.
5193  *
5194  * If the superblock doesn't refer to a multiuser mount, then just return
5195  * the master tcon for the mount.
5196  *
5197  * First, search the rbtree for an existing tcon for this fsuid. If one
5198  * exists, then check to see if it's pending construction. If it is then wait
5199  * for construction to complete. Once it's no longer pending, check to see if
5200  * it failed and either return an error or retry construction, depending on
5201  * the timeout.
5202  *
5203  * If one doesn't exist then insert a new tcon_link struct into the tree and
5204  * try to construct a new one.
5205  */
5206 struct tcon_link *
5207 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5208 {
5209         int ret;
5210         kuid_t fsuid = current_fsuid();
5211         struct tcon_link *tlink, *newtlink;
5212
5213         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5214                 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5215
5216         spin_lock(&cifs_sb->tlink_tree_lock);
5217         tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5218         if (tlink)
5219                 cifs_get_tlink(tlink);
5220         spin_unlock(&cifs_sb->tlink_tree_lock);
5221
5222         if (tlink == NULL) {
5223                 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5224                 if (newtlink == NULL)
5225                         return ERR_PTR(-ENOMEM);
5226                 newtlink->tl_uid = fsuid;
5227                 newtlink->tl_tcon = ERR_PTR(-EACCES);
5228                 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5229                 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5230                 cifs_get_tlink(newtlink);
5231
5232                 spin_lock(&cifs_sb->tlink_tree_lock);
5233                 /* was one inserted after previous search? */
5234                 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5235                 if (tlink) {
5236                         cifs_get_tlink(tlink);
5237                         spin_unlock(&cifs_sb->tlink_tree_lock);
5238                         kfree(newtlink);
5239                         goto wait_for_construction;
5240                 }
5241                 tlink = newtlink;
5242                 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5243                 spin_unlock(&cifs_sb->tlink_tree_lock);
5244         } else {
5245 wait_for_construction:
5246                 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5247                                   TASK_INTERRUPTIBLE);
5248                 if (ret) {
5249                         cifs_put_tlink(tlink);
5250                         return ERR_PTR(-ERESTARTSYS);
5251                 }
5252
5253                 /* if it's good, return it */
5254                 if (!IS_ERR(tlink->tl_tcon))
5255                         return tlink;
5256
5257                 /* return error if we tried this already recently */
5258                 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5259                         cifs_put_tlink(tlink);
5260                         return ERR_PTR(-EACCES);
5261                 }
5262
5263                 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5264                         goto wait_for_construction;
5265         }
5266
5267         tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5268         clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5269         wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5270
5271         if (IS_ERR(tlink->tl_tcon)) {
5272                 cifs_put_tlink(tlink);
5273                 return ERR_PTR(-EACCES);
5274         }
5275
5276         return tlink;
5277 }
5278
5279 /*
5280  * periodic workqueue job that scans tcon_tree for a superblock and closes
5281  * out tcons.
5282  */
5283 static void
5284 cifs_prune_tlinks(struct work_struct *work)
5285 {
5286         struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5287                                                     prune_tlinks.work);
5288         struct rb_root *root = &cifs_sb->tlink_tree;
5289         struct rb_node *node;
5290         struct rb_node *tmp;
5291         struct tcon_link *tlink;
5292
5293         /*
5294          * Because we drop the spinlock in the loop in order to put the tlink
5295          * it's not guarded against removal of links from the tree. The only
5296          * places that remove entries from the tree are this function and
5297          * umounts. Because this function is non-reentrant and is canceled
5298          * before umount can proceed, this is safe.
5299          */
5300         spin_lock(&cifs_sb->tlink_tree_lock);
5301         node = rb_first(root);
5302         while (node != NULL) {
5303                 tmp = node;
5304                 node = rb_next(tmp);
5305                 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5306
5307                 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5308                     atomic_read(&tlink->tl_count) != 0 ||
5309                     time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5310                         continue;
5311
5312                 cifs_get_tlink(tlink);
5313                 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5314                 rb_erase(tmp, root);
5315
5316                 spin_unlock(&cifs_sb->tlink_tree_lock);
5317                 cifs_put_tlink(tlink);
5318                 spin_lock(&cifs_sb->tlink_tree_lock);
5319         }
5320         spin_unlock(&cifs_sb->tlink_tree_lock);
5321
5322         queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
5323                                 TLINK_IDLE_EXPIRE);
5324 }
5325
5326 #ifdef CONFIG_CIFS_DFS_UPCALL
5327 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
5328 {
5329         int rc;
5330         struct TCP_Server_Info *server = tcon->ses->server;
5331         const struct smb_version_operations *ops = server->ops;
5332         struct dfs_cache_tgt_list tl;
5333         struct dfs_cache_tgt_iterator *it = NULL;
5334         char *tree;
5335         const char *tcp_host;
5336         size_t tcp_host_len;
5337         const char *dfs_host;
5338         size_t dfs_host_len;
5339         char *share = NULL, *prefix = NULL;
5340         struct dfs_info3_param ref = {0};
5341         bool isroot;
5342
5343         tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
5344         if (!tree)
5345                 return -ENOMEM;
5346
5347         if (!tcon->dfs_path) {
5348                 if (tcon->ipc) {
5349                         scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
5350                         rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5351                 } else {
5352                         rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
5353                 }
5354                 goto out;
5355         }
5356
5357         rc = dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl);
5358         if (rc)
5359                 goto out;
5360         isroot = ref.server_type == DFS_TYPE_ROOT;
5361         free_dfs_info_param(&ref);
5362
5363         extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
5364
5365         for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
5366                 bool target_match;
5367
5368                 kfree(share);
5369                 kfree(prefix);
5370                 share = NULL;
5371                 prefix = NULL;
5372
5373                 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
5374                 if (rc) {
5375                         cifs_dbg(VFS, "%s: failed to parse target share %d\n",
5376                                  __func__, rc);
5377                         continue;
5378                 }
5379
5380                 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
5381
5382                 if (dfs_host_len != tcp_host_len
5383                     || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
5384                         cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
5385                                  dfs_host, (int)tcp_host_len, tcp_host);
5386
5387                         rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
5388                         if (rc) {
5389                                 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
5390                                 break;
5391                         }
5392
5393                         if (!target_match) {
5394                                 cifs_dbg(FYI, "%s: skipping target\n", __func__);
5395                                 continue;
5396                         }
5397                 }
5398
5399                 if (tcon->ipc) {
5400                         scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
5401                         rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5402                 } else {
5403                         scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
5404                         rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5405                         /* Only handle prefix paths of DFS link targets */
5406                         if (!rc && !isroot) {
5407                                 rc = update_super_prepath(tcon, prefix);
5408                                 break;
5409                         }
5410                 }
5411                 if (rc == -EREMOTE)
5412                         break;
5413         }
5414
5415         kfree(share);
5416         kfree(prefix);
5417
5418         if (!rc) {
5419                 if (it)
5420                         rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
5421                 else
5422                         rc = -ENOENT;
5423         }
5424         dfs_cache_free_tgts(&tl);
5425 out:
5426         kfree(tree);
5427         return rc;
5428 }
5429 #else
5430 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
5431 {
5432         const struct smb_version_operations *ops = tcon->ses->server->ops;
5433
5434         return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
5435 }
5436 #endif