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