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/sched/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
49 #include "cifsproto.h"
50 #include "cifs_unicode.h"
51 #include "cifs_debug.h"
52 #include "cifs_fs_sb.h"
55 #include "rfc1002pdu.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
60 extern mempool_t *cifs_req_poolp;
61 extern bool disable_legacy_dialects;
63 /* FIXME: should these be tunable? */
64 #define TLINK_ERROR_EXPIRE (1 * HZ)
65 #define TLINK_IDLE_EXPIRE (600 * HZ)
68 /* Mount options that take no arguments */
69 Opt_user_xattr, Opt_nouser_xattr,
70 Opt_forceuid, Opt_noforceuid,
71 Opt_forcegid, Opt_noforcegid,
72 Opt_noblocksend, Opt_noautotune,
73 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
74 Opt_mapposix, Opt_nomapposix,
75 Opt_mapchars, Opt_nomapchars, Opt_sfu,
76 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
77 Opt_noposixpaths, Opt_nounix, Opt_unix,
80 Opt_handlecache, Opt_nohandlecache,
81 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
82 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
83 Opt_nohard, Opt_nosoft,
85 Opt_nostrictsync, Opt_strictsync,
86 Opt_serverino, Opt_noserverino,
87 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
88 Opt_acl, Opt_noacl, Opt_locallease,
89 Opt_sign, Opt_seal, Opt_noac,
90 Opt_fsc, Opt_mfsymlinks,
91 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
92 Opt_persistent, Opt_nopersistent,
93 Opt_resilient, Opt_noresilient,
94 Opt_domainauto, Opt_rdma,
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,
104 /* Mount options which take string value */
105 Opt_user, Opt_pass, Opt_ip,
106 Opt_domain, Opt_srcaddr, Opt_iocharset,
107 Opt_netbiosname, Opt_servern,
108 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
110 /* Mount options to be ignored */
113 /* Options which could be blank */
121 static const match_table_t cifs_mount_option_tokens = {
123 { Opt_user_xattr, "user_xattr" },
124 { Opt_nouser_xattr, "nouser_xattr" },
125 { Opt_forceuid, "forceuid" },
126 { Opt_noforceuid, "noforceuid" },
127 { Opt_forcegid, "forcegid" },
128 { Opt_noforcegid, "noforcegid" },
129 { Opt_noblocksend, "noblocksend" },
130 { Opt_noautotune, "noautotune" },
131 { Opt_hard, "hard" },
132 { Opt_soft, "soft" },
133 { Opt_perm, "perm" },
134 { Opt_noperm, "noperm" },
135 { Opt_mapchars, "mapchars" }, /* SFU style */
136 { Opt_nomapchars, "nomapchars" },
137 { Opt_mapposix, "mapposix" }, /* SFM style */
138 { Opt_nomapposix, "nomapposix" },
140 { Opt_nosfu, "nosfu" },
141 { Opt_nodfs, "nodfs" },
142 { Opt_posixpaths, "posixpaths" },
143 { Opt_noposixpaths, "noposixpaths" },
144 { Opt_nounix, "nounix" },
145 { Opt_nounix, "nolinux" },
146 { Opt_nounix, "noposix" },
147 { Opt_unix, "unix" },
148 { Opt_unix, "linux" },
149 { Opt_unix, "posix" },
150 { Opt_nocase, "nocase" },
151 { Opt_nocase, "ignorecase" },
153 { Opt_nobrl, "nobrl" },
154 { Opt_handlecache, "handlecache" },
155 { Opt_nohandlecache, "nohandlecache" },
156 { Opt_nobrl, "nolock" },
157 { Opt_forcemandatorylock, "forcemandatorylock" },
158 { Opt_forcemandatorylock, "forcemand" },
159 { Opt_setuids, "setuids" },
160 { Opt_nosetuids, "nosetuids" },
161 { Opt_setuidfromacl, "idsfromsid" },
162 { Opt_dynperm, "dynperm" },
163 { Opt_nodynperm, "nodynperm" },
164 { Opt_nohard, "nohard" },
165 { Opt_nosoft, "nosoft" },
166 { Opt_nointr, "nointr" },
167 { Opt_intr, "intr" },
168 { Opt_nostrictsync, "nostrictsync" },
169 { Opt_strictsync, "strictsync" },
170 { Opt_serverino, "serverino" },
171 { Opt_noserverino, "noserverino" },
172 { Opt_rwpidforward, "rwpidforward" },
173 { Opt_cifsacl, "cifsacl" },
174 { Opt_nocifsacl, "nocifsacl" },
176 { Opt_noacl, "noacl" },
177 { Opt_locallease, "locallease" },
178 { Opt_sign, "sign" },
179 { Opt_seal, "seal" },
180 { Opt_noac, "noac" },
182 { Opt_mfsymlinks, "mfsymlinks" },
183 { Opt_multiuser, "multiuser" },
184 { Opt_sloppy, "sloppy" },
185 { Opt_nosharesock, "nosharesock" },
186 { Opt_persistent, "persistenthandles"},
187 { Opt_nopersistent, "nopersistenthandles"},
188 { Opt_resilient, "resilienthandles"},
189 { Opt_noresilient, "noresilienthandles"},
190 { Opt_domainauto, "domainauto"},
193 { Opt_backupuid, "backupuid=%s" },
194 { Opt_backupgid, "backupgid=%s" },
195 { Opt_uid, "uid=%s" },
196 { Opt_cruid, "cruid=%s" },
197 { Opt_gid, "gid=%s" },
198 { Opt_file_mode, "file_mode=%s" },
199 { Opt_dirmode, "dirmode=%s" },
200 { Opt_dirmode, "dir_mode=%s" },
201 { Opt_port, "port=%s" },
202 { Opt_rsize, "rsize=%s" },
203 { Opt_wsize, "wsize=%s" },
204 { Opt_actimeo, "actimeo=%s" },
205 { Opt_echo_interval, "echo_interval=%s" },
206 { Opt_max_credits, "max_credits=%s" },
207 { Opt_snapshot, "snapshot=%s" },
209 { Opt_blank_user, "user=" },
210 { Opt_blank_user, "username=" },
211 { Opt_user, "user=%s" },
212 { Opt_user, "username=%s" },
213 { Opt_blank_pass, "pass=" },
214 { Opt_blank_pass, "password=" },
215 { Opt_pass, "pass=%s" },
216 { Opt_pass, "password=%s" },
217 { Opt_blank_ip, "ip=" },
218 { Opt_blank_ip, "addr=" },
220 { Opt_ip, "addr=%s" },
221 { Opt_ignore, "unc=%s" },
222 { Opt_ignore, "target=%s" },
223 { Opt_ignore, "path=%s" },
224 { Opt_domain, "dom=%s" },
225 { Opt_domain, "domain=%s" },
226 { Opt_domain, "workgroup=%s" },
227 { Opt_srcaddr, "srcaddr=%s" },
228 { Opt_ignore, "prefixpath=%s" },
229 { Opt_iocharset, "iocharset=%s" },
230 { Opt_netbiosname, "netbiosname=%s" },
231 { Opt_servern, "servern=%s" },
232 { Opt_ver, "ver=%s" },
233 { Opt_vers, "vers=%s" },
234 { Opt_sec, "sec=%s" },
235 { Opt_cache, "cache=%s" },
237 { Opt_ignore, "cred" },
238 { Opt_ignore, "credentials" },
239 { Opt_ignore, "cred=%s" },
240 { Opt_ignore, "credentials=%s" },
241 { Opt_ignore, "guest" },
242 { Opt_ignore, "rw" },
243 { Opt_ignore, "ro" },
244 { Opt_ignore, "suid" },
245 { Opt_ignore, "nosuid" },
246 { Opt_ignore, "exec" },
247 { Opt_ignore, "noexec" },
248 { Opt_ignore, "nodev" },
249 { Opt_ignore, "noauto" },
250 { Opt_ignore, "dev" },
251 { Opt_ignore, "mand" },
252 { Opt_ignore, "nomand" },
253 { Opt_ignore, "_netdev" },
259 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
260 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
261 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
262 Opt_sec_ntlmv2i, Opt_sec_lanman,
268 static const match_table_t cifs_secflavor_tokens = {
269 { Opt_sec_krb5, "krb5" },
270 { Opt_sec_krb5i, "krb5i" },
271 { Opt_sec_krb5p, "krb5p" },
272 { Opt_sec_ntlmsspi, "ntlmsspi" },
273 { Opt_sec_ntlmssp, "ntlmssp" },
274 { Opt_ntlm, "ntlm" },
275 { Opt_sec_ntlmi, "ntlmi" },
276 { Opt_sec_ntlmv2, "nontlm" },
277 { Opt_sec_ntlmv2, "ntlmv2" },
278 { Opt_sec_ntlmv2i, "ntlmv2i" },
279 { Opt_sec_lanman, "lanman" },
280 { Opt_sec_none, "none" },
282 { Opt_sec_err, NULL }
293 static const match_table_t cifs_cacheflavor_tokens = {
294 { Opt_cache_loose, "loose" },
295 { Opt_cache_strict, "strict" },
296 { Opt_cache_none, "none" },
297 { Opt_cache_err, NULL }
300 static const match_table_t cifs_smb_version_tokens = {
301 { Smb_1, SMB1_VERSION_STRING },
302 { Smb_20, SMB20_VERSION_STRING},
303 { Smb_21, SMB21_VERSION_STRING },
304 { Smb_30, SMB30_VERSION_STRING },
305 { Smb_302, SMB302_VERSION_STRING },
306 #ifdef CONFIG_CIFS_SMB311
307 { Smb_311, SMB311_VERSION_STRING },
308 { Smb_311, ALT_SMB311_VERSION_STRING },
310 { Smb_3any, SMB3ANY_VERSION_STRING },
311 { Smb_default, SMBDEFAULT_VERSION_STRING },
312 { Smb_version_err, NULL }
315 static int ip_connect(struct TCP_Server_Info *server);
316 static int generic_ip_connect(struct TCP_Server_Info *server);
317 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
318 static void cifs_prune_tlinks(struct work_struct *work);
319 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
320 const char *devname, bool is_smb3);
323 * cifs tcp session reconnection
325 * mark tcp session as reconnecting so temporarily locked
326 * mark all smb sessions as reconnecting for tcp session
327 * reconnect tcp session
328 * wake up waiters on reconnection? - (not needed currently)
331 cifs_reconnect(struct TCP_Server_Info *server)
334 struct list_head *tmp, *tmp2;
335 struct cifs_ses *ses;
336 struct cifs_tcon *tcon;
337 struct mid_q_entry *mid_entry;
338 struct list_head retry_list;
340 spin_lock(&GlobalMid_Lock);
341 if (server->tcpStatus == CifsExiting) {
342 /* the demux thread will exit normally
343 next time through the loop */
344 spin_unlock(&GlobalMid_Lock);
347 server->tcpStatus = CifsNeedReconnect;
348 spin_unlock(&GlobalMid_Lock);
350 server->max_read = 0;
352 cifs_dbg(FYI, "Reconnecting tcp session\n");
354 /* before reconnecting the tcp session, mark the smb session (uid)
355 and the tid bad so they are not used until reconnected */
356 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
358 spin_lock(&cifs_tcp_ses_lock);
359 list_for_each(tmp, &server->smb_ses_list) {
360 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
361 ses->need_reconnect = true;
362 list_for_each(tmp2, &ses->tcon_list) {
363 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
364 tcon->need_reconnect = true;
367 ses->tcon_ipc->need_reconnect = true;
369 spin_unlock(&cifs_tcp_ses_lock);
371 /* do not want to be sending data on a socket we are freeing */
372 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
373 mutex_lock(&server->srv_mutex);
374 if (server->ssocket) {
375 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
376 server->ssocket->state, server->ssocket->flags);
377 kernel_sock_shutdown(server->ssocket, SHUT_WR);
378 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
379 server->ssocket->state, server->ssocket->flags);
380 sock_release(server->ssocket);
381 server->ssocket = NULL;
383 server->sequence_number = 0;
384 server->session_estab = false;
385 kfree(server->session_key.response);
386 server->session_key.response = NULL;
387 server->session_key.len = 0;
388 server->lstrp = jiffies;
390 /* mark submitted MIDs for retry and issue callback */
391 INIT_LIST_HEAD(&retry_list);
392 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
393 spin_lock(&GlobalMid_Lock);
394 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
395 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
396 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
397 mid_entry->mid_state = MID_RETRY_NEEDED;
398 list_move(&mid_entry->qhead, &retry_list);
400 spin_unlock(&GlobalMid_Lock);
401 mutex_unlock(&server->srv_mutex);
403 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
404 list_for_each_safe(tmp, tmp2, &retry_list) {
405 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
406 list_del_init(&mid_entry->qhead);
407 mid_entry->callback(mid_entry);
413 /* we should try only the port we connected to before */
414 mutex_lock(&server->srv_mutex);
415 if (cifs_rdma_enabled(server))
416 rc = smbd_reconnect(server);
418 rc = generic_ip_connect(server);
420 cifs_dbg(FYI, "reconnect error %d\n", rc);
421 mutex_unlock(&server->srv_mutex);
424 atomic_inc(&tcpSesReconnectCount);
425 spin_lock(&GlobalMid_Lock);
426 if (server->tcpStatus != CifsExiting)
427 server->tcpStatus = CifsNeedNegotiate;
428 spin_unlock(&GlobalMid_Lock);
429 mutex_unlock(&server->srv_mutex);
431 } while (server->tcpStatus == CifsNeedReconnect);
433 if (server->tcpStatus == CifsNeedNegotiate)
434 mod_delayed_work(cifsiod_wq, &server->echo, 0);
440 cifs_echo_request(struct work_struct *work)
443 struct TCP_Server_Info *server = container_of(work,
444 struct TCP_Server_Info, echo.work);
445 unsigned long echo_interval;
448 * If we need to renegotiate, set echo interval to zero to
449 * immediately call echo service where we can renegotiate.
451 if (server->tcpStatus == CifsNeedNegotiate)
454 echo_interval = server->echo_interval;
457 * We cannot send an echo if it is disabled.
458 * Also, no need to ping if we got a response recently.
461 if (server->tcpStatus == CifsNeedReconnect ||
462 server->tcpStatus == CifsExiting ||
463 server->tcpStatus == CifsNew ||
464 (server->ops->can_echo && !server->ops->can_echo(server)) ||
465 time_before(jiffies, server->lstrp + echo_interval - HZ))
468 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
470 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
474 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
478 allocate_buffers(struct TCP_Server_Info *server)
480 if (!server->bigbuf) {
481 server->bigbuf = (char *)cifs_buf_get();
482 if (!server->bigbuf) {
483 cifs_dbg(VFS, "No memory for large SMB response\n");
485 /* retry will check if exiting */
488 } else if (server->large_buf) {
489 /* we are reusing a dirty large buf, clear its start */
490 memset(server->bigbuf, 0, HEADER_SIZE(server));
493 if (!server->smallbuf) {
494 server->smallbuf = (char *)cifs_small_buf_get();
495 if (!server->smallbuf) {
496 cifs_dbg(VFS, "No memory for SMB response\n");
498 /* retry will check if exiting */
501 /* beginning of smb buffer is cleared in our buf_get */
503 /* if existing small buf clear beginning */
504 memset(server->smallbuf, 0, HEADER_SIZE(server));
511 server_unresponsive(struct TCP_Server_Info *server)
514 * We need to wait 2 echo intervals to make sure we handle such
516 * 1s client sends a normal SMB request
517 * 2s client gets a response
518 * 30s echo workqueue job pops, and decides we got a response recently
519 * and don't need to send another
521 * 65s kernel_recvmsg times out, and we see that we haven't gotten
522 * a response in >60s.
524 if ((server->tcpStatus == CifsGood ||
525 server->tcpStatus == CifsNeedNegotiate) &&
526 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
527 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
528 server->hostname, (2 * server->echo_interval) / HZ);
529 cifs_reconnect(server);
530 wake_up(&server->response_q);
538 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
543 smb_msg->msg_control = NULL;
544 smb_msg->msg_controllen = 0;
546 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
549 if (server_unresponsive(server))
550 return -ECONNABORTED;
551 if (cifs_rdma_enabled(server) && server->smbd_conn)
552 length = smbd_recv(server->smbd_conn, smb_msg);
554 length = sock_recvmsg(server->ssocket, smb_msg, 0);
556 if (server->tcpStatus == CifsExiting)
559 if (server->tcpStatus == CifsNeedReconnect) {
560 cifs_reconnect(server);
561 return -ECONNABORTED;
564 if (length == -ERESTARTSYS ||
568 * Minimum sleep to prevent looping, allowing socket
569 * to clear and app threads to set tcpStatus
570 * CifsNeedReconnect if server hung.
572 usleep_range(1000, 2000);
578 cifs_dbg(FYI, "Received no data or error: %d\n", length);
579 cifs_reconnect(server);
580 return -ECONNABORTED;
587 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
588 unsigned int to_read)
590 struct msghdr smb_msg;
591 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
592 iov_iter_kvec(&smb_msg.msg_iter, READ | ITER_KVEC, &iov, 1, to_read);
594 return cifs_readv_from_socket(server, &smb_msg);
598 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
599 unsigned int page_offset, unsigned int to_read)
601 struct msghdr smb_msg;
602 struct bio_vec bv = {
603 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
604 iov_iter_bvec(&smb_msg.msg_iter, READ | ITER_BVEC, &bv, 1, to_read);
605 return cifs_readv_from_socket(server, &smb_msg);
609 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
612 * The first byte big endian of the length field,
613 * is actually not part of the length but the type
614 * with the most common, zero, as regular data.
617 case RFC1002_SESSION_MESSAGE:
618 /* Regular SMB response */
620 case RFC1002_SESSION_KEEP_ALIVE:
621 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
623 case RFC1002_POSITIVE_SESSION_RESPONSE:
624 cifs_dbg(FYI, "RFC 1002 positive session response\n");
626 case RFC1002_NEGATIVE_SESSION_RESPONSE:
628 * We get this from Windows 98 instead of an error on
629 * SMB negprot response.
631 cifs_dbg(FYI, "RFC 1002 negative session response\n");
632 /* give server a second to clean up */
635 * Always try 445 first on reconnect since we get NACK
636 * on some if we ever connected to port 139 (the NACK
637 * is since we do not begin with RFC1001 session
640 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
641 cifs_reconnect(server);
642 wake_up(&server->response_q);
645 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
646 cifs_reconnect(server);
653 dequeue_mid(struct mid_q_entry *mid, bool malformed)
655 #ifdef CONFIG_CIFS_STATS2
656 mid->when_received = jiffies;
658 spin_lock(&GlobalMid_Lock);
660 mid->mid_state = MID_RESPONSE_RECEIVED;
662 mid->mid_state = MID_RESPONSE_MALFORMED;
663 list_del_init(&mid->qhead);
664 spin_unlock(&GlobalMid_Lock);
668 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
669 char *buf, int malformed)
671 if (server->ops->check_trans2 &&
672 server->ops->check_trans2(mid, server, buf, malformed))
675 mid->large_buf = server->large_buf;
676 /* Was previous buf put in mpx struct for multi-rsp? */
677 if (!mid->multiRsp) {
678 /* smb buffer will be freed by user thread */
679 if (server->large_buf)
680 server->bigbuf = NULL;
682 server->smallbuf = NULL;
684 dequeue_mid(mid, malformed);
687 static void clean_demultiplex_info(struct TCP_Server_Info *server)
691 /* take it off the list, if it's not already */
692 spin_lock(&cifs_tcp_ses_lock);
693 list_del_init(&server->tcp_ses_list);
694 spin_unlock(&cifs_tcp_ses_lock);
696 spin_lock(&GlobalMid_Lock);
697 server->tcpStatus = CifsExiting;
698 spin_unlock(&GlobalMid_Lock);
699 wake_up_all(&server->response_q);
701 /* check if we have blocked requests that need to free */
702 spin_lock(&server->req_lock);
703 if (server->credits <= 0)
705 spin_unlock(&server->req_lock);
707 * Although there should not be any requests blocked on this queue it
708 * can not hurt to be paranoid and try to wake up requests that may
709 * haven been blocked when more than 50 at time were on the wire to the
710 * same server - they now will see the session is in exit state and get
711 * out of SendReceive.
713 wake_up_all(&server->request_q);
714 /* give those requests time to exit */
716 if (cifs_rdma_enabled(server) && server->smbd_conn) {
717 smbd_destroy(server->smbd_conn);
718 server->smbd_conn = NULL;
720 if (server->ssocket) {
721 sock_release(server->ssocket);
722 server->ssocket = NULL;
725 if (!list_empty(&server->pending_mid_q)) {
726 struct list_head dispose_list;
727 struct mid_q_entry *mid_entry;
728 struct list_head *tmp, *tmp2;
730 INIT_LIST_HEAD(&dispose_list);
731 spin_lock(&GlobalMid_Lock);
732 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
733 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
734 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
735 mid_entry->mid_state = MID_SHUTDOWN;
736 list_move(&mid_entry->qhead, &dispose_list);
738 spin_unlock(&GlobalMid_Lock);
740 /* now walk dispose list and issue callbacks */
741 list_for_each_safe(tmp, tmp2, &dispose_list) {
742 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
743 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
744 list_del_init(&mid_entry->qhead);
745 mid_entry->callback(mid_entry);
747 /* 1/8th of sec is more than enough time for them to exit */
751 if (!list_empty(&server->pending_mid_q)) {
753 * mpx threads have not exited yet give them at least the smb
754 * send timeout time for long ops.
756 * Due to delays on oplock break requests, we need to wait at
757 * least 45 seconds before giving up on a request getting a
758 * response and going ahead and killing cifsd.
760 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
763 * If threads still have not exited they are probably never
764 * coming home not much else we can do but free the memory.
768 kfree(server->hostname);
771 length = atomic_dec_return(&tcpSesAllocCount);
773 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
777 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
780 char *buf = server->smallbuf;
781 unsigned int pdu_length = server->pdu_size;
783 /* make sure this will fit in a large buffer */
784 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
785 server->vals->header_preamble_size) {
786 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
787 cifs_reconnect(server);
788 wake_up(&server->response_q);
789 return -ECONNABORTED;
792 /* switch to large buffer if too big for a small one */
793 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
794 server->large_buf = true;
795 memcpy(server->bigbuf, buf, server->total_read);
796 buf = server->bigbuf;
799 /* now read the rest */
800 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
801 pdu_length - HEADER_SIZE(server) + 1
802 + server->vals->header_preamble_size);
806 server->total_read += length;
808 dump_smb(buf, server->total_read);
810 return cifs_handle_standard(server, mid);
814 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
816 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
820 * We know that we received enough to get to the MID as we
821 * checked the pdu_length earlier. Now check to see
822 * if the rest of the header is OK. We borrow the length
823 * var for the rest of the loop to avoid a new stack var.
825 * 48 bytes is enough to display the header and a little bit
826 * into the payload for debugging purposes.
828 length = server->ops->check_message(buf, server->total_read, server);
830 cifs_dump_mem("Bad SMB: ", buf,
831 min_t(unsigned int, server->total_read, 48));
833 if (server->ops->is_session_expired &&
834 server->ops->is_session_expired(buf)) {
835 cifs_reconnect(server);
836 wake_up(&server->response_q);
840 if (server->ops->is_status_pending &&
841 server->ops->is_status_pending(buf, server, length))
847 handle_mid(mid, server, buf, length);
852 cifs_demultiplex_thread(void *p)
855 struct TCP_Server_Info *server = p;
856 unsigned int pdu_length;
857 unsigned int next_offset;
859 struct task_struct *task_to_wake = NULL;
860 struct mid_q_entry *mid_entry;
862 current->flags |= PF_MEMALLOC;
863 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
865 length = atomic_inc_return(&tcpSesAllocCount);
867 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
870 while (server->tcpStatus != CifsExiting) {
874 if (!allocate_buffers(server))
877 server->large_buf = false;
878 buf = server->smallbuf;
879 pdu_length = 4; /* enough to get RFC1001 header */
881 length = cifs_read_from_socket(server, buf, pdu_length);
885 if (server->vals->header_preamble_size == 0)
886 server->total_read = 0;
888 server->total_read = length;
891 * The right amount was read from socket - 4 bytes,
892 * so we can now interpret the length field.
894 pdu_length = get_rfc1002_length(buf);
896 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
897 if (!is_smb_response(server, buf[0]))
900 server->pdu_size = pdu_length;
902 /* make sure we have enough to get to the MID */
903 if (server->pdu_size < HEADER_SIZE(server) - 1 -
904 server->vals->header_preamble_size) {
905 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
907 cifs_reconnect(server);
908 wake_up(&server->response_q);
912 /* read down to the MID */
913 length = cifs_read_from_socket(server,
914 buf + server->vals->header_preamble_size,
915 HEADER_SIZE(server) - 1
916 - server->vals->header_preamble_size);
919 server->total_read += length;
921 if (server->ops->next_header) {
922 next_offset = server->ops->next_header(buf);
924 server->pdu_size = next_offset;
927 if (server->ops->is_transform_hdr &&
928 server->ops->receive_transform &&
929 server->ops->is_transform_hdr(buf)) {
930 length = server->ops->receive_transform(server,
933 mid_entry = server->ops->find_mid(server, buf);
935 if (!mid_entry || !mid_entry->receive)
936 length = standard_receive3(server, mid_entry);
938 length = mid_entry->receive(server, mid_entry);
944 if (server->large_buf)
945 buf = server->bigbuf;
947 server->lstrp = jiffies;
948 if (mid_entry != NULL) {
949 mid_entry->resp_buf_size = server->pdu_size;
950 if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
951 mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
952 server->ops->handle_cancelled_mid)
953 server->ops->handle_cancelled_mid(
957 if (!mid_entry->multiRsp || mid_entry->multiEnd)
958 mid_entry->callback(mid_entry);
959 } else if (server->ops->is_oplock_break &&
960 server->ops->is_oplock_break(buf, server)) {
961 cifs_dbg(FYI, "Received oplock break\n");
963 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
964 atomic_read(&midCount));
965 cifs_dump_mem("Received Data is: ", buf,
966 HEADER_SIZE(server));
967 #ifdef CONFIG_CIFS_DEBUG2
968 if (server->ops->dump_detail)
969 server->ops->dump_detail(buf, server);
970 cifs_dump_mids(server);
971 #endif /* CIFS_DEBUG2 */
973 if (pdu_length > server->pdu_size) {
974 if (!allocate_buffers(server))
976 pdu_length -= server->pdu_size;
977 server->total_read = 0;
978 server->large_buf = false;
979 buf = server->smallbuf;
982 } /* end while !EXITING */
984 /* buffer usually freed in free_mid - need to free it here on exit */
985 cifs_buf_release(server->bigbuf);
986 if (server->smallbuf) /* no sense logging a debug message if NULL */
987 cifs_small_buf_release(server->smallbuf);
989 task_to_wake = xchg(&server->tsk, NULL);
990 clean_demultiplex_info(server);
992 /* if server->tsk was NULL then wait for a signal before exiting */
994 set_current_state(TASK_INTERRUPTIBLE);
995 while (!signal_pending(current)) {
997 set_current_state(TASK_INTERRUPTIBLE);
999 set_current_state(TASK_RUNNING);
1002 module_put_and_exit(0);
1005 /* extract the host portion of the UNC string */
1007 extract_hostname(const char *unc)
1013 /* skip double chars at beginning of string */
1014 /* BB: check validity of these bytes? */
1017 /* delimiter between hostname and sharename is always '\\' now */
1018 delim = strchr(src, '\\');
1020 return ERR_PTR(-EINVAL);
1023 dst = kmalloc((len + 1), GFP_KERNEL);
1025 return ERR_PTR(-ENOMEM);
1027 memcpy(dst, src, len);
1033 static int get_option_ul(substring_t args[], unsigned long *option)
1038 string = match_strdup(args);
1041 rc = kstrtoul(string, 0, option);
1047 static int get_option_uid(substring_t args[], kuid_t *result)
1049 unsigned long value;
1053 rc = get_option_ul(args, &value);
1057 uid = make_kuid(current_user_ns(), value);
1058 if (!uid_valid(uid))
1065 static int get_option_gid(substring_t args[], kgid_t *result)
1067 unsigned long value;
1071 rc = get_option_ul(args, &value);
1075 gid = make_kgid(current_user_ns(), value);
1076 if (!gid_valid(gid))
1083 static int cifs_parse_security_flavors(char *value,
1084 struct smb_vol *vol)
1087 substring_t args[MAX_OPT_ARGS];
1090 * With mount options, the last one should win. Reset any existing
1091 * settings back to default.
1093 vol->sectype = Unspecified;
1096 switch (match_token(value, cifs_secflavor_tokens, args)) {
1098 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1104 vol->sectype = Kerberos;
1106 case Opt_sec_ntlmsspi:
1109 case Opt_sec_ntlmssp:
1110 vol->sectype = RawNTLMSSP;
1116 vol->sectype = NTLM;
1118 case Opt_sec_ntlmv2i:
1121 case Opt_sec_ntlmv2:
1122 vol->sectype = NTLMv2;
1124 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1125 case Opt_sec_lanman:
1126 vol->sectype = LANMAN;
1133 cifs_dbg(VFS, "bad security option: %s\n", value);
1141 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1143 substring_t args[MAX_OPT_ARGS];
1145 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1146 case Opt_cache_loose:
1147 vol->direct_io = false;
1148 vol->strict_io = false;
1150 case Opt_cache_strict:
1151 vol->direct_io = false;
1152 vol->strict_io = true;
1154 case Opt_cache_none:
1155 vol->direct_io = true;
1156 vol->strict_io = false;
1159 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1166 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1168 substring_t args[MAX_OPT_ARGS];
1170 switch (match_token(value, cifs_smb_version_tokens, args)) {
1172 if (disable_legacy_dialects) {
1173 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1177 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1180 vol->ops = &smb1_operations;
1181 vol->vals = &smb1_values;
1184 if (disable_legacy_dialects) {
1185 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1189 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1192 vol->ops = &smb20_operations;
1193 vol->vals = &smb20_values;
1196 vol->ops = &smb21_operations;
1197 vol->vals = &smb21_values;
1200 vol->ops = &smb30_operations;
1201 vol->vals = &smb30_values;
1204 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1205 vol->vals = &smb302_values;
1207 #ifdef CONFIG_CIFS_SMB311
1209 vol->ops = &smb311_operations;
1210 vol->vals = &smb311_values;
1214 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1215 vol->vals = &smb3any_values;
1218 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1219 vol->vals = &smbdefault_values;
1222 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1229 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1230 * fields with the result. Returns 0 on success and an error otherwise.
1233 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1236 const char *delims = "/\\";
1239 /* make sure we have a valid UNC double delimiter prefix */
1240 len = strspn(devname, delims);
1244 /* find delimiter between host and sharename */
1245 pos = strpbrk(devname + 2, delims);
1249 /* skip past delimiter */
1252 /* now go until next delimiter or end of string */
1253 len = strcspn(pos, delims);
1255 /* move "pos" up to delimiter or NULL */
1257 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1261 convert_delimiter(vol->UNC, '\\');
1263 /* skip any delimiter */
1264 if (*pos == '/' || *pos == '\\')
1267 /* If pos is NULL then no prepath */
1271 vol->prepath = kstrdup(pos, GFP_KERNEL);
1279 cifs_parse_mount_options(const char *mountdata, const char *devname,
1280 struct smb_vol *vol, bool is_smb3)
1283 char *mountdata_copy = NULL, *options;
1284 unsigned int temp_len, i, j;
1286 short int override_uid = -1;
1287 short int override_gid = -1;
1288 bool uid_specified = false;
1289 bool gid_specified = false;
1290 bool sloppy = false;
1291 char *invalid = NULL;
1292 char *nodename = utsname()->nodename;
1293 char *string = NULL;
1294 char *tmp_end, *value;
1296 bool got_ip = false;
1297 bool got_version = false;
1298 unsigned short port = 0;
1299 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1303 delim = separator[0];
1305 /* ensure we always start with zeroed-out smb_vol */
1306 memset(vol, 0, sizeof(*vol));
1309 * does not have to be perfect mapping since field is
1310 * informational, only used for servers that do not support
1311 * port 445 and it can be overridden at mount time
1313 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1314 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1315 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1317 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1318 /* null target name indicates to use *SMBSERVR default called name
1319 if we end up sending RFC1001 session initialize */
1320 vol->target_rfc1001_name[0] = 0;
1321 vol->cred_uid = current_uid();
1322 vol->linux_uid = current_uid();
1323 vol->linux_gid = current_gid();
1326 * default to SFM style remapping of seven reserved characters
1327 * unless user overrides it or we negotiate CIFS POSIX where
1328 * it is unnecessary. Can not simultaneously use more than one mapping
1329 * since then readdir could list files that open could not open
1333 /* default to only allowing write access to owner of the mount */
1334 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1336 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1337 /* default is always to request posix paths. */
1338 vol->posix_paths = 1;
1339 /* default to using server inode numbers where available */
1340 vol->server_ino = 1;
1342 /* default is to use strict cifs caching semantics */
1343 vol->strict_io = true;
1345 vol->actimeo = CIFS_DEF_ACTIMEO;
1347 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1348 vol->ops = &smb30_operations;
1349 vol->vals = &smbdefault_values;
1351 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1354 goto cifs_parse_mount_err;
1356 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1357 if (!mountdata_copy)
1358 goto cifs_parse_mount_err;
1360 options = mountdata_copy;
1361 end = options + strlen(options);
1363 if (strncmp(options, "sep=", 4) == 0) {
1364 if (options[4] != 0) {
1365 separator[0] = options[4];
1368 cifs_dbg(FYI, "Null separator not allowed\n");
1371 vol->backupuid_specified = false; /* no backup intent for a user */
1372 vol->backupgid_specified = false; /* no backup intent for a group */
1374 switch (cifs_parse_devname(devname, vol)) {
1378 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1379 goto cifs_parse_mount_err;
1381 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1382 goto cifs_parse_mount_err;
1384 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1385 goto cifs_parse_mount_err;
1388 while ((data = strsep(&options, separator)) != NULL) {
1389 substring_t args[MAX_OPT_ARGS];
1390 unsigned long option;
1396 token = match_token(data, cifs_mount_option_tokens, args);
1400 /* Ingnore the following */
1404 /* Boolean values */
1405 case Opt_user_xattr:
1408 case Opt_nouser_xattr:
1414 case Opt_noforceuid:
1420 case Opt_noforcegid:
1423 case Opt_noblocksend:
1424 vol->noblocksnd = 1;
1426 case Opt_noautotune:
1427 vol->noautotune = 1;
1442 vol->sfu_remap = true;
1443 vol->remap = false; /* disable SFM mapping */
1445 case Opt_nomapchars:
1446 vol->sfu_remap = false;
1450 vol->sfu_remap = false; /* disable SFU mapping */
1452 case Opt_nomapposix:
1464 case Opt_posixpaths:
1465 vol->posix_paths = 1;
1467 case Opt_noposixpaths:
1468 vol->posix_paths = 0;
1473 "conflicting unix mount options\n");
1474 vol->no_linux_ext = 1;
1477 if (vol->no_linux_ext)
1479 "conflicting unix mount options\n");
1491 * turn off mandatory locking in mode
1492 * if remote locking is turned off since the
1493 * local vfs will do advisory
1495 if (vol->file_mode ==
1496 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1497 vol->file_mode = S_IALLUGO;
1499 case Opt_nohandlecache:
1500 vol->nohandlecache = 1;
1502 case Opt_handlecache:
1503 vol->nohandlecache = 0;
1505 case Opt_forcemandatorylock:
1514 case Opt_setuidfromacl:
1515 vol->setuidfromacl = 1;
1518 vol->dynperm = true;
1521 vol->dynperm = false;
1535 case Opt_nostrictsync:
1536 vol->nostrictsync = 1;
1538 case Opt_strictsync:
1539 vol->nostrictsync = 0;
1542 vol->server_ino = 1;
1544 case Opt_noserverino:
1545 vol->server_ino = 0;
1547 case Opt_rwpidforward:
1548 vol->rwpidforward = 1;
1557 vol->no_psx_acl = 0;
1560 vol->no_psx_acl = 1;
1562 case Opt_locallease:
1563 vol->local_lease = 1;
1569 /* we do not do the following in secFlags because seal
1570 * is a per tree connection (mount) not a per socket
1571 * or per-smb connection option in the protocol
1572 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1577 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1580 #ifndef CONFIG_CIFS_FSCACHE
1581 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1582 goto cifs_parse_mount_err;
1586 case Opt_mfsymlinks:
1587 vol->mfsymlinks = true;
1590 vol->multiuser = true;
1595 case Opt_nosharesock:
1596 vol->nosharesock = true;
1598 case Opt_nopersistent:
1599 vol->nopersistent = true;
1600 if (vol->persistent) {
1602 "persistenthandles mount options conflict\n");
1603 goto cifs_parse_mount_err;
1606 case Opt_persistent:
1607 vol->persistent = true;
1608 if ((vol->nopersistent) || (vol->resilient)) {
1610 "persistenthandles mount options conflict\n");
1611 goto cifs_parse_mount_err;
1615 vol->resilient = true;
1616 if (vol->persistent) {
1618 "persistenthandles mount options conflict\n");
1619 goto cifs_parse_mount_err;
1622 case Opt_noresilient:
1623 vol->resilient = false; /* already the default */
1625 case Opt_domainauto:
1626 vol->domainauto = true;
1632 /* Numeric Values */
1634 if (get_option_uid(args, &vol->backupuid)) {
1635 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1637 goto cifs_parse_mount_err;
1639 vol->backupuid_specified = true;
1642 if (get_option_gid(args, &vol->backupgid)) {
1643 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1645 goto cifs_parse_mount_err;
1647 vol->backupgid_specified = true;
1650 if (get_option_uid(args, &vol->linux_uid)) {
1651 cifs_dbg(VFS, "%s: Invalid uid value\n",
1653 goto cifs_parse_mount_err;
1655 uid_specified = true;
1658 if (get_option_uid(args, &vol->cred_uid)) {
1659 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1661 goto cifs_parse_mount_err;
1665 if (get_option_gid(args, &vol->linux_gid)) {
1666 cifs_dbg(VFS, "%s: Invalid gid value\n",
1668 goto cifs_parse_mount_err;
1670 gid_specified = true;
1673 if (get_option_ul(args, &option)) {
1674 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1676 goto cifs_parse_mount_err;
1678 vol->file_mode = option;
1681 if (get_option_ul(args, &option)) {
1682 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1684 goto cifs_parse_mount_err;
1686 vol->dir_mode = option;
1689 if (get_option_ul(args, &option) ||
1690 option > USHRT_MAX) {
1691 cifs_dbg(VFS, "%s: Invalid port value\n",
1693 goto cifs_parse_mount_err;
1695 port = (unsigned short)option;
1698 if (get_option_ul(args, &option)) {
1699 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1701 goto cifs_parse_mount_err;
1703 vol->rsize = option;
1706 if (get_option_ul(args, &option)) {
1707 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1709 goto cifs_parse_mount_err;
1711 vol->wsize = option;
1714 if (get_option_ul(args, &option)) {
1715 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1717 goto cifs_parse_mount_err;
1719 vol->actimeo = HZ * option;
1720 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1721 cifs_dbg(VFS, "attribute cache timeout too large\n");
1722 goto cifs_parse_mount_err;
1725 case Opt_echo_interval:
1726 if (get_option_ul(args, &option)) {
1727 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1729 goto cifs_parse_mount_err;
1731 vol->echo_interval = option;
1734 if (get_option_ul(args, &option)) {
1735 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1737 goto cifs_parse_mount_err;
1739 vol->snapshot_time = option;
1741 case Opt_max_credits:
1742 if (get_option_ul(args, &option) || (option < 20) ||
1744 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1746 goto cifs_parse_mount_err;
1748 vol->max_credits = option;
1751 /* String Arguments */
1753 case Opt_blank_user:
1754 /* null user, ie. anonymous authentication */
1756 vol->username = NULL;
1759 string = match_strdup(args);
1763 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1764 CIFS_MAX_USERNAME_LEN) {
1765 pr_warn("CIFS: username too long\n");
1766 goto cifs_parse_mount_err;
1769 kfree(vol->username);
1770 vol->username = kstrdup(string, GFP_KERNEL);
1772 goto cifs_parse_mount_err;
1774 case Opt_blank_pass:
1775 /* passwords have to be handled differently
1776 * to allow the character used for deliminator
1777 * to be passed within them
1781 * Check if this is a case where the password
1782 * starts with a delimiter
1784 tmp_end = strchr(data, '=');
1786 if (!(tmp_end < end && tmp_end[1] == delim)) {
1787 /* No it is not. Set the password to NULL */
1788 kzfree(vol->password);
1789 vol->password = NULL;
1792 /* Yes it is. Drop down to Opt_pass below.*/
1794 /* Obtain the value string */
1795 value = strchr(data, '=');
1798 /* Set tmp_end to end of the string */
1799 tmp_end = (char *) value + strlen(value);
1801 /* Check if following character is the deliminator
1802 * If yes, we have encountered a double deliminator
1803 * reset the NULL character to the deliminator
1805 if (tmp_end < end && tmp_end[1] == delim) {
1808 /* Keep iterating until we get to a single
1809 * deliminator OR the end
1811 while ((tmp_end = strchr(tmp_end, delim))
1812 != NULL && (tmp_end[1] == delim)) {
1813 tmp_end = (char *) &tmp_end[2];
1816 /* Reset var options to point to next element */
1819 options = (char *) &tmp_end[1];
1821 /* Reached the end of the mount option
1826 kzfree(vol->password);
1827 /* Now build new password string */
1828 temp_len = strlen(value);
1829 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1830 if (vol->password == NULL) {
1831 pr_warn("CIFS: no memory for password\n");
1832 goto cifs_parse_mount_err;
1835 for (i = 0, j = 0; i < temp_len; i++, j++) {
1836 vol->password[j] = value[i];
1837 if ((value[i] == delim) &&
1838 value[i+1] == delim)
1839 /* skip the second deliminator */
1842 vol->password[j] = '\0';
1845 /* FIXME: should this be an error instead? */
1849 string = match_strdup(args);
1853 if (!cifs_convert_address(dstaddr, string,
1855 pr_err("CIFS: bad ip= option (%s).\n", string);
1856 goto cifs_parse_mount_err;
1861 string = match_strdup(args);
1865 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1866 == CIFS_MAX_DOMAINNAME_LEN) {
1867 pr_warn("CIFS: domain name too long\n");
1868 goto cifs_parse_mount_err;
1871 kfree(vol->domainname);
1872 vol->domainname = kstrdup(string, GFP_KERNEL);
1873 if (!vol->domainname) {
1874 pr_warn("CIFS: no memory for domainname\n");
1875 goto cifs_parse_mount_err;
1877 cifs_dbg(FYI, "Domain name set\n");
1880 string = match_strdup(args);
1884 if (!cifs_convert_address(
1885 (struct sockaddr *)&vol->srcaddr,
1886 string, strlen(string))) {
1887 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1889 goto cifs_parse_mount_err;
1893 string = match_strdup(args);
1897 if (strnlen(string, 1024) >= 65) {
1898 pr_warn("CIFS: iocharset name too long.\n");
1899 goto cifs_parse_mount_err;
1902 if (strncasecmp(string, "default", 7) != 0) {
1903 kfree(vol->iocharset);
1904 vol->iocharset = kstrdup(string,
1906 if (!vol->iocharset) {
1907 pr_warn("CIFS: no memory for charset\n");
1908 goto cifs_parse_mount_err;
1911 /* if iocharset not set then load_nls_default
1914 cifs_dbg(FYI, "iocharset set to %s\n", string);
1916 case Opt_netbiosname:
1917 string = match_strdup(args);
1921 memset(vol->source_rfc1001_name, 0x20,
1924 * FIXME: are there cases in which a comma can
1925 * be valid in workstation netbios name (and
1926 * need special handling)?
1928 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1929 /* don't ucase netbiosname for user */
1932 vol->source_rfc1001_name[i] = string[i];
1934 /* The string has 16th byte zero still from
1935 * set at top of the function
1937 if (i == RFC1001_NAME_LEN && string[i] != 0)
1938 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1941 /* servernetbiosname specified override *SMBSERVER */
1942 string = match_strdup(args);
1946 /* last byte, type, is 0x20 for servr type */
1947 memset(vol->target_rfc1001_name, 0x20,
1948 RFC1001_NAME_LEN_WITH_NULL);
1950 /* BB are there cases in which a comma can be
1951 valid in this workstation netbios name
1952 (and need special handling)? */
1954 /* user or mount helper must uppercase the
1956 for (i = 0; i < 15; i++) {
1959 vol->target_rfc1001_name[i] = string[i];
1961 /* The string has 16th byte zero still from
1962 set at top of the function */
1963 if (i == RFC1001_NAME_LEN && string[i] != 0)
1964 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1967 /* version of mount userspace tools, not dialect */
1968 string = match_strdup(args);
1972 /* If interface changes in mount.cifs bump to new ver */
1973 if (strncasecmp(string, "1", 1) == 0) {
1974 if (strlen(string) > 1) {
1975 pr_warn("Bad mount helper ver=%s. Did "
1976 "you want SMB1 (CIFS) dialect "
1977 "and mean to type vers=1.0 "
1978 "instead?\n", string);
1979 goto cifs_parse_mount_err;
1981 /* This is the default */
1984 /* For all other value, error */
1985 pr_warn("CIFS: Invalid mount helper version specified\n");
1986 goto cifs_parse_mount_err;
1988 /* protocol version (dialect) */
1989 string = match_strdup(args);
1993 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
1994 goto cifs_parse_mount_err;
1998 string = match_strdup(args);
2002 if (cifs_parse_security_flavors(string, vol) != 0)
2003 goto cifs_parse_mount_err;
2006 string = match_strdup(args);
2010 if (cifs_parse_cache_flavor(string, vol) != 0)
2011 goto cifs_parse_mount_err;
2015 * An option we don't recognize. Save it off for later
2016 * if we haven't already found one
2022 /* Free up any allocated string */
2027 if (!sloppy && invalid) {
2028 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2029 goto cifs_parse_mount_err;
2032 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2033 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2034 goto cifs_parse_mount_err;
2038 /* Muliuser mounts require CONFIG_KEYS support */
2039 if (vol->multiuser) {
2040 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2041 goto cifs_parse_mount_err;
2045 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2046 goto cifs_parse_mount_err;
2049 /* make sure UNC has a share name */
2050 if (!strchr(vol->UNC + 3, '\\')) {
2051 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2052 goto cifs_parse_mount_err;
2059 /* No ip= option specified? Try to get it from UNC */
2060 /* Use the address part of the UNC. */
2061 slash = strchr(&vol->UNC[2], '\\');
2062 len = slash - &vol->UNC[2];
2063 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2064 pr_err("Unable to determine destination address.\n");
2065 goto cifs_parse_mount_err;
2069 /* set the port that we got earlier */
2070 cifs_set_port(dstaddr, port);
2073 vol->override_uid = override_uid;
2074 else if (override_uid == 1)
2075 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2078 vol->override_gid = override_gid;
2079 else if (override_gid == 1)
2080 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2082 if (got_version == false)
2083 pr_warn("No dialect specified on mount. Default has changed to "
2084 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2085 "(SMB1). To use the less secure SMB1 dialect to access "
2086 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2089 kfree(mountdata_copy);
2093 pr_warn("Could not allocate temporary buffer\n");
2094 cifs_parse_mount_err:
2096 kfree(mountdata_copy);
2100 /** Returns true if srcaddr isn't specified and rhs isn't
2101 * specified, or if srcaddr is specified and
2102 * matches the IP address of the rhs argument.
2105 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2107 switch (srcaddr->sa_family) {
2109 return (rhs->sa_family == AF_UNSPEC);
2111 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2112 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2113 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2116 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2117 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2118 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2122 return false; /* don't expect to be here */
2127 * If no port is specified in addr structure, we try to match with 445 port
2128 * and if it fails - with 139 ports. It should be called only if address
2129 * families of server and addr are equal.
2132 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2134 __be16 port, *sport;
2136 switch (addr->sa_family) {
2138 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2139 port = ((struct sockaddr_in *) addr)->sin_port;
2142 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2143 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2151 port = htons(CIFS_PORT);
2155 port = htons(RFC1001_PORT);
2158 return port == *sport;
2162 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2163 struct sockaddr *srcaddr)
2165 switch (addr->sa_family) {
2167 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2168 struct sockaddr_in *srv_addr4 =
2169 (struct sockaddr_in *)&server->dstaddr;
2171 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2176 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2177 struct sockaddr_in6 *srv_addr6 =
2178 (struct sockaddr_in6 *)&server->dstaddr;
2180 if (!ipv6_addr_equal(&addr6->sin6_addr,
2181 &srv_addr6->sin6_addr))
2183 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2189 return false; /* don't expect to be here */
2192 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2199 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2202 * The select_sectype function should either return the vol->sectype
2203 * that was specified, or "Unspecified" if that sectype was not
2204 * compatible with the given NEGOTIATE request.
2206 if (server->ops->select_sectype(server, vol->sectype)
2211 * Now check if signing mode is acceptable. No need to check
2212 * global_secflags at this point since if MUST_SIGN is set then
2213 * the server->sign had better be too.
2215 if (vol->sign && !server->sign)
2221 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2223 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2225 if (vol->nosharesock)
2228 /* BB update this for smb3any and default case */
2229 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2232 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2235 if (!match_address(server, addr,
2236 (struct sockaddr *)&vol->srcaddr))
2239 if (!match_port(server, addr))
2242 if (!match_security(server, vol))
2245 if (server->echo_interval != vol->echo_interval * HZ)
2248 if (server->rdma != vol->rdma)
2254 static struct TCP_Server_Info *
2255 cifs_find_tcp_session(struct smb_vol *vol)
2257 struct TCP_Server_Info *server;
2259 spin_lock(&cifs_tcp_ses_lock);
2260 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2261 if (!match_server(server, vol))
2264 ++server->srv_count;
2265 spin_unlock(&cifs_tcp_ses_lock);
2266 cifs_dbg(FYI, "Existing tcp session with server found\n");
2269 spin_unlock(&cifs_tcp_ses_lock);
2274 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2276 struct task_struct *task;
2278 spin_lock(&cifs_tcp_ses_lock);
2279 if (--server->srv_count > 0) {
2280 spin_unlock(&cifs_tcp_ses_lock);
2284 put_net(cifs_net_ns(server));
2286 list_del_init(&server->tcp_ses_list);
2287 spin_unlock(&cifs_tcp_ses_lock);
2289 cancel_delayed_work_sync(&server->echo);
2293 * Avoid deadlock here: reconnect work calls
2294 * cifs_put_tcp_session() at its end. Need to be sure
2295 * that reconnect work does nothing with server pointer after
2298 cancel_delayed_work(&server->reconnect);
2300 cancel_delayed_work_sync(&server->reconnect);
2302 spin_lock(&GlobalMid_Lock);
2303 server->tcpStatus = CifsExiting;
2304 spin_unlock(&GlobalMid_Lock);
2306 cifs_crypto_secmech_release(server);
2307 cifs_fscache_release_client_cookie(server);
2309 kfree(server->session_key.response);
2310 server->session_key.response = NULL;
2311 server->session_key.len = 0;
2313 task = xchg(&server->tsk, NULL);
2315 force_sig(SIGKILL, task);
2318 static struct TCP_Server_Info *
2319 cifs_get_tcp_session(struct smb_vol *volume_info)
2321 struct TCP_Server_Info *tcp_ses = NULL;
2324 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2326 /* see if we already have a matching tcp_ses */
2327 tcp_ses = cifs_find_tcp_session(volume_info);
2331 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2337 tcp_ses->ops = volume_info->ops;
2338 tcp_ses->vals = volume_info->vals;
2339 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2340 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2341 if (IS_ERR(tcp_ses->hostname)) {
2342 rc = PTR_ERR(tcp_ses->hostname);
2343 goto out_err_crypto_release;
2346 tcp_ses->noblocksnd = volume_info->noblocksnd;
2347 tcp_ses->noautotune = volume_info->noautotune;
2348 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2349 tcp_ses->rdma = volume_info->rdma;
2350 tcp_ses->in_flight = 0;
2351 tcp_ses->credits = 1;
2352 init_waitqueue_head(&tcp_ses->response_q);
2353 init_waitqueue_head(&tcp_ses->request_q);
2354 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2355 mutex_init(&tcp_ses->srv_mutex);
2356 memcpy(tcp_ses->workstation_RFC1001_name,
2357 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2358 memcpy(tcp_ses->server_RFC1001_name,
2359 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2360 tcp_ses->session_estab = false;
2361 tcp_ses->sequence_number = 0;
2362 tcp_ses->lstrp = jiffies;
2363 spin_lock_init(&tcp_ses->req_lock);
2364 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2365 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2366 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2367 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2368 mutex_init(&tcp_ses->reconnect_mutex);
2369 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2370 sizeof(tcp_ses->srcaddr));
2371 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2372 sizeof(tcp_ses->dstaddr));
2373 generate_random_uuid(tcp_ses->client_guid);
2375 * at this point we are the only ones with the pointer
2376 * to the struct since the kernel thread not created yet
2377 * no need to spinlock this init of tcpStatus or srv_count
2379 tcp_ses->tcpStatus = CifsNew;
2380 ++tcp_ses->srv_count;
2382 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2383 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2384 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2386 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2387 if (tcp_ses->rdma) {
2388 #ifndef CONFIG_CIFS_SMB_DIRECT
2389 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2391 goto out_err_crypto_release;
2393 tcp_ses->smbd_conn = smbd_get_connection(
2394 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2395 if (tcp_ses->smbd_conn) {
2396 cifs_dbg(VFS, "RDMA transport established\n");
2398 goto smbd_connected;
2401 goto out_err_crypto_release;
2404 rc = ip_connect(tcp_ses);
2406 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2407 goto out_err_crypto_release;
2411 * since we're in a cifs function already, we know that
2412 * this will succeed. No need for try_module_get().
2414 __module_get(THIS_MODULE);
2415 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2417 if (IS_ERR(tcp_ses->tsk)) {
2418 rc = PTR_ERR(tcp_ses->tsk);
2419 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2420 module_put(THIS_MODULE);
2421 goto out_err_crypto_release;
2423 tcp_ses->tcpStatus = CifsNeedNegotiate;
2425 /* thread spawned, put it on the list */
2426 spin_lock(&cifs_tcp_ses_lock);
2427 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2428 spin_unlock(&cifs_tcp_ses_lock);
2430 cifs_fscache_get_client_cookie(tcp_ses);
2432 /* queue echo request delayed work */
2433 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2437 out_err_crypto_release:
2438 cifs_crypto_secmech_release(tcp_ses);
2440 put_net(cifs_net_ns(tcp_ses));
2444 if (!IS_ERR(tcp_ses->hostname))
2445 kfree(tcp_ses->hostname);
2446 if (tcp_ses->ssocket)
2447 sock_release(tcp_ses->ssocket);
2453 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2455 if (vol->sectype != Unspecified &&
2456 vol->sectype != ses->sectype)
2459 switch (ses->sectype) {
2461 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2465 /* NULL username means anonymous session */
2466 if (ses->user_name == NULL) {
2472 /* anything else takes username/password */
2473 if (strncmp(ses->user_name,
2474 vol->username ? vol->username : "",
2475 CIFS_MAX_USERNAME_LEN))
2477 if ((vol->username && strlen(vol->username) != 0) &&
2478 ses->password != NULL &&
2479 strncmp(ses->password,
2480 vol->password ? vol->password : "",
2481 CIFS_MAX_PASSWORD_LEN))
2488 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2490 * A new IPC connection is made and stored in the session
2491 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2494 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2497 struct cifs_tcon *tcon;
2498 struct nls_table *nls_codepage;
2499 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2503 * If the mount request that resulted in the creation of the
2504 * session requires encryption, force IPC to be encrypted too.
2506 if (volume_info->seal) {
2507 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2511 "IPC: server doesn't support encryption\n");
2516 tcon = tconInfoAlloc();
2520 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->serverName);
2523 nls_codepage = load_nls_default();
2529 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2533 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2538 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2540 ses->tcon_ipc = tcon;
2542 unload_nls(nls_codepage);
2547 * cifs_free_ipc - helper to release the session IPC tcon
2549 * Needs to be called everytime a session is destroyed
2552 cifs_free_ipc(struct cifs_ses *ses)
2555 struct cifs_tcon *tcon = ses->tcon_ipc;
2560 if (ses->server->ops->tree_disconnect) {
2562 rc = ses->server->ops->tree_disconnect(xid, tcon);
2567 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2570 ses->tcon_ipc = NULL;
2574 static struct cifs_ses *
2575 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2577 struct cifs_ses *ses;
2579 spin_lock(&cifs_tcp_ses_lock);
2580 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2581 if (ses->status == CifsExiting)
2583 if (!match_session(ses, vol))
2586 spin_unlock(&cifs_tcp_ses_lock);
2589 spin_unlock(&cifs_tcp_ses_lock);
2594 cifs_put_smb_ses(struct cifs_ses *ses)
2596 unsigned int rc, xid;
2597 struct TCP_Server_Info *server = ses->server;
2599 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2601 spin_lock(&cifs_tcp_ses_lock);
2602 if (ses->status == CifsExiting) {
2603 spin_unlock(&cifs_tcp_ses_lock);
2606 if (--ses->ses_count > 0) {
2607 spin_unlock(&cifs_tcp_ses_lock);
2610 if (ses->status == CifsGood)
2611 ses->status = CifsExiting;
2612 spin_unlock(&cifs_tcp_ses_lock);
2616 if (ses->status == CifsExiting && server->ops->logoff) {
2618 rc = server->ops->logoff(xid, ses);
2620 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2625 spin_lock(&cifs_tcp_ses_lock);
2626 list_del_init(&ses->smb_ses_list);
2627 spin_unlock(&cifs_tcp_ses_lock);
2630 cifs_put_tcp_session(server, 0);
2635 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2636 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2638 /* Populate username and pw fields from keyring if possible */
2640 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2643 const char *delim, *payload;
2647 struct TCP_Server_Info *server = ses->server;
2648 struct sockaddr_in *sa;
2649 struct sockaddr_in6 *sa6;
2650 const struct user_key_payload *upayload;
2652 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2656 /* try to find an address key first */
2657 switch (server->dstaddr.ss_family) {
2659 sa = (struct sockaddr_in *)&server->dstaddr;
2660 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2663 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2664 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2667 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2668 server->dstaddr.ss_family);
2673 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2674 key = request_key(&key_type_logon, desc, "");
2676 if (!ses->domainName) {
2677 cifs_dbg(FYI, "domainName is NULL\n");
2682 /* didn't work, try to find a domain key */
2683 sprintf(desc, "cifs:d:%s", ses->domainName);
2684 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2685 key = request_key(&key_type_logon, desc, "");
2692 down_read(&key->sem);
2693 upayload = user_key_payload_locked(key);
2694 if (IS_ERR_OR_NULL(upayload)) {
2695 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2699 /* find first : in payload */
2700 payload = upayload->data;
2701 delim = strnchr(payload, upayload->datalen, ':');
2702 cifs_dbg(FYI, "payload=%s\n", payload);
2704 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2710 len = delim - payload;
2711 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2712 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2718 vol->username = kstrndup(payload, len, GFP_KERNEL);
2719 if (!vol->username) {
2720 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2725 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2727 len = key->datalen - (len + 1);
2728 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2729 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2731 kfree(vol->username);
2732 vol->username = NULL;
2737 vol->password = kstrndup(delim, len, GFP_KERNEL);
2738 if (!vol->password) {
2739 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2742 kfree(vol->username);
2743 vol->username = NULL;
2752 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2755 #else /* ! CONFIG_KEYS */
2757 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2758 struct cifs_ses *ses __attribute__((unused)))
2762 #endif /* CONFIG_KEYS */
2765 * cifs_get_smb_ses - get a session matching @volume_info data from @server
2767 * This function assumes it is being called from cifs_mount() where we
2768 * already got a server reference (server refcount +1). See
2769 * cifs_get_tcon() for refcount explanations.
2771 static struct cifs_ses *
2772 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2776 struct cifs_ses *ses;
2777 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2778 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2782 ses = cifs_find_smb_ses(server, volume_info);
2784 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2787 mutex_lock(&ses->session_mutex);
2788 rc = cifs_negotiate_protocol(xid, ses);
2790 mutex_unlock(&ses->session_mutex);
2791 /* problem -- put our ses reference */
2792 cifs_put_smb_ses(ses);
2796 if (ses->need_reconnect) {
2797 cifs_dbg(FYI, "Session needs reconnect\n");
2798 rc = cifs_setup_session(xid, ses,
2799 volume_info->local_nls);
2801 mutex_unlock(&ses->session_mutex);
2802 /* problem -- put our reference */
2803 cifs_put_smb_ses(ses);
2808 mutex_unlock(&ses->session_mutex);
2810 /* existing SMB ses has a server reference already */
2811 cifs_put_tcp_session(server, 0);
2816 cifs_dbg(FYI, "Existing smb sess not found\n");
2817 ses = sesInfoAlloc();
2821 /* new SMB session uses our server ref */
2822 ses->server = server;
2823 if (server->dstaddr.ss_family == AF_INET6)
2824 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2826 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2828 if (volume_info->username) {
2829 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2830 if (!ses->user_name)
2834 /* volume_info->password freed at unmount */
2835 if (volume_info->password) {
2836 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2840 if (volume_info->domainname) {
2841 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2842 if (!ses->domainName)
2845 if (volume_info->domainauto)
2846 ses->domainAuto = volume_info->domainauto;
2847 ses->cred_uid = volume_info->cred_uid;
2848 ses->linux_uid = volume_info->linux_uid;
2850 ses->sectype = volume_info->sectype;
2851 ses->sign = volume_info->sign;
2853 mutex_lock(&ses->session_mutex);
2854 rc = cifs_negotiate_protocol(xid, ses);
2856 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2857 mutex_unlock(&ses->session_mutex);
2861 /* success, put it on the list */
2862 spin_lock(&cifs_tcp_ses_lock);
2863 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2864 spin_unlock(&cifs_tcp_ses_lock);
2868 cifs_setup_ipc(ses, volume_info);
2878 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
2880 if (tcon->tidStatus == CifsExiting)
2882 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
2884 if (tcon->seal != volume_info->seal)
2886 if (tcon->snapshot_time != volume_info->snapshot_time)
2891 static struct cifs_tcon *
2892 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2894 struct list_head *tmp;
2895 struct cifs_tcon *tcon;
2897 spin_lock(&cifs_tcp_ses_lock);
2898 list_for_each(tmp, &ses->tcon_list) {
2899 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2900 if (!match_tcon(tcon, volume_info))
2903 spin_unlock(&cifs_tcp_ses_lock);
2906 spin_unlock(&cifs_tcp_ses_lock);
2911 cifs_put_tcon(struct cifs_tcon *tcon)
2914 struct cifs_ses *ses;
2917 * IPC tcon share the lifetime of their session and are
2918 * destroyed in the session put function
2920 if (tcon == NULL || tcon->ipc)
2924 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2925 spin_lock(&cifs_tcp_ses_lock);
2926 if (--tcon->tc_count > 0) {
2927 spin_unlock(&cifs_tcp_ses_lock);
2931 list_del_init(&tcon->tcon_list);
2932 spin_unlock(&cifs_tcp_ses_lock);
2935 if (ses->server->ops->tree_disconnect)
2936 ses->server->ops->tree_disconnect(xid, tcon);
2939 cifs_fscache_release_super_cookie(tcon);
2941 cifs_put_smb_ses(ses);
2945 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
2947 * - tcon refcount is the number of mount points using the tcon.
2948 * - ses refcount is the number of tcon using the session.
2950 * 1. This function assumes it is being called from cifs_mount() where
2951 * we already got a session reference (ses refcount +1).
2953 * 2. Since we're in the context of adding a mount point, the end
2954 * result should be either:
2956 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2957 * its session refcount incremented (1 new tcon). This +1 was
2958 * already done in (1).
2960 * b) an existing tcon with refcount+1 (add a mount point to it) and
2961 * identical ses refcount (no new tcon). Because of (1) we need to
2962 * decrement the ses refcount.
2964 static struct cifs_tcon *
2965 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2968 struct cifs_tcon *tcon;
2970 tcon = cifs_find_tcon(ses, volume_info);
2973 * tcon has refcount already incremented but we need to
2974 * decrement extra ses reference gotten by caller (case b)
2976 cifs_dbg(FYI, "Found match on UNC path\n");
2977 cifs_put_smb_ses(ses);
2981 if (!ses->server->ops->tree_connect) {
2986 tcon = tconInfoAlloc();
2992 if (volume_info->snapshot_time) {
2993 if (ses->server->vals->protocol_id == 0) {
2995 "Use SMB2 or later for snapshot mount option\n");
2999 tcon->snapshot_time = volume_info->snapshot_time;
3003 if (volume_info->password) {
3004 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3005 if (!tcon->password) {
3011 if (volume_info->seal) {
3012 if (ses->server->vals->protocol_id == 0) {
3014 "SMB3 or later required for encryption\n");
3017 } else if (tcon->ses->server->capabilities &
3018 SMB2_GLOBAL_CAP_ENCRYPTION)
3021 cifs_dbg(VFS, "Encryption is not supported on share\n");
3027 #ifdef CONFIG_CIFS_SMB311
3028 if ((volume_info->linux_ext) && (ses->server->posix_ext_supported)) {
3029 if (ses->server->vals->protocol_id == SMB311_PROT_ID) {
3030 tcon->posix_extensions = true;
3031 printk_once(KERN_WARNING
3032 "SMB3.11 POSIX Extensions are experimental\n");
3038 * BB Do we need to wrap session_mutex around this TCon call and Unix
3039 * SetFS as we do on SessSetup and reconnect?
3042 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3043 volume_info->local_nls);
3045 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3049 if (volume_info->nodfs) {
3050 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
3051 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
3053 tcon->use_persistent = false;
3054 /* check if SMB2 or later, CIFS does not support persistent handles */
3055 if (volume_info->persistent) {
3056 if (ses->server->vals->protocol_id == 0) {
3058 "SMB3 or later required for persistent handles\n");
3061 } else if (ses->server->capabilities &
3062 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3063 tcon->use_persistent = true;
3064 else /* persistent handles requested but not supported */ {
3066 "Persistent handles not supported on share\n");
3070 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3071 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3072 && (volume_info->nopersistent == false)) {
3073 cifs_dbg(FYI, "enabling persistent handles\n");
3074 tcon->use_persistent = true;
3075 } else if (volume_info->resilient) {
3076 if (ses->server->vals->protocol_id == 0) {
3078 "SMB2.1 or later required for resilient handles\n");
3082 tcon->use_resilient = true;
3086 * We can have only one retry value for a connection to a share so for
3087 * resources mounted more than once to the same server share the last
3088 * value passed in for the retry flag is used.
3090 tcon->retry = volume_info->retry;
3091 tcon->nocase = volume_info->nocase;
3092 tcon->nohandlecache = volume_info->nohandlecache;
3093 tcon->local_lease = volume_info->local_lease;
3094 INIT_LIST_HEAD(&tcon->pending_opens);
3096 spin_lock(&cifs_tcp_ses_lock);
3097 list_add(&tcon->tcon_list, &ses->tcon_list);
3098 spin_unlock(&cifs_tcp_ses_lock);
3100 cifs_fscache_get_super_cookie(tcon);
3110 cifs_put_tlink(struct tcon_link *tlink)
3112 if (!tlink || IS_ERR(tlink))
3115 if (!atomic_dec_and_test(&tlink->tl_count) ||
3116 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3117 tlink->tl_time = jiffies;
3121 if (!IS_ERR(tlink_tcon(tlink)))
3122 cifs_put_tcon(tlink_tcon(tlink));
3128 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3130 struct cifs_sb_info *old = CIFS_SB(sb);
3131 struct cifs_sb_info *new = mnt_data->cifs_sb;
3133 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3136 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3137 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3141 * We want to share sb only if we don't specify an r/wsize or
3142 * specified r/wsize is greater than or equal to existing one.
3144 if (new->wsize && new->wsize < old->wsize)
3147 if (new->rsize && new->rsize < old->rsize)
3150 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3153 if (old->mnt_file_mode != new->mnt_file_mode ||
3154 old->mnt_dir_mode != new->mnt_dir_mode)
3157 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3160 if (old->actimeo != new->actimeo)
3167 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3169 struct cifs_sb_info *old = CIFS_SB(sb);
3170 struct cifs_sb_info *new = mnt_data->cifs_sb;
3171 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3172 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3174 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3176 else if (!old_set && !new_set)
3183 cifs_match_super(struct super_block *sb, void *data)
3185 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3186 struct smb_vol *volume_info;
3187 struct cifs_sb_info *cifs_sb;
3188 struct TCP_Server_Info *tcp_srv;
3189 struct cifs_ses *ses;
3190 struct cifs_tcon *tcon;
3191 struct tcon_link *tlink;
3194 spin_lock(&cifs_tcp_ses_lock);
3195 cifs_sb = CIFS_SB(sb);
3196 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3197 if (IS_ERR(tlink)) {
3198 spin_unlock(&cifs_tcp_ses_lock);
3201 tcon = tlink_tcon(tlink);
3203 tcp_srv = ses->server;
3205 volume_info = mnt_data->vol;
3207 if (!match_server(tcp_srv, volume_info) ||
3208 !match_session(ses, volume_info) ||
3209 !match_tcon(tcon, volume_info) ||
3210 !match_prepath(sb, mnt_data)) {
3215 rc = compare_mount_options(sb, mnt_data);
3217 spin_unlock(&cifs_tcp_ses_lock);
3218 cifs_put_tlink(tlink);
3223 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
3224 const struct nls_table *nls_codepage, unsigned int *num_referrals,
3225 struct dfs_info3_param **referrals, int remap)
3229 if (!ses->server->ops->get_dfs_refer)
3235 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
3236 referrals, num_referrals,
3237 nls_codepage, remap);
3241 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3242 static struct lock_class_key cifs_key[2];
3243 static struct lock_class_key cifs_slock_key[2];
3246 cifs_reclassify_socket4(struct socket *sock)
3248 struct sock *sk = sock->sk;
3249 BUG_ON(!sock_allow_reclassification(sk));
3250 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3251 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3255 cifs_reclassify_socket6(struct socket *sock)
3257 struct sock *sk = sock->sk;
3258 BUG_ON(!sock_allow_reclassification(sk));
3259 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3260 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3264 cifs_reclassify_socket4(struct socket *sock)
3269 cifs_reclassify_socket6(struct socket *sock)
3274 /* See RFC1001 section 14 on representation of Netbios names */
3275 static void rfc1002mangle(char *target, char *source, unsigned int length)
3279 for (i = 0, j = 0; i < (length); i++) {
3280 /* mask a nibble at a time and encode */
3281 target[j] = 'A' + (0x0F & (source[i] >> 4));
3282 target[j+1] = 'A' + (0x0F & source[i]);
3289 bind_socket(struct TCP_Server_Info *server)
3292 if (server->srcaddr.ss_family != AF_UNSPEC) {
3293 /* Bind to the specified local IP address */
3294 struct socket *socket = server->ssocket;
3295 rc = socket->ops->bind(socket,
3296 (struct sockaddr *) &server->srcaddr,
3297 sizeof(server->srcaddr));
3299 struct sockaddr_in *saddr4;
3300 struct sockaddr_in6 *saddr6;
3301 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3302 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3303 if (saddr6->sin6_family == AF_INET6)
3304 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3305 &saddr6->sin6_addr, rc);
3307 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3308 &saddr4->sin_addr.s_addr, rc);
3315 ip_rfc1001_connect(struct TCP_Server_Info *server)
3319 * some servers require RFC1001 sessinit before sending
3320 * negprot - BB check reconnection in case where second
3321 * sessinit is sent but no second negprot
3323 struct rfc1002_session_packet *ses_init_buf;
3324 struct smb_hdr *smb_buf;
3325 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3328 ses_init_buf->trailer.session_req.called_len = 32;
3330 if (server->server_RFC1001_name[0] != 0)
3331 rfc1002mangle(ses_init_buf->trailer.
3332 session_req.called_name,
3333 server->server_RFC1001_name,
3334 RFC1001_NAME_LEN_WITH_NULL);
3336 rfc1002mangle(ses_init_buf->trailer.
3337 session_req.called_name,
3338 DEFAULT_CIFS_CALLED_NAME,
3339 RFC1001_NAME_LEN_WITH_NULL);
3341 ses_init_buf->trailer.session_req.calling_len = 32;
3344 * calling name ends in null (byte 16) from old smb
3347 if (server->workstation_RFC1001_name[0] != 0)
3348 rfc1002mangle(ses_init_buf->trailer.
3349 session_req.calling_name,
3350 server->workstation_RFC1001_name,
3351 RFC1001_NAME_LEN_WITH_NULL);
3353 rfc1002mangle(ses_init_buf->trailer.
3354 session_req.calling_name,
3356 RFC1001_NAME_LEN_WITH_NULL);
3358 ses_init_buf->trailer.session_req.scope1 = 0;
3359 ses_init_buf->trailer.session_req.scope2 = 0;
3360 smb_buf = (struct smb_hdr *)ses_init_buf;
3362 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3363 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3364 rc = smb_send(server, smb_buf, 0x44);
3365 kfree(ses_init_buf);
3367 * RFC1001 layer in at least one server
3368 * requires very short break before negprot
3369 * presumably because not expecting negprot
3370 * to follow so fast. This is a simple
3371 * solution that works without
3372 * complicating the code and causes no
3373 * significant slowing down on mount
3376 usleep_range(1000, 2000);
3379 * else the negprot may still work without this
3380 * even though malloc failed
3387 generic_ip_connect(struct TCP_Server_Info *server)
3392 struct socket *socket = server->ssocket;
3393 struct sockaddr *saddr;
3395 saddr = (struct sockaddr *) &server->dstaddr;
3397 if (server->dstaddr.ss_family == AF_INET6) {
3398 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3399 slen = sizeof(struct sockaddr_in6);
3402 sport = ((struct sockaddr_in *) saddr)->sin_port;
3403 slen = sizeof(struct sockaddr_in);
3407 if (socket == NULL) {
3408 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3409 IPPROTO_TCP, &socket, 1);
3411 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3412 server->ssocket = NULL;
3416 /* BB other socket options to set KEEPALIVE, NODELAY? */
3417 cifs_dbg(FYI, "Socket created\n");
3418 server->ssocket = socket;
3419 socket->sk->sk_allocation = GFP_NOFS;
3420 if (sfamily == AF_INET6)
3421 cifs_reclassify_socket6(socket);
3423 cifs_reclassify_socket4(socket);
3426 rc = bind_socket(server);
3431 * Eventually check for other socket options to change from
3432 * the default. sock_setsockopt not used because it expects
3435 socket->sk->sk_rcvtimeo = 7 * HZ;
3436 socket->sk->sk_sndtimeo = 5 * HZ;
3438 /* make the bufsizes depend on wsize/rsize and max requests */
3439 if (server->noautotune) {
3440 if (socket->sk->sk_sndbuf < (200 * 1024))
3441 socket->sk->sk_sndbuf = 200 * 1024;
3442 if (socket->sk->sk_rcvbuf < (140 * 1024))
3443 socket->sk->sk_rcvbuf = 140 * 1024;
3446 if (server->tcp_nodelay) {
3448 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3449 (char *)&val, sizeof(val));
3451 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3455 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3456 socket->sk->sk_sndbuf,
3457 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3459 rc = socket->ops->connect(socket, saddr, slen, 0);
3461 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3462 sock_release(socket);
3463 server->ssocket = NULL;
3467 if (sport == htons(RFC1001_PORT))
3468 rc = ip_rfc1001_connect(server);
3474 ip_connect(struct TCP_Server_Info *server)
3477 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3478 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3480 if (server->dstaddr.ss_family == AF_INET6)
3481 sport = &addr6->sin6_port;
3483 sport = &addr->sin_port;
3488 /* try with 445 port at first */
3489 *sport = htons(CIFS_PORT);
3491 rc = generic_ip_connect(server);
3495 /* if it failed, try with 139 port */
3496 *sport = htons(RFC1001_PORT);
3499 return generic_ip_connect(server);
3502 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3503 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3505 /* if we are reconnecting then should we check to see if
3506 * any requested capabilities changed locally e.g. via
3507 * remount but we can not do much about it here
3508 * if they have (even if we could detect it by the following)
3509 * Perhaps we could add a backpointer to array of sb from tcon
3510 * or if we change to make all sb to same share the same
3511 * sb as NFS - then we only have one backpointer to sb.
3512 * What if we wanted to mount the server share twice once with
3513 * and once without posixacls or posix paths? */
3514 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3516 if (vol_info && vol_info->no_linux_ext) {
3517 tcon->fsUnixInfo.Capability = 0;
3518 tcon->unix_ext = 0; /* Unix Extensions disabled */
3519 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3521 } else if (vol_info)
3522 tcon->unix_ext = 1; /* Unix Extensions supported */
3524 if (tcon->unix_ext == 0) {
3525 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3529 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3530 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3531 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3532 /* check for reconnect case in which we do not
3533 want to change the mount behavior if we can avoid it */
3534 if (vol_info == NULL) {
3535 /* turn off POSIX ACL and PATHNAMES if not set
3536 originally at mount time */
3537 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3538 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3539 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3540 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3541 cifs_dbg(VFS, "POSIXPATH support change\n");
3542 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3543 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3544 cifs_dbg(VFS, "possible reconnect error\n");
3545 cifs_dbg(VFS, "server disabled POSIX path support\n");
3549 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3550 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3552 cap &= CIFS_UNIX_CAP_MASK;
3553 if (vol_info && vol_info->no_psx_acl)
3554 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3555 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3556 cifs_dbg(FYI, "negotiated posix acl support\n");
3558 cifs_sb->mnt_cifs_flags |=
3559 CIFS_MOUNT_POSIXACL;
3562 if (vol_info && vol_info->posix_paths == 0)
3563 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3564 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3565 cifs_dbg(FYI, "negotiate posix pathnames\n");
3567 cifs_sb->mnt_cifs_flags |=
3568 CIFS_MOUNT_POSIX_PATHS;
3571 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3572 #ifdef CONFIG_CIFS_DEBUG2
3573 if (cap & CIFS_UNIX_FCNTL_CAP)
3574 cifs_dbg(FYI, "FCNTL cap\n");
3575 if (cap & CIFS_UNIX_EXTATTR_CAP)
3576 cifs_dbg(FYI, "EXTATTR cap\n");
3577 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3578 cifs_dbg(FYI, "POSIX path cap\n");
3579 if (cap & CIFS_UNIX_XATTR_CAP)
3580 cifs_dbg(FYI, "XATTR cap\n");
3581 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3582 cifs_dbg(FYI, "POSIX ACL cap\n");
3583 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3584 cifs_dbg(FYI, "very large read cap\n");
3585 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3586 cifs_dbg(FYI, "very large write cap\n");
3587 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3588 cifs_dbg(FYI, "transport encryption cap\n");
3589 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3590 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3591 #endif /* CIFS_DEBUG2 */
3592 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3593 if (vol_info == NULL) {
3594 cifs_dbg(FYI, "resetting capabilities failed\n");
3596 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");
3602 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3603 struct cifs_sb_info *cifs_sb)
3605 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3607 spin_lock_init(&cifs_sb->tlink_tree_lock);
3608 cifs_sb->tlink_tree = RB_ROOT;
3611 * Temporarily set r/wsize for matching superblock. If we end up using
3612 * new sb then client will later negotiate it downward if needed.
3614 cifs_sb->rsize = pvolume_info->rsize;
3615 cifs_sb->wsize = pvolume_info->wsize;
3617 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3618 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3619 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3620 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3621 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3622 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3624 cifs_sb->actimeo = pvolume_info->actimeo;
3625 cifs_sb->local_nls = pvolume_info->local_nls;
3627 if (pvolume_info->noperm)
3628 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3629 if (pvolume_info->setuids)
3630 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3631 if (pvolume_info->setuidfromacl)
3632 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3633 if (pvolume_info->server_ino)
3634 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3635 if (pvolume_info->remap)
3636 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3637 if (pvolume_info->sfu_remap)
3638 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3639 if (pvolume_info->no_xattr)
3640 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3641 if (pvolume_info->sfu_emul)
3642 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3643 if (pvolume_info->nobrl)
3644 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3645 if (pvolume_info->nohandlecache)
3646 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3647 if (pvolume_info->nostrictsync)
3648 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3649 if (pvolume_info->mand_lock)
3650 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3651 if (pvolume_info->rwpidforward)
3652 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3653 if (pvolume_info->cifs_acl)
3654 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3655 if (pvolume_info->backupuid_specified) {
3656 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3657 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3659 if (pvolume_info->backupgid_specified) {
3660 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3661 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3663 if (pvolume_info->override_uid)
3664 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3665 if (pvolume_info->override_gid)
3666 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3667 if (pvolume_info->dynperm)
3668 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3669 if (pvolume_info->fsc)
3670 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3671 if (pvolume_info->multiuser)
3672 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3673 CIFS_MOUNT_NO_PERM);
3674 if (pvolume_info->strict_io)
3675 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3676 if (pvolume_info->direct_io) {
3677 cifs_dbg(FYI, "mounting share using direct i/o\n");
3678 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3680 if (pvolume_info->mfsymlinks) {
3681 if (pvolume_info->sfu_emul) {
3683 * Our SFU ("Services for Unix" emulation does not allow
3684 * creating symlinks but does allow reading existing SFU
3685 * symlinks (it does allow both creating and reading SFU
3686 * style mknod and FIFOs though). When "mfsymlinks" and
3687 * "sfu" are both enabled at the same time, it allows
3688 * reading both types of symlinks, but will only create
3689 * them with mfsymlinks format. This allows better
3690 * Apple compatibility (probably better for Samba too)
3691 * while still recognizing old Windows style symlinks.
3693 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3695 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3698 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3699 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3701 if (pvolume_info->prepath) {
3702 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3703 if (cifs_sb->prepath == NULL)
3711 cleanup_volume_info_contents(struct smb_vol *volume_info)
3713 kfree(volume_info->username);
3714 kzfree(volume_info->password);
3715 kfree(volume_info->UNC);
3716 kfree(volume_info->domainname);
3717 kfree(volume_info->iocharset);
3718 kfree(volume_info->prepath);
3722 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3726 cleanup_volume_info_contents(volume_info);
3731 #ifdef CONFIG_CIFS_DFS_UPCALL
3733 * cifs_build_path_to_root returns full path to root when we do not have an
3734 * exiting connection (tcon)
3737 build_unc_path_to_root(const struct smb_vol *vol,
3738 const struct cifs_sb_info *cifs_sb)
3740 char *full_path, *pos;
3741 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3742 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3744 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3745 if (full_path == NULL)
3746 return ERR_PTR(-ENOMEM);
3748 strncpy(full_path, vol->UNC, unc_len);
3749 pos = full_path + unc_len;
3752 *pos = CIFS_DIR_SEP(cifs_sb);
3753 strncpy(pos + 1, vol->prepath, pplen);
3757 *pos = '\0'; /* add trailing null */
3758 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3759 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3764 * Perform a dfs referral query for a share and (optionally) prefix
3766 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3767 * to a string containing updated options for the submount. Otherwise it
3768 * will be left untouched.
3770 * Returns the rc from get_dfs_path to the caller, which can be used to
3771 * determine whether there were referrals.
3774 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3775 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3779 unsigned int num_referrals = 0;
3780 struct dfs_info3_param *referrals = NULL;
3781 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3783 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3784 if (IS_ERR(full_path))
3785 return PTR_ERR(full_path);
3787 /* For DFS paths, skip the first '\' of the UNC */
3788 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3790 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3791 &num_referrals, &referrals, cifs_remap(cifs_sb));
3793 if (!rc && num_referrals > 0) {
3794 char *fake_devname = NULL;
3796 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3797 full_path + 1, referrals,
3800 free_dfs_info_array(referrals, num_referrals);
3802 if (IS_ERR(mdata)) {
3803 rc = PTR_ERR(mdata);
3806 cleanup_volume_info_contents(volume_info);
3807 rc = cifs_setup_volume_info(volume_info, mdata,
3808 fake_devname, false);
3810 kfree(fake_devname);
3811 kfree(cifs_sb->mountdata);
3812 cifs_sb->mountdata = mdata;
3820 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3821 const char *devname, bool is_smb3)
3825 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
3828 if (volume_info->nullauth) {
3829 cifs_dbg(FYI, "Anonymous login\n");
3830 kfree(volume_info->username);
3831 volume_info->username = NULL;
3832 } else if (volume_info->username) {
3833 /* BB fixme parse for domain name here */
3834 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3836 cifs_dbg(VFS, "No username specified\n");
3837 /* In userspace mount helper we can get user name from alternate
3838 locations such as env variables and files on disk */
3842 /* this is needed for ASCII cp to Unicode converts */
3843 if (volume_info->iocharset == NULL) {
3844 /* load_nls_default cannot return null */
3845 volume_info->local_nls = load_nls_default();
3847 volume_info->local_nls = load_nls(volume_info->iocharset);
3848 if (volume_info->local_nls == NULL) {
3849 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3850 volume_info->iocharset);
3859 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
3862 struct smb_vol *volume_info;
3864 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3866 return ERR_PTR(-ENOMEM);
3868 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
3870 cifs_cleanup_volume_info(volume_info);
3871 volume_info = ERR_PTR(rc);
3878 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3880 struct cifs_tcon *tcon,
3881 struct cifs_sb_info *cifs_sb,
3888 sep = CIFS_DIR_SEP(cifs_sb);
3891 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3893 /* skip separators */
3898 /* next separator */
3899 while (*s && *s != sep)
3903 * temporarily null-terminate the path at the end of
3904 * the current component
3908 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3916 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3920 struct cifs_ses *ses;
3921 struct cifs_tcon *tcon;
3922 struct TCP_Server_Info *server;
3924 struct tcon_link *tlink;
3925 #ifdef CONFIG_CIFS_DFS_UPCALL
3926 int referral_walks_count = 0;
3929 #ifdef CONFIG_CIFS_DFS_UPCALL
3931 /* cleanup activities if we're chasing a referral */
3932 if (referral_walks_count) {
3934 cifs_put_tcon(tcon);
3936 cifs_put_smb_ses(ses);
3938 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3952 /* get a reference to a tcp session */
3953 server = cifs_get_tcp_session(volume_info);
3954 if (IS_ERR(server)) {
3955 rc = PTR_ERR(server);
3958 if ((volume_info->max_credits < 20) ||
3959 (volume_info->max_credits > 60000))
3960 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3962 server->max_credits = volume_info->max_credits;
3963 /* get a reference to a SMB session */
3964 ses = cifs_get_smb_ses(server, volume_info);
3968 goto mount_fail_check;
3971 if ((volume_info->persistent == true) && ((ses->server->capabilities &
3972 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
3973 cifs_dbg(VFS, "persistent handles not supported by server\n");
3975 goto mount_fail_check;
3978 /* search for existing tcon to this server share */
3979 tcon = cifs_get_tcon(ses, volume_info);
3984 goto mount_fail_check;
3986 goto remote_path_check;
3989 #ifdef CONFIG_CIFS_SMB311
3990 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
3991 if (tcon->posix_extensions)
3992 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
3993 #endif /* SMB3.11 */
3995 /* tell server which Unix caps we support */
3996 if (cap_unix(tcon->ses)) {
3997 /* reset of caps checks mount to see if unix extensions
3998 disabled for just this mount */
3999 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
4000 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4001 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4002 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
4004 goto mount_fail_check;
4007 tcon->unix_ext = 0; /* server does not support them */
4009 /* do not care if a following call succeed - informational */
4010 if (!tcon->pipe && server->ops->qfs_tcon)
4011 server->ops->qfs_tcon(xid, tcon);
4013 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
4014 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
4017 #ifdef CONFIG_CIFS_DFS_UPCALL
4019 * Perform an unconditional check for whether there are DFS
4020 * referrals for this path without prefix, to provide support
4021 * for DFS referrals from w2k8 servers which don't seem to respond
4022 * with PATH_NOT_COVERED to requests that include the prefix.
4023 * Chase the referral if found, otherwise continue normally.
4025 if (referral_walks_count == 0) {
4026 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
4029 referral_walks_count++;
4030 goto try_mount_again;
4035 /* check if a whole path is not remote */
4037 if (!server->ops->is_path_accessible) {
4039 goto mount_fail_check;
4042 * cifs_build_path_to_root works only when we have a valid tcon
4044 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon,
4045 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4046 if (full_path == NULL) {
4048 goto mount_fail_check;
4050 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4052 if (rc != 0 && rc != -EREMOTE) {
4054 goto mount_fail_check;
4057 if (rc != -EREMOTE) {
4058 rc = cifs_are_all_path_components_accessible(server,
4062 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4063 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4064 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4071 /* get referral if needed */
4072 if (rc == -EREMOTE) {
4073 #ifdef CONFIG_CIFS_DFS_UPCALL
4074 if (referral_walks_count > MAX_NESTED_LINKS) {
4076 * BB: when we implement proper loop detection,
4077 * we will remove this check. But now we need it
4078 * to prevent an indefinite loop if 'DFS tree' is
4079 * misconfigured (i.e. has loops).
4082 goto mount_fail_check;
4085 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
4088 referral_walks_count++;
4089 goto try_mount_again;
4091 goto mount_fail_check;
4092 #else /* No DFS support, return error on mount */
4098 goto mount_fail_check;
4100 /* now, hang the tcon off of the superblock */
4101 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
4102 if (tlink == NULL) {
4104 goto mount_fail_check;
4107 tlink->tl_uid = ses->linux_uid;
4108 tlink->tl_tcon = tcon;
4109 tlink->tl_time = jiffies;
4110 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4111 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4113 cifs_sb->master_tlink = tlink;
4114 spin_lock(&cifs_sb->tlink_tree_lock);
4115 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4116 spin_unlock(&cifs_sb->tlink_tree_lock);
4118 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4122 /* on error free sesinfo and tcon struct if needed */
4124 /* If find_unc succeeded then rc == 0 so we can not end */
4125 /* up accidentally freeing someone elses tcon struct */
4127 cifs_put_tcon(tcon);
4129 cifs_put_smb_ses(ses);
4131 cifs_put_tcp_session(server, 0);
4140 * Issue a TREE_CONNECT request.
4143 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4144 const char *tree, struct cifs_tcon *tcon,
4145 const struct nls_table *nls_codepage)
4147 struct smb_hdr *smb_buffer;
4148 struct smb_hdr *smb_buffer_response;
4151 unsigned char *bcc_ptr;
4154 __u16 bytes_left, count;
4159 smb_buffer = cifs_buf_get();
4160 if (smb_buffer == NULL)
4163 smb_buffer_response = smb_buffer;
4165 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4166 NULL /*no tid */ , 4 /*wct */ );
4168 smb_buffer->Mid = get_next_mid(ses->server);
4169 smb_buffer->Uid = ses->Suid;
4170 pSMB = (TCONX_REQ *) smb_buffer;
4171 pSMBr = (TCONX_RSP *) smb_buffer_response;
4173 pSMB->AndXCommand = 0xFF;
4174 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4175 bcc_ptr = &pSMB->Password[0];
4176 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4177 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4178 *bcc_ptr = 0; /* password is null byte */
4179 bcc_ptr++; /* skip password */
4180 /* already aligned so no need to do it below */
4182 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4183 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4184 specified as required (when that support is added to
4185 the vfs in the future) as only NTLM or the much
4186 weaker LANMAN (which we do not send by default) is accepted
4187 by Samba (not sure whether other servers allow
4188 NTLMv2 password here) */
4189 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4190 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4191 (ses->sectype == LANMAN))
4192 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4193 ses->server->sec_mode &
4194 SECMODE_PW_ENCRYPT ? true : false,
4197 #endif /* CIFS_WEAK_PW_HASH */
4198 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4199 bcc_ptr, nls_codepage);
4201 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4203 cifs_buf_release(smb_buffer);
4207 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4208 if (ses->capabilities & CAP_UNICODE) {
4209 /* must align unicode strings */
4210 *bcc_ptr = 0; /* null byte password */
4215 if (ses->server->sign)
4216 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4218 if (ses->capabilities & CAP_STATUS32) {
4219 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4221 if (ses->capabilities & CAP_DFS) {
4222 smb_buffer->Flags2 |= SMBFLG2_DFS;
4224 if (ses->capabilities & CAP_UNICODE) {
4225 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4227 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4228 6 /* max utf8 char length in bytes */ *
4229 (/* server len*/ + 256 /* share len */), nls_codepage);
4230 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4231 bcc_ptr += 2; /* skip trailing null */
4232 } else { /* ASCII */
4233 strcpy(bcc_ptr, tree);
4234 bcc_ptr += strlen(tree) + 1;
4236 strcpy(bcc_ptr, "?????");
4237 bcc_ptr += strlen("?????");
4239 count = bcc_ptr - &pSMB->Password[0];
4240 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4241 pSMB->hdr.smb_buf_length) + count);
4242 pSMB->ByteCount = cpu_to_le16(count);
4244 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4247 /* above now done in SendReceive */
4251 tcon->tidStatus = CifsGood;
4252 tcon->need_reconnect = false;
4253 tcon->tid = smb_buffer_response->Tid;
4254 bcc_ptr = pByteArea(smb_buffer_response);
4255 bytes_left = get_bcc(smb_buffer_response);
4256 length = strnlen(bcc_ptr, bytes_left - 2);
4257 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4263 /* skip service field (NB: this field is always ASCII) */
4265 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4266 (bcc_ptr[2] == 'C')) {
4267 cifs_dbg(FYI, "IPC connection\n");
4271 } else if (length == 2) {
4272 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4273 /* the most common case */
4274 cifs_dbg(FYI, "disk share connection\n");
4277 bcc_ptr += length + 1;
4278 bytes_left -= (length + 1);
4279 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4281 /* mostly informational -- no need to fail on error here */
4282 kfree(tcon->nativeFileSystem);
4283 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4284 bytes_left, is_unicode,
4287 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4289 if ((smb_buffer_response->WordCount == 3) ||
4290 (smb_buffer_response->WordCount == 7))
4291 /* field is in same location */
4292 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4295 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4298 cifs_buf_release(smb_buffer);
4302 static void delayed_free(struct rcu_head *p)
4304 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4305 unload_nls(sbi->local_nls);
4310 cifs_umount(struct cifs_sb_info *cifs_sb)
4312 struct rb_root *root = &cifs_sb->tlink_tree;
4313 struct rb_node *node;
4314 struct tcon_link *tlink;
4316 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4318 spin_lock(&cifs_sb->tlink_tree_lock);
4319 while ((node = rb_first(root))) {
4320 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4321 cifs_get_tlink(tlink);
4322 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4323 rb_erase(node, root);
4325 spin_unlock(&cifs_sb->tlink_tree_lock);
4326 cifs_put_tlink(tlink);
4327 spin_lock(&cifs_sb->tlink_tree_lock);
4329 spin_unlock(&cifs_sb->tlink_tree_lock);
4331 kfree(cifs_sb->mountdata);
4332 kfree(cifs_sb->prepath);
4333 call_rcu(&cifs_sb->rcu, delayed_free);
4337 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4340 struct TCP_Server_Info *server = ses->server;
4342 if (!server->ops->need_neg || !server->ops->negotiate)
4345 /* only send once per connect */
4346 if (!server->ops->need_neg(server))
4349 set_credits(server, 1);
4351 rc = server->ops->negotiate(xid, ses);
4353 spin_lock(&GlobalMid_Lock);
4354 if (server->tcpStatus == CifsNeedNegotiate)
4355 server->tcpStatus = CifsGood;
4358 spin_unlock(&GlobalMid_Lock);
4365 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4366 struct nls_table *nls_info)
4369 struct TCP_Server_Info *server = ses->server;
4371 ses->capabilities = server->capabilities;
4372 if (linuxExtEnabled == 0)
4373 ses->capabilities &= (~server->vals->cap_unix);
4375 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4376 server->sec_mode, server->capabilities, server->timeAdj);
4378 if (ses->auth_key.response) {
4379 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4380 ses->auth_key.response);
4381 kfree(ses->auth_key.response);
4382 ses->auth_key.response = NULL;
4383 ses->auth_key.len = 0;
4386 if (server->ops->sess_setup)
4387 rc = server->ops->sess_setup(xid, ses, nls_info);
4390 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4396 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4398 vol->sectype = ses->sectype;
4400 /* krb5 is special, since we don't need username or pw */
4401 if (vol->sectype == Kerberos)
4404 return cifs_set_cifscreds(vol, ses);
4407 static struct cifs_tcon *
4408 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4411 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4412 struct cifs_ses *ses;
4413 struct cifs_tcon *tcon = NULL;
4414 struct smb_vol *vol_info;
4416 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4417 if (vol_info == NULL)
4418 return ERR_PTR(-ENOMEM);
4420 vol_info->local_nls = cifs_sb->local_nls;
4421 vol_info->linux_uid = fsuid;
4422 vol_info->cred_uid = fsuid;
4423 vol_info->UNC = master_tcon->treeName;
4424 vol_info->retry = master_tcon->retry;
4425 vol_info->nocase = master_tcon->nocase;
4426 vol_info->nohandlecache = master_tcon->nohandlecache;
4427 vol_info->local_lease = master_tcon->local_lease;
4428 vol_info->no_linux_ext = !master_tcon->unix_ext;
4429 vol_info->sectype = master_tcon->ses->sectype;
4430 vol_info->sign = master_tcon->ses->sign;
4432 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4438 /* get a reference for the same TCP session */
4439 spin_lock(&cifs_tcp_ses_lock);
4440 ++master_tcon->ses->server->srv_count;
4441 spin_unlock(&cifs_tcp_ses_lock);
4443 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4445 tcon = (struct cifs_tcon *)ses;
4446 cifs_put_tcp_session(master_tcon->ses->server, 0);
4450 tcon = cifs_get_tcon(ses, vol_info);
4452 cifs_put_smb_ses(ses);
4456 #ifdef CONFIG_CIFS_SMB311
4457 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4458 if (tcon->posix_extensions)
4459 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4460 #endif /* SMB3.11 */
4462 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4465 kfree(vol_info->username);
4466 kzfree(vol_info->password);
4473 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4475 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4478 /* find and return a tlink with given uid */
4479 static struct tcon_link *
4480 tlink_rb_search(struct rb_root *root, kuid_t uid)
4482 struct rb_node *node = root->rb_node;
4483 struct tcon_link *tlink;
4486 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4488 if (uid_gt(tlink->tl_uid, uid))
4489 node = node->rb_left;
4490 else if (uid_lt(tlink->tl_uid, uid))
4491 node = node->rb_right;
4498 /* insert a tcon_link into the tree */
4500 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4502 struct rb_node **new = &(root->rb_node), *parent = NULL;
4503 struct tcon_link *tlink;
4506 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4509 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4510 new = &((*new)->rb_left);
4512 new = &((*new)->rb_right);
4515 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4516 rb_insert_color(&new_tlink->tl_rbnode, root);
4520 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4523 * If the superblock doesn't refer to a multiuser mount, then just return
4524 * the master tcon for the mount.
4526 * First, search the rbtree for an existing tcon for this fsuid. If one
4527 * exists, then check to see if it's pending construction. If it is then wait
4528 * for construction to complete. Once it's no longer pending, check to see if
4529 * it failed and either return an error or retry construction, depending on
4532 * If one doesn't exist then insert a new tcon_link struct into the tree and
4533 * try to construct a new one.
4536 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4539 kuid_t fsuid = current_fsuid();
4540 struct tcon_link *tlink, *newtlink;
4542 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4543 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4545 spin_lock(&cifs_sb->tlink_tree_lock);
4546 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4548 cifs_get_tlink(tlink);
4549 spin_unlock(&cifs_sb->tlink_tree_lock);
4551 if (tlink == NULL) {
4552 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4553 if (newtlink == NULL)
4554 return ERR_PTR(-ENOMEM);
4555 newtlink->tl_uid = fsuid;
4556 newtlink->tl_tcon = ERR_PTR(-EACCES);
4557 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4558 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4559 cifs_get_tlink(newtlink);
4561 spin_lock(&cifs_sb->tlink_tree_lock);
4562 /* was one inserted after previous search? */
4563 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4565 cifs_get_tlink(tlink);
4566 spin_unlock(&cifs_sb->tlink_tree_lock);
4568 goto wait_for_construction;
4571 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4572 spin_unlock(&cifs_sb->tlink_tree_lock);
4574 wait_for_construction:
4575 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4576 TASK_INTERRUPTIBLE);
4578 cifs_put_tlink(tlink);
4579 return ERR_PTR(-ERESTARTSYS);
4582 /* if it's good, return it */
4583 if (!IS_ERR(tlink->tl_tcon))
4586 /* return error if we tried this already recently */
4587 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4588 cifs_put_tlink(tlink);
4589 return ERR_PTR(-EACCES);
4592 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4593 goto wait_for_construction;
4596 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4597 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4598 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4600 if (IS_ERR(tlink->tl_tcon)) {
4601 cifs_put_tlink(tlink);
4602 return ERR_PTR(-EACCES);
4609 * periodic workqueue job that scans tcon_tree for a superblock and closes
4613 cifs_prune_tlinks(struct work_struct *work)
4615 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4617 struct rb_root *root = &cifs_sb->tlink_tree;
4618 struct rb_node *node;
4619 struct rb_node *tmp;
4620 struct tcon_link *tlink;
4623 * Because we drop the spinlock in the loop in order to put the tlink
4624 * it's not guarded against removal of links from the tree. The only
4625 * places that remove entries from the tree are this function and
4626 * umounts. Because this function is non-reentrant and is canceled
4627 * before umount can proceed, this is safe.
4629 spin_lock(&cifs_sb->tlink_tree_lock);
4630 node = rb_first(root);
4631 while (node != NULL) {
4633 node = rb_next(tmp);
4634 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4636 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4637 atomic_read(&tlink->tl_count) != 0 ||
4638 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4641 cifs_get_tlink(tlink);
4642 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4643 rb_erase(tmp, root);
4645 spin_unlock(&cifs_sb->tlink_tree_lock);
4646 cifs_put_tlink(tlink);
4647 spin_lock(&cifs_sb->tlink_tree_lock);
4649 spin_unlock(&cifs_sb->tlink_tree_lock);
4651 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,