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