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