platform/x86: (eeepc-laptop) Replace SENSORS_LIMIT with clamp_val
[linux-2.6.git] / fs / cifs / connect.c
blob12b3da39733b2bc180cd1ac4a164d9f0d071e99a
1 /*
2 * fs/cifs/connect.c
4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
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.
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.
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
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>
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"
56 #define CIFS_PORT 445
57 #define RFC1001_PORT 139
59 extern mempool_t *cifs_req_poolp;
61 /* FIXME: should these be tunable? */
62 #define TLINK_ERROR_EXPIRE (1 * HZ)
63 #define TLINK_IDLE_EXPIRE (600 * HZ)
65 enum {
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,
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,
96 /* Mount options which take string value */
97 Opt_user, Opt_pass, Opt_ip,
98 Opt_unc, Opt_domain,
99 Opt_srcaddr, Opt_prefixpath,
100 Opt_iocharset, Opt_sockopt,
101 Opt_netbiosname, Opt_servern,
102 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
104 /* Mount options to be ignored */
105 Opt_ignore,
107 /* Options which could be blank */
108 Opt_blank_pass,
109 Opt_blank_user,
110 Opt_blank_ip,
112 Opt_err
115 static const match_table_t cifs_mount_option_tokens = {
117 { Opt_user_xattr, "user_xattr" },
118 { Opt_nouser_xattr, "nouser_xattr" },
119 { Opt_forceuid, "forceuid" },
120 { Opt_noforceuid, "noforceuid" },
121 { Opt_forcegid, "forcegid" },
122 { Opt_noforcegid, "noforcegid" },
123 { Opt_noblocksend, "noblocksend" },
124 { Opt_noautotune, "noautotune" },
125 { Opt_hard, "hard" },
126 { Opt_soft, "soft" },
127 { Opt_perm, "perm" },
128 { Opt_noperm, "noperm" },
129 { Opt_mapchars, "mapchars" },
130 { Opt_nomapchars, "nomapchars" },
131 { Opt_sfu, "sfu" },
132 { Opt_nosfu, "nosfu" },
133 { Opt_nodfs, "nodfs" },
134 { Opt_posixpaths, "posixpaths" },
135 { Opt_noposixpaths, "noposixpaths" },
136 { Opt_nounix, "nounix" },
137 { Opt_nounix, "nolinux" },
138 { Opt_nocase, "nocase" },
139 { Opt_nocase, "ignorecase" },
140 { Opt_brl, "brl" },
141 { Opt_nobrl, "nobrl" },
142 { Opt_nobrl, "nolock" },
143 { Opt_forcemandatorylock, "forcemandatorylock" },
144 { Opt_forcemandatorylock, "forcemand" },
145 { Opt_setuids, "setuids" },
146 { Opt_nosetuids, "nosetuids" },
147 { Opt_dynperm, "dynperm" },
148 { Opt_nodynperm, "nodynperm" },
149 { Opt_nohard, "nohard" },
150 { Opt_nosoft, "nosoft" },
151 { Opt_nointr, "nointr" },
152 { Opt_intr, "intr" },
153 { Opt_nostrictsync, "nostrictsync" },
154 { Opt_strictsync, "strictsync" },
155 { Opt_serverino, "serverino" },
156 { Opt_noserverino, "noserverino" },
157 { Opt_rwpidforward, "rwpidforward" },
158 { Opt_cifsacl, "cifsacl" },
159 { Opt_nocifsacl, "nocifsacl" },
160 { Opt_acl, "acl" },
161 { Opt_noacl, "noacl" },
162 { Opt_locallease, "locallease" },
163 { Opt_sign, "sign" },
164 { Opt_seal, "seal" },
165 { Opt_noac, "noac" },
166 { Opt_fsc, "fsc" },
167 { Opt_mfsymlinks, "mfsymlinks" },
168 { Opt_multiuser, "multiuser" },
169 { Opt_sloppy, "sloppy" },
171 { Opt_backupuid, "backupuid=%s" },
172 { Opt_backupgid, "backupgid=%s" },
173 { Opt_uid, "uid=%s" },
174 { Opt_cruid, "cruid=%s" },
175 { Opt_gid, "gid=%s" },
176 { Opt_file_mode, "file_mode=%s" },
177 { Opt_dirmode, "dirmode=%s" },
178 { Opt_dirmode, "dir_mode=%s" },
179 { Opt_port, "port=%s" },
180 { Opt_rsize, "rsize=%s" },
181 { Opt_wsize, "wsize=%s" },
182 { Opt_actimeo, "actimeo=%s" },
184 { Opt_blank_user, "user=" },
185 { Opt_blank_user, "username=" },
186 { Opt_user, "user=%s" },
187 { Opt_user, "username=%s" },
188 { Opt_blank_pass, "pass=" },
189 { Opt_blank_pass, "password=" },
190 { Opt_pass, "pass=%s" },
191 { Opt_pass, "password=%s" },
192 { Opt_blank_ip, "ip=" },
193 { Opt_blank_ip, "addr=" },
194 { Opt_ip, "ip=%s" },
195 { Opt_ip, "addr=%s" },
196 { Opt_unc, "unc=%s" },
197 { Opt_unc, "target=%s" },
198 { Opt_unc, "path=%s" },
199 { Opt_domain, "dom=%s" },
200 { Opt_domain, "domain=%s" },
201 { Opt_domain, "workgroup=%s" },
202 { Opt_srcaddr, "srcaddr=%s" },
203 { Opt_prefixpath, "prefixpath=%s" },
204 { Opt_iocharset, "iocharset=%s" },
205 { Opt_sockopt, "sockopt=%s" },
206 { Opt_netbiosname, "netbiosname=%s" },
207 { Opt_servern, "servern=%s" },
208 { Opt_ver, "ver=%s" },
209 { Opt_vers, "vers=%s" },
210 { Opt_sec, "sec=%s" },
211 { Opt_cache, "cache=%s" },
213 { Opt_ignore, "cred" },
214 { Opt_ignore, "credentials" },
215 { Opt_ignore, "cred=%s" },
216 { Opt_ignore, "credentials=%s" },
217 { Opt_ignore, "guest" },
218 { Opt_ignore, "rw" },
219 { Opt_ignore, "ro" },
220 { Opt_ignore, "suid" },
221 { Opt_ignore, "nosuid" },
222 { Opt_ignore, "exec" },
223 { Opt_ignore, "noexec" },
224 { Opt_ignore, "nodev" },
225 { Opt_ignore, "noauto" },
226 { Opt_ignore, "dev" },
227 { Opt_ignore, "mand" },
228 { Opt_ignore, "nomand" },
229 { Opt_ignore, "_netdev" },
231 { Opt_err, NULL }
234 enum {
235 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
236 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
237 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
238 Opt_sec_ntlmv2i, Opt_sec_lanman,
239 Opt_sec_none,
241 Opt_sec_err
244 static const match_table_t cifs_secflavor_tokens = {
245 { Opt_sec_krb5, "krb5" },
246 { Opt_sec_krb5i, "krb5i" },
247 { Opt_sec_krb5p, "krb5p" },
248 { Opt_sec_ntlmsspi, "ntlmsspi" },
249 { Opt_sec_ntlmssp, "ntlmssp" },
250 { Opt_ntlm, "ntlm" },
251 { Opt_sec_ntlmi, "ntlmi" },
252 { Opt_sec_ntlmv2, "nontlm" },
253 { Opt_sec_ntlmv2, "ntlmv2" },
254 { Opt_sec_ntlmv2i, "ntlmv2i" },
255 { Opt_sec_lanman, "lanman" },
256 { Opt_sec_none, "none" },
258 { Opt_sec_err, NULL }
261 /* cache flavors */
262 enum {
263 Opt_cache_loose,
264 Opt_cache_strict,
265 Opt_cache_none,
266 Opt_cache_err
269 static const match_table_t cifs_cacheflavor_tokens = {
270 { Opt_cache_loose, "loose" },
271 { Opt_cache_strict, "strict" },
272 { Opt_cache_none, "none" },
273 { Opt_cache_err, NULL }
276 static const match_table_t cifs_smb_version_tokens = {
277 { Smb_1, SMB1_VERSION_STRING },
278 { Smb_20, SMB20_VERSION_STRING},
279 { Smb_21, SMB21_VERSION_STRING },
280 { Smb_30, SMB30_VERSION_STRING },
283 static int ip_connect(struct TCP_Server_Info *server);
284 static int generic_ip_connect(struct TCP_Server_Info *server);
285 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
286 static void cifs_prune_tlinks(struct work_struct *work);
287 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
288 const char *devname);
291 * cifs tcp session reconnection
293 * mark tcp session as reconnecting so temporarily locked
294 * mark all smb sessions as reconnecting for tcp session
295 * reconnect tcp session
296 * wake up waiters on reconnection? - (not needed currently)
299 cifs_reconnect(struct TCP_Server_Info *server)
301 int rc = 0;
302 struct list_head *tmp, *tmp2;
303 struct cifs_ses *ses;
304 struct cifs_tcon *tcon;
305 struct mid_q_entry *mid_entry;
306 struct list_head retry_list;
308 spin_lock(&GlobalMid_Lock);
309 if (server->tcpStatus == CifsExiting) {
310 /* the demux thread will exit normally
311 next time through the loop */
312 spin_unlock(&GlobalMid_Lock);
313 return rc;
314 } else
315 server->tcpStatus = CifsNeedReconnect;
316 spin_unlock(&GlobalMid_Lock);
317 server->maxBuf = 0;
318 #ifdef CONFIG_CIFS_SMB2
319 server->max_read = 0;
320 #endif
322 cFYI(1, "Reconnecting tcp session");
324 /* before reconnecting the tcp session, mark the smb session (uid)
325 and the tid bad so they are not used until reconnected */
326 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
327 spin_lock(&cifs_tcp_ses_lock);
328 list_for_each(tmp, &server->smb_ses_list) {
329 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
330 ses->need_reconnect = true;
331 ses->ipc_tid = 0;
332 list_for_each(tmp2, &ses->tcon_list) {
333 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
334 tcon->need_reconnect = true;
337 spin_unlock(&cifs_tcp_ses_lock);
339 /* do not want to be sending data on a socket we are freeing */
340 cFYI(1, "%s: tearing down socket", __func__);
341 mutex_lock(&server->srv_mutex);
342 if (server->ssocket) {
343 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
344 server->ssocket->flags);
345 kernel_sock_shutdown(server->ssocket, SHUT_WR);
346 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
347 server->ssocket->state,
348 server->ssocket->flags);
349 sock_release(server->ssocket);
350 server->ssocket = NULL;
352 server->sequence_number = 0;
353 server->session_estab = false;
354 kfree(server->session_key.response);
355 server->session_key.response = NULL;
356 server->session_key.len = 0;
357 server->lstrp = jiffies;
358 mutex_unlock(&server->srv_mutex);
360 /* mark submitted MIDs for retry and issue callback */
361 INIT_LIST_HEAD(&retry_list);
362 cFYI(1, "%s: moving mids to private list", __func__);
363 spin_lock(&GlobalMid_Lock);
364 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
365 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
366 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
367 mid_entry->mid_state = MID_RETRY_NEEDED;
368 list_move(&mid_entry->qhead, &retry_list);
370 spin_unlock(&GlobalMid_Lock);
372 cFYI(1, "%s: issuing mid callbacks", __func__);
373 list_for_each_safe(tmp, tmp2, &retry_list) {
374 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
375 list_del_init(&mid_entry->qhead);
376 mid_entry->callback(mid_entry);
379 do {
380 try_to_freeze();
382 /* we should try only the port we connected to before */
383 rc = generic_ip_connect(server);
384 if (rc) {
385 cFYI(1, "reconnect error %d", rc);
386 msleep(3000);
387 } else {
388 atomic_inc(&tcpSesReconnectCount);
389 spin_lock(&GlobalMid_Lock);
390 if (server->tcpStatus != CifsExiting)
391 server->tcpStatus = CifsNeedNegotiate;
392 spin_unlock(&GlobalMid_Lock);
394 } while (server->tcpStatus == CifsNeedReconnect);
396 return rc;
399 static void
400 cifs_echo_request(struct work_struct *work)
402 int rc;
403 struct TCP_Server_Info *server = container_of(work,
404 struct TCP_Server_Info, echo.work);
407 * We cannot send an echo if it is disabled or until the
408 * NEGOTIATE_PROTOCOL request is done, which is indicated by
409 * server->ops->need_neg() == true. Also, no need to ping if
410 * we got a response recently.
412 if (!server->ops->need_neg || server->ops->need_neg(server) ||
413 (server->ops->can_echo && !server->ops->can_echo(server)) ||
414 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
415 goto requeue_echo;
417 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
418 if (rc)
419 cFYI(1, "Unable to send echo request to server: %s",
420 server->hostname);
422 requeue_echo:
423 queue_delayed_work(cifsiod_wq, &server->echo, SMB_ECHO_INTERVAL);
426 static bool
427 allocate_buffers(struct TCP_Server_Info *server)
429 if (!server->bigbuf) {
430 server->bigbuf = (char *)cifs_buf_get();
431 if (!server->bigbuf) {
432 cERROR(1, "No memory for large SMB response");
433 msleep(3000);
434 /* retry will check if exiting */
435 return false;
437 } else if (server->large_buf) {
438 /* we are reusing a dirty large buf, clear its start */
439 memset(server->bigbuf, 0, HEADER_SIZE(server));
442 if (!server->smallbuf) {
443 server->smallbuf = (char *)cifs_small_buf_get();
444 if (!server->smallbuf) {
445 cERROR(1, "No memory for SMB response");
446 msleep(1000);
447 /* retry will check if exiting */
448 return false;
450 /* beginning of smb buffer is cleared in our buf_get */
451 } else {
452 /* if existing small buf clear beginning */
453 memset(server->smallbuf, 0, HEADER_SIZE(server));
456 return true;
459 static bool
460 server_unresponsive(struct TCP_Server_Info *server)
463 * We need to wait 2 echo intervals to make sure we handle such
464 * situations right:
465 * 1s client sends a normal SMB request
466 * 2s client gets a response
467 * 30s echo workqueue job pops, and decides we got a response recently
468 * and don't need to send another
469 * ...
470 * 65s kernel_recvmsg times out, and we see that we haven't gotten
471 * a response in >60s.
473 if (server->tcpStatus == CifsGood &&
474 time_after(jiffies, server->lstrp + 2 * SMB_ECHO_INTERVAL)) {
475 cERROR(1, "Server %s has not responded in %d seconds. "
476 "Reconnecting...", server->hostname,
477 (2 * SMB_ECHO_INTERVAL) / HZ);
478 cifs_reconnect(server);
479 wake_up(&server->response_q);
480 return true;
483 return false;
487 * kvec_array_init - clone a kvec array, and advance into it
488 * @new: pointer to memory for cloned array
489 * @iov: pointer to original array
490 * @nr_segs: number of members in original array
491 * @bytes: number of bytes to advance into the cloned array
493 * This function will copy the array provided in iov to a section of memory
494 * and advance the specified number of bytes into the new array. It returns
495 * the number of segments in the new array. "new" must be at least as big as
496 * the original iov array.
498 static unsigned int
499 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
500 size_t bytes)
502 size_t base = 0;
504 while (bytes || !iov->iov_len) {
505 int copy = min(bytes, iov->iov_len);
507 bytes -= copy;
508 base += copy;
509 if (iov->iov_len == base) {
510 iov++;
511 nr_segs--;
512 base = 0;
515 memcpy(new, iov, sizeof(*iov) * nr_segs);
516 new->iov_base += base;
517 new->iov_len -= base;
518 return nr_segs;
521 static struct kvec *
522 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
524 struct kvec *new_iov;
526 if (server->iov && nr_segs <= server->nr_iov)
527 return server->iov;
529 /* not big enough -- allocate a new one and release the old */
530 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
531 if (new_iov) {
532 kfree(server->iov);
533 server->iov = new_iov;
534 server->nr_iov = nr_segs;
536 return new_iov;
540 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
541 unsigned int nr_segs, unsigned int to_read)
543 int length = 0;
544 int total_read;
545 unsigned int segs;
546 struct msghdr smb_msg;
547 struct kvec *iov;
549 iov = get_server_iovec(server, nr_segs);
550 if (!iov)
551 return -ENOMEM;
553 smb_msg.msg_control = NULL;
554 smb_msg.msg_controllen = 0;
556 for (total_read = 0; to_read; total_read += length, to_read -= length) {
557 try_to_freeze();
559 if (server_unresponsive(server)) {
560 total_read = -EAGAIN;
561 break;
564 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
566 length = kernel_recvmsg(server->ssocket, &smb_msg,
567 iov, segs, to_read, 0);
569 if (server->tcpStatus == CifsExiting) {
570 total_read = -ESHUTDOWN;
571 break;
572 } else if (server->tcpStatus == CifsNeedReconnect) {
573 cifs_reconnect(server);
574 total_read = -EAGAIN;
575 break;
576 } else if (length == -ERESTARTSYS ||
577 length == -EAGAIN ||
578 length == -EINTR) {
580 * Minimum sleep to prevent looping, allowing socket
581 * to clear and app threads to set tcpStatus
582 * CifsNeedReconnect if server hung.
584 usleep_range(1000, 2000);
585 length = 0;
586 continue;
587 } else if (length <= 0) {
588 cFYI(1, "Received no data or error: expecting %d "
589 "got %d", to_read, length);
590 cifs_reconnect(server);
591 total_read = -EAGAIN;
592 break;
595 return total_read;
599 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
600 unsigned int to_read)
602 struct kvec iov;
604 iov.iov_base = buf;
605 iov.iov_len = to_read;
607 return cifs_readv_from_socket(server, &iov, 1, to_read);
610 static bool
611 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
614 * The first byte big endian of the length field,
615 * is actually not part of the length but the type
616 * with the most common, zero, as regular data.
618 switch (type) {
619 case RFC1002_SESSION_MESSAGE:
620 /* Regular SMB response */
621 return true;
622 case RFC1002_SESSION_KEEP_ALIVE:
623 cFYI(1, "RFC 1002 session keep alive");
624 break;
625 case RFC1002_POSITIVE_SESSION_RESPONSE:
626 cFYI(1, "RFC 1002 positive session response");
627 break;
628 case RFC1002_NEGATIVE_SESSION_RESPONSE:
630 * We get this from Windows 98 instead of an error on
631 * SMB negprot response.
633 cFYI(1, "RFC 1002 negative session response");
634 /* give server a second to clean up */
635 msleep(1000);
637 * Always try 445 first on reconnect since we get NACK
638 * on some if we ever connected to port 139 (the NACK
639 * is since we do not begin with RFC1001 session
640 * initialize frame).
642 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
643 cifs_reconnect(server);
644 wake_up(&server->response_q);
645 break;
646 default:
647 cERROR(1, "RFC 1002 unknown response type 0x%x", type);
648 cifs_reconnect(server);
651 return false;
654 void
655 dequeue_mid(struct mid_q_entry *mid, bool malformed)
657 #ifdef CONFIG_CIFS_STATS2
658 mid->when_received = jiffies;
659 #endif
660 spin_lock(&GlobalMid_Lock);
661 if (!malformed)
662 mid->mid_state = MID_RESPONSE_RECEIVED;
663 else
664 mid->mid_state = MID_RESPONSE_MALFORMED;
665 list_del_init(&mid->qhead);
666 spin_unlock(&GlobalMid_Lock);
669 static void
670 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
671 char *buf, int malformed)
673 if (server->ops->check_trans2 &&
674 server->ops->check_trans2(mid, server, buf, malformed))
675 return;
676 mid->resp_buf = buf;
677 mid->large_buf = server->large_buf;
678 /* Was previous buf put in mpx struct for multi-rsp? */
679 if (!mid->multiRsp) {
680 /* smb buffer will be freed by user thread */
681 if (server->large_buf)
682 server->bigbuf = NULL;
683 else
684 server->smallbuf = NULL;
686 dequeue_mid(mid, malformed);
689 static void clean_demultiplex_info(struct TCP_Server_Info *server)
691 int length;
693 /* take it off the list, if it's not already */
694 spin_lock(&cifs_tcp_ses_lock);
695 list_del_init(&server->tcp_ses_list);
696 spin_unlock(&cifs_tcp_ses_lock);
698 spin_lock(&GlobalMid_Lock);
699 server->tcpStatus = CifsExiting;
700 spin_unlock(&GlobalMid_Lock);
701 wake_up_all(&server->response_q);
703 /* check if we have blocked requests that need to free */
704 spin_lock(&server->req_lock);
705 if (server->credits <= 0)
706 server->credits = 1;
707 spin_unlock(&server->req_lock);
709 * Although there should not be any requests blocked on this queue it
710 * can not hurt to be paranoid and try to wake up requests that may
711 * haven been blocked when more than 50 at time were on the wire to the
712 * same server - they now will see the session is in exit state and get
713 * out of SendReceive.
715 wake_up_all(&server->request_q);
716 /* give those requests time to exit */
717 msleep(125);
719 if (server->ssocket) {
720 sock_release(server->ssocket);
721 server->ssocket = NULL;
724 if (!list_empty(&server->pending_mid_q)) {
725 struct list_head dispose_list;
726 struct mid_q_entry *mid_entry;
727 struct list_head *tmp, *tmp2;
729 INIT_LIST_HEAD(&dispose_list);
730 spin_lock(&GlobalMid_Lock);
731 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
732 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
733 cFYI(1, "Clearing mid 0x%llx", mid_entry->mid);
734 mid_entry->mid_state = MID_SHUTDOWN;
735 list_move(&mid_entry->qhead, &dispose_list);
737 spin_unlock(&GlobalMid_Lock);
739 /* now walk dispose list and issue callbacks */
740 list_for_each_safe(tmp, tmp2, &dispose_list) {
741 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
742 cFYI(1, "Callback mid 0x%llx", mid_entry->mid);
743 list_del_init(&mid_entry->qhead);
744 mid_entry->callback(mid_entry);
746 /* 1/8th of sec is more than enough time for them to exit */
747 msleep(125);
750 if (!list_empty(&server->pending_mid_q)) {
752 * mpx threads have not exited yet give them at least the smb
753 * send timeout time for long ops.
755 * Due to delays on oplock break requests, we need to wait at
756 * least 45 seconds before giving up on a request getting a
757 * response and going ahead and killing cifsd.
759 cFYI(1, "Wait for exit from demultiplex thread");
760 msleep(46000);
762 * If threads still have not exited they are probably never
763 * coming home not much else we can do but free the memory.
767 kfree(server->hostname);
768 kfree(server->iov);
769 kfree(server);
771 length = atomic_dec_return(&tcpSesAllocCount);
772 if (length > 0)
773 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
774 GFP_KERNEL);
777 static int
778 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
780 int length;
781 char *buf = server->smallbuf;
782 unsigned int pdu_length = get_rfc1002_length(buf);
784 /* make sure this will fit in a large buffer */
785 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
786 cERROR(1, "SMB response too long (%u bytes)",
787 pdu_length);
788 cifs_reconnect(server);
789 wake_up(&server->response_q);
790 return -EAGAIN;
793 /* switch to large buffer if too big for a small one */
794 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
795 server->large_buf = true;
796 memcpy(server->bigbuf, buf, server->total_read);
797 buf = server->bigbuf;
800 /* now read the rest */
801 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
802 pdu_length - HEADER_SIZE(server) + 1 + 4);
803 if (length < 0)
804 return length;
805 server->total_read += length;
807 dump_smb(buf, server->total_read);
810 * We know that we received enough to get to the MID as we
811 * checked the pdu_length earlier. Now check to see
812 * if the rest of the header is OK. We borrow the length
813 * var for the rest of the loop to avoid a new stack var.
815 * 48 bytes is enough to display the header and a little bit
816 * into the payload for debugging purposes.
818 length = server->ops->check_message(buf, server->total_read);
819 if (length != 0)
820 cifs_dump_mem("Bad SMB: ", buf,
821 min_t(unsigned int, server->total_read, 48));
823 if (server->ops->is_status_pending &&
824 server->ops->is_status_pending(buf, server, length))
825 return -1;
827 if (!mid)
828 return length;
830 handle_mid(mid, server, buf, length);
831 return 0;
834 static int
835 cifs_demultiplex_thread(void *p)
837 int length;
838 struct TCP_Server_Info *server = p;
839 unsigned int pdu_length;
840 char *buf = NULL;
841 struct task_struct *task_to_wake = NULL;
842 struct mid_q_entry *mid_entry;
844 current->flags |= PF_MEMALLOC;
845 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
847 length = atomic_inc_return(&tcpSesAllocCount);
848 if (length > 1)
849 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
850 GFP_KERNEL);
852 set_freezable();
853 while (server->tcpStatus != CifsExiting) {
854 if (try_to_freeze())
855 continue;
857 if (!allocate_buffers(server))
858 continue;
860 server->large_buf = false;
861 buf = server->smallbuf;
862 pdu_length = 4; /* enough to get RFC1001 header */
864 length = cifs_read_from_socket(server, buf, pdu_length);
865 if (length < 0)
866 continue;
867 server->total_read = length;
870 * The right amount was read from socket - 4 bytes,
871 * so we can now interpret the length field.
873 pdu_length = get_rfc1002_length(buf);
875 cFYI(1, "RFC1002 header 0x%x", pdu_length);
876 if (!is_smb_response(server, buf[0]))
877 continue;
879 /* make sure we have enough to get to the MID */
880 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
881 cERROR(1, "SMB response too short (%u bytes)",
882 pdu_length);
883 cifs_reconnect(server);
884 wake_up(&server->response_q);
885 continue;
888 /* read down to the MID */
889 length = cifs_read_from_socket(server, buf + 4,
890 HEADER_SIZE(server) - 1 - 4);
891 if (length < 0)
892 continue;
893 server->total_read += length;
895 mid_entry = server->ops->find_mid(server, buf);
897 if (!mid_entry || !mid_entry->receive)
898 length = standard_receive3(server, mid_entry);
899 else
900 length = mid_entry->receive(server, mid_entry);
902 if (length < 0)
903 continue;
905 if (server->large_buf)
906 buf = server->bigbuf;
908 server->lstrp = jiffies;
909 if (mid_entry != NULL) {
910 if (!mid_entry->multiRsp || mid_entry->multiEnd)
911 mid_entry->callback(mid_entry);
912 } else if (!server->ops->is_oplock_break ||
913 !server->ops->is_oplock_break(buf, server)) {
914 cERROR(1, "No task to wake, unknown frame received! "
915 "NumMids %d", atomic_read(&midCount));
916 cifs_dump_mem("Received Data is: ", buf,
917 HEADER_SIZE(server));
918 #ifdef CONFIG_CIFS_DEBUG2
919 if (server->ops->dump_detail)
920 server->ops->dump_detail(buf);
921 cifs_dump_mids(server);
922 #endif /* CIFS_DEBUG2 */
925 } /* end while !EXITING */
927 /* buffer usually freed in free_mid - need to free it here on exit */
928 cifs_buf_release(server->bigbuf);
929 if (server->smallbuf) /* no sense logging a debug message if NULL */
930 cifs_small_buf_release(server->smallbuf);
932 task_to_wake = xchg(&server->tsk, NULL);
933 clean_demultiplex_info(server);
935 /* if server->tsk was NULL then wait for a signal before exiting */
936 if (!task_to_wake) {
937 set_current_state(TASK_INTERRUPTIBLE);
938 while (!signal_pending(current)) {
939 schedule();
940 set_current_state(TASK_INTERRUPTIBLE);
942 set_current_state(TASK_RUNNING);
945 module_put_and_exit(0);
948 /* extract the host portion of the UNC string */
949 static char *
950 extract_hostname(const char *unc)
952 const char *src;
953 char *dst, *delim;
954 unsigned int len;
956 /* skip double chars at beginning of string */
957 /* BB: check validity of these bytes? */
958 src = unc + 2;
960 /* delimiter between hostname and sharename is always '\\' now */
961 delim = strchr(src, '\\');
962 if (!delim)
963 return ERR_PTR(-EINVAL);
965 len = delim - src;
966 dst = kmalloc((len + 1), GFP_KERNEL);
967 if (dst == NULL)
968 return ERR_PTR(-ENOMEM);
970 memcpy(dst, src, len);
971 dst[len] = '\0';
973 return dst;
976 static int get_option_ul(substring_t args[], unsigned long *option)
978 int rc;
979 char *string;
981 string = match_strdup(args);
982 if (string == NULL)
983 return -ENOMEM;
984 rc = kstrtoul(string, 0, option);
985 kfree(string);
987 return rc;
991 static int cifs_parse_security_flavors(char *value,
992 struct smb_vol *vol)
995 substring_t args[MAX_OPT_ARGS];
997 switch (match_token(value, cifs_secflavor_tokens, args)) {
998 case Opt_sec_krb5:
999 vol->secFlg |= CIFSSEC_MAY_KRB5;
1000 break;
1001 case Opt_sec_krb5i:
1002 vol->secFlg |= CIFSSEC_MAY_KRB5 | CIFSSEC_MUST_SIGN;
1003 break;
1004 case Opt_sec_krb5p:
1005 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1006 cERROR(1, "Krb5 cifs privacy not supported");
1007 break;
1008 case Opt_sec_ntlmssp:
1009 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1010 break;
1011 case Opt_sec_ntlmsspi:
1012 vol->secFlg |= CIFSSEC_MAY_NTLMSSP | CIFSSEC_MUST_SIGN;
1013 break;
1014 case Opt_ntlm:
1015 /* ntlm is default so can be turned off too */
1016 vol->secFlg |= CIFSSEC_MAY_NTLM;
1017 break;
1018 case Opt_sec_ntlmi:
1019 vol->secFlg |= CIFSSEC_MAY_NTLM | CIFSSEC_MUST_SIGN;
1020 break;
1021 case Opt_sec_ntlmv2:
1022 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1023 break;
1024 case Opt_sec_ntlmv2i:
1025 vol->secFlg |= CIFSSEC_MAY_NTLMV2 | CIFSSEC_MUST_SIGN;
1026 break;
1027 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1028 case Opt_sec_lanman:
1029 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1030 break;
1031 #endif
1032 case Opt_sec_none:
1033 vol->nullauth = 1;
1034 break;
1035 default:
1036 cERROR(1, "bad security option: %s", value);
1037 return 1;
1040 return 0;
1043 static int
1044 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1046 substring_t args[MAX_OPT_ARGS];
1048 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1049 case Opt_cache_loose:
1050 vol->direct_io = false;
1051 vol->strict_io = false;
1052 break;
1053 case Opt_cache_strict:
1054 vol->direct_io = false;
1055 vol->strict_io = true;
1056 break;
1057 case Opt_cache_none:
1058 vol->direct_io = true;
1059 vol->strict_io = false;
1060 break;
1061 default:
1062 cERROR(1, "bad cache= option: %s", value);
1063 return 1;
1065 return 0;
1068 static int
1069 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1071 substring_t args[MAX_OPT_ARGS];
1073 switch (match_token(value, cifs_smb_version_tokens, args)) {
1074 case Smb_1:
1075 vol->ops = &smb1_operations;
1076 vol->vals = &smb1_values;
1077 break;
1078 #ifdef CONFIG_CIFS_SMB2
1079 case Smb_20:
1080 vol->ops = &smb21_operations; /* currently identical with 2.1 */
1081 vol->vals = &smb20_values;
1082 break;
1083 case Smb_21:
1084 vol->ops = &smb21_operations;
1085 vol->vals = &smb21_values;
1086 break;
1087 case Smb_30:
1088 vol->ops = &smb30_operations;
1089 vol->vals = &smb30_values;
1090 break;
1091 #endif
1092 default:
1093 cERROR(1, "Unknown vers= option specified: %s", value);
1094 return 1;
1096 return 0;
1100 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1101 * fields with the result. Returns 0 on success and an error otherwise.
1103 static int
1104 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1106 char *pos;
1107 const char *delims = "/\\";
1108 size_t len;
1110 /* make sure we have a valid UNC double delimiter prefix */
1111 len = strspn(devname, delims);
1112 if (len != 2)
1113 return -EINVAL;
1115 /* find delimiter between host and sharename */
1116 pos = strpbrk(devname + 2, delims);
1117 if (!pos)
1118 return -EINVAL;
1120 /* skip past delimiter */
1121 ++pos;
1123 /* now go until next delimiter or end of string */
1124 len = strcspn(pos, delims);
1126 /* move "pos" up to delimiter or NULL */
1127 pos += len;
1128 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1129 if (!vol->UNC)
1130 return -ENOMEM;
1132 convert_delimiter(vol->UNC, '\\');
1134 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1135 if (!*pos++ || !*pos)
1136 return 0;
1138 vol->prepath = kstrdup(pos, GFP_KERNEL);
1139 if (!vol->prepath)
1140 return -ENOMEM;
1142 return 0;
1145 static int
1146 cifs_parse_mount_options(const char *mountdata, const char *devname,
1147 struct smb_vol *vol)
1149 char *data, *end;
1150 char *mountdata_copy = NULL, *options;
1151 unsigned int temp_len, i, j;
1152 char separator[2];
1153 short int override_uid = -1;
1154 short int override_gid = -1;
1155 bool uid_specified = false;
1156 bool gid_specified = false;
1157 bool sloppy = false;
1158 char *invalid = NULL;
1159 char *nodename = utsname()->nodename;
1160 char *string = NULL;
1161 char *tmp_end, *value;
1162 char delim;
1163 bool got_ip = false;
1164 unsigned short port = 0;
1165 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1167 separator[0] = ',';
1168 separator[1] = 0;
1169 delim = separator[0];
1171 /* ensure we always start with zeroed-out smb_vol */
1172 memset(vol, 0, sizeof(*vol));
1175 * does not have to be perfect mapping since field is
1176 * informational, only used for servers that do not support
1177 * port 445 and it can be overridden at mount time
1179 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1180 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1181 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1183 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1184 /* null target name indicates to use *SMBSERVR default called name
1185 if we end up sending RFC1001 session initialize */
1186 vol->target_rfc1001_name[0] = 0;
1187 vol->cred_uid = current_uid();
1188 vol->linux_uid = current_uid();
1189 vol->linux_gid = current_gid();
1191 /* default to only allowing write access to owner of the mount */
1192 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1194 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1195 /* default is always to request posix paths. */
1196 vol->posix_paths = 1;
1197 /* default to using server inode numbers where available */
1198 vol->server_ino = 1;
1200 /* default is to use strict cifs caching semantics */
1201 vol->strict_io = true;
1203 vol->actimeo = CIFS_DEF_ACTIMEO;
1205 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1206 vol->ops = &smb1_operations;
1207 vol->vals = &smb1_values;
1209 if (!mountdata)
1210 goto cifs_parse_mount_err;
1212 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1213 if (!mountdata_copy)
1214 goto cifs_parse_mount_err;
1216 options = mountdata_copy;
1217 end = options + strlen(options);
1219 if (strncmp(options, "sep=", 4) == 0) {
1220 if (options[4] != 0) {
1221 separator[0] = options[4];
1222 options += 5;
1223 } else {
1224 cFYI(1, "Null separator not allowed");
1227 vol->backupuid_specified = false; /* no backup intent for a user */
1228 vol->backupgid_specified = false; /* no backup intent for a group */
1231 * For now, we ignore -EINVAL errors under the assumption that the
1232 * unc= and prefixpath= options will be usable.
1234 if (cifs_parse_devname(devname, vol) == -ENOMEM) {
1235 printk(KERN_ERR "CIFS: Unable to allocate memory to parse "
1236 "device string.\n");
1237 goto out_nomem;
1240 while ((data = strsep(&options, separator)) != NULL) {
1241 substring_t args[MAX_OPT_ARGS];
1242 unsigned long option;
1243 int token;
1245 if (!*data)
1246 continue;
1248 token = match_token(data, cifs_mount_option_tokens, args);
1250 switch (token) {
1252 /* Ingnore the following */
1253 case Opt_ignore:
1254 break;
1256 /* Boolean values */
1257 case Opt_user_xattr:
1258 vol->no_xattr = 0;
1259 break;
1260 case Opt_nouser_xattr:
1261 vol->no_xattr = 1;
1262 break;
1263 case Opt_forceuid:
1264 override_uid = 1;
1265 break;
1266 case Opt_noforceuid:
1267 override_uid = 0;
1268 break;
1269 case Opt_forcegid:
1270 override_gid = 1;
1271 break;
1272 case Opt_noforcegid:
1273 override_gid = 0;
1274 break;
1275 case Opt_noblocksend:
1276 vol->noblocksnd = 1;
1277 break;
1278 case Opt_noautotune:
1279 vol->noautotune = 1;
1280 break;
1281 case Opt_hard:
1282 vol->retry = 1;
1283 break;
1284 case Opt_soft:
1285 vol->retry = 0;
1286 break;
1287 case Opt_perm:
1288 vol->noperm = 0;
1289 break;
1290 case Opt_noperm:
1291 vol->noperm = 1;
1292 break;
1293 case Opt_mapchars:
1294 vol->remap = 1;
1295 break;
1296 case Opt_nomapchars:
1297 vol->remap = 0;
1298 break;
1299 case Opt_sfu:
1300 vol->sfu_emul = 1;
1301 break;
1302 case Opt_nosfu:
1303 vol->sfu_emul = 0;
1304 break;
1305 case Opt_nodfs:
1306 vol->nodfs = 1;
1307 break;
1308 case Opt_posixpaths:
1309 vol->posix_paths = 1;
1310 break;
1311 case Opt_noposixpaths:
1312 vol->posix_paths = 0;
1313 break;
1314 case Opt_nounix:
1315 vol->no_linux_ext = 1;
1316 break;
1317 case Opt_nocase:
1318 vol->nocase = 1;
1319 break;
1320 case Opt_brl:
1321 vol->nobrl = 0;
1322 break;
1323 case Opt_nobrl:
1324 vol->nobrl = 1;
1326 * turn off mandatory locking in mode
1327 * if remote locking is turned off since the
1328 * local vfs will do advisory
1330 if (vol->file_mode ==
1331 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1332 vol->file_mode = S_IALLUGO;
1333 break;
1334 case Opt_forcemandatorylock:
1335 vol->mand_lock = 1;
1336 break;
1337 case Opt_setuids:
1338 vol->setuids = 1;
1339 break;
1340 case Opt_nosetuids:
1341 vol->setuids = 0;
1342 break;
1343 case Opt_dynperm:
1344 vol->dynperm = true;
1345 break;
1346 case Opt_nodynperm:
1347 vol->dynperm = false;
1348 break;
1349 case Opt_nohard:
1350 vol->retry = 0;
1351 break;
1352 case Opt_nosoft:
1353 vol->retry = 1;
1354 break;
1355 case Opt_nointr:
1356 vol->intr = 0;
1357 break;
1358 case Opt_intr:
1359 vol->intr = 1;
1360 break;
1361 case Opt_nostrictsync:
1362 vol->nostrictsync = 1;
1363 break;
1364 case Opt_strictsync:
1365 vol->nostrictsync = 0;
1366 break;
1367 case Opt_serverino:
1368 vol->server_ino = 1;
1369 break;
1370 case Opt_noserverino:
1371 vol->server_ino = 0;
1372 break;
1373 case Opt_rwpidforward:
1374 vol->rwpidforward = 1;
1375 break;
1376 case Opt_cifsacl:
1377 vol->cifs_acl = 1;
1378 break;
1379 case Opt_nocifsacl:
1380 vol->cifs_acl = 0;
1381 break;
1382 case Opt_acl:
1383 vol->no_psx_acl = 0;
1384 break;
1385 case Opt_noacl:
1386 vol->no_psx_acl = 1;
1387 break;
1388 case Opt_locallease:
1389 vol->local_lease = 1;
1390 break;
1391 case Opt_sign:
1392 vol->secFlg |= CIFSSEC_MUST_SIGN;
1393 break;
1394 case Opt_seal:
1395 /* we do not do the following in secFlags because seal
1396 * is a per tree connection (mount) not a per socket
1397 * or per-smb connection option in the protocol
1398 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1400 vol->seal = 1;
1401 break;
1402 case Opt_noac:
1403 printk(KERN_WARNING "CIFS: Mount option noac not "
1404 "supported. Instead set "
1405 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1406 break;
1407 case Opt_fsc:
1408 #ifndef CONFIG_CIFS_FSCACHE
1409 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1410 "kernel config option set");
1411 goto cifs_parse_mount_err;
1412 #endif
1413 vol->fsc = true;
1414 break;
1415 case Opt_mfsymlinks:
1416 vol->mfsymlinks = true;
1417 break;
1418 case Opt_multiuser:
1419 vol->multiuser = true;
1420 break;
1421 case Opt_sloppy:
1422 sloppy = true;
1423 break;
1425 /* Numeric Values */
1426 case Opt_backupuid:
1427 if (get_option_ul(args, &option)) {
1428 cERROR(1, "%s: Invalid backupuid value",
1429 __func__);
1430 goto cifs_parse_mount_err;
1432 vol->backupuid = option;
1433 vol->backupuid_specified = true;
1434 break;
1435 case Opt_backupgid:
1436 if (get_option_ul(args, &option)) {
1437 cERROR(1, "%s: Invalid backupgid value",
1438 __func__);
1439 goto cifs_parse_mount_err;
1441 vol->backupgid = option;
1442 vol->backupgid_specified = true;
1443 break;
1444 case Opt_uid:
1445 if (get_option_ul(args, &option)) {
1446 cERROR(1, "%s: Invalid uid value",
1447 __func__);
1448 goto cifs_parse_mount_err;
1450 vol->linux_uid = option;
1451 uid_specified = true;
1452 break;
1453 case Opt_cruid:
1454 if (get_option_ul(args, &option)) {
1455 cERROR(1, "%s: Invalid cruid value",
1456 __func__);
1457 goto cifs_parse_mount_err;
1459 vol->cred_uid = option;
1460 break;
1461 case Opt_gid:
1462 if (get_option_ul(args, &option)) {
1463 cERROR(1, "%s: Invalid gid value",
1464 __func__);
1465 goto cifs_parse_mount_err;
1467 vol->linux_gid = option;
1468 gid_specified = true;
1469 break;
1470 case Opt_file_mode:
1471 if (get_option_ul(args, &option)) {
1472 cERROR(1, "%s: Invalid file_mode value",
1473 __func__);
1474 goto cifs_parse_mount_err;
1476 vol->file_mode = option;
1477 break;
1478 case Opt_dirmode:
1479 if (get_option_ul(args, &option)) {
1480 cERROR(1, "%s: Invalid dir_mode value",
1481 __func__);
1482 goto cifs_parse_mount_err;
1484 vol->dir_mode = option;
1485 break;
1486 case Opt_port:
1487 if (get_option_ul(args, &option) ||
1488 option > USHRT_MAX) {
1489 cERROR(1, "%s: Invalid port value", __func__);
1490 goto cifs_parse_mount_err;
1492 port = (unsigned short)option;
1493 break;
1494 case Opt_rsize:
1495 if (get_option_ul(args, &option)) {
1496 cERROR(1, "%s: Invalid rsize value",
1497 __func__);
1498 goto cifs_parse_mount_err;
1500 vol->rsize = option;
1501 break;
1502 case Opt_wsize:
1503 if (get_option_ul(args, &option)) {
1504 cERROR(1, "%s: Invalid wsize value",
1505 __func__);
1506 goto cifs_parse_mount_err;
1508 vol->wsize = option;
1509 break;
1510 case Opt_actimeo:
1511 if (get_option_ul(args, &option)) {
1512 cERROR(1, "%s: Invalid actimeo value",
1513 __func__);
1514 goto cifs_parse_mount_err;
1516 vol->actimeo = HZ * option;
1517 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1518 cERROR(1, "CIFS: attribute cache"
1519 "timeout too large");
1520 goto cifs_parse_mount_err;
1522 break;
1524 /* String Arguments */
1526 case Opt_blank_user:
1527 /* null user, ie. anonymous authentication */
1528 vol->nullauth = 1;
1529 vol->username = NULL;
1530 break;
1531 case Opt_user:
1532 string = match_strdup(args);
1533 if (string == NULL)
1534 goto out_nomem;
1536 if (strnlen(string, MAX_USERNAME_SIZE) >
1537 MAX_USERNAME_SIZE) {
1538 printk(KERN_WARNING "CIFS: username too long\n");
1539 goto cifs_parse_mount_err;
1541 vol->username = kstrdup(string, GFP_KERNEL);
1542 if (!vol->username) {
1543 printk(KERN_WARNING "CIFS: no memory "
1544 "for username\n");
1545 goto cifs_parse_mount_err;
1547 break;
1548 case Opt_blank_pass:
1549 vol->password = NULL;
1550 break;
1551 case Opt_pass:
1552 /* passwords have to be handled differently
1553 * to allow the character used for deliminator
1554 * to be passed within them
1557 /* Obtain the value string */
1558 value = strchr(data, '=');
1559 value++;
1561 /* Set tmp_end to end of the string */
1562 tmp_end = (char *) value + strlen(value);
1564 /* Check if following character is the deliminator
1565 * If yes, we have encountered a double deliminator
1566 * reset the NULL character to the deliminator
1568 if (tmp_end < end && tmp_end[1] == delim) {
1569 tmp_end[0] = delim;
1571 /* Keep iterating until we get to a single
1572 * deliminator OR the end
1574 while ((tmp_end = strchr(tmp_end, delim))
1575 != NULL && (tmp_end[1] == delim)) {
1576 tmp_end = (char *) &tmp_end[2];
1579 /* Reset var options to point to next element */
1580 if (tmp_end) {
1581 tmp_end[0] = '\0';
1582 options = (char *) &tmp_end[1];
1583 } else
1584 /* Reached the end of the mount option
1585 * string */
1586 options = end;
1589 /* Now build new password string */
1590 temp_len = strlen(value);
1591 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1592 if (vol->password == NULL) {
1593 printk(KERN_WARNING "CIFS: no memory "
1594 "for password\n");
1595 goto cifs_parse_mount_err;
1598 for (i = 0, j = 0; i < temp_len; i++, j++) {
1599 vol->password[j] = value[i];
1600 if ((value[i] == delim) &&
1601 value[i+1] == delim)
1602 /* skip the second deliminator */
1603 i++;
1605 vol->password[j] = '\0';
1606 break;
1607 case Opt_blank_ip:
1608 /* FIXME: should this be an error instead? */
1609 got_ip = false;
1610 break;
1611 case Opt_ip:
1612 string = match_strdup(args);
1613 if (string == NULL)
1614 goto out_nomem;
1616 if (!cifs_convert_address(dstaddr, string,
1617 strlen(string))) {
1618 printk(KERN_ERR "CIFS: bad ip= option (%s).\n",
1619 string);
1620 goto cifs_parse_mount_err;
1622 got_ip = true;
1623 break;
1624 case Opt_unc:
1625 string = vol->UNC;
1626 vol->UNC = match_strdup(args);
1627 if (vol->UNC == NULL)
1628 goto out_nomem;
1630 convert_delimiter(vol->UNC, '\\');
1631 if (vol->UNC[0] != '\\' || vol->UNC[1] != '\\') {
1632 printk(KERN_ERR "CIFS: UNC Path does not "
1633 "begin with // or \\\\\n");
1634 goto cifs_parse_mount_err;
1637 /* Compare old unc= option to new one */
1638 if (!string || strcmp(string, vol->UNC))
1639 printk(KERN_WARNING "CIFS: the value of the "
1640 "unc= mount option does not match the "
1641 "device string. Using the unc= option "
1642 "for now. In 3.10, that option will "
1643 "be ignored and the contents of the "
1644 "device string will be used "
1645 "instead. (%s != %s)\n", string,
1646 vol->UNC);
1647 break;
1648 case Opt_domain:
1649 string = match_strdup(args);
1650 if (string == NULL)
1651 goto out_nomem;
1653 if (strnlen(string, 256) == 256) {
1654 printk(KERN_WARNING "CIFS: domain name too"
1655 " long\n");
1656 goto cifs_parse_mount_err;
1659 vol->domainname = kstrdup(string, GFP_KERNEL);
1660 if (!vol->domainname) {
1661 printk(KERN_WARNING "CIFS: no memory "
1662 "for domainname\n");
1663 goto cifs_parse_mount_err;
1665 cFYI(1, "Domain name set");
1666 break;
1667 case Opt_srcaddr:
1668 string = match_strdup(args);
1669 if (string == NULL)
1670 goto out_nomem;
1672 if (!cifs_convert_address(
1673 (struct sockaddr *)&vol->srcaddr,
1674 string, strlen(string))) {
1675 printk(KERN_WARNING "CIFS: Could not parse"
1676 " srcaddr: %s\n", string);
1677 goto cifs_parse_mount_err;
1679 break;
1680 case Opt_prefixpath:
1681 /* skip over any leading delimiter */
1682 if (*args[0].from == '/' || *args[0].from == '\\')
1683 args[0].from++;
1685 string = vol->prepath;
1686 vol->prepath = match_strdup(args);
1687 if (vol->prepath == NULL)
1688 goto out_nomem;
1689 /* Compare old prefixpath= option to new one */
1690 if (!string || strcmp(string, vol->prepath))
1691 printk(KERN_WARNING "CIFS: the value of the "
1692 "prefixpath= mount option does not "
1693 "match the device string. Using the "
1694 "prefixpath= option for now. In 3.10, "
1695 "that option will be ignored and the "
1696 "contents of the device string will be "
1697 "used instead.(%s != %s)\n", string,
1698 vol->prepath);
1699 break;
1700 case Opt_iocharset:
1701 string = match_strdup(args);
1702 if (string == NULL)
1703 goto out_nomem;
1705 if (strnlen(string, 1024) >= 65) {
1706 printk(KERN_WARNING "CIFS: iocharset name "
1707 "too long.\n");
1708 goto cifs_parse_mount_err;
1711 if (strnicmp(string, "default", 7) != 0) {
1712 vol->iocharset = kstrdup(string,
1713 GFP_KERNEL);
1714 if (!vol->iocharset) {
1715 printk(KERN_WARNING "CIFS: no memory"
1716 "for charset\n");
1717 goto cifs_parse_mount_err;
1720 /* if iocharset not set then load_nls_default
1721 * is used by caller
1723 cFYI(1, "iocharset set to %s", string);
1724 break;
1725 case Opt_sockopt:
1726 string = match_strdup(args);
1727 if (string == NULL)
1728 goto out_nomem;
1730 if (strnicmp(string, "TCP_NODELAY", 11) == 0) {
1731 printk(KERN_WARNING "CIFS: the "
1732 "sockopt=TCP_NODELAY option has been "
1733 "deprecated and will be removed "
1734 "in 3.9\n");
1735 vol->sockopt_tcp_nodelay = 1;
1737 break;
1738 case Opt_netbiosname:
1739 string = match_strdup(args);
1740 if (string == NULL)
1741 goto out_nomem;
1743 memset(vol->source_rfc1001_name, 0x20,
1744 RFC1001_NAME_LEN);
1746 * FIXME: are there cases in which a comma can
1747 * be valid in workstation netbios name (and
1748 * need special handling)?
1750 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1751 /* don't ucase netbiosname for user */
1752 if (string[i] == 0)
1753 break;
1754 vol->source_rfc1001_name[i] = string[i];
1756 /* The string has 16th byte zero still from
1757 * set at top of the function
1759 if (i == RFC1001_NAME_LEN && string[i] != 0)
1760 printk(KERN_WARNING "CIFS: netbiosname"
1761 " longer than 15 truncated.\n");
1763 break;
1764 case Opt_servern:
1765 /* servernetbiosname specified override *SMBSERVER */
1766 string = match_strdup(args);
1767 if (string == NULL)
1768 goto out_nomem;
1770 /* last byte, type, is 0x20 for servr type */
1771 memset(vol->target_rfc1001_name, 0x20,
1772 RFC1001_NAME_LEN_WITH_NULL);
1774 /* BB are there cases in which a comma can be
1775 valid in this workstation netbios name
1776 (and need special handling)? */
1778 /* user or mount helper must uppercase the
1779 netbios name */
1780 for (i = 0; i < 15; i++) {
1781 if (string[i] == 0)
1782 break;
1783 vol->target_rfc1001_name[i] = string[i];
1785 /* The string has 16th byte zero still from
1786 set at top of the function */
1787 if (i == RFC1001_NAME_LEN && string[i] != 0)
1788 printk(KERN_WARNING "CIFS: server net"
1789 "biosname longer than 15 truncated.\n");
1790 break;
1791 case Opt_ver:
1792 string = match_strdup(args);
1793 if (string == NULL)
1794 goto out_nomem;
1796 if (strnicmp(string, "1", 1) == 0) {
1797 /* This is the default */
1798 break;
1800 /* For all other value, error */
1801 printk(KERN_WARNING "CIFS: Invalid version"
1802 " specified\n");
1803 goto cifs_parse_mount_err;
1804 case Opt_vers:
1805 string = match_strdup(args);
1806 if (string == NULL)
1807 goto out_nomem;
1809 if (cifs_parse_smb_version(string, vol) != 0)
1810 goto cifs_parse_mount_err;
1811 break;
1812 case Opt_sec:
1813 string = match_strdup(args);
1814 if (string == NULL)
1815 goto out_nomem;
1817 if (cifs_parse_security_flavors(string, vol) != 0)
1818 goto cifs_parse_mount_err;
1819 break;
1820 case Opt_cache:
1821 string = match_strdup(args);
1822 if (string == NULL)
1823 goto out_nomem;
1825 if (cifs_parse_cache_flavor(string, vol) != 0)
1826 goto cifs_parse_mount_err;
1827 break;
1828 default:
1830 * An option we don't recognize. Save it off for later
1831 * if we haven't already found one
1833 if (!invalid)
1834 invalid = data;
1835 break;
1837 /* Free up any allocated string */
1838 kfree(string);
1839 string = NULL;
1842 if (!sloppy && invalid) {
1843 printk(KERN_ERR "CIFS: Unknown mount option \"%s\"\n", invalid);
1844 goto cifs_parse_mount_err;
1847 #ifndef CONFIG_KEYS
1848 /* Muliuser mounts require CONFIG_KEYS support */
1849 if (vol->multiuser) {
1850 cERROR(1, "Multiuser mounts require kernels with "
1851 "CONFIG_KEYS enabled.");
1852 goto cifs_parse_mount_err;
1854 #endif
1855 if (!vol->UNC) {
1856 cERROR(1, "CIFS mount error: No usable UNC path provided in "
1857 "device string or in unc= option!");
1858 goto cifs_parse_mount_err;
1861 /* make sure UNC has a share name */
1862 if (!strchr(vol->UNC + 3, '\\')) {
1863 cERROR(1, "Malformed UNC. Unable to find share name.");
1864 goto cifs_parse_mount_err;
1867 if (!got_ip) {
1868 /* No ip= option specified? Try to get it from UNC */
1869 if (!cifs_convert_address(dstaddr, &vol->UNC[2],
1870 strlen(&vol->UNC[2]))) {
1871 printk(KERN_ERR "Unable to determine destination "
1872 "address.\n");
1873 goto cifs_parse_mount_err;
1877 /* set the port that we got earlier */
1878 cifs_set_port(dstaddr, port);
1880 if (uid_specified)
1881 vol->override_uid = override_uid;
1882 else if (override_uid == 1)
1883 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1884 "specified with no uid= option.\n");
1886 if (gid_specified)
1887 vol->override_gid = override_gid;
1888 else if (override_gid == 1)
1889 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1890 "specified with no gid= option.\n");
1892 kfree(mountdata_copy);
1893 return 0;
1895 out_nomem:
1896 printk(KERN_WARNING "Could not allocate temporary buffer\n");
1897 cifs_parse_mount_err:
1898 kfree(string);
1899 kfree(mountdata_copy);
1900 return 1;
1903 /** Returns true if srcaddr isn't specified and rhs isn't
1904 * specified, or if srcaddr is specified and
1905 * matches the IP address of the rhs argument.
1907 static bool
1908 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1910 switch (srcaddr->sa_family) {
1911 case AF_UNSPEC:
1912 return (rhs->sa_family == AF_UNSPEC);
1913 case AF_INET: {
1914 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1915 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1916 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1918 case AF_INET6: {
1919 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1920 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1921 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1923 default:
1924 WARN_ON(1);
1925 return false; /* don't expect to be here */
1930 * If no port is specified in addr structure, we try to match with 445 port
1931 * and if it fails - with 139 ports. It should be called only if address
1932 * families of server and addr are equal.
1934 static bool
1935 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1937 __be16 port, *sport;
1939 switch (addr->sa_family) {
1940 case AF_INET:
1941 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1942 port = ((struct sockaddr_in *) addr)->sin_port;
1943 break;
1944 case AF_INET6:
1945 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1946 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1947 break;
1948 default:
1949 WARN_ON(1);
1950 return false;
1953 if (!port) {
1954 port = htons(CIFS_PORT);
1955 if (port == *sport)
1956 return true;
1958 port = htons(RFC1001_PORT);
1961 return port == *sport;
1964 static bool
1965 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1966 struct sockaddr *srcaddr)
1968 switch (addr->sa_family) {
1969 case AF_INET: {
1970 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1971 struct sockaddr_in *srv_addr4 =
1972 (struct sockaddr_in *)&server->dstaddr;
1974 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1975 return false;
1976 break;
1978 case AF_INET6: {
1979 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1980 struct sockaddr_in6 *srv_addr6 =
1981 (struct sockaddr_in6 *)&server->dstaddr;
1983 if (!ipv6_addr_equal(&addr6->sin6_addr,
1984 &srv_addr6->sin6_addr))
1985 return false;
1986 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1987 return false;
1988 break;
1990 default:
1991 WARN_ON(1);
1992 return false; /* don't expect to be here */
1995 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1996 return false;
1998 return true;
2001 static bool
2002 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2004 unsigned int secFlags;
2006 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
2007 secFlags = vol->secFlg;
2008 else
2009 secFlags = global_secflags | vol->secFlg;
2011 switch (server->secType) {
2012 case LANMAN:
2013 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
2014 return false;
2015 break;
2016 case NTLMv2:
2017 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
2018 return false;
2019 break;
2020 case NTLM:
2021 if (!(secFlags & CIFSSEC_MAY_NTLM))
2022 return false;
2023 break;
2024 case Kerberos:
2025 if (!(secFlags & CIFSSEC_MAY_KRB5))
2026 return false;
2027 break;
2028 case RawNTLMSSP:
2029 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
2030 return false;
2031 break;
2032 default:
2033 /* shouldn't happen */
2034 return false;
2037 /* now check if signing mode is acceptable */
2038 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
2039 (server->sec_mode & SECMODE_SIGN_REQUIRED))
2040 return false;
2041 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
2042 (server->sec_mode &
2043 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
2044 return false;
2046 return true;
2049 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2051 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2053 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2054 return 0;
2056 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2057 return 0;
2059 if (!match_address(server, addr,
2060 (struct sockaddr *)&vol->srcaddr))
2061 return 0;
2063 if (!match_port(server, addr))
2064 return 0;
2066 if (!match_security(server, vol))
2067 return 0;
2069 return 1;
2072 static struct TCP_Server_Info *
2073 cifs_find_tcp_session(struct smb_vol *vol)
2075 struct TCP_Server_Info *server;
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;
2082 ++server->srv_count;
2083 spin_unlock(&cifs_tcp_ses_lock);
2084 cFYI(1, "Existing tcp session with server found");
2085 return server;
2087 spin_unlock(&cifs_tcp_ses_lock);
2088 return NULL;
2091 static void
2092 cifs_put_tcp_session(struct TCP_Server_Info *server)
2094 struct task_struct *task;
2096 spin_lock(&cifs_tcp_ses_lock);
2097 if (--server->srv_count > 0) {
2098 spin_unlock(&cifs_tcp_ses_lock);
2099 return;
2102 put_net(cifs_net_ns(server));
2104 list_del_init(&server->tcp_ses_list);
2105 spin_unlock(&cifs_tcp_ses_lock);
2107 cancel_delayed_work_sync(&server->echo);
2109 spin_lock(&GlobalMid_Lock);
2110 server->tcpStatus = CifsExiting;
2111 spin_unlock(&GlobalMid_Lock);
2113 cifs_crypto_shash_release(server);
2114 cifs_fscache_release_client_cookie(server);
2116 kfree(server->session_key.response);
2117 server->session_key.response = NULL;
2118 server->session_key.len = 0;
2120 task = xchg(&server->tsk, NULL);
2121 if (task)
2122 force_sig(SIGKILL, task);
2125 static struct TCP_Server_Info *
2126 cifs_get_tcp_session(struct smb_vol *volume_info)
2128 struct TCP_Server_Info *tcp_ses = NULL;
2129 int rc;
2131 cFYI(1, "UNC: %s", volume_info->UNC);
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;
2138 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2139 if (!tcp_ses) {
2140 rc = -ENOMEM;
2141 goto out_err;
2144 rc = cifs_crypto_shash_allocate(tcp_ses);
2145 if (rc) {
2146 cERROR(1, "could not setup hash structures rc %d", rc);
2147 goto out_err;
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;
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));
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
2188 tcp_ses->tcpStatus = CifsNew;
2189 ++tcp_ses->srv_count;
2191 rc = ip_connect(tcp_ses);
2192 if (rc < 0) {
2193 cERROR(1, "Error connecting to socket. Aborting operation");
2194 goto out_err_crypto_release;
2198 * since we're in a cifs function already, we know that
2199 * this will succeed. No need for try_module_get().
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 cERROR(1, "error %d create cifsd thread", rc);
2207 module_put(THIS_MODULE);
2208 goto out_err_crypto_release;
2210 tcp_ses->tcpStatus = CifsNeedNegotiate;
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);
2217 cifs_fscache_get_client_cookie(tcp_ses);
2219 /* queue echo request delayed work */
2220 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2222 return tcp_ses;
2224 out_err_crypto_release:
2225 cifs_crypto_shash_release(tcp_ses);
2227 put_net(cifs_net_ns(tcp_ses));
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);
2237 return ERR_PTR(rc);
2240 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2242 switch (ses->server->secType) {
2243 case Kerberos:
2244 if (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;
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;
2267 return 1;
2270 static struct cifs_ses *
2271 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2273 struct cifs_ses *ses;
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;
2283 spin_unlock(&cifs_tcp_ses_lock);
2284 return NULL;
2287 static void
2288 cifs_put_smb_ses(struct cifs_ses *ses)
2290 unsigned int xid;
2291 struct TCP_Server_Info *server = ses->server;
2293 cFYI(1, "%s: ses_count=%d", __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;
2300 list_del_init(&ses->smb_ses_list);
2301 spin_unlock(&cifs_tcp_ses_lock);
2303 if (ses->status == CifsGood && server->ops->logoff) {
2304 xid = get_xid();
2305 server->ops->logoff(xid, ses);
2306 _free_xid(xid);
2308 sesInfoFree(ses);
2309 cifs_put_tcp_session(server);
2312 #ifdef CONFIG_KEYS
2314 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2315 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
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)
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;
2330 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2331 if (!desc)
2332 return -ENOMEM;
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 cFYI(1, "Bad ss_family (%hu)", server->dstaddr.ss_family);
2346 rc = -EINVAL;
2347 goto out_err;
2350 cFYI(1, "%s: desc=%s", __func__, desc);
2351 key = request_key(&key_type_logon, desc, "");
2352 if (IS_ERR(key)) {
2353 if (!ses->domainName) {
2354 cFYI(1, "domainName is NULL");
2355 rc = PTR_ERR(key);
2356 goto out_err;
2359 /* didn't work, try to find a domain key */
2360 sprintf(desc, "cifs:d:%s", ses->domainName);
2361 cFYI(1, "%s: desc=%s", __func__, desc);
2362 key = request_key(&key_type_logon, desc, "");
2363 if (IS_ERR(key)) {
2364 rc = PTR_ERR(key);
2365 goto out_err;
2369 down_read(&key->sem);
2370 upayload = key->payload.data;
2371 if (IS_ERR_OR_NULL(upayload)) {
2372 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2373 goto out_key_put;
2376 /* find first : in payload */
2377 payload = (char *)upayload->data;
2378 delim = strnchr(payload, upayload->datalen, ':');
2379 cFYI(1, "payload=%s", payload);
2380 if (!delim) {
2381 cFYI(1, "Unable to find ':' in payload (datalen=%d)",
2382 upayload->datalen);
2383 rc = -EINVAL;
2384 goto out_key_put;
2387 len = delim - payload;
2388 if (len > MAX_USERNAME_SIZE || len <= 0) {
2389 cFYI(1, "Bad value from username search (len=%zd)", len);
2390 rc = -EINVAL;
2391 goto out_key_put;
2394 vol->username = kstrndup(payload, len, GFP_KERNEL);
2395 if (!vol->username) {
2396 cFYI(1, "Unable to allocate %zd bytes for username", len);
2397 rc = -ENOMEM;
2398 goto out_key_put;
2400 cFYI(1, "%s: username=%s", __func__, vol->username);
2402 len = key->datalen - (len + 1);
2403 if (len > MAX_PASSWORD_SIZE || len <= 0) {
2404 cFYI(1, "Bad len for password search (len=%zd)", len);
2405 rc = -EINVAL;
2406 kfree(vol->username);
2407 vol->username = NULL;
2408 goto out_key_put;
2411 ++delim;
2412 vol->password = kstrndup(delim, len, GFP_KERNEL);
2413 if (!vol->password) {
2414 cFYI(1, "Unable to allocate %zd bytes for password", len);
2415 rc = -ENOMEM;
2416 kfree(vol->username);
2417 vol->username = NULL;
2418 goto out_key_put;
2421 out_key_put:
2422 up_read(&key->sem);
2423 key_put(key);
2424 out_err:
2425 kfree(desc);
2426 cFYI(1, "%s: returning %d", __func__, rc);
2427 return rc;
2429 #else /* ! CONFIG_KEYS */
2430 static inline int
2431 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2432 struct cifs_ses *ses __attribute__((unused)))
2434 return -ENOSYS;
2436 #endif /* CONFIG_KEYS */
2438 static struct cifs_ses *
2439 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2441 int rc = -ENOMEM;
2442 unsigned int xid;
2443 struct cifs_ses *ses;
2444 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2445 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2447 xid = get_xid();
2449 ses = cifs_find_smb_ses(server, volume_info);
2450 if (ses) {
2451 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2453 mutex_lock(&ses->session_mutex);
2454 rc = cifs_negotiate_protocol(xid, ses);
2455 if (rc) {
2456 mutex_unlock(&ses->session_mutex);
2457 /* problem -- put our ses reference */
2458 cifs_put_smb_ses(ses);
2459 free_xid(xid);
2460 return ERR_PTR(rc);
2462 if (ses->need_reconnect) {
2463 cFYI(1, "Session needs reconnect");
2464 rc = cifs_setup_session(xid, ses,
2465 volume_info->local_nls);
2466 if (rc) {
2467 mutex_unlock(&ses->session_mutex);
2468 /* problem -- put our reference */
2469 cifs_put_smb_ses(ses);
2470 free_xid(xid);
2471 return ERR_PTR(rc);
2474 mutex_unlock(&ses->session_mutex);
2476 /* existing SMB ses has a server reference already */
2477 cifs_put_tcp_session(server);
2478 free_xid(xid);
2479 return ses;
2482 cFYI(1, "Existing smb sess not found");
2483 ses = sesInfoAlloc();
2484 if (ses == NULL)
2485 goto get_ses_fail;
2487 /* new SMB session uses our server ref */
2488 ses->server = server;
2489 if (server->dstaddr.ss_family == AF_INET6)
2490 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2491 else
2492 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2494 if (volume_info->username) {
2495 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2496 if (!ses->user_name)
2497 goto get_ses_fail;
2500 /* volume_info->password freed at unmount */
2501 if (volume_info->password) {
2502 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2503 if (!ses->password)
2504 goto get_ses_fail;
2506 if (volume_info->domainname) {
2507 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2508 if (!ses->domainName)
2509 goto get_ses_fail;
2511 ses->cred_uid = volume_info->cred_uid;
2512 ses->linux_uid = volume_info->linux_uid;
2514 ses->overrideSecFlg = volume_info->secFlg;
2516 mutex_lock(&ses->session_mutex);
2517 rc = cifs_negotiate_protocol(xid, ses);
2518 if (!rc)
2519 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2520 mutex_unlock(&ses->session_mutex);
2521 if (rc)
2522 goto get_ses_fail;
2524 /* success, put it on the list */
2525 spin_lock(&cifs_tcp_ses_lock);
2526 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2527 spin_unlock(&cifs_tcp_ses_lock);
2529 free_xid(xid);
2530 return ses;
2532 get_ses_fail:
2533 sesInfoFree(ses);
2534 free_xid(xid);
2535 return ERR_PTR(rc);
2538 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2540 if (tcon->tidStatus == CifsExiting)
2541 return 0;
2542 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2543 return 0;
2544 return 1;
2547 static struct cifs_tcon *
2548 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2550 struct list_head *tmp;
2551 struct cifs_tcon *tcon;
2553 spin_lock(&cifs_tcp_ses_lock);
2554 list_for_each(tmp, &ses->tcon_list) {
2555 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2556 if (!match_tcon(tcon, unc))
2557 continue;
2558 ++tcon->tc_count;
2559 spin_unlock(&cifs_tcp_ses_lock);
2560 return tcon;
2562 spin_unlock(&cifs_tcp_ses_lock);
2563 return NULL;
2566 static void
2567 cifs_put_tcon(struct cifs_tcon *tcon)
2569 unsigned int xid;
2570 struct cifs_ses *ses = tcon->ses;
2572 cFYI(1, "%s: tc_count=%d", __func__, tcon->tc_count);
2573 spin_lock(&cifs_tcp_ses_lock);
2574 if (--tcon->tc_count > 0) {
2575 spin_unlock(&cifs_tcp_ses_lock);
2576 return;
2579 list_del_init(&tcon->tcon_list);
2580 spin_unlock(&cifs_tcp_ses_lock);
2582 xid = get_xid();
2583 if (ses->server->ops->tree_disconnect)
2584 ses->server->ops->tree_disconnect(xid, tcon);
2585 _free_xid(xid);
2587 cifs_fscache_release_super_cookie(tcon);
2588 tconInfoFree(tcon);
2589 cifs_put_smb_ses(ses);
2592 static struct cifs_tcon *
2593 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2595 int rc, xid;
2596 struct cifs_tcon *tcon;
2598 tcon = cifs_find_tcon(ses, volume_info->UNC);
2599 if (tcon) {
2600 cFYI(1, "Found match on UNC path");
2601 /* existing tcon already has a reference */
2602 cifs_put_smb_ses(ses);
2603 if (tcon->seal != volume_info->seal)
2604 cERROR(1, "transport encryption setting "
2605 "conflicts with existing tid");
2606 return tcon;
2609 if (!ses->server->ops->tree_connect) {
2610 rc = -ENOSYS;
2611 goto out_fail;
2614 tcon = tconInfoAlloc();
2615 if (tcon == NULL) {
2616 rc = -ENOMEM;
2617 goto out_fail;
2620 tcon->ses = ses;
2621 if (volume_info->password) {
2622 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2623 if (!tcon->password) {
2624 rc = -ENOMEM;
2625 goto out_fail;
2630 * BB Do we need to wrap session_mutex around this TCon call and Unix
2631 * SetFS as we do on SessSetup and reconnect?
2633 xid = get_xid();
2634 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2635 volume_info->local_nls);
2636 free_xid(xid);
2637 cFYI(1, "Tcon rc = %d", rc);
2638 if (rc)
2639 goto out_fail;
2641 if (volume_info->nodfs) {
2642 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2643 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2645 tcon->seal = volume_info->seal;
2647 * We can have only one retry value for a connection to a share so for
2648 * resources mounted more than once to the same server share the last
2649 * value passed in for the retry flag is used.
2651 tcon->retry = volume_info->retry;
2652 tcon->nocase = volume_info->nocase;
2653 tcon->local_lease = volume_info->local_lease;
2654 INIT_LIST_HEAD(&tcon->pending_opens);
2656 spin_lock(&cifs_tcp_ses_lock);
2657 list_add(&tcon->tcon_list, &ses->tcon_list);
2658 spin_unlock(&cifs_tcp_ses_lock);
2660 cifs_fscache_get_super_cookie(tcon);
2662 return tcon;
2664 out_fail:
2665 tconInfoFree(tcon);
2666 return ERR_PTR(rc);
2669 void
2670 cifs_put_tlink(struct tcon_link *tlink)
2672 if (!tlink || IS_ERR(tlink))
2673 return;
2675 if (!atomic_dec_and_test(&tlink->tl_count) ||
2676 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2677 tlink->tl_time = jiffies;
2678 return;
2681 if (!IS_ERR(tlink_tcon(tlink)))
2682 cifs_put_tcon(tlink_tcon(tlink));
2683 kfree(tlink);
2684 return;
2687 static inline struct tcon_link *
2688 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2690 return cifs_sb->master_tlink;
2693 static int
2694 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2696 struct cifs_sb_info *old = CIFS_SB(sb);
2697 struct cifs_sb_info *new = mnt_data->cifs_sb;
2699 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2700 return 0;
2702 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2703 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2704 return 0;
2707 * We want to share sb only if we don't specify an r/wsize or
2708 * specified r/wsize is greater than or equal to existing one.
2710 if (new->wsize && new->wsize < old->wsize)
2711 return 0;
2713 if (new->rsize && new->rsize < old->rsize)
2714 return 0;
2716 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2717 return 0;
2719 if (old->mnt_file_mode != new->mnt_file_mode ||
2720 old->mnt_dir_mode != new->mnt_dir_mode)
2721 return 0;
2723 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2724 return 0;
2726 if (old->actimeo != new->actimeo)
2727 return 0;
2729 return 1;
2733 cifs_match_super(struct super_block *sb, void *data)
2735 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2736 struct smb_vol *volume_info;
2737 struct cifs_sb_info *cifs_sb;
2738 struct TCP_Server_Info *tcp_srv;
2739 struct cifs_ses *ses;
2740 struct cifs_tcon *tcon;
2741 struct tcon_link *tlink;
2742 int rc = 0;
2744 spin_lock(&cifs_tcp_ses_lock);
2745 cifs_sb = CIFS_SB(sb);
2746 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2747 if (IS_ERR(tlink)) {
2748 spin_unlock(&cifs_tcp_ses_lock);
2749 return rc;
2751 tcon = tlink_tcon(tlink);
2752 ses = tcon->ses;
2753 tcp_srv = ses->server;
2755 volume_info = mnt_data->vol;
2757 if (!match_server(tcp_srv, volume_info) ||
2758 !match_session(ses, volume_info) ||
2759 !match_tcon(tcon, volume_info->UNC)) {
2760 rc = 0;
2761 goto out;
2764 rc = compare_mount_options(sb, mnt_data);
2765 out:
2766 spin_unlock(&cifs_tcp_ses_lock);
2767 cifs_put_tlink(tlink);
2768 return rc;
2772 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2773 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2774 struct dfs_info3_param **referrals, int remap)
2776 char *temp_unc;
2777 int rc = 0;
2779 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2780 return -ENOSYS;
2782 *num_referrals = 0;
2783 *referrals = NULL;
2785 if (ses->ipc_tid == 0) {
2786 temp_unc = kmalloc(2 /* for slashes */ +
2787 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2788 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2789 if (temp_unc == NULL)
2790 return -ENOMEM;
2791 temp_unc[0] = '\\';
2792 temp_unc[1] = '\\';
2793 strcpy(temp_unc + 2, ses->serverName);
2794 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2795 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
2796 nls_codepage);
2797 cFYI(1, "Tcon rc = %d ipc_tid = %d", rc, ses->ipc_tid);
2798 kfree(temp_unc);
2800 if (rc == 0)
2801 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
2802 referrals, num_referrals,
2803 nls_codepage, remap);
2805 * BB - map targetUNCs to dfs_info3 structures, here or in
2806 * ses->server->ops->get_dfs_refer.
2809 return rc;
2812 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2813 static struct lock_class_key cifs_key[2];
2814 static struct lock_class_key cifs_slock_key[2];
2816 static inline void
2817 cifs_reclassify_socket4(struct socket *sock)
2819 struct sock *sk = sock->sk;
2820 BUG_ON(sock_owned_by_user(sk));
2821 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2822 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2825 static inline void
2826 cifs_reclassify_socket6(struct socket *sock)
2828 struct sock *sk = sock->sk;
2829 BUG_ON(sock_owned_by_user(sk));
2830 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2831 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2833 #else
2834 static inline void
2835 cifs_reclassify_socket4(struct socket *sock)
2839 static inline void
2840 cifs_reclassify_socket6(struct socket *sock)
2843 #endif
2845 /* See RFC1001 section 14 on representation of Netbios names */
2846 static void rfc1002mangle(char *target, char *source, unsigned int length)
2848 unsigned int i, j;
2850 for (i = 0, j = 0; i < (length); i++) {
2851 /* mask a nibble at a time and encode */
2852 target[j] = 'A' + (0x0F & (source[i] >> 4));
2853 target[j+1] = 'A' + (0x0F & source[i]);
2854 j += 2;
2859 static int
2860 bind_socket(struct TCP_Server_Info *server)
2862 int rc = 0;
2863 if (server->srcaddr.ss_family != AF_UNSPEC) {
2864 /* Bind to the specified local IP address */
2865 struct socket *socket = server->ssocket;
2866 rc = socket->ops->bind(socket,
2867 (struct sockaddr *) &server->srcaddr,
2868 sizeof(server->srcaddr));
2869 if (rc < 0) {
2870 struct sockaddr_in *saddr4;
2871 struct sockaddr_in6 *saddr6;
2872 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2873 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2874 if (saddr6->sin6_family == AF_INET6)
2875 cERROR(1, "cifs: "
2876 "Failed to bind to: %pI6c, error: %d",
2877 &saddr6->sin6_addr, rc);
2878 else
2879 cERROR(1, "cifs: "
2880 "Failed to bind to: %pI4, error: %d",
2881 &saddr4->sin_addr.s_addr, rc);
2884 return rc;
2887 static int
2888 ip_rfc1001_connect(struct TCP_Server_Info *server)
2890 int rc = 0;
2892 * some servers require RFC1001 sessinit before sending
2893 * negprot - BB check reconnection in case where second
2894 * sessinit is sent but no second negprot
2896 struct rfc1002_session_packet *ses_init_buf;
2897 struct smb_hdr *smb_buf;
2898 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2899 GFP_KERNEL);
2900 if (ses_init_buf) {
2901 ses_init_buf->trailer.session_req.called_len = 32;
2903 if (server->server_RFC1001_name &&
2904 server->server_RFC1001_name[0] != 0)
2905 rfc1002mangle(ses_init_buf->trailer.
2906 session_req.called_name,
2907 server->server_RFC1001_name,
2908 RFC1001_NAME_LEN_WITH_NULL);
2909 else
2910 rfc1002mangle(ses_init_buf->trailer.
2911 session_req.called_name,
2912 DEFAULT_CIFS_CALLED_NAME,
2913 RFC1001_NAME_LEN_WITH_NULL);
2915 ses_init_buf->trailer.session_req.calling_len = 32;
2918 * calling name ends in null (byte 16) from old smb
2919 * convention.
2921 if (server->workstation_RFC1001_name &&
2922 server->workstation_RFC1001_name[0] != 0)
2923 rfc1002mangle(ses_init_buf->trailer.
2924 session_req.calling_name,
2925 server->workstation_RFC1001_name,
2926 RFC1001_NAME_LEN_WITH_NULL);
2927 else
2928 rfc1002mangle(ses_init_buf->trailer.
2929 session_req.calling_name,
2930 "LINUX_CIFS_CLNT",
2931 RFC1001_NAME_LEN_WITH_NULL);
2933 ses_init_buf->trailer.session_req.scope1 = 0;
2934 ses_init_buf->trailer.session_req.scope2 = 0;
2935 smb_buf = (struct smb_hdr *)ses_init_buf;
2937 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2938 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2939 rc = smb_send(server, smb_buf, 0x44);
2940 kfree(ses_init_buf);
2942 * RFC1001 layer in at least one server
2943 * requires very short break before negprot
2944 * presumably because not expecting negprot
2945 * to follow so fast. This is a simple
2946 * solution that works without
2947 * complicating the code and causes no
2948 * significant slowing down on mount
2949 * for everyone else
2951 usleep_range(1000, 2000);
2954 * else the negprot may still work without this
2955 * even though malloc failed
2958 return rc;
2961 static int
2962 generic_ip_connect(struct TCP_Server_Info *server)
2964 int rc = 0;
2965 __be16 sport;
2966 int slen, sfamily;
2967 struct socket *socket = server->ssocket;
2968 struct sockaddr *saddr;
2970 saddr = (struct sockaddr *) &server->dstaddr;
2972 if (server->dstaddr.ss_family == AF_INET6) {
2973 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2974 slen = sizeof(struct sockaddr_in6);
2975 sfamily = AF_INET6;
2976 } else {
2977 sport = ((struct sockaddr_in *) saddr)->sin_port;
2978 slen = sizeof(struct sockaddr_in);
2979 sfamily = AF_INET;
2982 if (socket == NULL) {
2983 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2984 IPPROTO_TCP, &socket, 1);
2985 if (rc < 0) {
2986 cERROR(1, "Error %d creating socket", rc);
2987 server->ssocket = NULL;
2988 return rc;
2991 /* BB other socket options to set KEEPALIVE, NODELAY? */
2992 cFYI(1, "Socket created");
2993 server->ssocket = socket;
2994 socket->sk->sk_allocation = GFP_NOFS;
2995 if (sfamily == AF_INET6)
2996 cifs_reclassify_socket6(socket);
2997 else
2998 cifs_reclassify_socket4(socket);
3001 rc = bind_socket(server);
3002 if (rc < 0)
3003 return rc;
3006 * Eventually check for other socket options to change from
3007 * the default. sock_setsockopt not used because it expects
3008 * user space buffer
3010 socket->sk->sk_rcvtimeo = 7 * HZ;
3011 socket->sk->sk_sndtimeo = 5 * HZ;
3013 /* make the bufsizes depend on wsize/rsize and max requests */
3014 if (server->noautotune) {
3015 if (socket->sk->sk_sndbuf < (200 * 1024))
3016 socket->sk->sk_sndbuf = 200 * 1024;
3017 if (socket->sk->sk_rcvbuf < (140 * 1024))
3018 socket->sk->sk_rcvbuf = 140 * 1024;
3021 if (server->tcp_nodelay) {
3022 int val = 1;
3023 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3024 (char *)&val, sizeof(val));
3025 if (rc)
3026 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
3029 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
3030 socket->sk->sk_sndbuf,
3031 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3033 rc = socket->ops->connect(socket, saddr, slen, 0);
3034 if (rc < 0) {
3035 cFYI(1, "Error %d connecting to server", rc);
3036 sock_release(socket);
3037 server->ssocket = NULL;
3038 return rc;
3041 if (sport == htons(RFC1001_PORT))
3042 rc = ip_rfc1001_connect(server);
3044 return rc;
3047 static int
3048 ip_connect(struct TCP_Server_Info *server)
3050 __be16 *sport;
3051 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3052 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3054 if (server->dstaddr.ss_family == AF_INET6)
3055 sport = &addr6->sin6_port;
3056 else
3057 sport = &addr->sin_port;
3059 if (*sport == 0) {
3060 int rc;
3062 /* try with 445 port at first */
3063 *sport = htons(CIFS_PORT);
3065 rc = generic_ip_connect(server);
3066 if (rc >= 0)
3067 return rc;
3069 /* if it failed, try with 139 port */
3070 *sport = htons(RFC1001_PORT);
3073 return generic_ip_connect(server);
3076 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3077 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3079 /* if we are reconnecting then should we check to see if
3080 * any requested capabilities changed locally e.g. via
3081 * remount but we can not do much about it here
3082 * if they have (even if we could detect it by the following)
3083 * Perhaps we could add a backpointer to array of sb from tcon
3084 * or if we change to make all sb to same share the same
3085 * sb as NFS - then we only have one backpointer to sb.
3086 * What if we wanted to mount the server share twice once with
3087 * and once without posixacls or posix paths? */
3088 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3090 if (vol_info && vol_info->no_linux_ext) {
3091 tcon->fsUnixInfo.Capability = 0;
3092 tcon->unix_ext = 0; /* Unix Extensions disabled */
3093 cFYI(1, "Linux protocol extensions disabled");
3094 return;
3095 } else if (vol_info)
3096 tcon->unix_ext = 1; /* Unix Extensions supported */
3098 if (tcon->unix_ext == 0) {
3099 cFYI(1, "Unix extensions disabled so not set on reconnect");
3100 return;
3103 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3104 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3105 cFYI(1, "unix caps which server supports %lld", cap);
3106 /* check for reconnect case in which we do not
3107 want to change the mount behavior if we can avoid it */
3108 if (vol_info == NULL) {
3109 /* turn off POSIX ACL and PATHNAMES if not set
3110 originally at mount time */
3111 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3112 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3113 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3114 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3115 cERROR(1, "POSIXPATH support change");
3116 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3117 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3118 cERROR(1, "possible reconnect error");
3119 cERROR(1, "server disabled POSIX path support");
3123 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3124 cERROR(1, "per-share encryption not supported yet");
3126 cap &= CIFS_UNIX_CAP_MASK;
3127 if (vol_info && vol_info->no_psx_acl)
3128 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3129 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3130 cFYI(1, "negotiated posix acl support");
3131 if (cifs_sb)
3132 cifs_sb->mnt_cifs_flags |=
3133 CIFS_MOUNT_POSIXACL;
3136 if (vol_info && vol_info->posix_paths == 0)
3137 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3138 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3139 cFYI(1, "negotiate posix pathnames");
3140 if (cifs_sb)
3141 cifs_sb->mnt_cifs_flags |=
3142 CIFS_MOUNT_POSIX_PATHS;
3145 cFYI(1, "Negotiate caps 0x%x", (int)cap);
3146 #ifdef CONFIG_CIFS_DEBUG2
3147 if (cap & CIFS_UNIX_FCNTL_CAP)
3148 cFYI(1, "FCNTL cap");
3149 if (cap & CIFS_UNIX_EXTATTR_CAP)
3150 cFYI(1, "EXTATTR cap");
3151 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3152 cFYI(1, "POSIX path cap");
3153 if (cap & CIFS_UNIX_XATTR_CAP)
3154 cFYI(1, "XATTR cap");
3155 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3156 cFYI(1, "POSIX ACL cap");
3157 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3158 cFYI(1, "very large read cap");
3159 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3160 cFYI(1, "very large write cap");
3161 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3162 cFYI(1, "transport encryption cap");
3163 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3164 cFYI(1, "mandatory transport encryption cap");
3165 #endif /* CIFS_DEBUG2 */
3166 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3167 if (vol_info == NULL) {
3168 cFYI(1, "resetting capabilities failed");
3169 } else
3170 cERROR(1, "Negotiating Unix capabilities "
3171 "with the server failed. Consider "
3172 "mounting with the Unix Extensions "
3173 "disabled if problems are found "
3174 "by specifying the nounix mount "
3175 "option.");
3181 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3182 struct cifs_sb_info *cifs_sb)
3184 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3186 spin_lock_init(&cifs_sb->tlink_tree_lock);
3187 cifs_sb->tlink_tree = RB_ROOT;
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.
3193 cifs_sb->rsize = pvolume_info->rsize;
3194 cifs_sb->wsize = pvolume_info->wsize;
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 cFYI(1, "file mode: 0x%hx dir mode: 0x%hx",
3201 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3203 cifs_sb->actimeo = pvolume_info->actimeo;
3204 cifs_sb->local_nls = pvolume_info->local_nls;
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;
3232 if (pvolume_info->backupgid_specified) {
3233 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3234 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
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 cFYI(1, "mounting share using direct i/o");
3251 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3253 if (pvolume_info->mfsymlinks) {
3254 if (pvolume_info->sfu_emul) {
3255 cERROR(1, "mount option mfsymlinks ignored if sfu "
3256 "mount option is used");
3257 } else {
3258 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3262 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3263 cERROR(1, "mount option dynperm ignored if cifsacl "
3264 "mount option supported");
3267 static void
3268 cleanup_volume_info_contents(struct smb_vol *volume_info)
3270 kfree(volume_info->username);
3271 kzfree(volume_info->password);
3272 kfree(volume_info->UNC);
3273 kfree(volume_info->domainname);
3274 kfree(volume_info->iocharset);
3275 kfree(volume_info->prepath);
3278 void
3279 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3281 if (!volume_info)
3282 return;
3283 cleanup_volume_info_contents(volume_info);
3284 kfree(volume_info);
3288 #ifdef CONFIG_CIFS_DFS_UPCALL
3290 * cifs_build_path_to_root returns full path to root when we do not have an
3291 * exiting connection (tcon)
3293 static char *
3294 build_unc_path_to_root(const struct smb_vol *vol,
3295 const struct cifs_sb_info *cifs_sb)
3297 char *full_path, *pos;
3298 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3299 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3301 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3302 if (full_path == NULL)
3303 return ERR_PTR(-ENOMEM);
3305 strncpy(full_path, vol->UNC, unc_len);
3306 pos = full_path + unc_len;
3308 if (pplen) {
3309 *pos++ = CIFS_DIR_SEP(cifs_sb);
3310 strncpy(pos, vol->prepath, pplen);
3311 pos += pplen;
3314 *pos = '\0'; /* add trailing null */
3315 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3316 cFYI(1, "%s: full_path=%s", __func__, full_path);
3317 return full_path;
3321 * Perform a dfs referral query for a share and (optionally) prefix
3323 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3324 * to a string containing updated options for the submount. Otherwise it
3325 * will be left untouched.
3327 * Returns the rc from get_dfs_path to the caller, which can be used to
3328 * determine whether there were referrals.
3330 static int
3331 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3332 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3333 int check_prefix)
3335 int rc;
3336 unsigned int num_referrals = 0;
3337 struct dfs_info3_param *referrals = NULL;
3338 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3340 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3341 if (IS_ERR(full_path))
3342 return PTR_ERR(full_path);
3344 /* For DFS paths, skip the first '\' of the UNC */
3345 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3347 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3348 &num_referrals, &referrals,
3349 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3351 if (!rc && num_referrals > 0) {
3352 char *fake_devname = NULL;
3354 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3355 full_path + 1, referrals,
3356 &fake_devname);
3358 free_dfs_info_array(referrals, num_referrals);
3360 if (IS_ERR(mdata)) {
3361 rc = PTR_ERR(mdata);
3362 mdata = NULL;
3363 } else {
3364 cleanup_volume_info_contents(volume_info);
3365 rc = cifs_setup_volume_info(volume_info, mdata,
3366 fake_devname);
3368 kfree(fake_devname);
3369 kfree(cifs_sb->mountdata);
3370 cifs_sb->mountdata = mdata;
3372 kfree(full_path);
3373 return rc;
3375 #endif
3377 static int
3378 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3379 const char *devname)
3381 int rc = 0;
3383 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3384 return -EINVAL;
3386 if (volume_info->nullauth) {
3387 cFYI(1, "Anonymous login");
3388 kfree(volume_info->username);
3389 volume_info->username = NULL;
3390 } else if (volume_info->username) {
3391 /* BB fixme parse for domain name here */
3392 cFYI(1, "Username: %s", volume_info->username);
3393 } else {
3394 cifserror("No username specified");
3395 /* In userspace mount helper we can get user name from alternate
3396 locations such as env variables and files on disk */
3397 return -EINVAL;
3400 /* this is needed for ASCII cp to Unicode converts */
3401 if (volume_info->iocharset == NULL) {
3402 /* load_nls_default cannot return null */
3403 volume_info->local_nls = load_nls_default();
3404 } else {
3405 volume_info->local_nls = load_nls(volume_info->iocharset);
3406 if (volume_info->local_nls == NULL) {
3407 cERROR(1, "CIFS mount error: iocharset %s not found",
3408 volume_info->iocharset);
3409 return -ELIBACC;
3413 return rc;
3416 struct smb_vol *
3417 cifs_get_volume_info(char *mount_data, const char *devname)
3419 int rc;
3420 struct smb_vol *volume_info;
3422 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3423 if (!volume_info)
3424 return ERR_PTR(-ENOMEM);
3426 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3427 if (rc) {
3428 cifs_cleanup_volume_info(volume_info);
3429 volume_info = ERR_PTR(rc);
3432 return volume_info;
3436 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3438 int rc;
3439 unsigned int xid;
3440 struct cifs_ses *ses;
3441 struct cifs_tcon *tcon;
3442 struct TCP_Server_Info *server;
3443 char *full_path;
3444 struct tcon_link *tlink;
3445 #ifdef CONFIG_CIFS_DFS_UPCALL
3446 int referral_walks_count = 0;
3447 #endif
3449 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3450 if (rc)
3451 return rc;
3453 #ifdef CONFIG_CIFS_DFS_UPCALL
3454 try_mount_again:
3455 /* cleanup activities if we're chasing a referral */
3456 if (referral_walks_count) {
3457 if (tcon)
3458 cifs_put_tcon(tcon);
3459 else if (ses)
3460 cifs_put_smb_ses(ses);
3462 free_xid(xid);
3464 #endif
3465 rc = 0;
3466 tcon = NULL;
3467 ses = NULL;
3468 server = NULL;
3469 full_path = NULL;
3470 tlink = NULL;
3472 xid = get_xid();
3474 /* get a reference to a tcp session */
3475 server = cifs_get_tcp_session(volume_info);
3476 if (IS_ERR(server)) {
3477 rc = PTR_ERR(server);
3478 bdi_destroy(&cifs_sb->bdi);
3479 goto out;
3482 /* get a reference to a SMB session */
3483 ses = cifs_get_smb_ses(server, volume_info);
3484 if (IS_ERR(ses)) {
3485 rc = PTR_ERR(ses);
3486 ses = NULL;
3487 goto mount_fail_check;
3490 /* search for existing tcon to this server share */
3491 tcon = cifs_get_tcon(ses, volume_info);
3492 if (IS_ERR(tcon)) {
3493 rc = PTR_ERR(tcon);
3494 tcon = NULL;
3495 goto remote_path_check;
3498 /* tell server which Unix caps we support */
3499 if (cap_unix(tcon->ses)) {
3500 /* reset of caps checks mount to see if unix extensions
3501 disabled for just this mount */
3502 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3503 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3504 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3505 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3506 rc = -EACCES;
3507 goto mount_fail_check;
3509 } else
3510 tcon->unix_ext = 0; /* server does not support them */
3512 /* do not care if a following call succeed - informational */
3513 if (!tcon->ipc && server->ops->qfs_tcon)
3514 server->ops->qfs_tcon(xid, tcon);
3516 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3517 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3519 /* tune readahead according to rsize */
3520 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3522 remote_path_check:
3523 #ifdef CONFIG_CIFS_DFS_UPCALL
3525 * Perform an unconditional check for whether there are DFS
3526 * referrals for this path without prefix, to provide support
3527 * for DFS referrals from w2k8 servers which don't seem to respond
3528 * with PATH_NOT_COVERED to requests that include the prefix.
3529 * Chase the referral if found, otherwise continue normally.
3531 if (referral_walks_count == 0) {
3532 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3533 false);
3534 if (!refrc) {
3535 referral_walks_count++;
3536 goto try_mount_again;
3539 #endif
3541 /* check if a whole path is not remote */
3542 if (!rc && tcon) {
3543 if (!server->ops->is_path_accessible) {
3544 rc = -ENOSYS;
3545 goto mount_fail_check;
3548 * cifs_build_path_to_root works only when we have a valid tcon
3550 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3551 if (full_path == NULL) {
3552 rc = -ENOMEM;
3553 goto mount_fail_check;
3555 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3556 full_path);
3557 if (rc != 0 && rc != -EREMOTE) {
3558 kfree(full_path);
3559 goto mount_fail_check;
3561 kfree(full_path);
3564 /* get referral if needed */
3565 if (rc == -EREMOTE) {
3566 #ifdef CONFIG_CIFS_DFS_UPCALL
3567 if (referral_walks_count > MAX_NESTED_LINKS) {
3569 * BB: when we implement proper loop detection,
3570 * we will remove this check. But now we need it
3571 * to prevent an indefinite loop if 'DFS tree' is
3572 * misconfigured (i.e. has loops).
3574 rc = -ELOOP;
3575 goto mount_fail_check;
3578 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3580 if (!rc) {
3581 referral_walks_count++;
3582 goto try_mount_again;
3584 goto mount_fail_check;
3585 #else /* No DFS support, return error on mount */
3586 rc = -EOPNOTSUPP;
3587 #endif
3590 if (rc)
3591 goto mount_fail_check;
3593 /* now, hang the tcon off of the superblock */
3594 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3595 if (tlink == NULL) {
3596 rc = -ENOMEM;
3597 goto mount_fail_check;
3600 tlink->tl_uid = ses->linux_uid;
3601 tlink->tl_tcon = tcon;
3602 tlink->tl_time = jiffies;
3603 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3604 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3606 cifs_sb->master_tlink = tlink;
3607 spin_lock(&cifs_sb->tlink_tree_lock);
3608 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3609 spin_unlock(&cifs_sb->tlink_tree_lock);
3611 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3612 TLINK_IDLE_EXPIRE);
3614 mount_fail_check:
3615 /* on error free sesinfo and tcon struct if needed */
3616 if (rc) {
3617 /* If find_unc succeeded then rc == 0 so we can not end */
3618 /* up accidentally freeing someone elses tcon struct */
3619 if (tcon)
3620 cifs_put_tcon(tcon);
3621 else if (ses)
3622 cifs_put_smb_ses(ses);
3623 else
3624 cifs_put_tcp_session(server);
3625 bdi_destroy(&cifs_sb->bdi);
3628 out:
3629 free_xid(xid);
3630 return rc;
3634 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3635 * pointer may be NULL.
3638 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3639 const char *tree, struct cifs_tcon *tcon,
3640 const struct nls_table *nls_codepage)
3642 struct smb_hdr *smb_buffer;
3643 struct smb_hdr *smb_buffer_response;
3644 TCONX_REQ *pSMB;
3645 TCONX_RSP *pSMBr;
3646 unsigned char *bcc_ptr;
3647 int rc = 0;
3648 int length;
3649 __u16 bytes_left, count;
3651 if (ses == NULL)
3652 return -EIO;
3654 smb_buffer = cifs_buf_get();
3655 if (smb_buffer == NULL)
3656 return -ENOMEM;
3658 smb_buffer_response = smb_buffer;
3660 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3661 NULL /*no tid */ , 4 /*wct */ );
3663 smb_buffer->Mid = get_next_mid(ses->server);
3664 smb_buffer->Uid = ses->Suid;
3665 pSMB = (TCONX_REQ *) smb_buffer;
3666 pSMBr = (TCONX_RSP *) smb_buffer_response;
3668 pSMB->AndXCommand = 0xFF;
3669 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3670 bcc_ptr = &pSMB->Password[0];
3671 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3672 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3673 *bcc_ptr = 0; /* password is null byte */
3674 bcc_ptr++; /* skip password */
3675 /* already aligned so no need to do it below */
3676 } else {
3677 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3678 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3679 specified as required (when that support is added to
3680 the vfs in the future) as only NTLM or the much
3681 weaker LANMAN (which we do not send by default) is accepted
3682 by Samba (not sure whether other servers allow
3683 NTLMv2 password here) */
3684 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3685 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3686 (ses->server->secType == LANMAN))
3687 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3688 ses->server->sec_mode &
3689 SECMODE_PW_ENCRYPT ? true : false,
3690 bcc_ptr);
3691 else
3692 #endif /* CIFS_WEAK_PW_HASH */
3693 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3694 bcc_ptr, nls_codepage);
3696 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3697 if (ses->capabilities & CAP_UNICODE) {
3698 /* must align unicode strings */
3699 *bcc_ptr = 0; /* null byte password */
3700 bcc_ptr++;
3704 if (ses->server->sec_mode &
3705 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3706 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3708 if (ses->capabilities & CAP_STATUS32) {
3709 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3711 if (ses->capabilities & CAP_DFS) {
3712 smb_buffer->Flags2 |= SMBFLG2_DFS;
3714 if (ses->capabilities & CAP_UNICODE) {
3715 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3716 length =
3717 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3718 6 /* max utf8 char length in bytes */ *
3719 (/* server len*/ + 256 /* share len */), nls_codepage);
3720 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3721 bcc_ptr += 2; /* skip trailing null */
3722 } else { /* ASCII */
3723 strcpy(bcc_ptr, tree);
3724 bcc_ptr += strlen(tree) + 1;
3726 strcpy(bcc_ptr, "?????");
3727 bcc_ptr += strlen("?????");
3728 bcc_ptr += 1;
3729 count = bcc_ptr - &pSMB->Password[0];
3730 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3731 pSMB->hdr.smb_buf_length) + count);
3732 pSMB->ByteCount = cpu_to_le16(count);
3734 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3737 /* above now done in SendReceive */
3738 if ((rc == 0) && (tcon != NULL)) {
3739 bool is_unicode;
3741 tcon->tidStatus = CifsGood;
3742 tcon->need_reconnect = false;
3743 tcon->tid = smb_buffer_response->Tid;
3744 bcc_ptr = pByteArea(smb_buffer_response);
3745 bytes_left = get_bcc(smb_buffer_response);
3746 length = strnlen(bcc_ptr, bytes_left - 2);
3747 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3748 is_unicode = true;
3749 else
3750 is_unicode = false;
3753 /* skip service field (NB: this field is always ASCII) */
3754 if (length == 3) {
3755 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3756 (bcc_ptr[2] == 'C')) {
3757 cFYI(1, "IPC connection");
3758 tcon->ipc = 1;
3760 } else if (length == 2) {
3761 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3762 /* the most common case */
3763 cFYI(1, "disk share connection");
3766 bcc_ptr += length + 1;
3767 bytes_left -= (length + 1);
3768 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3770 /* mostly informational -- no need to fail on error here */
3771 kfree(tcon->nativeFileSystem);
3772 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3773 bytes_left, is_unicode,
3774 nls_codepage);
3776 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3778 if ((smb_buffer_response->WordCount == 3) ||
3779 (smb_buffer_response->WordCount == 7))
3780 /* field is in same location */
3781 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3782 else
3783 tcon->Flags = 0;
3784 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3785 } else if ((rc == 0) && tcon == NULL) {
3786 /* all we need to save for IPC$ connection */
3787 ses->ipc_tid = smb_buffer_response->Tid;
3790 cifs_buf_release(smb_buffer);
3791 return rc;
3794 void
3795 cifs_umount(struct cifs_sb_info *cifs_sb)
3797 struct rb_root *root = &cifs_sb->tlink_tree;
3798 struct rb_node *node;
3799 struct tcon_link *tlink;
3801 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3803 spin_lock(&cifs_sb->tlink_tree_lock);
3804 while ((node = rb_first(root))) {
3805 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3806 cifs_get_tlink(tlink);
3807 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3808 rb_erase(node, root);
3810 spin_unlock(&cifs_sb->tlink_tree_lock);
3811 cifs_put_tlink(tlink);
3812 spin_lock(&cifs_sb->tlink_tree_lock);
3814 spin_unlock(&cifs_sb->tlink_tree_lock);
3816 bdi_destroy(&cifs_sb->bdi);
3817 kfree(cifs_sb->mountdata);
3818 unload_nls(cifs_sb->local_nls);
3819 kfree(cifs_sb);
3823 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3825 int rc = 0;
3826 struct TCP_Server_Info *server = ses->server;
3828 if (!server->ops->need_neg || !server->ops->negotiate)
3829 return -ENOSYS;
3831 /* only send once per connect */
3832 if (!server->ops->need_neg(server))
3833 return 0;
3835 set_credits(server, 1);
3837 rc = server->ops->negotiate(xid, ses);
3838 if (rc == 0) {
3839 spin_lock(&GlobalMid_Lock);
3840 if (server->tcpStatus == CifsNeedNegotiate)
3841 server->tcpStatus = CifsGood;
3842 else
3843 rc = -EHOSTDOWN;
3844 spin_unlock(&GlobalMid_Lock);
3847 return rc;
3851 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3852 struct nls_table *nls_info)
3854 int rc = -ENOSYS;
3855 struct TCP_Server_Info *server = ses->server;
3857 ses->flags = 0;
3858 ses->capabilities = server->capabilities;
3859 if (linuxExtEnabled == 0)
3860 ses->capabilities &= (~server->vals->cap_unix);
3862 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3863 server->sec_mode, server->capabilities, server->timeAdj);
3865 if (server->ops->sess_setup)
3866 rc = server->ops->sess_setup(xid, ses, nls_info);
3868 if (rc) {
3869 cERROR(1, "Send error in SessSetup = %d", rc);
3870 } else {
3871 mutex_lock(&ses->server->srv_mutex);
3872 if (!server->session_estab) {
3873 server->session_key.response = ses->auth_key.response;
3874 server->session_key.len = ses->auth_key.len;
3875 server->sequence_number = 0x2;
3876 server->session_estab = true;
3877 ses->auth_key.response = NULL;
3879 mutex_unlock(&server->srv_mutex);
3881 cFYI(1, "CIFS Session Established successfully");
3882 spin_lock(&GlobalMid_Lock);
3883 ses->status = CifsGood;
3884 ses->need_reconnect = false;
3885 spin_unlock(&GlobalMid_Lock);
3888 kfree(ses->auth_key.response);
3889 ses->auth_key.response = NULL;
3890 ses->auth_key.len = 0;
3891 kfree(ses->ntlmssp);
3892 ses->ntlmssp = NULL;
3894 return rc;
3897 static int
3898 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
3900 switch (ses->server->secType) {
3901 case Kerberos:
3902 vol->secFlg = CIFSSEC_MUST_KRB5;
3903 return 0;
3904 case NTLMv2:
3905 vol->secFlg = CIFSSEC_MUST_NTLMV2;
3906 break;
3907 case NTLM:
3908 vol->secFlg = CIFSSEC_MUST_NTLM;
3909 break;
3910 case RawNTLMSSP:
3911 vol->secFlg = CIFSSEC_MUST_NTLMSSP;
3912 break;
3913 case LANMAN:
3914 vol->secFlg = CIFSSEC_MUST_LANMAN;
3915 break;
3918 return cifs_set_cifscreds(vol, ses);
3921 static struct cifs_tcon *
3922 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
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;
3930 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3931 if (vol_info == NULL)
3932 return ERR_PTR(-ENOMEM);
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;
3943 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
3944 if (rc) {
3945 tcon = ERR_PTR(rc);
3946 goto out;
3949 /* get a reference for the same TCP session */
3950 spin_lock(&cifs_tcp_ses_lock);
3951 ++master_tcon->ses->server->srv_count;
3952 spin_unlock(&cifs_tcp_ses_lock);
3954 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3955 if (IS_ERR(ses)) {
3956 tcon = (struct cifs_tcon *)ses;
3957 cifs_put_tcp_session(master_tcon->ses->server);
3958 goto out;
3961 tcon = cifs_get_tcon(ses, vol_info);
3962 if (IS_ERR(tcon)) {
3963 cifs_put_smb_ses(ses);
3964 goto out;
3967 if (cap_unix(ses))
3968 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3969 out:
3970 kfree(vol_info->username);
3971 kfree(vol_info->password);
3972 kfree(vol_info);
3974 return tcon;
3977 struct cifs_tcon *
3978 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3980 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3983 static int
3984 cifs_sb_tcon_pending_wait(void *unused)
3986 schedule();
3987 return signal_pending(current) ? -ERESTARTSYS : 0;
3990 /* find and return a tlink with given uid */
3991 static struct tcon_link *
3992 tlink_rb_search(struct rb_root *root, uid_t uid)
3994 struct rb_node *node = root->rb_node;
3995 struct tcon_link *tlink;
3997 while (node) {
3998 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4000 if (tlink->tl_uid > uid)
4001 node = node->rb_left;
4002 else if (tlink->tl_uid < uid)
4003 node = node->rb_right;
4004 else
4005 return tlink;
4007 return NULL;
4010 /* insert a tcon_link into the tree */
4011 static void
4012 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4014 struct rb_node **new = &(root->rb_node), *parent = NULL;
4015 struct tcon_link *tlink;
4017 while (*new) {
4018 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4019 parent = *new;
4021 if (tlink->tl_uid > new_tlink->tl_uid)
4022 new = &((*new)->rb_left);
4023 else
4024 new = &((*new)->rb_right);
4027 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4028 rb_insert_color(&new_tlink->tl_rbnode, root);
4032 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4033 * current task.
4035 * If the superblock doesn't refer to a multiuser mount, then just return
4036 * the master tcon for the mount.
4038 * First, search the rbtree for an existing tcon for this fsuid. If one
4039 * exists, then check to see if it's pending construction. If it is then wait
4040 * for construction to complete. Once it's no longer pending, check to see if
4041 * it failed and either return an error or retry construction, depending on
4042 * the timeout.
4044 * If one doesn't exist then insert a new tcon_link struct into the tree and
4045 * try to construct a new one.
4047 struct tcon_link *
4048 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4050 int ret;
4051 uid_t fsuid = current_fsuid();
4052 struct tcon_link *tlink, *newtlink;
4054 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4055 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4057 spin_lock(&cifs_sb->tlink_tree_lock);
4058 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4059 if (tlink)
4060 cifs_get_tlink(tlink);
4061 spin_unlock(&cifs_sb->tlink_tree_lock);
4063 if (tlink == NULL) {
4064 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4065 if (newtlink == NULL)
4066 return ERR_PTR(-ENOMEM);
4067 newtlink->tl_uid = fsuid;
4068 newtlink->tl_tcon = ERR_PTR(-EACCES);
4069 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4070 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4071 cifs_get_tlink(newtlink);
4073 spin_lock(&cifs_sb->tlink_tree_lock);
4074 /* was one inserted after previous search? */
4075 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4076 if (tlink) {
4077 cifs_get_tlink(tlink);
4078 spin_unlock(&cifs_sb->tlink_tree_lock);
4079 kfree(newtlink);
4080 goto wait_for_construction;
4082 tlink = newtlink;
4083 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4084 spin_unlock(&cifs_sb->tlink_tree_lock);
4085 } else {
4086 wait_for_construction:
4087 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4088 cifs_sb_tcon_pending_wait,
4089 TASK_INTERRUPTIBLE);
4090 if (ret) {
4091 cifs_put_tlink(tlink);
4092 return ERR_PTR(ret);
4095 /* if it's good, return it */
4096 if (!IS_ERR(tlink->tl_tcon))
4097 return tlink;
4099 /* return error if we tried this already recently */
4100 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4101 cifs_put_tlink(tlink);
4102 return ERR_PTR(-EACCES);
4105 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4106 goto wait_for_construction;
4109 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4110 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4111 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4113 if (IS_ERR(tlink->tl_tcon)) {
4114 cifs_put_tlink(tlink);
4115 return ERR_PTR(-EACCES);
4118 return tlink;
4122 * periodic workqueue job that scans tcon_tree for a superblock and closes
4123 * out tcons.
4125 static void
4126 cifs_prune_tlinks(struct work_struct *work)
4128 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4129 prune_tlinks.work);
4130 struct rb_root *root = &cifs_sb->tlink_tree;
4131 struct rb_node *node = rb_first(root);
4132 struct rb_node *tmp;
4133 struct tcon_link *tlink;
4136 * Because we drop the spinlock in the loop in order to put the tlink
4137 * it's not guarded against removal of links from the tree. The only
4138 * places that remove entries from the tree are this function and
4139 * umounts. Because this function is non-reentrant and is canceled
4140 * before umount can proceed, this is safe.
4142 spin_lock(&cifs_sb->tlink_tree_lock);
4143 node = rb_first(root);
4144 while (node != NULL) {
4145 tmp = node;
4146 node = rb_next(tmp);
4147 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4149 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4150 atomic_read(&tlink->tl_count) != 0 ||
4151 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4152 continue;
4154 cifs_get_tlink(tlink);
4155 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4156 rb_erase(tmp, root);
4158 spin_unlock(&cifs_sb->tlink_tree_lock);
4159 cifs_put_tlink(tlink);
4160 spin_lock(&cifs_sb->tlink_tree_lock);
4162 spin_unlock(&cifs_sb->tlink_tree_lock);
4164 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4165 TLINK_IDLE_EXPIRE);