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