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