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