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