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