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