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