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