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