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