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