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