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