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