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