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