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
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>
43 #include <linux/parser.h>
47 #include "cifsproto.h"
48 #include "cifs_unicode.h"
49 #include "cifs_debug.h"
50 #include "cifs_fs_sb.h"
51 #include "dns_resolve.h"
54 #include "rfc1002pdu.h"
56 #ifdef CONFIG_CIFS_SMB2
57 #include "smb2proto.h"
61 #define RFC1001_PORT 139
63 extern mempool_t *cifs_req_poolp;
65 /* FIXME: should these be tunable? */
66 #define TLINK_ERROR_EXPIRE (1 * HZ)
67 #define TLINK_IDLE_EXPIRE (600 * HZ)
70 /* Mount options that take no arguments */
71 Opt_user_xattr, Opt_nouser_xattr,
72 Opt_forceuid, Opt_noforceuid,
73 Opt_forcegid, Opt_noforcegid,
74 Opt_noblocksend, Opt_noautotune,
75 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
76 Opt_mapposix, Opt_nomapposix,
77 Opt_mapchars, Opt_nomapchars, Opt_sfu,
78 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
79 Opt_noposixpaths, Opt_nounix,
82 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
83 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
84 Opt_nohard, Opt_nosoft,
86 Opt_nostrictsync, Opt_strictsync,
87 Opt_serverino, Opt_noserverino,
88 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
89 Opt_acl, Opt_noacl, Opt_locallease,
90 Opt_sign, Opt_seal, Opt_noac,
91 Opt_fsc, Opt_mfsymlinks,
92 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
93 Opt_persistent, Opt_nopersistent,
94 Opt_resilient, Opt_noresilient,
96 /* Mount options which take numeric value */
97 Opt_backupuid, Opt_backupgid, Opt_uid,
98 Opt_cruid, Opt_gid, Opt_file_mode,
99 Opt_dirmode, Opt_port,
100 Opt_rsize, Opt_wsize, Opt_actimeo,
101 Opt_echo_interval, Opt_max_credits,
103 /* Mount options which take string value */
104 Opt_user, Opt_pass, Opt_ip,
105 Opt_domain, Opt_srcaddr, Opt_iocharset,
106 Opt_netbiosname, Opt_servern,
107 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
109 /* Mount options to be ignored */
112 /* Options which could be blank */
120 static const match_table_t cifs_mount_option_tokens = {
122 { Opt_user_xattr, "user_xattr" },
123 { Opt_nouser_xattr, "nouser_xattr" },
124 { Opt_forceuid, "forceuid" },
125 { Opt_noforceuid, "noforceuid" },
126 { Opt_forcegid, "forcegid" },
127 { Opt_noforcegid, "noforcegid" },
128 { Opt_noblocksend, "noblocksend" },
129 { Opt_noautotune, "noautotune" },
130 { Opt_hard, "hard" },
131 { Opt_soft, "soft" },
132 { Opt_perm, "perm" },
133 { Opt_noperm, "noperm" },
134 { Opt_mapchars, "mapchars" }, /* SFU style */
135 { Opt_nomapchars, "nomapchars" },
136 { Opt_mapposix, "mapposix" }, /* SFM style */
137 { Opt_nomapposix, "nomapposix" },
139 { Opt_nosfu, "nosfu" },
140 { Opt_nodfs, "nodfs" },
141 { Opt_posixpaths, "posixpaths" },
142 { Opt_noposixpaths, "noposixpaths" },
143 { Opt_nounix, "nounix" },
144 { Opt_nounix, "nolinux" },
145 { Opt_nocase, "nocase" },
146 { Opt_nocase, "ignorecase" },
148 { Opt_nobrl, "nobrl" },
149 { Opt_nobrl, "nolock" },
150 { Opt_forcemandatorylock, "forcemandatorylock" },
151 { Opt_forcemandatorylock, "forcemand" },
152 { Opt_setuids, "setuids" },
153 { Opt_nosetuids, "nosetuids" },
154 { Opt_setuidfromacl, "idsfromsid" },
155 { Opt_dynperm, "dynperm" },
156 { Opt_nodynperm, "nodynperm" },
157 { Opt_nohard, "nohard" },
158 { Opt_nosoft, "nosoft" },
159 { Opt_nointr, "nointr" },
160 { Opt_intr, "intr" },
161 { Opt_nostrictsync, "nostrictsync" },
162 { Opt_strictsync, "strictsync" },
163 { Opt_serverino, "serverino" },
164 { Opt_noserverino, "noserverino" },
165 { Opt_rwpidforward, "rwpidforward" },
166 { Opt_cifsacl, "cifsacl" },
167 { Opt_nocifsacl, "nocifsacl" },
169 { Opt_noacl, "noacl" },
170 { Opt_locallease, "locallease" },
171 { Opt_sign, "sign" },
172 { Opt_seal, "seal" },
173 { Opt_noac, "noac" },
175 { Opt_mfsymlinks, "mfsymlinks" },
176 { Opt_multiuser, "multiuser" },
177 { Opt_sloppy, "sloppy" },
178 { Opt_nosharesock, "nosharesock" },
179 { Opt_persistent, "persistenthandles"},
180 { Opt_nopersistent, "nopersistenthandles"},
181 { Opt_resilient, "resilienthandles"},
182 { Opt_noresilient, "noresilienthandles"},
184 { Opt_backupuid, "backupuid=%s" },
185 { Opt_backupgid, "backupgid=%s" },
186 { Opt_uid, "uid=%s" },
187 { Opt_cruid, "cruid=%s" },
188 { Opt_gid, "gid=%s" },
189 { Opt_file_mode, "file_mode=%s" },
190 { Opt_dirmode, "dirmode=%s" },
191 { Opt_dirmode, "dir_mode=%s" },
192 { Opt_port, "port=%s" },
193 { Opt_rsize, "rsize=%s" },
194 { Opt_wsize, "wsize=%s" },
195 { Opt_actimeo, "actimeo=%s" },
196 { Opt_echo_interval, "echo_interval=%s" },
197 { Opt_max_credits, "max_credits=%s" },
199 { Opt_blank_user, "user=" },
200 { Opt_blank_user, "username=" },
201 { Opt_user, "user=%s" },
202 { Opt_user, "username=%s" },
203 { Opt_blank_pass, "pass=" },
204 { Opt_blank_pass, "password=" },
205 { Opt_pass, "pass=%s" },
206 { Opt_pass, "password=%s" },
207 { Opt_blank_ip, "ip=" },
208 { Opt_blank_ip, "addr=" },
210 { Opt_ip, "addr=%s" },
211 { Opt_ignore, "unc=%s" },
212 { Opt_ignore, "target=%s" },
213 { Opt_ignore, "path=%s" },
214 { Opt_domain, "dom=%s" },
215 { Opt_domain, "domain=%s" },
216 { Opt_domain, "workgroup=%s" },
217 { Opt_srcaddr, "srcaddr=%s" },
218 { Opt_ignore, "prefixpath=%s" },
219 { Opt_iocharset, "iocharset=%s" },
220 { Opt_netbiosname, "netbiosname=%s" },
221 { Opt_servern, "servern=%s" },
222 { Opt_ver, "ver=%s" },
223 { Opt_vers, "vers=%s" },
224 { Opt_sec, "sec=%s" },
225 { Opt_cache, "cache=%s" },
227 { Opt_ignore, "cred" },
228 { Opt_ignore, "credentials" },
229 { Opt_ignore, "cred=%s" },
230 { Opt_ignore, "credentials=%s" },
231 { Opt_ignore, "guest" },
232 { Opt_ignore, "rw" },
233 { Opt_ignore, "ro" },
234 { Opt_ignore, "suid" },
235 { Opt_ignore, "nosuid" },
236 { Opt_ignore, "exec" },
237 { Opt_ignore, "noexec" },
238 { Opt_ignore, "nodev" },
239 { Opt_ignore, "noauto" },
240 { Opt_ignore, "dev" },
241 { Opt_ignore, "mand" },
242 { Opt_ignore, "nomand" },
243 { Opt_ignore, "_netdev" },
249 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
250 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
251 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
252 Opt_sec_ntlmv2i, Opt_sec_lanman,
258 static const match_table_t cifs_secflavor_tokens = {
259 { Opt_sec_krb5, "krb5" },
260 { Opt_sec_krb5i, "krb5i" },
261 { Opt_sec_krb5p, "krb5p" },
262 { Opt_sec_ntlmsspi, "ntlmsspi" },
263 { Opt_sec_ntlmssp, "ntlmssp" },
264 { Opt_ntlm, "ntlm" },
265 { Opt_sec_ntlmi, "ntlmi" },
266 { Opt_sec_ntlmv2, "nontlm" },
267 { Opt_sec_ntlmv2, "ntlmv2" },
268 { Opt_sec_ntlmv2i, "ntlmv2i" },
269 { Opt_sec_lanman, "lanman" },
270 { Opt_sec_none, "none" },
272 { Opt_sec_err, NULL }
283 static const match_table_t cifs_cacheflavor_tokens = {
284 { Opt_cache_loose, "loose" },
285 { Opt_cache_strict, "strict" },
286 { Opt_cache_none, "none" },
287 { Opt_cache_err, NULL }
290 static const match_table_t cifs_smb_version_tokens = {
291 { Smb_1, SMB1_VERSION_STRING },
292 { Smb_20, SMB20_VERSION_STRING},
293 { Smb_21, SMB21_VERSION_STRING },
294 { Smb_30, SMB30_VERSION_STRING },
295 { Smb_302, SMB302_VERSION_STRING },
296 #ifdef CONFIG_CIFS_SMB311
297 { Smb_311, SMB311_VERSION_STRING },
298 { Smb_311, ALT_SMB311_VERSION_STRING },
300 { Smb_version_err, NULL }
303 static int ip_connect(struct TCP_Server_Info *server);
304 static int generic_ip_connect(struct TCP_Server_Info *server);
305 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
306 static void cifs_prune_tlinks(struct work_struct *work);
307 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
308 const char *devname);
311 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
312 * get their ip addresses changed at some point.
314 * This should be called with server->srv_mutex held.
316 #ifdef CONFIG_CIFS_DFS_UPCALL
317 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
321 char *unc, *ipaddr = NULL;
323 if (!server->hostname)
326 len = strlen(server->hostname) + 3;
328 unc = kmalloc(len, GFP_KERNEL);
330 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
333 snprintf(unc, len, "\\\\%s", server->hostname);
335 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
339 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
340 __func__, server->hostname, rc);
344 spin_lock(&cifs_tcp_ses_lock);
345 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
347 spin_unlock(&cifs_tcp_ses_lock);
353 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
360 * cifs tcp session reconnection
362 * mark tcp session as reconnecting so temporarily locked
363 * mark all smb sessions as reconnecting for tcp session
364 * reconnect tcp session
365 * wake up waiters on reconnection? - (not needed currently)
368 cifs_reconnect(struct TCP_Server_Info *server)
371 struct list_head *tmp, *tmp2;
372 struct cifs_ses *ses;
373 struct cifs_tcon *tcon;
374 struct mid_q_entry *mid_entry;
375 struct list_head retry_list;
377 spin_lock(&GlobalMid_Lock);
378 if (server->tcpStatus == CifsExiting) {
379 /* the demux thread will exit normally
380 next time through the loop */
381 spin_unlock(&GlobalMid_Lock);
384 server->tcpStatus = CifsNeedReconnect;
385 spin_unlock(&GlobalMid_Lock);
387 #ifdef CONFIG_CIFS_SMB2
388 server->max_read = 0;
391 cifs_dbg(FYI, "Reconnecting tcp session\n");
393 /* before reconnecting the tcp session, mark the smb session (uid)
394 and the tid bad so they are not used until reconnected */
395 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
397 spin_lock(&cifs_tcp_ses_lock);
398 list_for_each(tmp, &server->smb_ses_list) {
399 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
400 ses->need_reconnect = true;
402 list_for_each(tmp2, &ses->tcon_list) {
403 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
404 tcon->need_reconnect = true;
407 spin_unlock(&cifs_tcp_ses_lock);
409 /* do not want to be sending data on a socket we are freeing */
410 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
411 mutex_lock(&server->srv_mutex);
412 if (server->ssocket) {
413 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
414 server->ssocket->state, server->ssocket->flags);
415 kernel_sock_shutdown(server->ssocket, SHUT_WR);
416 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
417 server->ssocket->state, server->ssocket->flags);
418 sock_release(server->ssocket);
419 server->ssocket = NULL;
421 server->sequence_number = 0;
422 server->session_estab = false;
423 kfree(server->session_key.response);
424 server->session_key.response = NULL;
425 server->session_key.len = 0;
426 server->lstrp = jiffies;
428 /* mark submitted MIDs for retry and issue callback */
429 INIT_LIST_HEAD(&retry_list);
430 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
431 spin_lock(&GlobalMid_Lock);
432 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
433 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
434 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
435 mid_entry->mid_state = MID_RETRY_NEEDED;
436 list_move(&mid_entry->qhead, &retry_list);
438 spin_unlock(&GlobalMid_Lock);
439 mutex_unlock(&server->srv_mutex);
441 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
442 list_for_each_safe(tmp, tmp2, &retry_list) {
443 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
444 list_del_init(&mid_entry->qhead);
445 mid_entry->callback(mid_entry);
451 /* we should try only the port we connected to before */
452 mutex_lock(&server->srv_mutex);
453 rc = generic_ip_connect(server);
455 cifs_dbg(FYI, "reconnect error %d\n", rc);
456 rc = reconn_set_ipaddr(server);
458 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
461 mutex_unlock(&server->srv_mutex);
464 atomic_inc(&tcpSesReconnectCount);
465 spin_lock(&GlobalMid_Lock);
466 if (server->tcpStatus != CifsExiting)
467 server->tcpStatus = CifsNeedNegotiate;
468 spin_unlock(&GlobalMid_Lock);
469 mutex_unlock(&server->srv_mutex);
471 } while (server->tcpStatus == CifsNeedReconnect);
473 if (server->tcpStatus == CifsNeedNegotiate)
474 mod_delayed_work(cifsiod_wq, &server->echo, 0);
480 cifs_echo_request(struct work_struct *work)
483 struct TCP_Server_Info *server = container_of(work,
484 struct TCP_Server_Info, echo.work);
485 unsigned long echo_interval;
488 * If we need to renegotiate, set echo interval to zero to
489 * immediately call echo service where we can renegotiate.
491 if (server->tcpStatus == CifsNeedNegotiate)
494 echo_interval = server->echo_interval;
497 * We cannot send an echo if it is disabled.
498 * Also, no need to ping if we got a response recently.
501 if (server->tcpStatus == CifsNeedReconnect ||
502 server->tcpStatus == CifsExiting ||
503 server->tcpStatus == CifsNew ||
504 (server->ops->can_echo && !server->ops->can_echo(server)) ||
505 time_before(jiffies, server->lstrp + echo_interval - HZ))
508 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
510 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
514 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
518 allocate_buffers(struct TCP_Server_Info *server)
520 if (!server->bigbuf) {
521 server->bigbuf = (char *)cifs_buf_get();
522 if (!server->bigbuf) {
523 cifs_dbg(VFS, "No memory for large SMB response\n");
525 /* retry will check if exiting */
528 } else if (server->large_buf) {
529 /* we are reusing a dirty large buf, clear its start */
530 memset(server->bigbuf, 0, HEADER_SIZE(server));
533 if (!server->smallbuf) {
534 server->smallbuf = (char *)cifs_small_buf_get();
535 if (!server->smallbuf) {
536 cifs_dbg(VFS, "No memory for SMB response\n");
538 /* retry will check if exiting */
541 /* beginning of smb buffer is cleared in our buf_get */
543 /* if existing small buf clear beginning */
544 memset(server->smallbuf, 0, HEADER_SIZE(server));
551 server_unresponsive(struct TCP_Server_Info *server)
554 * We need to wait 3 echo intervals to make sure we handle such
556 * 1s client sends a normal SMB request
557 * 3s client gets a response
558 * 30s echo workqueue job pops, and decides we got a response recently
559 * and don't need to send another
561 * 65s kernel_recvmsg times out, and we see that we haven't gotten
562 * a response in >60s.
564 if ((server->tcpStatus == CifsGood ||
565 server->tcpStatus == CifsNeedNegotiate) &&
566 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
567 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
568 server->hostname, (3 * server->echo_interval) / HZ);
569 cifs_reconnect(server);
570 wake_up(&server->response_q);
578 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
583 smb_msg->msg_control = NULL;
584 smb_msg->msg_controllen = 0;
586 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
589 if (server_unresponsive(server))
590 return -ECONNABORTED;
592 length = sock_recvmsg(server->ssocket, smb_msg, 0);
594 if (server->tcpStatus == CifsExiting)
597 if (server->tcpStatus == CifsNeedReconnect) {
598 cifs_reconnect(server);
599 return -ECONNABORTED;
602 if (length == -ERESTARTSYS ||
606 * Minimum sleep to prevent looping, allowing socket
607 * to clear and app threads to set tcpStatus
608 * CifsNeedReconnect if server hung.
610 usleep_range(1000, 2000);
616 cifs_dbg(FYI, "Received no data or error: %d\n", length);
617 cifs_reconnect(server);
618 return -ECONNABORTED;
625 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
626 unsigned int to_read)
628 struct msghdr smb_msg;
629 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
630 iov_iter_kvec(&smb_msg.msg_iter, READ | ITER_KVEC, &iov, 1, to_read);
632 return cifs_readv_from_socket(server, &smb_msg);
636 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
637 unsigned int to_read)
639 struct msghdr smb_msg;
640 struct bio_vec bv = {.bv_page = page, .bv_len = to_read};
641 iov_iter_bvec(&smb_msg.msg_iter, READ | ITER_BVEC, &bv, 1, to_read);
642 return cifs_readv_from_socket(server, &smb_msg);
646 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
649 * The first byte big endian of the length field,
650 * is actually not part of the length but the type
651 * with the most common, zero, as regular data.
654 case RFC1002_SESSION_MESSAGE:
655 /* Regular SMB response */
657 case RFC1002_SESSION_KEEP_ALIVE:
658 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
660 case RFC1002_POSITIVE_SESSION_RESPONSE:
661 cifs_dbg(FYI, "RFC 1002 positive session response\n");
663 case RFC1002_NEGATIVE_SESSION_RESPONSE:
665 * We get this from Windows 98 instead of an error on
666 * SMB negprot response.
668 cifs_dbg(FYI, "RFC 1002 negative session response\n");
669 /* give server a second to clean up */
672 * Always try 445 first on reconnect since we get NACK
673 * on some if we ever connected to port 139 (the NACK
674 * is since we do not begin with RFC1001 session
677 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
678 cifs_reconnect(server);
679 wake_up(&server->response_q);
682 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
683 cifs_reconnect(server);
690 dequeue_mid(struct mid_q_entry *mid, bool malformed)
692 #ifdef CONFIG_CIFS_STATS2
693 mid->when_received = jiffies;
695 spin_lock(&GlobalMid_Lock);
697 mid->mid_state = MID_RESPONSE_RECEIVED;
699 mid->mid_state = MID_RESPONSE_MALFORMED;
700 list_del_init(&mid->qhead);
701 spin_unlock(&GlobalMid_Lock);
705 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
706 char *buf, int malformed)
708 if (server->ops->check_trans2 &&
709 server->ops->check_trans2(mid, server, buf, malformed))
712 mid->large_buf = server->large_buf;
713 /* Was previous buf put in mpx struct for multi-rsp? */
714 if (!mid->multiRsp) {
715 /* smb buffer will be freed by user thread */
716 if (server->large_buf)
717 server->bigbuf = NULL;
719 server->smallbuf = NULL;
721 dequeue_mid(mid, malformed);
724 static void clean_demultiplex_info(struct TCP_Server_Info *server)
728 /* take it off the list, if it's not already */
729 spin_lock(&cifs_tcp_ses_lock);
730 list_del_init(&server->tcp_ses_list);
731 spin_unlock(&cifs_tcp_ses_lock);
733 cancel_delayed_work_sync(&server->echo);
735 spin_lock(&GlobalMid_Lock);
736 server->tcpStatus = CifsExiting;
737 spin_unlock(&GlobalMid_Lock);
738 wake_up_all(&server->response_q);
740 /* check if we have blocked requests that need to free */
741 spin_lock(&server->req_lock);
742 if (server->credits <= 0)
744 spin_unlock(&server->req_lock);
746 * Although there should not be any requests blocked on this queue it
747 * can not hurt to be paranoid and try to wake up requests that may
748 * haven been blocked when more than 50 at time were on the wire to the
749 * same server - they now will see the session is in exit state and get
750 * out of SendReceive.
752 wake_up_all(&server->request_q);
753 /* give those requests time to exit */
756 if (server->ssocket) {
757 sock_release(server->ssocket);
758 server->ssocket = NULL;
761 if (!list_empty(&server->pending_mid_q)) {
762 struct list_head dispose_list;
763 struct mid_q_entry *mid_entry;
764 struct list_head *tmp, *tmp2;
766 INIT_LIST_HEAD(&dispose_list);
767 spin_lock(&GlobalMid_Lock);
768 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
769 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
770 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
771 mid_entry->mid_state = MID_SHUTDOWN;
772 list_move(&mid_entry->qhead, &dispose_list);
774 spin_unlock(&GlobalMid_Lock);
776 /* now walk dispose list and issue callbacks */
777 list_for_each_safe(tmp, tmp2, &dispose_list) {
778 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
779 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
780 list_del_init(&mid_entry->qhead);
781 mid_entry->callback(mid_entry);
783 /* 1/8th of sec is more than enough time for them to exit */
787 if (!list_empty(&server->pending_mid_q)) {
789 * mpx threads have not exited yet give them at least the smb
790 * send timeout time for long ops.
792 * Due to delays on oplock break requests, we need to wait at
793 * least 45 seconds before giving up on a request getting a
794 * response and going ahead and killing cifsd.
796 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
799 * If threads still have not exited they are probably never
800 * coming home not much else we can do but free the memory.
804 kfree(server->hostname);
807 length = atomic_dec_return(&tcpSesAllocCount);
809 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
813 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
816 char *buf = server->smallbuf;
817 unsigned int pdu_length = get_rfc1002_length(buf);
819 /* make sure this will fit in a large buffer */
820 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
821 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
822 cifs_reconnect(server);
823 wake_up(&server->response_q);
824 return -ECONNABORTED;
827 /* switch to large buffer if too big for a small one */
828 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
829 server->large_buf = true;
830 memcpy(server->bigbuf, buf, server->total_read);
831 buf = server->bigbuf;
834 /* now read the rest */
835 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
836 pdu_length - HEADER_SIZE(server) + 1 + 4);
839 server->total_read += length;
841 dump_smb(buf, server->total_read);
844 * We know that we received enough to get to the MID as we
845 * checked the pdu_length earlier. Now check to see
846 * if the rest of the header is OK. We borrow the length
847 * var for the rest of the loop to avoid a new stack var.
849 * 48 bytes is enough to display the header and a little bit
850 * into the payload for debugging purposes.
852 length = server->ops->check_message(buf, server->total_read, server);
854 cifs_dump_mem("Bad SMB: ", buf,
855 min_t(unsigned int, server->total_read, 48));
857 if (server->ops->is_session_expired &&
858 server->ops->is_session_expired(buf)) {
859 cifs_reconnect(server);
860 wake_up(&server->response_q);
864 if (server->ops->is_status_pending &&
865 server->ops->is_status_pending(buf, server, length))
871 handle_mid(mid, server, buf, length);
876 cifs_demultiplex_thread(void *p)
879 struct TCP_Server_Info *server = p;
880 unsigned int pdu_length;
882 struct task_struct *task_to_wake = NULL;
883 struct mid_q_entry *mid_entry;
885 current->flags |= PF_MEMALLOC;
886 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
888 length = atomic_inc_return(&tcpSesAllocCount);
890 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
893 allow_kernel_signal(SIGKILL);
894 while (server->tcpStatus != CifsExiting) {
898 if (!allocate_buffers(server))
901 server->large_buf = false;
902 buf = server->smallbuf;
903 pdu_length = 4; /* enough to get RFC1001 header */
905 length = cifs_read_from_socket(server, buf, pdu_length);
908 server->total_read = length;
911 * The right amount was read from socket - 4 bytes,
912 * so we can now interpret the length field.
914 pdu_length = get_rfc1002_length(buf);
916 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
917 if (!is_smb_response(server, buf[0]))
920 /* make sure we have enough to get to the MID */
921 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
922 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
924 cifs_reconnect(server);
925 wake_up(&server->response_q);
929 /* read down to the MID */
930 length = cifs_read_from_socket(server, buf + 4,
931 HEADER_SIZE(server) - 1 - 4);
934 server->total_read += length;
936 mid_entry = server->ops->find_mid(server, buf);
938 if (!mid_entry || !mid_entry->receive)
939 length = standard_receive3(server, mid_entry);
941 length = mid_entry->receive(server, mid_entry);
946 if (server->large_buf)
947 buf = server->bigbuf;
949 server->lstrp = jiffies;
950 if (mid_entry != NULL) {
951 if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
952 mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
953 server->ops->handle_cancelled_mid)
954 server->ops->handle_cancelled_mid(
958 if (!mid_entry->multiRsp || mid_entry->multiEnd)
959 mid_entry->callback(mid_entry);
960 } else if (server->ops->is_oplock_break &&
961 server->ops->is_oplock_break(buf, server)) {
962 cifs_dbg(FYI, "Received oplock break\n");
964 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
965 atomic_read(&midCount));
966 cifs_dump_mem("Received Data is: ", buf,
967 HEADER_SIZE(server));
968 #ifdef CONFIG_CIFS_DEBUG2
969 if (server->ops->dump_detail)
970 server->ops->dump_detail(buf);
971 cifs_dump_mids(server);
972 #endif /* CIFS_DEBUG2 */
975 } /* end while !EXITING */
977 /* buffer usually freed in free_mid - need to free it here on exit */
978 cifs_buf_release(server->bigbuf);
979 if (server->smallbuf) /* no sense logging a debug message if NULL */
980 cifs_small_buf_release(server->smallbuf);
982 task_to_wake = xchg(&server->tsk, NULL);
983 clean_demultiplex_info(server);
985 /* if server->tsk was NULL then wait for a signal before exiting */
987 set_current_state(TASK_INTERRUPTIBLE);
988 while (!signal_pending(current)) {
990 set_current_state(TASK_INTERRUPTIBLE);
992 set_current_state(TASK_RUNNING);
995 module_put_and_exit(0);
998 /* extract the host portion of the UNC string */
1000 extract_hostname(const char *unc)
1006 /* skip double chars at beginning of string */
1007 /* BB: check validity of these bytes? */
1010 /* delimiter between hostname and sharename is always '\\' now */
1011 delim = strchr(src, '\\');
1013 return ERR_PTR(-EINVAL);
1016 dst = kmalloc((len + 1), GFP_KERNEL);
1018 return ERR_PTR(-ENOMEM);
1020 memcpy(dst, src, len);
1026 static int get_option_ul(substring_t args[], unsigned long *option)
1031 string = match_strdup(args);
1034 rc = kstrtoul(string, 0, option);
1040 static int get_option_uid(substring_t args[], kuid_t *result)
1042 unsigned long value;
1046 rc = get_option_ul(args, &value);
1050 uid = make_kuid(current_user_ns(), value);
1051 if (!uid_valid(uid))
1058 static int get_option_gid(substring_t args[], kgid_t *result)
1060 unsigned long value;
1064 rc = get_option_ul(args, &value);
1068 gid = make_kgid(current_user_ns(), value);
1069 if (!gid_valid(gid))
1076 static int cifs_parse_security_flavors(char *value,
1077 struct smb_vol *vol)
1080 substring_t args[MAX_OPT_ARGS];
1083 * With mount options, the last one should win. Reset any existing
1084 * settings back to default.
1086 vol->sectype = Unspecified;
1089 switch (match_token(value, cifs_secflavor_tokens, args)) {
1091 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1097 vol->sectype = Kerberos;
1099 case Opt_sec_ntlmsspi:
1102 case Opt_sec_ntlmssp:
1103 vol->sectype = RawNTLMSSP;
1109 vol->sectype = NTLM;
1111 case Opt_sec_ntlmv2i:
1114 case Opt_sec_ntlmv2:
1115 vol->sectype = NTLMv2;
1117 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1118 case Opt_sec_lanman:
1119 vol->sectype = LANMAN;
1126 cifs_dbg(VFS, "bad security option: %s\n", value);
1134 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1136 substring_t args[MAX_OPT_ARGS];
1138 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1139 case Opt_cache_loose:
1140 vol->direct_io = false;
1141 vol->strict_io = false;
1143 case Opt_cache_strict:
1144 vol->direct_io = false;
1145 vol->strict_io = true;
1147 case Opt_cache_none:
1148 vol->direct_io = true;
1149 vol->strict_io = false;
1152 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1159 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1161 substring_t args[MAX_OPT_ARGS];
1163 switch (match_token(value, cifs_smb_version_tokens, args)) {
1165 vol->ops = &smb1_operations;
1166 vol->vals = &smb1_values;
1168 #ifdef CONFIG_CIFS_SMB2
1170 vol->ops = &smb20_operations;
1171 vol->vals = &smb20_values;
1174 vol->ops = &smb21_operations;
1175 vol->vals = &smb21_values;
1178 vol->ops = &smb30_operations;
1179 vol->vals = &smb30_values;
1182 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1183 vol->vals = &smb302_values;
1185 #ifdef CONFIG_CIFS_SMB311
1187 vol->ops = &smb311_operations;
1188 vol->vals = &smb311_values;
1193 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1200 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1201 * fields with the result. Returns 0 on success and an error otherwise.
1204 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1207 const char *delims = "/\\";
1210 if (unlikely(!devname || !*devname)) {
1211 cifs_dbg(VFS, "Device name not specified.\n");
1215 /* make sure we have a valid UNC double delimiter prefix */
1216 len = strspn(devname, delims);
1220 /* find delimiter between host and sharename */
1221 pos = strpbrk(devname + 2, delims);
1225 /* skip past delimiter */
1228 /* now go until next delimiter or end of string */
1229 len = strcspn(pos, delims);
1231 /* move "pos" up to delimiter or NULL */
1233 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1237 convert_delimiter(vol->UNC, '\\');
1239 /* skip any delimiter */
1240 if (*pos == '/' || *pos == '\\')
1243 /* If pos is NULL then no prepath */
1247 vol->prepath = kstrdup(pos, GFP_KERNEL);
1255 cifs_parse_mount_options(const char *mountdata, const char *devname,
1256 struct smb_vol *vol)
1259 char *mountdata_copy = NULL, *options;
1260 unsigned int temp_len, i, j;
1262 short int override_uid = -1;
1263 short int override_gid = -1;
1264 bool uid_specified = false;
1265 bool gid_specified = false;
1266 bool sloppy = false;
1267 char *invalid = NULL;
1268 char *nodename = utsname()->nodename;
1269 char *string = NULL;
1270 char *tmp_end, *value;
1272 bool got_ip = false;
1273 unsigned short port = 0;
1274 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1278 delim = separator[0];
1280 /* ensure we always start with zeroed-out smb_vol */
1281 memset(vol, 0, sizeof(*vol));
1284 * does not have to be perfect mapping since field is
1285 * informational, only used for servers that do not support
1286 * port 445 and it can be overridden at mount time
1288 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1289 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1290 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1292 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1293 /* null target name indicates to use *SMBSERVR default called name
1294 if we end up sending RFC1001 session initialize */
1295 vol->target_rfc1001_name[0] = 0;
1296 vol->cred_uid = current_uid();
1297 vol->linux_uid = current_uid();
1298 vol->linux_gid = current_gid();
1301 * default to SFM style remapping of seven reserved characters
1302 * unless user overrides it or we negotiate CIFS POSIX where
1303 * it is unnecessary. Can not simultaneously use more than one mapping
1304 * since then readdir could list files that open could not open
1308 /* default to only allowing write access to owner of the mount */
1309 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1311 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1312 /* default is always to request posix paths. */
1313 vol->posix_paths = 1;
1314 /* default to using server inode numbers where available */
1315 vol->server_ino = 1;
1317 /* default is to use strict cifs caching semantics */
1318 vol->strict_io = true;
1320 vol->actimeo = CIFS_DEF_ACTIMEO;
1322 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1323 vol->ops = &smb1_operations;
1324 vol->vals = &smb1_values;
1326 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1329 goto cifs_parse_mount_err;
1331 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1332 if (!mountdata_copy)
1333 goto cifs_parse_mount_err;
1335 options = mountdata_copy;
1336 end = options + strlen(options);
1338 if (strncmp(options, "sep=", 4) == 0) {
1339 if (options[4] != 0) {
1340 separator[0] = options[4];
1343 cifs_dbg(FYI, "Null separator not allowed\n");
1346 vol->backupuid_specified = false; /* no backup intent for a user */
1347 vol->backupgid_specified = false; /* no backup intent for a group */
1349 switch (cifs_parse_devname(devname, vol)) {
1353 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1354 goto cifs_parse_mount_err;
1356 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1357 goto cifs_parse_mount_err;
1359 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1360 goto cifs_parse_mount_err;
1363 while ((data = strsep(&options, separator)) != NULL) {
1364 substring_t args[MAX_OPT_ARGS];
1365 unsigned long option;
1371 token = match_token(data, cifs_mount_option_tokens, args);
1375 /* Ingnore the following */
1379 /* Boolean values */
1380 case Opt_user_xattr:
1383 case Opt_nouser_xattr:
1389 case Opt_noforceuid:
1395 case Opt_noforcegid:
1398 case Opt_noblocksend:
1399 vol->noblocksnd = 1;
1401 case Opt_noautotune:
1402 vol->noautotune = 1;
1417 vol->sfu_remap = true;
1418 vol->remap = false; /* disable SFM mapping */
1420 case Opt_nomapchars:
1421 vol->sfu_remap = false;
1425 vol->sfu_remap = false; /* disable SFU mapping */
1427 case Opt_nomapposix:
1439 case Opt_posixpaths:
1440 vol->posix_paths = 1;
1442 case Opt_noposixpaths:
1443 vol->posix_paths = 0;
1446 vol->no_linux_ext = 1;
1457 * turn off mandatory locking in mode
1458 * if remote locking is turned off since the
1459 * local vfs will do advisory
1461 if (vol->file_mode ==
1462 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1463 vol->file_mode = S_IALLUGO;
1465 case Opt_forcemandatorylock:
1474 case Opt_setuidfromacl:
1475 vol->setuidfromacl = 1;
1478 vol->dynperm = true;
1481 vol->dynperm = false;
1495 case Opt_nostrictsync:
1496 vol->nostrictsync = 1;
1498 case Opt_strictsync:
1499 vol->nostrictsync = 0;
1502 vol->server_ino = 1;
1504 case Opt_noserverino:
1505 vol->server_ino = 0;
1507 case Opt_rwpidforward:
1508 vol->rwpidforward = 1;
1517 vol->no_psx_acl = 0;
1520 vol->no_psx_acl = 1;
1522 case Opt_locallease:
1523 vol->local_lease = 1;
1529 /* we do not do the following in secFlags because seal
1530 * is a per tree connection (mount) not a per socket
1531 * or per-smb connection option in the protocol
1532 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1537 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1540 #ifndef CONFIG_CIFS_FSCACHE
1541 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1542 goto cifs_parse_mount_err;
1546 case Opt_mfsymlinks:
1547 vol->mfsymlinks = true;
1550 vol->multiuser = true;
1555 case Opt_nosharesock:
1556 vol->nosharesock = true;
1558 case Opt_nopersistent:
1559 vol->nopersistent = true;
1560 if (vol->persistent) {
1562 "persistenthandles mount options conflict\n");
1563 goto cifs_parse_mount_err;
1566 case Opt_persistent:
1567 vol->persistent = true;
1568 if ((vol->nopersistent) || (vol->resilient)) {
1570 "persistenthandles mount options conflict\n");
1571 goto cifs_parse_mount_err;
1575 vol->resilient = true;
1576 if (vol->persistent) {
1578 "persistenthandles mount options conflict\n");
1579 goto cifs_parse_mount_err;
1582 case Opt_noresilient:
1583 vol->resilient = false; /* already the default */
1586 /* Numeric Values */
1588 if (get_option_uid(args, &vol->backupuid)) {
1589 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1591 goto cifs_parse_mount_err;
1593 vol->backupuid_specified = true;
1596 if (get_option_gid(args, &vol->backupgid)) {
1597 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1599 goto cifs_parse_mount_err;
1601 vol->backupgid_specified = true;
1604 if (get_option_uid(args, &vol->linux_uid)) {
1605 cifs_dbg(VFS, "%s: Invalid uid value\n",
1607 goto cifs_parse_mount_err;
1609 uid_specified = true;
1612 if (get_option_uid(args, &vol->cred_uid)) {
1613 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1615 goto cifs_parse_mount_err;
1619 if (get_option_gid(args, &vol->linux_gid)) {
1620 cifs_dbg(VFS, "%s: Invalid gid value\n",
1622 goto cifs_parse_mount_err;
1624 gid_specified = true;
1627 if (get_option_ul(args, &option)) {
1628 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1630 goto cifs_parse_mount_err;
1632 vol->file_mode = option;
1635 if (get_option_ul(args, &option)) {
1636 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1638 goto cifs_parse_mount_err;
1640 vol->dir_mode = option;
1643 if (get_option_ul(args, &option) ||
1644 option > USHRT_MAX) {
1645 cifs_dbg(VFS, "%s: Invalid port value\n",
1647 goto cifs_parse_mount_err;
1649 port = (unsigned short)option;
1652 if (get_option_ul(args, &option)) {
1653 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1655 goto cifs_parse_mount_err;
1657 vol->rsize = option;
1660 if (get_option_ul(args, &option)) {
1661 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1663 goto cifs_parse_mount_err;
1665 vol->wsize = option;
1668 if (get_option_ul(args, &option)) {
1669 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1671 goto cifs_parse_mount_err;
1673 vol->actimeo = HZ * option;
1674 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1675 cifs_dbg(VFS, "attribute cache timeout too large\n");
1676 goto cifs_parse_mount_err;
1679 case Opt_echo_interval:
1680 if (get_option_ul(args, &option)) {
1681 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1683 goto cifs_parse_mount_err;
1685 vol->echo_interval = option;
1687 case Opt_max_credits:
1688 if (get_option_ul(args, &option) || (option < 20) ||
1690 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1692 goto cifs_parse_mount_err;
1694 vol->max_credits = option;
1697 /* String Arguments */
1699 case Opt_blank_user:
1700 /* null user, ie. anonymous authentication */
1702 vol->username = NULL;
1705 string = match_strdup(args);
1709 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1710 CIFS_MAX_USERNAME_LEN) {
1711 pr_warn("CIFS: username too long\n");
1712 goto cifs_parse_mount_err;
1715 kfree(vol->username);
1716 vol->username = kstrdup(string, GFP_KERNEL);
1718 goto cifs_parse_mount_err;
1720 case Opt_blank_pass:
1721 /* passwords have to be handled differently
1722 * to allow the character used for deliminator
1723 * to be passed within them
1727 * Check if this is a case where the password
1728 * starts with a delimiter
1730 tmp_end = strchr(data, '=');
1732 if (!(tmp_end < end && tmp_end[1] == delim)) {
1733 /* No it is not. Set the password to NULL */
1734 kzfree(vol->password);
1735 vol->password = NULL;
1738 /* Yes it is. Drop down to Opt_pass below.*/
1740 /* Obtain the value string */
1741 value = strchr(data, '=');
1744 /* Set tmp_end to end of the string */
1745 tmp_end = (char *) value + strlen(value);
1747 /* Check if following character is the deliminator
1748 * If yes, we have encountered a double deliminator
1749 * reset the NULL character to the deliminator
1751 if (tmp_end < end && tmp_end[1] == delim) {
1754 /* Keep iterating until we get to a single
1755 * deliminator OR the end
1757 while ((tmp_end = strchr(tmp_end, delim))
1758 != NULL && (tmp_end[1] == delim)) {
1759 tmp_end = (char *) &tmp_end[2];
1762 /* Reset var options to point to next element */
1765 options = (char *) &tmp_end[1];
1767 /* Reached the end of the mount option
1772 kzfree(vol->password);
1773 /* Now build new password string */
1774 temp_len = strlen(value);
1775 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1776 if (vol->password == NULL) {
1777 pr_warn("CIFS: no memory for password\n");
1778 goto cifs_parse_mount_err;
1781 for (i = 0, j = 0; i < temp_len; i++, j++) {
1782 vol->password[j] = value[i];
1783 if ((value[i] == delim) &&
1784 value[i+1] == delim)
1785 /* skip the second deliminator */
1788 vol->password[j] = '\0';
1791 /* FIXME: should this be an error instead? */
1795 string = match_strdup(args);
1799 if (!cifs_convert_address(dstaddr, string,
1801 pr_err("CIFS: bad ip= option (%s).\n", string);
1802 goto cifs_parse_mount_err;
1807 string = match_strdup(args);
1811 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1812 == CIFS_MAX_DOMAINNAME_LEN) {
1813 pr_warn("CIFS: domain name too long\n");
1814 goto cifs_parse_mount_err;
1817 kfree(vol->domainname);
1818 vol->domainname = kstrdup(string, GFP_KERNEL);
1819 if (!vol->domainname) {
1820 pr_warn("CIFS: no memory for domainname\n");
1821 goto cifs_parse_mount_err;
1823 cifs_dbg(FYI, "Domain name set\n");
1826 string = match_strdup(args);
1830 if (!cifs_convert_address(
1831 (struct sockaddr *)&vol->srcaddr,
1832 string, strlen(string))) {
1833 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1835 goto cifs_parse_mount_err;
1839 string = match_strdup(args);
1843 if (strnlen(string, 1024) >= 65) {
1844 pr_warn("CIFS: iocharset name too long.\n");
1845 goto cifs_parse_mount_err;
1848 if (strncasecmp(string, "default", 7) != 0) {
1849 kfree(vol->iocharset);
1850 vol->iocharset = kstrdup(string,
1852 if (!vol->iocharset) {
1853 pr_warn("CIFS: no memory for charset\n");
1854 goto cifs_parse_mount_err;
1857 /* if iocharset not set then load_nls_default
1860 cifs_dbg(FYI, "iocharset set to %s\n", string);
1862 case Opt_netbiosname:
1863 string = match_strdup(args);
1867 memset(vol->source_rfc1001_name, 0x20,
1870 * FIXME: are there cases in which a comma can
1871 * be valid in workstation netbios name (and
1872 * need special handling)?
1874 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1875 /* don't ucase netbiosname for user */
1878 vol->source_rfc1001_name[i] = string[i];
1880 /* The string has 16th byte zero still from
1881 * set at top of the function
1883 if (i == RFC1001_NAME_LEN && string[i] != 0)
1884 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1887 /* servernetbiosname specified override *SMBSERVER */
1888 string = match_strdup(args);
1892 /* last byte, type, is 0x20 for servr type */
1893 memset(vol->target_rfc1001_name, 0x20,
1894 RFC1001_NAME_LEN_WITH_NULL);
1896 /* BB are there cases in which a comma can be
1897 valid in this workstation netbios name
1898 (and need special handling)? */
1900 /* user or mount helper must uppercase the
1902 for (i = 0; i < 15; i++) {
1905 vol->target_rfc1001_name[i] = string[i];
1907 /* The string has 16th byte zero still from
1908 set at top of the function */
1909 if (i == RFC1001_NAME_LEN && string[i] != 0)
1910 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1913 string = match_strdup(args);
1917 if (strncasecmp(string, "1", 1) == 0) {
1918 /* This is the default */
1921 /* For all other value, error */
1922 pr_warn("CIFS: Invalid version specified\n");
1923 goto cifs_parse_mount_err;
1925 string = match_strdup(args);
1929 if (cifs_parse_smb_version(string, vol) != 0)
1930 goto cifs_parse_mount_err;
1933 string = match_strdup(args);
1937 if (cifs_parse_security_flavors(string, vol) != 0)
1938 goto cifs_parse_mount_err;
1941 string = match_strdup(args);
1945 if (cifs_parse_cache_flavor(string, vol) != 0)
1946 goto cifs_parse_mount_err;
1950 * An option we don't recognize. Save it off for later
1951 * if we haven't already found one
1957 /* Free up any allocated string */
1962 if (!sloppy && invalid) {
1963 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
1964 goto cifs_parse_mount_err;
1968 /* Muliuser mounts require CONFIG_KEYS support */
1969 if (vol->multiuser) {
1970 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1971 goto cifs_parse_mount_err;
1975 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
1976 goto cifs_parse_mount_err;
1979 /* make sure UNC has a share name */
1980 if (!strchr(vol->UNC + 3, '\\')) {
1981 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
1982 goto cifs_parse_mount_err;
1986 /* No ip= option specified? Try to get it from UNC */
1987 if (!cifs_convert_address(dstaddr, &vol->UNC[2],
1988 strlen(&vol->UNC[2]))) {
1989 pr_err("Unable to determine destination address.\n");
1990 goto cifs_parse_mount_err;
1994 /* set the port that we got earlier */
1995 cifs_set_port(dstaddr, port);
1998 vol->override_uid = override_uid;
1999 else if (override_uid == 1)
2000 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2003 vol->override_gid = override_gid;
2004 else if (override_gid == 1)
2005 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2007 kfree(mountdata_copy);
2011 pr_warn("Could not allocate temporary buffer\n");
2012 cifs_parse_mount_err:
2014 kfree(mountdata_copy);
2018 /** Returns true if srcaddr isn't specified and rhs isn't
2019 * specified, or if srcaddr is specified and
2020 * matches the IP address of the rhs argument.
2023 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2025 switch (srcaddr->sa_family) {
2027 return (rhs->sa_family == AF_UNSPEC);
2029 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2030 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2031 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2034 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2035 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2036 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2040 return false; /* don't expect to be here */
2045 * If no port is specified in addr structure, we try to match with 445 port
2046 * and if it fails - with 139 ports. It should be called only if address
2047 * families of server and addr are equal.
2050 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2052 __be16 port, *sport;
2054 switch (addr->sa_family) {
2056 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2057 port = ((struct sockaddr_in *) addr)->sin_port;
2060 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2061 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2069 port = htons(CIFS_PORT);
2073 port = htons(RFC1001_PORT);
2076 return port == *sport;
2080 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2081 struct sockaddr *srcaddr)
2083 switch (addr->sa_family) {
2085 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2086 struct sockaddr_in *srv_addr4 =
2087 (struct sockaddr_in *)&server->dstaddr;
2089 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2094 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2095 struct sockaddr_in6 *srv_addr6 =
2096 (struct sockaddr_in6 *)&server->dstaddr;
2098 if (!ipv6_addr_equal(&addr6->sin6_addr,
2099 &srv_addr6->sin6_addr))
2101 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2107 return false; /* don't expect to be here */
2110 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2117 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2120 * The select_sectype function should either return the vol->sectype
2121 * that was specified, or "Unspecified" if that sectype was not
2122 * compatible with the given NEGOTIATE request.
2124 if (select_sectype(server, vol->sectype) == Unspecified)
2128 * Now check if signing mode is acceptable. No need to check
2129 * global_secflags at this point since if MUST_SIGN is set then
2130 * the server->sign had better be too.
2132 if (vol->sign && !server->sign)
2138 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2140 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2142 if (vol->nosharesock)
2145 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2148 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2151 if (!match_address(server, addr,
2152 (struct sockaddr *)&vol->srcaddr))
2155 if (!match_port(server, addr))
2158 if (!match_security(server, vol))
2161 if (server->echo_interval != vol->echo_interval * HZ)
2167 static struct TCP_Server_Info *
2168 cifs_find_tcp_session(struct smb_vol *vol)
2170 struct TCP_Server_Info *server;
2172 spin_lock(&cifs_tcp_ses_lock);
2173 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2174 if (!match_server(server, vol))
2177 ++server->srv_count;
2178 spin_unlock(&cifs_tcp_ses_lock);
2179 cifs_dbg(FYI, "Existing tcp session with server found\n");
2182 spin_unlock(&cifs_tcp_ses_lock);
2187 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2189 struct task_struct *task;
2191 spin_lock(&cifs_tcp_ses_lock);
2192 if (--server->srv_count > 0) {
2193 spin_unlock(&cifs_tcp_ses_lock);
2197 put_net(cifs_net_ns(server));
2199 list_del_init(&server->tcp_ses_list);
2200 spin_unlock(&cifs_tcp_ses_lock);
2202 cancel_delayed_work_sync(&server->echo);
2204 #ifdef CONFIG_CIFS_SMB2
2207 * Avoid deadlock here: reconnect work calls
2208 * cifs_put_tcp_session() at its end. Need to be sure
2209 * that reconnect work does nothing with server pointer after
2212 cancel_delayed_work(&server->reconnect);
2214 cancel_delayed_work_sync(&server->reconnect);
2217 spin_lock(&GlobalMid_Lock);
2218 server->tcpStatus = CifsExiting;
2219 spin_unlock(&GlobalMid_Lock);
2221 cifs_crypto_shash_release(server);
2222 cifs_fscache_release_client_cookie(server);
2224 kfree(server->session_key.response);
2225 server->session_key.response = NULL;
2226 server->session_key.len = 0;
2228 task = xchg(&server->tsk, NULL);
2230 send_sig(SIGKILL, task, 1);
2233 static struct TCP_Server_Info *
2234 cifs_get_tcp_session(struct smb_vol *volume_info)
2236 struct TCP_Server_Info *tcp_ses = NULL;
2239 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2241 /* see if we already have a matching tcp_ses */
2242 tcp_ses = cifs_find_tcp_session(volume_info);
2246 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2252 tcp_ses->ops = volume_info->ops;
2253 tcp_ses->vals = volume_info->vals;
2254 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2255 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2256 if (IS_ERR(tcp_ses->hostname)) {
2257 rc = PTR_ERR(tcp_ses->hostname);
2258 goto out_err_crypto_release;
2261 tcp_ses->noblocksnd = volume_info->noblocksnd;
2262 tcp_ses->noautotune = volume_info->noautotune;
2263 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2264 tcp_ses->in_flight = 0;
2265 tcp_ses->credits = 1;
2266 init_waitqueue_head(&tcp_ses->response_q);
2267 init_waitqueue_head(&tcp_ses->request_q);
2268 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2269 mutex_init(&tcp_ses->srv_mutex);
2270 memcpy(tcp_ses->workstation_RFC1001_name,
2271 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2272 memcpy(tcp_ses->server_RFC1001_name,
2273 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2274 tcp_ses->session_estab = false;
2275 tcp_ses->sequence_number = 0;
2276 tcp_ses->lstrp = jiffies;
2277 spin_lock_init(&tcp_ses->req_lock);
2278 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2279 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2280 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2281 #ifdef CONFIG_CIFS_SMB2
2282 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2283 mutex_init(&tcp_ses->reconnect_mutex);
2285 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2286 sizeof(tcp_ses->srcaddr));
2287 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2288 sizeof(tcp_ses->dstaddr));
2289 #ifdef CONFIG_CIFS_SMB2
2290 generate_random_uuid(tcp_ses->client_guid);
2293 * at this point we are the only ones with the pointer
2294 * to the struct since the kernel thread not created yet
2295 * no need to spinlock this init of tcpStatus or srv_count
2297 tcp_ses->tcpStatus = CifsNew;
2298 ++tcp_ses->srv_count;
2300 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2301 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2302 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2304 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2306 rc = ip_connect(tcp_ses);
2308 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2309 goto out_err_crypto_release;
2313 * since we're in a cifs function already, we know that
2314 * this will succeed. No need for try_module_get().
2316 __module_get(THIS_MODULE);
2317 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2319 if (IS_ERR(tcp_ses->tsk)) {
2320 rc = PTR_ERR(tcp_ses->tsk);
2321 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2322 module_put(THIS_MODULE);
2323 goto out_err_crypto_release;
2325 tcp_ses->tcpStatus = CifsNeedNegotiate;
2327 /* thread spawned, put it on the list */
2328 spin_lock(&cifs_tcp_ses_lock);
2329 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2330 spin_unlock(&cifs_tcp_ses_lock);
2332 cifs_fscache_get_client_cookie(tcp_ses);
2334 /* queue echo request delayed work */
2335 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2339 out_err_crypto_release:
2340 cifs_crypto_shash_release(tcp_ses);
2342 put_net(cifs_net_ns(tcp_ses));
2346 if (!IS_ERR(tcp_ses->hostname))
2347 kfree(tcp_ses->hostname);
2348 if (tcp_ses->ssocket)
2349 sock_release(tcp_ses->ssocket);
2355 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2357 if (vol->sectype != Unspecified &&
2358 vol->sectype != ses->sectype)
2361 switch (ses->sectype) {
2363 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2367 /* NULL username means anonymous session */
2368 if (ses->user_name == NULL) {
2374 /* anything else takes username/password */
2375 if (strncmp(ses->user_name,
2376 vol->username ? vol->username : "",
2377 CIFS_MAX_USERNAME_LEN))
2379 if ((vol->username && strlen(vol->username) != 0) &&
2380 ses->password != NULL &&
2381 strncmp(ses->password,
2382 vol->password ? vol->password : "",
2383 CIFS_MAX_PASSWORD_LEN))
2389 static struct cifs_ses *
2390 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2392 struct cifs_ses *ses;
2394 spin_lock(&cifs_tcp_ses_lock);
2395 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2396 if (ses->status == CifsExiting)
2398 if (!match_session(ses, vol))
2401 spin_unlock(&cifs_tcp_ses_lock);
2404 spin_unlock(&cifs_tcp_ses_lock);
2409 cifs_put_smb_ses(struct cifs_ses *ses)
2411 unsigned int rc, xid;
2412 struct TCP_Server_Info *server = ses->server;
2414 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2416 spin_lock(&cifs_tcp_ses_lock);
2417 if (ses->status == CifsExiting) {
2418 spin_unlock(&cifs_tcp_ses_lock);
2421 if (--ses->ses_count > 0) {
2422 spin_unlock(&cifs_tcp_ses_lock);
2425 if (ses->status == CifsGood)
2426 ses->status = CifsExiting;
2427 spin_unlock(&cifs_tcp_ses_lock);
2429 if (ses->status == CifsExiting && server->ops->logoff) {
2431 rc = server->ops->logoff(xid, ses);
2433 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2438 spin_lock(&cifs_tcp_ses_lock);
2439 list_del_init(&ses->smb_ses_list);
2440 spin_unlock(&cifs_tcp_ses_lock);
2443 cifs_put_tcp_session(server, 0);
2448 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2449 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2451 /* Populate username and pw fields from keyring if possible */
2453 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2457 const char *delim, *payload;
2461 struct TCP_Server_Info *server = ses->server;
2462 struct sockaddr_in *sa;
2463 struct sockaddr_in6 *sa6;
2464 const struct user_key_payload *upayload;
2466 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2470 /* try to find an address key first */
2471 switch (server->dstaddr.ss_family) {
2473 sa = (struct sockaddr_in *)&server->dstaddr;
2474 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2477 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2478 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2481 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2482 server->dstaddr.ss_family);
2487 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2488 key = request_key(&key_type_logon, desc, "");
2490 if (!ses->domainName) {
2491 cifs_dbg(FYI, "domainName is NULL\n");
2496 /* didn't work, try to find a domain key */
2497 sprintf(desc, "cifs:d:%s", ses->domainName);
2498 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2499 key = request_key(&key_type_logon, desc, "");
2507 down_read(&key->sem);
2508 upayload = user_key_payload(key);
2509 if (IS_ERR_OR_NULL(upayload)) {
2510 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2514 /* find first : in payload */
2515 payload = upayload->data;
2516 delim = strnchr(payload, upayload->datalen, ':');
2517 cifs_dbg(FYI, "payload=%s\n", payload);
2519 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2525 len = delim - payload;
2526 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2527 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2533 vol->username = kstrndup(payload, len, GFP_KERNEL);
2534 if (!vol->username) {
2535 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2540 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2542 len = key->datalen - (len + 1);
2543 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2544 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2546 kfree(vol->username);
2547 vol->username = NULL;
2552 vol->password = kstrndup(delim, len, GFP_KERNEL);
2553 if (!vol->password) {
2554 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2557 kfree(vol->username);
2558 vol->username = NULL;
2563 * If we have a domain key then we must set the domainName in the
2566 if (is_domain && ses->domainName) {
2567 vol->domainname = kstrndup(ses->domainName,
2568 strlen(ses->domainName),
2570 if (!vol->domainname) {
2571 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
2574 kfree(vol->username);
2575 vol->username = NULL;
2576 kzfree(vol->password);
2577 vol->password = NULL;
2587 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2590 #else /* ! CONFIG_KEYS */
2592 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2593 struct cifs_ses *ses __attribute__((unused)))
2597 #endif /* CONFIG_KEYS */
2599 static struct cifs_ses *
2600 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2604 struct cifs_ses *ses;
2605 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2606 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2610 ses = cifs_find_smb_ses(server, volume_info);
2612 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2615 mutex_lock(&ses->session_mutex);
2616 rc = cifs_negotiate_protocol(xid, ses);
2618 mutex_unlock(&ses->session_mutex);
2619 /* problem -- put our ses reference */
2620 cifs_put_smb_ses(ses);
2624 if (ses->need_reconnect) {
2625 cifs_dbg(FYI, "Session needs reconnect\n");
2626 rc = cifs_setup_session(xid, ses,
2627 volume_info->local_nls);
2629 mutex_unlock(&ses->session_mutex);
2630 /* problem -- put our reference */
2631 cifs_put_smb_ses(ses);
2636 mutex_unlock(&ses->session_mutex);
2638 /* existing SMB ses has a server reference already */
2639 cifs_put_tcp_session(server, 0);
2644 cifs_dbg(FYI, "Existing smb sess not found\n");
2645 ses = sesInfoAlloc();
2649 /* new SMB session uses our server ref */
2650 ses->server = server;
2651 if (server->dstaddr.ss_family == AF_INET6)
2652 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2654 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2656 if (volume_info->username) {
2657 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2658 if (!ses->user_name)
2662 /* volume_info->password freed at unmount */
2663 if (volume_info->password) {
2664 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2668 if (volume_info->domainname) {
2669 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2670 if (!ses->domainName)
2673 ses->cred_uid = volume_info->cred_uid;
2674 ses->linux_uid = volume_info->linux_uid;
2676 ses->sectype = volume_info->sectype;
2677 ses->sign = volume_info->sign;
2679 mutex_lock(&ses->session_mutex);
2680 rc = cifs_negotiate_protocol(xid, ses);
2682 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2683 mutex_unlock(&ses->session_mutex);
2687 /* success, put it on the list */
2688 spin_lock(&cifs_tcp_ses_lock);
2689 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2690 spin_unlock(&cifs_tcp_ses_lock);
2701 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2703 if (tcon->tidStatus == CifsExiting)
2705 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2710 static struct cifs_tcon *
2711 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2713 struct list_head *tmp;
2714 struct cifs_tcon *tcon;
2716 spin_lock(&cifs_tcp_ses_lock);
2717 list_for_each(tmp, &ses->tcon_list) {
2718 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2719 if (!match_tcon(tcon, unc))
2722 spin_unlock(&cifs_tcp_ses_lock);
2725 spin_unlock(&cifs_tcp_ses_lock);
2730 cifs_put_tcon(struct cifs_tcon *tcon)
2733 struct cifs_ses *ses = tcon->ses;
2735 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2736 spin_lock(&cifs_tcp_ses_lock);
2737 if (--tcon->tc_count > 0) {
2738 spin_unlock(&cifs_tcp_ses_lock);
2742 list_del_init(&tcon->tcon_list);
2743 spin_unlock(&cifs_tcp_ses_lock);
2746 if (ses->server->ops->tree_disconnect)
2747 ses->server->ops->tree_disconnect(xid, tcon);
2750 cifs_fscache_release_super_cookie(tcon);
2752 cifs_put_smb_ses(ses);
2755 static struct cifs_tcon *
2756 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2759 struct cifs_tcon *tcon;
2761 tcon = cifs_find_tcon(ses, volume_info->UNC);
2763 cifs_dbg(FYI, "Found match on UNC path\n");
2764 /* existing tcon already has a reference */
2765 cifs_put_smb_ses(ses);
2766 if (tcon->seal != volume_info->seal)
2767 cifs_dbg(VFS, "transport encryption setting conflicts with existing tid\n");
2771 if (!ses->server->ops->tree_connect) {
2776 tcon = tconInfoAlloc();
2783 if (volume_info->password) {
2784 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2785 if (!tcon->password) {
2792 * BB Do we need to wrap session_mutex around this TCon call and Unix
2793 * SetFS as we do on SessSetup and reconnect?
2796 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2797 volume_info->local_nls);
2799 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2803 if (volume_info->nodfs) {
2804 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2805 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
2807 tcon->seal = volume_info->seal;
2808 tcon->use_persistent = false;
2809 /* check if SMB2 or later, CIFS does not support persistent handles */
2810 if (volume_info->persistent) {
2811 if (ses->server->vals->protocol_id == 0) {
2813 "SMB3 or later required for persistent handles\n");
2816 #ifdef CONFIG_CIFS_SMB2
2817 } else if (ses->server->capabilities &
2818 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2819 tcon->use_persistent = true;
2820 else /* persistent handles requested but not supported */ {
2822 "Persistent handles not supported on share\n");
2825 #endif /* CONFIG_CIFS_SMB2 */
2827 #ifdef CONFIG_CIFS_SMB2
2828 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2829 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2830 && (volume_info->nopersistent == false)) {
2831 cifs_dbg(FYI, "enabling persistent handles\n");
2832 tcon->use_persistent = true;
2833 #endif /* CONFIG_CIFS_SMB2 */
2834 } else if (volume_info->resilient) {
2835 if (ses->server->vals->protocol_id == 0) {
2837 "SMB2.1 or later required for resilient handles\n");
2841 tcon->use_resilient = true;
2845 * We can have only one retry value for a connection to a share so for
2846 * resources mounted more than once to the same server share the last
2847 * value passed in for the retry flag is used.
2849 tcon->retry = volume_info->retry;
2850 tcon->nocase = volume_info->nocase;
2851 tcon->local_lease = volume_info->local_lease;
2852 INIT_LIST_HEAD(&tcon->pending_opens);
2854 spin_lock(&cifs_tcp_ses_lock);
2855 list_add(&tcon->tcon_list, &ses->tcon_list);
2856 spin_unlock(&cifs_tcp_ses_lock);
2858 cifs_fscache_get_super_cookie(tcon);
2868 cifs_put_tlink(struct tcon_link *tlink)
2870 if (!tlink || IS_ERR(tlink))
2873 if (!atomic_dec_and_test(&tlink->tl_count) ||
2874 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2875 tlink->tl_time = jiffies;
2879 if (!IS_ERR(tlink_tcon(tlink)))
2880 cifs_put_tcon(tlink_tcon(tlink));
2885 static inline struct tcon_link *
2886 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2888 return cifs_sb->master_tlink;
2892 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2894 struct cifs_sb_info *old = CIFS_SB(sb);
2895 struct cifs_sb_info *new = mnt_data->cifs_sb;
2897 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2900 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2901 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2905 * We want to share sb only if we don't specify an r/wsize or
2906 * specified r/wsize is greater than or equal to existing one.
2908 if (new->wsize && new->wsize < old->wsize)
2911 if (new->rsize && new->rsize < old->rsize)
2914 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
2917 if (old->mnt_file_mode != new->mnt_file_mode ||
2918 old->mnt_dir_mode != new->mnt_dir_mode)
2921 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2924 if (old->actimeo != new->actimeo)
2931 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2933 struct cifs_sb_info *old = CIFS_SB(sb);
2934 struct cifs_sb_info *new = mnt_data->cifs_sb;
2935 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2937 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2940 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2942 else if (!old_set && !new_set)
2949 cifs_match_super(struct super_block *sb, void *data)
2951 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2952 struct smb_vol *volume_info;
2953 struct cifs_sb_info *cifs_sb;
2954 struct TCP_Server_Info *tcp_srv;
2955 struct cifs_ses *ses;
2956 struct cifs_tcon *tcon;
2957 struct tcon_link *tlink;
2960 spin_lock(&cifs_tcp_ses_lock);
2961 cifs_sb = CIFS_SB(sb);
2962 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2963 if (tlink == NULL) {
2964 /* can not match superblock if tlink were ever null */
2965 spin_unlock(&cifs_tcp_ses_lock);
2968 tcon = tlink_tcon(tlink);
2970 tcp_srv = ses->server;
2972 volume_info = mnt_data->vol;
2974 if (!match_server(tcp_srv, volume_info) ||
2975 !match_session(ses, volume_info) ||
2976 !match_tcon(tcon, volume_info->UNC) ||
2977 !match_prepath(sb, mnt_data)) {
2982 rc = compare_mount_options(sb, mnt_data);
2984 spin_unlock(&cifs_tcp_ses_lock);
2985 cifs_put_tlink(tlink);
2990 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2991 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2992 struct dfs_info3_param **referrals, int remap)
2997 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
3003 if (ses->ipc_tid == 0) {
3004 temp_unc = kmalloc(2 /* for slashes */ +
3005 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
3006 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
3007 if (temp_unc == NULL)
3011 strcpy(temp_unc + 2, ses->serverName);
3012 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
3013 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
3015 cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
3019 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
3020 referrals, num_referrals,
3021 nls_codepage, remap);
3023 * BB - map targetUNCs to dfs_info3 structures, here or in
3024 * ses->server->ops->get_dfs_refer.
3030 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3031 static struct lock_class_key cifs_key[2];
3032 static struct lock_class_key cifs_slock_key[2];
3035 cifs_reclassify_socket4(struct socket *sock)
3037 struct sock *sk = sock->sk;
3038 BUG_ON(!sock_allow_reclassification(sk));
3039 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3040 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3044 cifs_reclassify_socket6(struct socket *sock)
3046 struct sock *sk = sock->sk;
3047 BUG_ON(!sock_allow_reclassification(sk));
3048 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3049 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3053 cifs_reclassify_socket4(struct socket *sock)
3058 cifs_reclassify_socket6(struct socket *sock)
3063 /* See RFC1001 section 14 on representation of Netbios names */
3064 static void rfc1002mangle(char *target, char *source, unsigned int length)
3068 for (i = 0, j = 0; i < (length); i++) {
3069 /* mask a nibble at a time and encode */
3070 target[j] = 'A' + (0x0F & (source[i] >> 4));
3071 target[j+1] = 'A' + (0x0F & source[i]);
3078 bind_socket(struct TCP_Server_Info *server)
3081 if (server->srcaddr.ss_family != AF_UNSPEC) {
3082 /* Bind to the specified local IP address */
3083 struct socket *socket = server->ssocket;
3084 rc = socket->ops->bind(socket,
3085 (struct sockaddr *) &server->srcaddr,
3086 sizeof(server->srcaddr));
3088 struct sockaddr_in *saddr4;
3089 struct sockaddr_in6 *saddr6;
3090 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3091 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3092 if (saddr6->sin6_family == AF_INET6)
3093 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3094 &saddr6->sin6_addr, rc);
3096 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3097 &saddr4->sin_addr.s_addr, rc);
3104 ip_rfc1001_connect(struct TCP_Server_Info *server)
3108 * some servers require RFC1001 sessinit before sending
3109 * negprot - BB check reconnection in case where second
3110 * sessinit is sent but no second negprot
3112 struct rfc1002_session_packet *ses_init_buf;
3113 struct smb_hdr *smb_buf;
3114 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3117 ses_init_buf->trailer.session_req.called_len = 32;
3119 if (server->server_RFC1001_name[0] != 0)
3120 rfc1002mangle(ses_init_buf->trailer.
3121 session_req.called_name,
3122 server->server_RFC1001_name,
3123 RFC1001_NAME_LEN_WITH_NULL);
3125 rfc1002mangle(ses_init_buf->trailer.
3126 session_req.called_name,
3127 DEFAULT_CIFS_CALLED_NAME,
3128 RFC1001_NAME_LEN_WITH_NULL);
3130 ses_init_buf->trailer.session_req.calling_len = 32;
3133 * calling name ends in null (byte 16) from old smb
3136 if (server->workstation_RFC1001_name[0] != 0)
3137 rfc1002mangle(ses_init_buf->trailer.
3138 session_req.calling_name,
3139 server->workstation_RFC1001_name,
3140 RFC1001_NAME_LEN_WITH_NULL);
3142 rfc1002mangle(ses_init_buf->trailer.
3143 session_req.calling_name,
3145 RFC1001_NAME_LEN_WITH_NULL);
3147 ses_init_buf->trailer.session_req.scope1 = 0;
3148 ses_init_buf->trailer.session_req.scope2 = 0;
3149 smb_buf = (struct smb_hdr *)ses_init_buf;
3151 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3152 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3153 rc = smb_send(server, smb_buf, 0x44);
3154 kfree(ses_init_buf);
3156 * RFC1001 layer in at least one server
3157 * requires very short break before negprot
3158 * presumably because not expecting negprot
3159 * to follow so fast. This is a simple
3160 * solution that works without
3161 * complicating the code and causes no
3162 * significant slowing down on mount
3165 usleep_range(1000, 2000);
3168 * else the negprot may still work without this
3169 * even though malloc failed
3176 generic_ip_connect(struct TCP_Server_Info *server)
3181 struct socket *socket = server->ssocket;
3182 struct sockaddr *saddr;
3184 saddr = (struct sockaddr *) &server->dstaddr;
3186 if (server->dstaddr.ss_family == AF_INET6) {
3187 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3188 slen = sizeof(struct sockaddr_in6);
3191 sport = ((struct sockaddr_in *) saddr)->sin_port;
3192 slen = sizeof(struct sockaddr_in);
3196 if (socket == NULL) {
3197 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3198 IPPROTO_TCP, &socket, 1);
3200 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3201 server->ssocket = NULL;
3205 /* BB other socket options to set KEEPALIVE, NODELAY? */
3206 cifs_dbg(FYI, "Socket created\n");
3207 server->ssocket = socket;
3208 socket->sk->sk_allocation = GFP_NOFS;
3209 if (sfamily == AF_INET6)
3210 cifs_reclassify_socket6(socket);
3212 cifs_reclassify_socket4(socket);
3215 rc = bind_socket(server);
3220 * Eventually check for other socket options to change from
3221 * the default. sock_setsockopt not used because it expects
3224 socket->sk->sk_rcvtimeo = 7 * HZ;
3225 socket->sk->sk_sndtimeo = 5 * HZ;
3227 /* make the bufsizes depend on wsize/rsize and max requests */
3228 if (server->noautotune) {
3229 if (socket->sk->sk_sndbuf < (200 * 1024))
3230 socket->sk->sk_sndbuf = 200 * 1024;
3231 if (socket->sk->sk_rcvbuf < (140 * 1024))
3232 socket->sk->sk_rcvbuf = 140 * 1024;
3235 if (server->tcp_nodelay) {
3237 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3238 (char *)&val, sizeof(val));
3240 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3244 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3245 socket->sk->sk_sndbuf,
3246 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3248 rc = socket->ops->connect(socket, saddr, slen, 0);
3250 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3251 sock_release(socket);
3252 server->ssocket = NULL;
3256 if (sport == htons(RFC1001_PORT))
3257 rc = ip_rfc1001_connect(server);
3263 ip_connect(struct TCP_Server_Info *server)
3266 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3267 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3269 if (server->dstaddr.ss_family == AF_INET6)
3270 sport = &addr6->sin6_port;
3272 sport = &addr->sin_port;
3277 /* try with 445 port at first */
3278 *sport = htons(CIFS_PORT);
3280 rc = generic_ip_connect(server);
3284 /* if it failed, try with 139 port */
3285 *sport = htons(RFC1001_PORT);
3288 return generic_ip_connect(server);
3291 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3292 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3294 /* if we are reconnecting then should we check to see if
3295 * any requested capabilities changed locally e.g. via
3296 * remount but we can not do much about it here
3297 * if they have (even if we could detect it by the following)
3298 * Perhaps we could add a backpointer to array of sb from tcon
3299 * or if we change to make all sb to same share the same
3300 * sb as NFS - then we only have one backpointer to sb.
3301 * What if we wanted to mount the server share twice once with
3302 * and once without posixacls or posix paths? */
3303 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3305 if (vol_info && vol_info->no_linux_ext) {
3306 tcon->fsUnixInfo.Capability = 0;
3307 tcon->unix_ext = 0; /* Unix Extensions disabled */
3308 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3310 } else if (vol_info)
3311 tcon->unix_ext = 1; /* Unix Extensions supported */
3313 if (tcon->unix_ext == 0) {
3314 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3318 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3319 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3320 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3321 /* check for reconnect case in which we do not
3322 want to change the mount behavior if we can avoid it */
3323 if (vol_info == NULL) {
3324 /* turn off POSIX ACL and PATHNAMES if not set
3325 originally at mount time */
3326 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3327 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3328 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3329 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3330 cifs_dbg(VFS, "POSIXPATH support change\n");
3331 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3332 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3333 cifs_dbg(VFS, "possible reconnect error\n");
3334 cifs_dbg(VFS, "server disabled POSIX path support\n");
3338 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3339 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3341 cap &= CIFS_UNIX_CAP_MASK;
3342 if (vol_info && vol_info->no_psx_acl)
3343 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3344 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3345 cifs_dbg(FYI, "negotiated posix acl support\n");
3347 cifs_sb->mnt_cifs_flags |=
3348 CIFS_MOUNT_POSIXACL;
3351 if (vol_info && vol_info->posix_paths == 0)
3352 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3353 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3354 cifs_dbg(FYI, "negotiate posix pathnames\n");
3356 cifs_sb->mnt_cifs_flags |=
3357 CIFS_MOUNT_POSIX_PATHS;
3360 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3361 #ifdef CONFIG_CIFS_DEBUG2
3362 if (cap & CIFS_UNIX_FCNTL_CAP)
3363 cifs_dbg(FYI, "FCNTL cap\n");
3364 if (cap & CIFS_UNIX_EXTATTR_CAP)
3365 cifs_dbg(FYI, "EXTATTR cap\n");
3366 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3367 cifs_dbg(FYI, "POSIX path cap\n");
3368 if (cap & CIFS_UNIX_XATTR_CAP)
3369 cifs_dbg(FYI, "XATTR cap\n");
3370 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3371 cifs_dbg(FYI, "POSIX ACL cap\n");
3372 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3373 cifs_dbg(FYI, "very large read cap\n");
3374 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3375 cifs_dbg(FYI, "very large write cap\n");
3376 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3377 cifs_dbg(FYI, "transport encryption cap\n");
3378 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3379 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3380 #endif /* CIFS_DEBUG2 */
3381 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3382 if (vol_info == NULL) {
3383 cifs_dbg(FYI, "resetting capabilities failed\n");
3385 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");
3391 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3392 struct cifs_sb_info *cifs_sb)
3394 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3396 spin_lock_init(&cifs_sb->tlink_tree_lock);
3397 cifs_sb->tlink_tree = RB_ROOT;
3400 * Temporarily set r/wsize for matching superblock. If we end up using
3401 * new sb then client will later negotiate it downward if needed.
3403 cifs_sb->rsize = pvolume_info->rsize;
3404 cifs_sb->wsize = pvolume_info->wsize;
3406 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3407 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3408 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3409 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3410 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
3411 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3413 cifs_sb->actimeo = pvolume_info->actimeo;
3414 cifs_sb->local_nls = pvolume_info->local_nls;
3416 if (pvolume_info->noperm)
3417 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3418 if (pvolume_info->setuids)
3419 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3420 if (pvolume_info->setuidfromacl)
3421 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3422 if (pvolume_info->server_ino)
3423 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3424 if (pvolume_info->remap)
3425 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3426 if (pvolume_info->sfu_remap)
3427 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3428 if (pvolume_info->no_xattr)
3429 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3430 if (pvolume_info->sfu_emul)
3431 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3432 if (pvolume_info->nobrl)
3433 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3434 if (pvolume_info->nostrictsync)
3435 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3436 if (pvolume_info->mand_lock)
3437 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3438 if (pvolume_info->rwpidforward)
3439 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3440 if (pvolume_info->cifs_acl)
3441 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3442 if (pvolume_info->backupuid_specified) {
3443 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3444 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3446 if (pvolume_info->backupgid_specified) {
3447 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3448 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3450 if (pvolume_info->override_uid)
3451 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3452 if (pvolume_info->override_gid)
3453 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3454 if (pvolume_info->dynperm)
3455 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3456 if (pvolume_info->fsc)
3457 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3458 if (pvolume_info->multiuser)
3459 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3460 CIFS_MOUNT_NO_PERM);
3461 if (pvolume_info->strict_io)
3462 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3463 if (pvolume_info->direct_io) {
3464 cifs_dbg(FYI, "mounting share using direct i/o\n");
3465 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3467 if (pvolume_info->mfsymlinks) {
3468 if (pvolume_info->sfu_emul) {
3470 * Our SFU ("Services for Unix" emulation does not allow
3471 * creating symlinks but does allow reading existing SFU
3472 * symlinks (it does allow both creating and reading SFU
3473 * style mknod and FIFOs though). When "mfsymlinks" and
3474 * "sfu" are both enabled at the same time, it allows
3475 * reading both types of symlinks, but will only create
3476 * them with mfsymlinks format. This allows better
3477 * Apple compatibility (probably better for Samba too)
3478 * while still recognizing old Windows style symlinks.
3480 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3482 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3485 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3486 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3488 if (pvolume_info->prepath) {
3489 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3490 if (cifs_sb->prepath == NULL)
3498 cleanup_volume_info_contents(struct smb_vol *volume_info)
3500 kfree(volume_info->username);
3501 kzfree(volume_info->password);
3502 kfree(volume_info->UNC);
3503 kfree(volume_info->domainname);
3504 kfree(volume_info->iocharset);
3505 kfree(volume_info->prepath);
3509 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3513 cleanup_volume_info_contents(volume_info);
3518 #ifdef CONFIG_CIFS_DFS_UPCALL
3520 * cifs_build_path_to_root returns full path to root when we do not have an
3521 * exiting connection (tcon)
3524 build_unc_path_to_root(const struct smb_vol *vol,
3525 const struct cifs_sb_info *cifs_sb)
3527 char *full_path, *pos;
3528 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3529 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3531 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3532 if (full_path == NULL)
3533 return ERR_PTR(-ENOMEM);
3535 strncpy(full_path, vol->UNC, unc_len);
3536 pos = full_path + unc_len;
3539 *pos = CIFS_DIR_SEP(cifs_sb);
3540 strncpy(pos + 1, vol->prepath, pplen);
3544 *pos = '\0'; /* add trailing null */
3545 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3546 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3551 * Perform a dfs referral query for a share and (optionally) prefix
3553 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3554 * to a string containing updated options for the submount. Otherwise it
3555 * will be left untouched.
3557 * Returns the rc from get_dfs_path to the caller, which can be used to
3558 * determine whether there were referrals.
3561 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3562 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3566 unsigned int num_referrals = 0;
3567 struct dfs_info3_param *referrals = NULL;
3568 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3570 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3571 if (IS_ERR(full_path))
3572 return PTR_ERR(full_path);
3574 /* For DFS paths, skip the first '\' of the UNC */
3575 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3577 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3578 &num_referrals, &referrals, cifs_remap(cifs_sb));
3580 if (!rc && num_referrals > 0) {
3581 char *fake_devname = NULL;
3583 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3584 full_path + 1, referrals,
3587 free_dfs_info_array(referrals, num_referrals);
3589 if (IS_ERR(mdata)) {
3590 rc = PTR_ERR(mdata);
3593 cleanup_volume_info_contents(volume_info);
3594 rc = cifs_setup_volume_info(volume_info, mdata,
3597 kfree(fake_devname);
3598 kfree(cifs_sb->mountdata);
3599 cifs_sb->mountdata = mdata;
3607 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3608 const char *devname)
3612 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3615 if (volume_info->nullauth) {
3616 cifs_dbg(FYI, "Anonymous login\n");
3617 kfree(volume_info->username);
3618 volume_info->username = NULL;
3619 } else if (volume_info->username) {
3620 /* BB fixme parse for domain name here */
3621 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3623 cifs_dbg(VFS, "No username specified\n");
3624 /* In userspace mount helper we can get user name from alternate
3625 locations such as env variables and files on disk */
3629 /* this is needed for ASCII cp to Unicode converts */
3630 if (volume_info->iocharset == NULL) {
3631 /* load_nls_default cannot return null */
3632 volume_info->local_nls = load_nls_default();
3634 volume_info->local_nls = load_nls(volume_info->iocharset);
3635 if (volume_info->local_nls == NULL) {
3636 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3637 volume_info->iocharset);
3646 cifs_get_volume_info(char *mount_data, const char *devname)
3649 struct smb_vol *volume_info;
3651 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3653 return ERR_PTR(-ENOMEM);
3655 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3657 cifs_cleanup_volume_info(volume_info);
3658 volume_info = ERR_PTR(rc);
3665 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3667 struct cifs_tcon *tcon,
3668 struct cifs_sb_info *cifs_sb,
3675 sep = CIFS_DIR_SEP(cifs_sb);
3678 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3680 /* skip separators */
3685 /* next separator */
3686 while (*s && *s != sep)
3690 * temporarily null-terminate the path at the end of
3691 * the current component
3695 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3703 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3707 struct cifs_ses *ses;
3708 struct cifs_tcon *tcon;
3709 struct TCP_Server_Info *server;
3711 struct tcon_link *tlink;
3712 #ifdef CONFIG_CIFS_DFS_UPCALL
3713 int referral_walks_count = 0;
3716 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs");
3720 #ifdef CONFIG_CIFS_DFS_UPCALL
3722 /* cleanup activities if we're chasing a referral */
3723 if (referral_walks_count) {
3725 cifs_put_tcon(tcon);
3727 cifs_put_smb_ses(ses);
3729 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3743 /* get a reference to a tcp session */
3744 server = cifs_get_tcp_session(volume_info);
3745 if (IS_ERR(server)) {
3746 rc = PTR_ERR(server);
3747 bdi_destroy(&cifs_sb->bdi);
3750 if ((volume_info->max_credits < 20) ||
3751 (volume_info->max_credits > 60000))
3752 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3754 server->max_credits = volume_info->max_credits;
3755 /* get a reference to a SMB session */
3756 ses = cifs_get_smb_ses(server, volume_info);
3760 goto mount_fail_check;
3763 #ifdef CONFIG_CIFS_SMB2
3764 if ((volume_info->persistent == true) && ((ses->server->capabilities &
3765 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
3766 cifs_dbg(VFS, "persistent handles not supported by server\n");
3768 goto mount_fail_check;
3770 #endif /* CONFIG_CIFS_SMB2*/
3772 /* search for existing tcon to this server share */
3773 tcon = cifs_get_tcon(ses, volume_info);
3777 goto remote_path_check;
3780 /* tell server which Unix caps we support */
3781 if (cap_unix(tcon->ses)) {
3782 /* reset of caps checks mount to see if unix extensions
3783 disabled for just this mount */
3784 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3785 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3786 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3787 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3789 goto mount_fail_check;
3792 tcon->unix_ext = 0; /* server does not support them */
3794 /* do not care if a following call succeed - informational */
3795 if (!tcon->ipc && server->ops->qfs_tcon)
3796 server->ops->qfs_tcon(xid, tcon);
3798 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3799 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3801 /* tune readahead according to rsize */
3802 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_SIZE;
3805 #ifdef CONFIG_CIFS_DFS_UPCALL
3807 * Perform an unconditional check for whether there are DFS
3808 * referrals for this path without prefix, to provide support
3809 * for DFS referrals from w2k8 servers which don't seem to respond
3810 * with PATH_NOT_COVERED to requests that include the prefix.
3811 * Chase the referral if found, otherwise continue normally.
3813 if (referral_walks_count == 0) {
3814 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3817 referral_walks_count++;
3818 goto try_mount_again;
3823 /* check if a whole path is not remote */
3825 if (!server->ops->is_path_accessible) {
3827 goto mount_fail_check;
3830 * cifs_build_path_to_root works only when we have a valid tcon
3832 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3833 if (full_path == NULL) {
3835 goto mount_fail_check;
3837 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3839 if (rc != 0 && rc != -EREMOTE) {
3841 goto mount_fail_check;
3844 if (rc != -EREMOTE) {
3845 rc = cifs_are_all_path_components_accessible(server,
3849 cifs_dbg(VFS, "cannot query dirs between root and final path, "
3850 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3851 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3858 /* get referral if needed */
3859 if (rc == -EREMOTE) {
3860 #ifdef CONFIG_CIFS_DFS_UPCALL
3861 if (referral_walks_count > MAX_NESTED_LINKS) {
3863 * BB: when we implement proper loop detection,
3864 * we will remove this check. But now we need it
3865 * to prevent an indefinite loop if 'DFS tree' is
3866 * misconfigured (i.e. has loops).
3869 goto mount_fail_check;
3872 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3875 referral_walks_count++;
3876 goto try_mount_again;
3878 goto mount_fail_check;
3879 #else /* No DFS support, return error on mount */
3885 goto mount_fail_check;
3887 /* now, hang the tcon off of the superblock */
3888 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3889 if (tlink == NULL) {
3891 goto mount_fail_check;
3894 tlink->tl_uid = ses->linux_uid;
3895 tlink->tl_tcon = tcon;
3896 tlink->tl_time = jiffies;
3897 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3898 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3900 cifs_sb->master_tlink = tlink;
3901 spin_lock(&cifs_sb->tlink_tree_lock);
3902 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3903 spin_unlock(&cifs_sb->tlink_tree_lock);
3905 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3909 /* on error free sesinfo and tcon struct if needed */
3911 /* If find_unc succeeded then rc == 0 so we can not end */
3912 /* up accidentally freeing someone elses tcon struct */
3914 cifs_put_tcon(tcon);
3916 cifs_put_smb_ses(ses);
3918 cifs_put_tcp_session(server, 0);
3919 bdi_destroy(&cifs_sb->bdi);
3928 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3929 * pointer may be NULL.
3932 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3933 const char *tree, struct cifs_tcon *tcon,
3934 const struct nls_table *nls_codepage)
3936 struct smb_hdr *smb_buffer;
3937 struct smb_hdr *smb_buffer_response;
3940 unsigned char *bcc_ptr;
3943 __u16 bytes_left, count;
3948 smb_buffer = cifs_buf_get();
3949 if (smb_buffer == NULL)
3952 smb_buffer_response = smb_buffer;
3954 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3955 NULL /*no tid */ , 4 /*wct */ );
3957 smb_buffer->Mid = get_next_mid(ses->server);
3958 smb_buffer->Uid = ses->Suid;
3959 pSMB = (TCONX_REQ *) smb_buffer;
3960 pSMBr = (TCONX_RSP *) smb_buffer_response;
3962 pSMB->AndXCommand = 0xFF;
3963 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3964 bcc_ptr = &pSMB->Password[0];
3965 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3966 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3967 *bcc_ptr = 0; /* password is null byte */
3968 bcc_ptr++; /* skip password */
3969 /* already aligned so no need to do it below */
3971 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3972 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3973 specified as required (when that support is added to
3974 the vfs in the future) as only NTLM or the much
3975 weaker LANMAN (which we do not send by default) is accepted
3976 by Samba (not sure whether other servers allow
3977 NTLMv2 password here) */
3978 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3979 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3980 (ses->sectype == LANMAN))
3981 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3982 ses->server->sec_mode &
3983 SECMODE_PW_ENCRYPT ? true : false,
3986 #endif /* CIFS_WEAK_PW_HASH */
3987 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3988 bcc_ptr, nls_codepage);
3990 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3992 cifs_buf_release(smb_buffer);
3996 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3997 if (ses->capabilities & CAP_UNICODE) {
3998 /* must align unicode strings */
3999 *bcc_ptr = 0; /* null byte password */
4004 if (ses->server->sign)
4005 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4007 if (ses->capabilities & CAP_STATUS32) {
4008 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4010 if (ses->capabilities & CAP_DFS) {
4011 smb_buffer->Flags2 |= SMBFLG2_DFS;
4013 if (ses->capabilities & CAP_UNICODE) {
4014 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4016 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4017 6 /* max utf8 char length in bytes */ *
4018 (/* server len*/ + 256 /* share len */), nls_codepage);
4019 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4020 bcc_ptr += 2; /* skip trailing null */
4021 } else { /* ASCII */
4022 strcpy(bcc_ptr, tree);
4023 bcc_ptr += strlen(tree) + 1;
4025 strcpy(bcc_ptr, "?????");
4026 bcc_ptr += strlen("?????");
4028 count = bcc_ptr - &pSMB->Password[0];
4029 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4030 pSMB->hdr.smb_buf_length) + count);
4031 pSMB->ByteCount = cpu_to_le16(count);
4033 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4036 /* above now done in SendReceive */
4037 if ((rc == 0) && (tcon != NULL)) {
4040 tcon->tidStatus = CifsGood;
4041 tcon->need_reconnect = false;
4042 tcon->tid = smb_buffer_response->Tid;
4043 bcc_ptr = pByteArea(smb_buffer_response);
4044 bytes_left = get_bcc(smb_buffer_response);
4045 length = strnlen(bcc_ptr, bytes_left - 2);
4046 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4052 /* skip service field (NB: this field is always ASCII) */
4054 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4055 (bcc_ptr[2] == 'C')) {
4056 cifs_dbg(FYI, "IPC connection\n");
4059 } else if (length == 2) {
4060 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4061 /* the most common case */
4062 cifs_dbg(FYI, "disk share connection\n");
4065 bcc_ptr += length + 1;
4066 bytes_left -= (length + 1);
4067 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4069 /* mostly informational -- no need to fail on error here */
4070 kfree(tcon->nativeFileSystem);
4071 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4072 bytes_left, is_unicode,
4075 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4077 if ((smb_buffer_response->WordCount == 3) ||
4078 (smb_buffer_response->WordCount == 7))
4079 /* field is in same location */
4080 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4083 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4084 } else if ((rc == 0) && tcon == NULL) {
4085 /* all we need to save for IPC$ connection */
4086 ses->ipc_tid = smb_buffer_response->Tid;
4089 cifs_buf_release(smb_buffer);
4093 static void delayed_free(struct rcu_head *p)
4095 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4096 unload_nls(sbi->local_nls);
4101 cifs_umount(struct cifs_sb_info *cifs_sb)
4103 struct rb_root *root = &cifs_sb->tlink_tree;
4104 struct rb_node *node;
4105 struct tcon_link *tlink;
4107 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4109 spin_lock(&cifs_sb->tlink_tree_lock);
4110 while ((node = rb_first(root))) {
4111 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4112 cifs_get_tlink(tlink);
4113 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4114 rb_erase(node, root);
4116 spin_unlock(&cifs_sb->tlink_tree_lock);
4117 cifs_put_tlink(tlink);
4118 spin_lock(&cifs_sb->tlink_tree_lock);
4120 spin_unlock(&cifs_sb->tlink_tree_lock);
4122 bdi_destroy(&cifs_sb->bdi);
4123 kfree(cifs_sb->mountdata);
4124 kfree(cifs_sb->prepath);
4125 call_rcu(&cifs_sb->rcu, delayed_free);
4129 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4132 struct TCP_Server_Info *server = ses->server;
4134 if (!server->ops->need_neg || !server->ops->negotiate)
4137 /* only send once per connect */
4138 if (!server->ops->need_neg(server))
4141 set_credits(server, 1);
4143 rc = server->ops->negotiate(xid, ses);
4145 spin_lock(&GlobalMid_Lock);
4146 if (server->tcpStatus == CifsNeedNegotiate)
4147 server->tcpStatus = CifsGood;
4150 spin_unlock(&GlobalMid_Lock);
4157 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4158 struct nls_table *nls_info)
4161 struct TCP_Server_Info *server = ses->server;
4163 ses->capabilities = server->capabilities;
4164 if (linuxExtEnabled == 0)
4165 ses->capabilities &= (~server->vals->cap_unix);
4167 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4168 server->sec_mode, server->capabilities, server->timeAdj);
4170 if (ses->auth_key.response) {
4171 cifs_dbg(VFS, "Free previous auth_key.response = %p\n",
4172 ses->auth_key.response);
4173 kfree(ses->auth_key.response);
4174 ses->auth_key.response = NULL;
4175 ses->auth_key.len = 0;
4178 if (server->ops->sess_setup)
4179 rc = server->ops->sess_setup(xid, ses, nls_info);
4182 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4188 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4190 vol->sectype = ses->sectype;
4192 /* krb5 is special, since we don't need username or pw */
4193 if (vol->sectype == Kerberos)
4196 return cifs_set_cifscreds(vol, ses);
4199 static struct cifs_tcon *
4200 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4203 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4204 struct cifs_ses *ses;
4205 struct cifs_tcon *tcon = NULL;
4206 struct smb_vol *vol_info;
4208 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4209 if (vol_info == NULL)
4210 return ERR_PTR(-ENOMEM);
4212 vol_info->local_nls = cifs_sb->local_nls;
4213 vol_info->linux_uid = fsuid;
4214 vol_info->cred_uid = fsuid;
4215 vol_info->UNC = master_tcon->treeName;
4216 vol_info->retry = master_tcon->retry;
4217 vol_info->nocase = master_tcon->nocase;
4218 vol_info->local_lease = master_tcon->local_lease;
4219 vol_info->resilient = master_tcon->use_resilient;
4220 vol_info->persistent = master_tcon->use_persistent;
4221 vol_info->no_linux_ext = !master_tcon->unix_ext;
4222 vol_info->sectype = master_tcon->ses->sectype;
4223 vol_info->sign = master_tcon->ses->sign;
4224 vol_info->seal = master_tcon->seal;
4226 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4232 /* get a reference for the same TCP session */
4233 spin_lock(&cifs_tcp_ses_lock);
4234 ++master_tcon->ses->server->srv_count;
4235 spin_unlock(&cifs_tcp_ses_lock);
4237 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4239 tcon = (struct cifs_tcon *)ses;
4240 cifs_put_tcp_session(master_tcon->ses->server, 0);
4244 tcon = cifs_get_tcon(ses, vol_info);
4246 cifs_put_smb_ses(ses);
4251 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4253 kfree(vol_info->username);
4254 kzfree(vol_info->password);
4261 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4263 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4266 /* find and return a tlink with given uid */
4267 static struct tcon_link *
4268 tlink_rb_search(struct rb_root *root, kuid_t uid)
4270 struct rb_node *node = root->rb_node;
4271 struct tcon_link *tlink;
4274 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4276 if (uid_gt(tlink->tl_uid, uid))
4277 node = node->rb_left;
4278 else if (uid_lt(tlink->tl_uid, uid))
4279 node = node->rb_right;
4286 /* insert a tcon_link into the tree */
4288 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4290 struct rb_node **new = &(root->rb_node), *parent = NULL;
4291 struct tcon_link *tlink;
4294 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4297 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4298 new = &((*new)->rb_left);
4300 new = &((*new)->rb_right);
4303 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4304 rb_insert_color(&new_tlink->tl_rbnode, root);
4308 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4311 * If the superblock doesn't refer to a multiuser mount, then just return
4312 * the master tcon for the mount.
4314 * First, search the rbtree for an existing tcon for this fsuid. If one
4315 * exists, then check to see if it's pending construction. If it is then wait
4316 * for construction to complete. Once it's no longer pending, check to see if
4317 * it failed and either return an error or retry construction, depending on
4320 * If one doesn't exist then insert a new tcon_link struct into the tree and
4321 * try to construct a new one.
4324 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4327 kuid_t fsuid = current_fsuid();
4328 struct tcon_link *tlink, *newtlink;
4330 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4331 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4333 spin_lock(&cifs_sb->tlink_tree_lock);
4334 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4336 cifs_get_tlink(tlink);
4337 spin_unlock(&cifs_sb->tlink_tree_lock);
4339 if (tlink == NULL) {
4340 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4341 if (newtlink == NULL)
4342 return ERR_PTR(-ENOMEM);
4343 newtlink->tl_uid = fsuid;
4344 newtlink->tl_tcon = ERR_PTR(-EACCES);
4345 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4346 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4347 cifs_get_tlink(newtlink);
4349 spin_lock(&cifs_sb->tlink_tree_lock);
4350 /* was one inserted after previous search? */
4351 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4353 cifs_get_tlink(tlink);
4354 spin_unlock(&cifs_sb->tlink_tree_lock);
4356 goto wait_for_construction;
4359 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4360 spin_unlock(&cifs_sb->tlink_tree_lock);
4362 wait_for_construction:
4363 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4364 TASK_INTERRUPTIBLE);
4366 cifs_put_tlink(tlink);
4367 return ERR_PTR(-ERESTARTSYS);
4370 /* if it's good, return it */
4371 if (!IS_ERR(tlink->tl_tcon))
4374 /* return error if we tried this already recently */
4375 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4376 cifs_put_tlink(tlink);
4377 return ERR_PTR(-EACCES);
4380 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4381 goto wait_for_construction;
4384 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4385 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4386 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4388 if (IS_ERR(tlink->tl_tcon)) {
4389 cifs_put_tlink(tlink);
4390 return ERR_PTR(-EACCES);
4397 * periodic workqueue job that scans tcon_tree for a superblock and closes
4401 cifs_prune_tlinks(struct work_struct *work)
4403 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4405 struct rb_root *root = &cifs_sb->tlink_tree;
4406 struct rb_node *node = rb_first(root);
4407 struct rb_node *tmp;
4408 struct tcon_link *tlink;
4411 * Because we drop the spinlock in the loop in order to put the tlink
4412 * it's not guarded against removal of links from the tree. The only
4413 * places that remove entries from the tree are this function and
4414 * umounts. Because this function is non-reentrant and is canceled
4415 * before umount can proceed, this is safe.
4417 spin_lock(&cifs_sb->tlink_tree_lock);
4418 node = rb_first(root);
4419 while (node != NULL) {
4421 node = rb_next(tmp);
4422 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4424 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4425 atomic_read(&tlink->tl_count) != 0 ||
4426 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4429 cifs_get_tlink(tlink);
4430 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4431 rb_erase(tmp, root);
4433 spin_unlock(&cifs_sb->tlink_tree_lock);
4434 cifs_put_tlink(tlink);
4435 spin_lock(&cifs_sb->tlink_tree_lock);
4437 spin_unlock(&cifs_sb->tlink_tree_lock);
4439 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,