4 * Copyright (C) International Business Machines Corp., 2002,2011
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 { Smb_311, SMB311_VERSION_STRING },
307 { Smb_311, ALT_SMB311_VERSION_STRING },
308 { Smb_3any, SMB3ANY_VERSION_STRING },
309 { Smb_default, SMBDEFAULT_VERSION_STRING },
310 { Smb_version_err, NULL }
313 static int ip_connect(struct TCP_Server_Info *server);
314 static int generic_ip_connect(struct TCP_Server_Info *server);
315 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
316 static void cifs_prune_tlinks(struct work_struct *work);
317 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
318 const char *devname, bool is_smb3);
321 * cifs tcp session reconnection
323 * mark tcp session as reconnecting so temporarily locked
324 * mark all smb sessions as reconnecting for tcp session
325 * reconnect tcp session
326 * wake up waiters on reconnection? - (not needed currently)
329 cifs_reconnect(struct TCP_Server_Info *server)
332 struct list_head *tmp, *tmp2;
333 struct cifs_ses *ses;
334 struct cifs_tcon *tcon;
335 struct mid_q_entry *mid_entry;
336 struct list_head retry_list;
338 spin_lock(&GlobalMid_Lock);
339 if (server->tcpStatus == CifsExiting) {
340 /* the demux thread will exit normally
341 next time through the loop */
342 spin_unlock(&GlobalMid_Lock);
345 server->tcpStatus = CifsNeedReconnect;
346 spin_unlock(&GlobalMid_Lock);
348 server->max_read = 0;
350 cifs_dbg(FYI, "Reconnecting tcp session\n");
351 trace_smb3_reconnect(server->CurrentMid, server->hostname);
353 /* before reconnecting the tcp session, mark the smb session (uid)
354 and the tid bad so they are not used until reconnected */
355 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
357 spin_lock(&cifs_tcp_ses_lock);
358 list_for_each(tmp, &server->smb_ses_list) {
359 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
360 ses->need_reconnect = true;
361 list_for_each(tmp2, &ses->tcon_list) {
362 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
363 tcon->need_reconnect = true;
366 ses->tcon_ipc->need_reconnect = true;
368 spin_unlock(&cifs_tcp_ses_lock);
370 /* do not want to be sending data on a socket we are freeing */
371 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
372 mutex_lock(&server->srv_mutex);
373 if (server->ssocket) {
374 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
375 server->ssocket->state, server->ssocket->flags);
376 kernel_sock_shutdown(server->ssocket, SHUT_WR);
377 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
378 server->ssocket->state, server->ssocket->flags);
379 sock_release(server->ssocket);
380 server->ssocket = NULL;
382 server->sequence_number = 0;
383 server->session_estab = false;
384 kfree(server->session_key.response);
385 server->session_key.response = NULL;
386 server->session_key.len = 0;
387 server->lstrp = jiffies;
389 /* mark submitted MIDs for retry and issue callback */
390 INIT_LIST_HEAD(&retry_list);
391 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
392 spin_lock(&GlobalMid_Lock);
393 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
394 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
395 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
396 mid_entry->mid_state = MID_RETRY_NEEDED;
397 list_move(&mid_entry->qhead, &retry_list);
399 spin_unlock(&GlobalMid_Lock);
400 mutex_unlock(&server->srv_mutex);
402 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
403 list_for_each_safe(tmp, tmp2, &retry_list) {
404 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
405 list_del_init(&mid_entry->qhead);
406 mid_entry->callback(mid_entry);
412 /* we should try only the port we connected to before */
413 mutex_lock(&server->srv_mutex);
414 if (cifs_rdma_enabled(server))
415 rc = smbd_reconnect(server);
417 rc = generic_ip_connect(server);
419 cifs_dbg(FYI, "reconnect error %d\n", rc);
420 mutex_unlock(&server->srv_mutex);
423 atomic_inc(&tcpSesReconnectCount);
424 spin_lock(&GlobalMid_Lock);
425 if (server->tcpStatus != CifsExiting)
426 server->tcpStatus = CifsNeedNegotiate;
427 spin_unlock(&GlobalMid_Lock);
428 mutex_unlock(&server->srv_mutex);
430 } while (server->tcpStatus == CifsNeedReconnect);
432 if (server->tcpStatus == CifsNeedNegotiate)
433 mod_delayed_work(cifsiod_wq, &server->echo, 0);
439 cifs_echo_request(struct work_struct *work)
442 struct TCP_Server_Info *server = container_of(work,
443 struct TCP_Server_Info, echo.work);
444 unsigned long echo_interval;
447 * If we need to renegotiate, set echo interval to zero to
448 * immediately call echo service where we can renegotiate.
450 if (server->tcpStatus == CifsNeedNegotiate)
453 echo_interval = server->echo_interval;
456 * We cannot send an echo if it is disabled.
457 * Also, no need to ping if we got a response recently.
460 if (server->tcpStatus == CifsNeedReconnect ||
461 server->tcpStatus == CifsExiting ||
462 server->tcpStatus == CifsNew ||
463 (server->ops->can_echo && !server->ops->can_echo(server)) ||
464 time_before(jiffies, server->lstrp + echo_interval - HZ))
467 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
469 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
473 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
477 allocate_buffers(struct TCP_Server_Info *server)
479 if (!server->bigbuf) {
480 server->bigbuf = (char *)cifs_buf_get();
481 if (!server->bigbuf) {
482 cifs_dbg(VFS, "No memory for large SMB response\n");
484 /* retry will check if exiting */
487 } else if (server->large_buf) {
488 /* we are reusing a dirty large buf, clear its start */
489 memset(server->bigbuf, 0, HEADER_SIZE(server));
492 if (!server->smallbuf) {
493 server->smallbuf = (char *)cifs_small_buf_get();
494 if (!server->smallbuf) {
495 cifs_dbg(VFS, "No memory for SMB response\n");
497 /* retry will check if exiting */
500 /* beginning of smb buffer is cleared in our buf_get */
502 /* if existing small buf clear beginning */
503 memset(server->smallbuf, 0, HEADER_SIZE(server));
510 server_unresponsive(struct TCP_Server_Info *server)
513 * We need to wait 2 echo intervals to make sure we handle such
515 * 1s client sends a normal SMB request
516 * 2s client gets a response
517 * 30s echo workqueue job pops, and decides we got a response recently
518 * and don't need to send another
520 * 65s kernel_recvmsg times out, and we see that we haven't gotten
521 * a response in >60s.
523 if ((server->tcpStatus == CifsGood ||
524 server->tcpStatus == CifsNeedNegotiate) &&
525 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
526 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
527 server->hostname, (2 * server->echo_interval) / HZ);
528 cifs_reconnect(server);
529 wake_up(&server->response_q);
537 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
542 smb_msg->msg_control = NULL;
543 smb_msg->msg_controllen = 0;
545 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
548 if (server_unresponsive(server))
549 return -ECONNABORTED;
550 if (cifs_rdma_enabled(server) && server->smbd_conn)
551 length = smbd_recv(server->smbd_conn, smb_msg);
553 length = sock_recvmsg(server->ssocket, smb_msg, 0);
555 if (server->tcpStatus == CifsExiting)
558 if (server->tcpStatus == CifsNeedReconnect) {
559 cifs_reconnect(server);
560 return -ECONNABORTED;
563 if (length == -ERESTARTSYS ||
567 * Minimum sleep to prevent looping, allowing socket
568 * to clear and app threads to set tcpStatus
569 * CifsNeedReconnect if server hung.
571 usleep_range(1000, 2000);
577 cifs_dbg(FYI, "Received no data or error: %d\n", length);
578 cifs_reconnect(server);
579 return -ECONNABORTED;
586 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
587 unsigned int to_read)
589 struct msghdr smb_msg;
590 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
591 iov_iter_kvec(&smb_msg.msg_iter, READ | ITER_KVEC, &iov, 1, to_read);
593 return cifs_readv_from_socket(server, &smb_msg);
597 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
598 unsigned int page_offset, unsigned int to_read)
600 struct msghdr smb_msg;
601 struct bio_vec bv = {
602 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
603 iov_iter_bvec(&smb_msg.msg_iter, READ | ITER_BVEC, &bv, 1, to_read);
604 return cifs_readv_from_socket(server, &smb_msg);
608 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
611 * The first byte big endian of the length field,
612 * is actually not part of the length but the type
613 * with the most common, zero, as regular data.
616 case RFC1002_SESSION_MESSAGE:
617 /* Regular SMB response */
619 case RFC1002_SESSION_KEEP_ALIVE:
620 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
622 case RFC1002_POSITIVE_SESSION_RESPONSE:
623 cifs_dbg(FYI, "RFC 1002 positive session response\n");
625 case RFC1002_NEGATIVE_SESSION_RESPONSE:
627 * We get this from Windows 98 instead of an error on
628 * SMB negprot response.
630 cifs_dbg(FYI, "RFC 1002 negative session response\n");
631 /* give server a second to clean up */
634 * Always try 445 first on reconnect since we get NACK
635 * on some if we ever connected to port 139 (the NACK
636 * is since we do not begin with RFC1001 session
639 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
640 cifs_reconnect(server);
641 wake_up(&server->response_q);
644 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
645 cifs_reconnect(server);
652 dequeue_mid(struct mid_q_entry *mid, bool malformed)
654 #ifdef CONFIG_CIFS_STATS2
655 mid->when_received = jiffies;
657 spin_lock(&GlobalMid_Lock);
659 mid->mid_state = MID_RESPONSE_RECEIVED;
661 mid->mid_state = MID_RESPONSE_MALFORMED;
662 list_del_init(&mid->qhead);
663 spin_unlock(&GlobalMid_Lock);
667 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
668 char *buf, int malformed)
670 if (server->ops->check_trans2 &&
671 server->ops->check_trans2(mid, server, buf, malformed))
674 mid->large_buf = server->large_buf;
675 /* Was previous buf put in mpx struct for multi-rsp? */
676 if (!mid->multiRsp) {
677 /* smb buffer will be freed by user thread */
678 if (server->large_buf)
679 server->bigbuf = NULL;
681 server->smallbuf = NULL;
683 dequeue_mid(mid, malformed);
686 static void clean_demultiplex_info(struct TCP_Server_Info *server)
690 /* take it off the list, if it's not already */
691 spin_lock(&cifs_tcp_ses_lock);
692 list_del_init(&server->tcp_ses_list);
693 spin_unlock(&cifs_tcp_ses_lock);
695 spin_lock(&GlobalMid_Lock);
696 server->tcpStatus = CifsExiting;
697 spin_unlock(&GlobalMid_Lock);
698 wake_up_all(&server->response_q);
700 /* check if we have blocked requests that need to free */
701 spin_lock(&server->req_lock);
702 if (server->credits <= 0)
704 spin_unlock(&server->req_lock);
706 * Although there should not be any requests blocked on this queue it
707 * can not hurt to be paranoid and try to wake up requests that may
708 * haven been blocked when more than 50 at time were on the wire to the
709 * same server - they now will see the session is in exit state and get
710 * out of SendReceive.
712 wake_up_all(&server->request_q);
713 /* give those requests time to exit */
715 if (cifs_rdma_enabled(server) && server->smbd_conn) {
716 smbd_destroy(server->smbd_conn);
717 server->smbd_conn = NULL;
719 if (server->ssocket) {
720 sock_release(server->ssocket);
721 server->ssocket = NULL;
724 if (!list_empty(&server->pending_mid_q)) {
725 struct list_head dispose_list;
726 struct mid_q_entry *mid_entry;
727 struct list_head *tmp, *tmp2;
729 INIT_LIST_HEAD(&dispose_list);
730 spin_lock(&GlobalMid_Lock);
731 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
732 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
733 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
734 mid_entry->mid_state = MID_SHUTDOWN;
735 list_move(&mid_entry->qhead, &dispose_list);
737 spin_unlock(&GlobalMid_Lock);
739 /* now walk dispose list and issue callbacks */
740 list_for_each_safe(tmp, tmp2, &dispose_list) {
741 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
742 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
743 list_del_init(&mid_entry->qhead);
744 mid_entry->callback(mid_entry);
746 /* 1/8th of sec is more than enough time for them to exit */
750 if (!list_empty(&server->pending_mid_q)) {
752 * mpx threads have not exited yet give them at least the smb
753 * send timeout time for long ops.
755 * Due to delays on oplock break requests, we need to wait at
756 * least 45 seconds before giving up on a request getting a
757 * response and going ahead and killing cifsd.
759 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
762 * If threads still have not exited they are probably never
763 * coming home not much else we can do but free the memory.
767 kfree(server->hostname);
770 length = atomic_dec_return(&tcpSesAllocCount);
772 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
776 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
779 char *buf = server->smallbuf;
780 unsigned int pdu_length = server->pdu_size;
782 /* make sure this will fit in a large buffer */
783 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
784 server->vals->header_preamble_size) {
785 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
786 cifs_reconnect(server);
787 wake_up(&server->response_q);
788 return -ECONNABORTED;
791 /* switch to large buffer if too big for a small one */
792 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
793 server->large_buf = true;
794 memcpy(server->bigbuf, buf, server->total_read);
795 buf = server->bigbuf;
798 /* now read the rest */
799 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
800 pdu_length - HEADER_SIZE(server) + 1
801 + server->vals->header_preamble_size);
805 server->total_read += length;
807 dump_smb(buf, server->total_read);
809 return cifs_handle_standard(server, mid);
813 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
815 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
819 * We know that we received enough to get to the MID as we
820 * checked the pdu_length earlier. Now check to see
821 * if the rest of the header is OK. We borrow the length
822 * var for the rest of the loop to avoid a new stack var.
824 * 48 bytes is enough to display the header and a little bit
825 * into the payload for debugging purposes.
827 length = server->ops->check_message(buf, server->total_read, server);
829 cifs_dump_mem("Bad SMB: ", buf,
830 min_t(unsigned int, server->total_read, 48));
832 if (server->ops->is_session_expired &&
833 server->ops->is_session_expired(buf)) {
834 cifs_reconnect(server);
835 wake_up(&server->response_q);
839 if (server->ops->is_status_pending &&
840 server->ops->is_status_pending(buf, server, length))
846 handle_mid(mid, server, buf, length);
851 cifs_demultiplex_thread(void *p)
853 int i, num_mids, length;
854 struct TCP_Server_Info *server = p;
855 unsigned int pdu_length;
856 unsigned int next_offset;
858 struct task_struct *task_to_wake = NULL;
859 struct mid_q_entry *mids[MAX_COMPOUND];
860 char *bufs[MAX_COMPOUND];
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 memset(mids, 0, sizeof(mids));
928 memset(bufs, 0, sizeof(bufs));
931 if (server->ops->is_transform_hdr &&
932 server->ops->receive_transform &&
933 server->ops->is_transform_hdr(buf)) {
934 length = server->ops->receive_transform(server,
939 mids[0] = server->ops->find_mid(server, buf);
944 if (!mids[0] || !mids[0]->receive)
945 length = standard_receive3(server, mids[0]);
947 length = mids[0]->receive(server, mids[0]);
951 for (i = 0; i < num_mids; i++)
953 cifs_mid_q_entry_release(mids[i]);
957 if (server->large_buf)
958 buf = server->bigbuf;
961 server->lstrp = jiffies;
963 for (i = 0; i < num_mids; i++) {
964 if (mids[i] != NULL) {
965 mids[i]->resp_buf_size = server->pdu_size;
966 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
967 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
968 server->ops->handle_cancelled_mid)
969 server->ops->handle_cancelled_mid(
973 if (!mids[i]->multiRsp || mids[i]->multiEnd)
974 mids[i]->callback(mids[i]);
976 cifs_mid_q_entry_release(mids[i]);
977 } else if (server->ops->is_oplock_break &&
978 server->ops->is_oplock_break(bufs[i],
980 cifs_dbg(FYI, "Received oplock break\n");
982 cifs_dbg(VFS, "No task to wake, unknown frame "
983 "received! NumMids %d\n",
984 atomic_read(&midCount));
985 cifs_dump_mem("Received Data is: ", bufs[i],
986 HEADER_SIZE(server));
987 #ifdef CONFIG_CIFS_DEBUG2
988 if (server->ops->dump_detail)
989 server->ops->dump_detail(bufs[i],
991 cifs_dump_mids(server);
992 #endif /* CIFS_DEBUG2 */
996 if (pdu_length > server->pdu_size) {
997 if (!allocate_buffers(server))
999 pdu_length -= server->pdu_size;
1000 server->total_read = 0;
1001 server->large_buf = false;
1002 buf = server->smallbuf;
1005 } /* end while !EXITING */
1007 /* buffer usually freed in free_mid - need to free it here on exit */
1008 cifs_buf_release(server->bigbuf);
1009 if (server->smallbuf) /* no sense logging a debug message if NULL */
1010 cifs_small_buf_release(server->smallbuf);
1012 task_to_wake = xchg(&server->tsk, NULL);
1013 clean_demultiplex_info(server);
1015 /* if server->tsk was NULL then wait for a signal before exiting */
1016 if (!task_to_wake) {
1017 set_current_state(TASK_INTERRUPTIBLE);
1018 while (!signal_pending(current)) {
1020 set_current_state(TASK_INTERRUPTIBLE);
1022 set_current_state(TASK_RUNNING);
1025 module_put_and_exit(0);
1028 /* extract the host portion of the UNC string */
1030 extract_hostname(const char *unc)
1036 /* skip double chars at beginning of string */
1037 /* BB: check validity of these bytes? */
1040 /* delimiter between hostname and sharename is always '\\' now */
1041 delim = strchr(src, '\\');
1043 return ERR_PTR(-EINVAL);
1046 dst = kmalloc((len + 1), GFP_KERNEL);
1048 return ERR_PTR(-ENOMEM);
1050 memcpy(dst, src, len);
1056 static int get_option_ul(substring_t args[], unsigned long *option)
1061 string = match_strdup(args);
1064 rc = kstrtoul(string, 0, option);
1070 static int get_option_uid(substring_t args[], kuid_t *result)
1072 unsigned long value;
1076 rc = get_option_ul(args, &value);
1080 uid = make_kuid(current_user_ns(), value);
1081 if (!uid_valid(uid))
1088 static int get_option_gid(substring_t args[], kgid_t *result)
1090 unsigned long value;
1094 rc = get_option_ul(args, &value);
1098 gid = make_kgid(current_user_ns(), value);
1099 if (!gid_valid(gid))
1106 static int cifs_parse_security_flavors(char *value,
1107 struct smb_vol *vol)
1110 substring_t args[MAX_OPT_ARGS];
1113 * With mount options, the last one should win. Reset any existing
1114 * settings back to default.
1116 vol->sectype = Unspecified;
1119 switch (match_token(value, cifs_secflavor_tokens, args)) {
1121 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1127 vol->sectype = Kerberos;
1129 case Opt_sec_ntlmsspi:
1132 case Opt_sec_ntlmssp:
1133 vol->sectype = RawNTLMSSP;
1139 vol->sectype = NTLM;
1141 case Opt_sec_ntlmv2i:
1144 case Opt_sec_ntlmv2:
1145 vol->sectype = NTLMv2;
1147 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1148 case Opt_sec_lanman:
1149 vol->sectype = LANMAN;
1156 cifs_dbg(VFS, "bad security option: %s\n", value);
1164 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1166 substring_t args[MAX_OPT_ARGS];
1168 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1169 case Opt_cache_loose:
1170 vol->direct_io = false;
1171 vol->strict_io = false;
1173 case Opt_cache_strict:
1174 vol->direct_io = false;
1175 vol->strict_io = true;
1177 case Opt_cache_none:
1178 vol->direct_io = true;
1179 vol->strict_io = false;
1182 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1189 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1191 substring_t args[MAX_OPT_ARGS];
1193 switch (match_token(value, cifs_smb_version_tokens, args)) {
1194 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1196 if (disable_legacy_dialects) {
1197 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1201 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1204 vol->ops = &smb1_operations;
1205 vol->vals = &smb1_values;
1208 if (disable_legacy_dialects) {
1209 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1213 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1216 vol->ops = &smb20_operations;
1217 vol->vals = &smb20_values;
1221 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1224 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1226 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1228 vol->ops = &smb21_operations;
1229 vol->vals = &smb21_values;
1232 vol->ops = &smb30_operations;
1233 vol->vals = &smb30_values;
1236 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1237 vol->vals = &smb302_values;
1240 vol->ops = &smb311_operations;
1241 vol->vals = &smb311_values;
1244 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1245 vol->vals = &smb3any_values;
1248 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1249 vol->vals = &smbdefault_values;
1252 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1259 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1260 * fields with the result. Returns 0 on success and an error otherwise.
1263 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1266 const char *delims = "/\\";
1269 /* make sure we have a valid UNC double delimiter prefix */
1270 len = strspn(devname, delims);
1274 /* find delimiter between host and sharename */
1275 pos = strpbrk(devname + 2, delims);
1279 /* skip past delimiter */
1282 /* now go until next delimiter or end of string */
1283 len = strcspn(pos, delims);
1285 /* move "pos" up to delimiter or NULL */
1287 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1291 convert_delimiter(vol->UNC, '\\');
1293 /* skip any delimiter */
1294 if (*pos == '/' || *pos == '\\')
1297 /* If pos is NULL then no prepath */
1301 vol->prepath = kstrdup(pos, GFP_KERNEL);
1309 cifs_parse_mount_options(const char *mountdata, const char *devname,
1310 struct smb_vol *vol, bool is_smb3)
1313 char *mountdata_copy = NULL, *options;
1314 unsigned int temp_len, i, j;
1316 short int override_uid = -1;
1317 short int override_gid = -1;
1318 bool uid_specified = false;
1319 bool gid_specified = false;
1320 bool sloppy = false;
1321 char *invalid = NULL;
1322 char *nodename = utsname()->nodename;
1323 char *string = NULL;
1324 char *tmp_end, *value;
1326 bool got_ip = false;
1327 bool got_version = false;
1328 unsigned short port = 0;
1329 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1333 delim = separator[0];
1335 /* ensure we always start with zeroed-out smb_vol */
1336 memset(vol, 0, sizeof(*vol));
1339 * does not have to be perfect mapping since field is
1340 * informational, only used for servers that do not support
1341 * port 445 and it can be overridden at mount time
1343 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1344 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1345 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1347 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1348 /* null target name indicates to use *SMBSERVR default called name
1349 if we end up sending RFC1001 session initialize */
1350 vol->target_rfc1001_name[0] = 0;
1351 vol->cred_uid = current_uid();
1352 vol->linux_uid = current_uid();
1353 vol->linux_gid = current_gid();
1356 * default to SFM style remapping of seven reserved characters
1357 * unless user overrides it or we negotiate CIFS POSIX where
1358 * it is unnecessary. Can not simultaneously use more than one mapping
1359 * since then readdir could list files that open could not open
1363 /* default to only allowing write access to owner of the mount */
1364 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1366 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1367 /* default is always to request posix paths. */
1368 vol->posix_paths = 1;
1369 /* default to using server inode numbers where available */
1370 vol->server_ino = 1;
1372 /* default is to use strict cifs caching semantics */
1373 vol->strict_io = true;
1375 vol->actimeo = CIFS_DEF_ACTIMEO;
1377 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1378 vol->ops = &smb30_operations;
1379 vol->vals = &smbdefault_values;
1381 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1384 goto cifs_parse_mount_err;
1386 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1387 if (!mountdata_copy)
1388 goto cifs_parse_mount_err;
1390 options = mountdata_copy;
1391 end = options + strlen(options);
1393 if (strncmp(options, "sep=", 4) == 0) {
1394 if (options[4] != 0) {
1395 separator[0] = options[4];
1398 cifs_dbg(FYI, "Null separator not allowed\n");
1401 vol->backupuid_specified = false; /* no backup intent for a user */
1402 vol->backupgid_specified = false; /* no backup intent for a group */
1404 switch (cifs_parse_devname(devname, vol)) {
1408 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1409 goto cifs_parse_mount_err;
1411 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1412 goto cifs_parse_mount_err;
1414 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1415 goto cifs_parse_mount_err;
1418 while ((data = strsep(&options, separator)) != NULL) {
1419 substring_t args[MAX_OPT_ARGS];
1420 unsigned long option;
1426 token = match_token(data, cifs_mount_option_tokens, args);
1430 /* Ingnore the following */
1434 /* Boolean values */
1435 case Opt_user_xattr:
1438 case Opt_nouser_xattr:
1444 case Opt_noforceuid:
1450 case Opt_noforcegid:
1453 case Opt_noblocksend:
1454 vol->noblocksnd = 1;
1456 case Opt_noautotune:
1457 vol->noautotune = 1;
1472 vol->sfu_remap = true;
1473 vol->remap = false; /* disable SFM mapping */
1475 case Opt_nomapchars:
1476 vol->sfu_remap = false;
1480 vol->sfu_remap = false; /* disable SFU mapping */
1482 case Opt_nomapposix:
1494 case Opt_posixpaths:
1495 vol->posix_paths = 1;
1497 case Opt_noposixpaths:
1498 vol->posix_paths = 0;
1503 "conflicting unix mount options\n");
1504 vol->no_linux_ext = 1;
1507 if (vol->no_linux_ext)
1509 "conflicting unix mount options\n");
1521 * turn off mandatory locking in mode
1522 * if remote locking is turned off since the
1523 * local vfs will do advisory
1525 if (vol->file_mode ==
1526 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1527 vol->file_mode = S_IALLUGO;
1529 case Opt_nohandlecache:
1530 vol->nohandlecache = 1;
1532 case Opt_handlecache:
1533 vol->nohandlecache = 0;
1535 case Opt_forcemandatorylock:
1544 case Opt_setuidfromacl:
1545 vol->setuidfromacl = 1;
1548 vol->dynperm = true;
1551 vol->dynperm = false;
1565 case Opt_nostrictsync:
1566 vol->nostrictsync = 1;
1568 case Opt_strictsync:
1569 vol->nostrictsync = 0;
1572 vol->server_ino = 1;
1574 case Opt_noserverino:
1575 vol->server_ino = 0;
1577 case Opt_rwpidforward:
1578 vol->rwpidforward = 1;
1587 vol->no_psx_acl = 0;
1590 vol->no_psx_acl = 1;
1592 case Opt_locallease:
1593 vol->local_lease = 1;
1599 /* we do not do the following in secFlags because seal
1600 * is a per tree connection (mount) not a per socket
1601 * or per-smb connection option in the protocol
1602 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1607 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1610 #ifndef CONFIG_CIFS_FSCACHE
1611 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1612 goto cifs_parse_mount_err;
1616 case Opt_mfsymlinks:
1617 vol->mfsymlinks = true;
1620 vol->multiuser = true;
1625 case Opt_nosharesock:
1626 vol->nosharesock = true;
1628 case Opt_nopersistent:
1629 vol->nopersistent = true;
1630 if (vol->persistent) {
1632 "persistenthandles mount options conflict\n");
1633 goto cifs_parse_mount_err;
1636 case Opt_persistent:
1637 vol->persistent = true;
1638 if ((vol->nopersistent) || (vol->resilient)) {
1640 "persistenthandles mount options conflict\n");
1641 goto cifs_parse_mount_err;
1645 vol->resilient = true;
1646 if (vol->persistent) {
1648 "persistenthandles mount options conflict\n");
1649 goto cifs_parse_mount_err;
1652 case Opt_noresilient:
1653 vol->resilient = false; /* already the default */
1655 case Opt_domainauto:
1656 vol->domainauto = true;
1662 /* Numeric Values */
1664 if (get_option_uid(args, &vol->backupuid)) {
1665 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1667 goto cifs_parse_mount_err;
1669 vol->backupuid_specified = true;
1672 if (get_option_gid(args, &vol->backupgid)) {
1673 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1675 goto cifs_parse_mount_err;
1677 vol->backupgid_specified = true;
1680 if (get_option_uid(args, &vol->linux_uid)) {
1681 cifs_dbg(VFS, "%s: Invalid uid value\n",
1683 goto cifs_parse_mount_err;
1685 uid_specified = true;
1688 if (get_option_uid(args, &vol->cred_uid)) {
1689 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1691 goto cifs_parse_mount_err;
1695 if (get_option_gid(args, &vol->linux_gid)) {
1696 cifs_dbg(VFS, "%s: Invalid gid value\n",
1698 goto cifs_parse_mount_err;
1700 gid_specified = true;
1703 if (get_option_ul(args, &option)) {
1704 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1706 goto cifs_parse_mount_err;
1708 vol->file_mode = option;
1711 if (get_option_ul(args, &option)) {
1712 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1714 goto cifs_parse_mount_err;
1716 vol->dir_mode = option;
1719 if (get_option_ul(args, &option) ||
1720 option > USHRT_MAX) {
1721 cifs_dbg(VFS, "%s: Invalid port value\n",
1723 goto cifs_parse_mount_err;
1725 port = (unsigned short)option;
1728 if (get_option_ul(args, &option)) {
1729 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1731 goto cifs_parse_mount_err;
1733 vol->rsize = option;
1736 if (get_option_ul(args, &option)) {
1737 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1739 goto cifs_parse_mount_err;
1741 vol->wsize = option;
1744 if (get_option_ul(args, &option)) {
1745 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1747 goto cifs_parse_mount_err;
1749 vol->actimeo = HZ * option;
1750 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1751 cifs_dbg(VFS, "attribute cache timeout too large\n");
1752 goto cifs_parse_mount_err;
1755 case Opt_echo_interval:
1756 if (get_option_ul(args, &option)) {
1757 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1759 goto cifs_parse_mount_err;
1761 vol->echo_interval = option;
1764 if (get_option_ul(args, &option)) {
1765 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1767 goto cifs_parse_mount_err;
1769 vol->snapshot_time = option;
1771 case Opt_max_credits:
1772 if (get_option_ul(args, &option) || (option < 20) ||
1774 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1776 goto cifs_parse_mount_err;
1778 vol->max_credits = option;
1781 /* String Arguments */
1783 case Opt_blank_user:
1784 /* null user, ie. anonymous authentication */
1786 vol->username = NULL;
1789 string = match_strdup(args);
1793 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1794 CIFS_MAX_USERNAME_LEN) {
1795 pr_warn("CIFS: username too long\n");
1796 goto cifs_parse_mount_err;
1799 kfree(vol->username);
1800 vol->username = kstrdup(string, GFP_KERNEL);
1802 goto cifs_parse_mount_err;
1804 case Opt_blank_pass:
1805 /* passwords have to be handled differently
1806 * to allow the character used for deliminator
1807 * to be passed within them
1811 * Check if this is a case where the password
1812 * starts with a delimiter
1814 tmp_end = strchr(data, '=');
1816 if (!(tmp_end < end && tmp_end[1] == delim)) {
1817 /* No it is not. Set the password to NULL */
1818 kzfree(vol->password);
1819 vol->password = NULL;
1822 /* Yes it is. Drop down to Opt_pass below.*/
1824 /* Obtain the value string */
1825 value = strchr(data, '=');
1828 /* Set tmp_end to end of the string */
1829 tmp_end = (char *) value + strlen(value);
1831 /* Check if following character is the deliminator
1832 * If yes, we have encountered a double deliminator
1833 * reset the NULL character to the deliminator
1835 if (tmp_end < end && tmp_end[1] == delim) {
1838 /* Keep iterating until we get to a single
1839 * deliminator OR the end
1841 while ((tmp_end = strchr(tmp_end, delim))
1842 != NULL && (tmp_end[1] == delim)) {
1843 tmp_end = (char *) &tmp_end[2];
1846 /* Reset var options to point to next element */
1849 options = (char *) &tmp_end[1];
1851 /* Reached the end of the mount option
1856 kzfree(vol->password);
1857 /* Now build new password string */
1858 temp_len = strlen(value);
1859 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1860 if (vol->password == NULL) {
1861 pr_warn("CIFS: no memory for password\n");
1862 goto cifs_parse_mount_err;
1865 for (i = 0, j = 0; i < temp_len; i++, j++) {
1866 vol->password[j] = value[i];
1867 if ((value[i] == delim) &&
1868 value[i+1] == delim)
1869 /* skip the second deliminator */
1872 vol->password[j] = '\0';
1875 /* FIXME: should this be an error instead? */
1879 string = match_strdup(args);
1883 if (!cifs_convert_address(dstaddr, string,
1885 pr_err("CIFS: bad ip= option (%s).\n", string);
1886 goto cifs_parse_mount_err;
1891 string = match_strdup(args);
1895 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1896 == CIFS_MAX_DOMAINNAME_LEN) {
1897 pr_warn("CIFS: domain name too long\n");
1898 goto cifs_parse_mount_err;
1901 kfree(vol->domainname);
1902 vol->domainname = kstrdup(string, GFP_KERNEL);
1903 if (!vol->domainname) {
1904 pr_warn("CIFS: no memory for domainname\n");
1905 goto cifs_parse_mount_err;
1907 cifs_dbg(FYI, "Domain name set\n");
1910 string = match_strdup(args);
1914 if (!cifs_convert_address(
1915 (struct sockaddr *)&vol->srcaddr,
1916 string, strlen(string))) {
1917 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1919 goto cifs_parse_mount_err;
1923 string = match_strdup(args);
1927 if (strnlen(string, 1024) >= 65) {
1928 pr_warn("CIFS: iocharset name too long.\n");
1929 goto cifs_parse_mount_err;
1932 if (strncasecmp(string, "default", 7) != 0) {
1933 kfree(vol->iocharset);
1934 vol->iocharset = kstrdup(string,
1936 if (!vol->iocharset) {
1937 pr_warn("CIFS: no memory for charset\n");
1938 goto cifs_parse_mount_err;
1941 /* if iocharset not set then load_nls_default
1944 cifs_dbg(FYI, "iocharset set to %s\n", string);
1946 case Opt_netbiosname:
1947 string = match_strdup(args);
1951 memset(vol->source_rfc1001_name, 0x20,
1954 * FIXME: are there cases in which a comma can
1955 * be valid in workstation netbios name (and
1956 * need special handling)?
1958 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1959 /* don't ucase netbiosname for user */
1962 vol->source_rfc1001_name[i] = string[i];
1964 /* The string has 16th byte zero still from
1965 * set at top of the function
1967 if (i == RFC1001_NAME_LEN && string[i] != 0)
1968 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1971 /* servernetbiosname specified override *SMBSERVER */
1972 string = match_strdup(args);
1976 /* last byte, type, is 0x20 for servr type */
1977 memset(vol->target_rfc1001_name, 0x20,
1978 RFC1001_NAME_LEN_WITH_NULL);
1980 /* BB are there cases in which a comma can be
1981 valid in this workstation netbios name
1982 (and need special handling)? */
1984 /* user or mount helper must uppercase the
1986 for (i = 0; i < 15; i++) {
1989 vol->target_rfc1001_name[i] = string[i];
1991 /* The string has 16th byte zero still from
1992 set at top of the function */
1993 if (i == RFC1001_NAME_LEN && string[i] != 0)
1994 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1997 /* version of mount userspace tools, not dialect */
1998 string = match_strdup(args);
2002 /* If interface changes in mount.cifs bump to new ver */
2003 if (strncasecmp(string, "1", 1) == 0) {
2004 if (strlen(string) > 1) {
2005 pr_warn("Bad mount helper ver=%s. Did "
2006 "you want SMB1 (CIFS) dialect "
2007 "and mean to type vers=1.0 "
2008 "instead?\n", string);
2009 goto cifs_parse_mount_err;
2011 /* This is the default */
2014 /* For all other value, error */
2015 pr_warn("CIFS: Invalid mount helper version specified\n");
2016 goto cifs_parse_mount_err;
2018 /* protocol version (dialect) */
2019 string = match_strdup(args);
2023 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2024 goto cifs_parse_mount_err;
2028 string = match_strdup(args);
2032 if (cifs_parse_security_flavors(string, vol) != 0)
2033 goto cifs_parse_mount_err;
2036 string = match_strdup(args);
2040 if (cifs_parse_cache_flavor(string, vol) != 0)
2041 goto cifs_parse_mount_err;
2045 * An option we don't recognize. Save it off for later
2046 * if we haven't already found one
2052 /* Free up any allocated string */
2057 if (!sloppy && invalid) {
2058 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2059 goto cifs_parse_mount_err;
2062 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2063 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2064 goto cifs_parse_mount_err;
2068 /* Muliuser mounts require CONFIG_KEYS support */
2069 if (vol->multiuser) {
2070 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2071 goto cifs_parse_mount_err;
2075 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2076 goto cifs_parse_mount_err;
2079 /* make sure UNC has a share name */
2080 if (!strchr(vol->UNC + 3, '\\')) {
2081 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2082 goto cifs_parse_mount_err;
2089 /* No ip= option specified? Try to get it from UNC */
2090 /* Use the address part of the UNC. */
2091 slash = strchr(&vol->UNC[2], '\\');
2092 len = slash - &vol->UNC[2];
2093 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2094 pr_err("Unable to determine destination address.\n");
2095 goto cifs_parse_mount_err;
2099 /* set the port that we got earlier */
2100 cifs_set_port(dstaddr, port);
2103 vol->override_uid = override_uid;
2104 else if (override_uid == 1)
2105 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2108 vol->override_gid = override_gid;
2109 else if (override_gid == 1)
2110 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2112 if (got_version == false)
2113 pr_warn("No dialect specified on mount. Default has changed to "
2114 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2115 "(SMB1). To use the less secure SMB1 dialect to access "
2116 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2119 kfree(mountdata_copy);
2123 pr_warn("Could not allocate temporary buffer\n");
2124 cifs_parse_mount_err:
2126 kfree(mountdata_copy);
2130 /** Returns true if srcaddr isn't specified and rhs isn't
2131 * specified, or if srcaddr is specified and
2132 * matches the IP address of the rhs argument.
2135 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2137 switch (srcaddr->sa_family) {
2139 return (rhs->sa_family == AF_UNSPEC);
2141 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2142 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2143 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2146 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2147 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2148 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2152 return false; /* don't expect to be here */
2157 * If no port is specified in addr structure, we try to match with 445 port
2158 * and if it fails - with 139 ports. It should be called only if address
2159 * families of server and addr are equal.
2162 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2164 __be16 port, *sport;
2166 switch (addr->sa_family) {
2168 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2169 port = ((struct sockaddr_in *) addr)->sin_port;
2172 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2173 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2181 port = htons(CIFS_PORT);
2185 port = htons(RFC1001_PORT);
2188 return port == *sport;
2192 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2193 struct sockaddr *srcaddr)
2195 switch (addr->sa_family) {
2197 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2198 struct sockaddr_in *srv_addr4 =
2199 (struct sockaddr_in *)&server->dstaddr;
2201 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2206 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2207 struct sockaddr_in6 *srv_addr6 =
2208 (struct sockaddr_in6 *)&server->dstaddr;
2210 if (!ipv6_addr_equal(&addr6->sin6_addr,
2211 &srv_addr6->sin6_addr))
2213 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2219 return false; /* don't expect to be here */
2222 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2229 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2232 * The select_sectype function should either return the vol->sectype
2233 * that was specified, or "Unspecified" if that sectype was not
2234 * compatible with the given NEGOTIATE request.
2236 if (server->ops->select_sectype(server, vol->sectype)
2241 * Now check if signing mode is acceptable. No need to check
2242 * global_secflags at this point since if MUST_SIGN is set then
2243 * the server->sign had better be too.
2245 if (vol->sign && !server->sign)
2251 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2253 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2255 if (vol->nosharesock)
2258 /* BB update this for smb3any and default case */
2259 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2262 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2265 if (!match_address(server, addr,
2266 (struct sockaddr *)&vol->srcaddr))
2269 if (!match_port(server, addr))
2272 if (!match_security(server, vol))
2275 if (server->echo_interval != vol->echo_interval * HZ)
2278 if (server->rdma != vol->rdma)
2284 static struct TCP_Server_Info *
2285 cifs_find_tcp_session(struct smb_vol *vol)
2287 struct TCP_Server_Info *server;
2289 spin_lock(&cifs_tcp_ses_lock);
2290 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2291 if (!match_server(server, vol))
2294 ++server->srv_count;
2295 spin_unlock(&cifs_tcp_ses_lock);
2296 cifs_dbg(FYI, "Existing tcp session with server found\n");
2299 spin_unlock(&cifs_tcp_ses_lock);
2304 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2306 struct task_struct *task;
2308 spin_lock(&cifs_tcp_ses_lock);
2309 if (--server->srv_count > 0) {
2310 spin_unlock(&cifs_tcp_ses_lock);
2314 put_net(cifs_net_ns(server));
2316 list_del_init(&server->tcp_ses_list);
2317 spin_unlock(&cifs_tcp_ses_lock);
2319 cancel_delayed_work_sync(&server->echo);
2323 * Avoid deadlock here: reconnect work calls
2324 * cifs_put_tcp_session() at its end. Need to be sure
2325 * that reconnect work does nothing with server pointer after
2328 cancel_delayed_work(&server->reconnect);
2330 cancel_delayed_work_sync(&server->reconnect);
2332 spin_lock(&GlobalMid_Lock);
2333 server->tcpStatus = CifsExiting;
2334 spin_unlock(&GlobalMid_Lock);
2336 cifs_crypto_secmech_release(server);
2337 cifs_fscache_release_client_cookie(server);
2339 kfree(server->session_key.response);
2340 server->session_key.response = NULL;
2341 server->session_key.len = 0;
2343 task = xchg(&server->tsk, NULL);
2345 force_sig(SIGKILL, task);
2348 static struct TCP_Server_Info *
2349 cifs_get_tcp_session(struct smb_vol *volume_info)
2351 struct TCP_Server_Info *tcp_ses = NULL;
2354 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2356 /* see if we already have a matching tcp_ses */
2357 tcp_ses = cifs_find_tcp_session(volume_info);
2361 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2367 tcp_ses->ops = volume_info->ops;
2368 tcp_ses->vals = volume_info->vals;
2369 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2370 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2371 if (IS_ERR(tcp_ses->hostname)) {
2372 rc = PTR_ERR(tcp_ses->hostname);
2373 goto out_err_crypto_release;
2376 tcp_ses->noblocksnd = volume_info->noblocksnd;
2377 tcp_ses->noautotune = volume_info->noautotune;
2378 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2379 tcp_ses->rdma = volume_info->rdma;
2380 tcp_ses->in_flight = 0;
2381 tcp_ses->credits = 1;
2382 init_waitqueue_head(&tcp_ses->response_q);
2383 init_waitqueue_head(&tcp_ses->request_q);
2384 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2385 mutex_init(&tcp_ses->srv_mutex);
2386 memcpy(tcp_ses->workstation_RFC1001_name,
2387 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2388 memcpy(tcp_ses->server_RFC1001_name,
2389 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2390 tcp_ses->session_estab = false;
2391 tcp_ses->sequence_number = 0;
2392 tcp_ses->lstrp = jiffies;
2393 spin_lock_init(&tcp_ses->req_lock);
2394 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2395 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2396 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2397 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2398 mutex_init(&tcp_ses->reconnect_mutex);
2399 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2400 sizeof(tcp_ses->srcaddr));
2401 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2402 sizeof(tcp_ses->dstaddr));
2403 generate_random_uuid(tcp_ses->client_guid);
2405 * at this point we are the only ones with the pointer
2406 * to the struct since the kernel thread not created yet
2407 * no need to spinlock this init of tcpStatus or srv_count
2409 tcp_ses->tcpStatus = CifsNew;
2410 ++tcp_ses->srv_count;
2412 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2413 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2414 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2416 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2417 if (tcp_ses->rdma) {
2418 #ifndef CONFIG_CIFS_SMB_DIRECT
2419 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2421 goto out_err_crypto_release;
2423 tcp_ses->smbd_conn = smbd_get_connection(
2424 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2425 if (tcp_ses->smbd_conn) {
2426 cifs_dbg(VFS, "RDMA transport established\n");
2428 goto smbd_connected;
2431 goto out_err_crypto_release;
2434 rc = ip_connect(tcp_ses);
2436 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2437 goto out_err_crypto_release;
2441 * since we're in a cifs function already, we know that
2442 * this will succeed. No need for try_module_get().
2444 __module_get(THIS_MODULE);
2445 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2447 if (IS_ERR(tcp_ses->tsk)) {
2448 rc = PTR_ERR(tcp_ses->tsk);
2449 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2450 module_put(THIS_MODULE);
2451 goto out_err_crypto_release;
2453 tcp_ses->tcpStatus = CifsNeedNegotiate;
2455 /* thread spawned, put it on the list */
2456 spin_lock(&cifs_tcp_ses_lock);
2457 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2458 spin_unlock(&cifs_tcp_ses_lock);
2460 cifs_fscache_get_client_cookie(tcp_ses);
2462 /* queue echo request delayed work */
2463 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2467 out_err_crypto_release:
2468 cifs_crypto_secmech_release(tcp_ses);
2470 put_net(cifs_net_ns(tcp_ses));
2474 if (!IS_ERR(tcp_ses->hostname))
2475 kfree(tcp_ses->hostname);
2476 if (tcp_ses->ssocket)
2477 sock_release(tcp_ses->ssocket);
2483 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2485 if (vol->sectype != Unspecified &&
2486 vol->sectype != ses->sectype)
2489 switch (ses->sectype) {
2491 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2495 /* NULL username means anonymous session */
2496 if (ses->user_name == NULL) {
2502 /* anything else takes username/password */
2503 if (strncmp(ses->user_name,
2504 vol->username ? vol->username : "",
2505 CIFS_MAX_USERNAME_LEN))
2507 if ((vol->username && strlen(vol->username) != 0) &&
2508 ses->password != NULL &&
2509 strncmp(ses->password,
2510 vol->password ? vol->password : "",
2511 CIFS_MAX_PASSWORD_LEN))
2518 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2520 * A new IPC connection is made and stored in the session
2521 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2524 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2527 struct cifs_tcon *tcon;
2528 struct nls_table *nls_codepage;
2529 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2533 * If the mount request that resulted in the creation of the
2534 * session requires encryption, force IPC to be encrypted too.
2536 if (volume_info->seal) {
2537 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2541 "IPC: server doesn't support encryption\n");
2546 tcon = tconInfoAlloc();
2550 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->serverName);
2553 nls_codepage = load_nls_default();
2559 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2563 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2568 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2570 ses->tcon_ipc = tcon;
2572 unload_nls(nls_codepage);
2577 * cifs_free_ipc - helper to release the session IPC tcon
2579 * Needs to be called everytime a session is destroyed
2582 cifs_free_ipc(struct cifs_ses *ses)
2585 struct cifs_tcon *tcon = ses->tcon_ipc;
2590 if (ses->server->ops->tree_disconnect) {
2592 rc = ses->server->ops->tree_disconnect(xid, tcon);
2597 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2600 ses->tcon_ipc = NULL;
2604 static struct cifs_ses *
2605 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2607 struct cifs_ses *ses;
2609 spin_lock(&cifs_tcp_ses_lock);
2610 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2611 if (ses->status == CifsExiting)
2613 if (!match_session(ses, vol))
2616 spin_unlock(&cifs_tcp_ses_lock);
2619 spin_unlock(&cifs_tcp_ses_lock);
2624 cifs_put_smb_ses(struct cifs_ses *ses)
2626 unsigned int rc, xid;
2627 struct TCP_Server_Info *server = ses->server;
2629 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2631 spin_lock(&cifs_tcp_ses_lock);
2632 if (ses->status == CifsExiting) {
2633 spin_unlock(&cifs_tcp_ses_lock);
2636 if (--ses->ses_count > 0) {
2637 spin_unlock(&cifs_tcp_ses_lock);
2640 if (ses->status == CifsGood)
2641 ses->status = CifsExiting;
2642 spin_unlock(&cifs_tcp_ses_lock);
2646 if (ses->status == CifsExiting && server->ops->logoff) {
2648 rc = server->ops->logoff(xid, ses);
2650 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2655 spin_lock(&cifs_tcp_ses_lock);
2656 list_del_init(&ses->smb_ses_list);
2657 spin_unlock(&cifs_tcp_ses_lock);
2660 cifs_put_tcp_session(server, 0);
2665 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2666 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2668 /* Populate username and pw fields from keyring if possible */
2670 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2673 const char *delim, *payload;
2677 struct TCP_Server_Info *server = ses->server;
2678 struct sockaddr_in *sa;
2679 struct sockaddr_in6 *sa6;
2680 const struct user_key_payload *upayload;
2682 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2686 /* try to find an address key first */
2687 switch (server->dstaddr.ss_family) {
2689 sa = (struct sockaddr_in *)&server->dstaddr;
2690 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2693 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2694 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2697 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2698 server->dstaddr.ss_family);
2703 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2704 key = request_key(&key_type_logon, desc, "");
2706 if (!ses->domainName) {
2707 cifs_dbg(FYI, "domainName is NULL\n");
2712 /* didn't work, try to find a domain key */
2713 sprintf(desc, "cifs:d:%s", ses->domainName);
2714 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2715 key = request_key(&key_type_logon, desc, "");
2722 down_read(&key->sem);
2723 upayload = user_key_payload_locked(key);
2724 if (IS_ERR_OR_NULL(upayload)) {
2725 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2729 /* find first : in payload */
2730 payload = upayload->data;
2731 delim = strnchr(payload, upayload->datalen, ':');
2732 cifs_dbg(FYI, "payload=%s\n", payload);
2734 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2740 len = delim - payload;
2741 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2742 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2748 vol->username = kstrndup(payload, len, GFP_KERNEL);
2749 if (!vol->username) {
2750 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2755 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2757 len = key->datalen - (len + 1);
2758 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2759 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2761 kfree(vol->username);
2762 vol->username = NULL;
2767 vol->password = kstrndup(delim, len, GFP_KERNEL);
2768 if (!vol->password) {
2769 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2772 kfree(vol->username);
2773 vol->username = NULL;
2782 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2785 #else /* ! CONFIG_KEYS */
2787 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2788 struct cifs_ses *ses __attribute__((unused)))
2792 #endif /* CONFIG_KEYS */
2795 * cifs_get_smb_ses - get a session matching @volume_info data from @server
2797 * This function assumes it is being called from cifs_mount() where we
2798 * already got a server reference (server refcount +1). See
2799 * cifs_get_tcon() for refcount explanations.
2801 static struct cifs_ses *
2802 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2806 struct cifs_ses *ses;
2807 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2808 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2812 ses = cifs_find_smb_ses(server, volume_info);
2814 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2817 mutex_lock(&ses->session_mutex);
2818 rc = cifs_negotiate_protocol(xid, ses);
2820 mutex_unlock(&ses->session_mutex);
2821 /* problem -- put our ses reference */
2822 cifs_put_smb_ses(ses);
2826 if (ses->need_reconnect) {
2827 cifs_dbg(FYI, "Session needs reconnect\n");
2828 rc = cifs_setup_session(xid, ses,
2829 volume_info->local_nls);
2831 mutex_unlock(&ses->session_mutex);
2832 /* problem -- put our reference */
2833 cifs_put_smb_ses(ses);
2838 mutex_unlock(&ses->session_mutex);
2840 /* existing SMB ses has a server reference already */
2841 cifs_put_tcp_session(server, 0);
2846 cifs_dbg(FYI, "Existing smb sess not found\n");
2847 ses = sesInfoAlloc();
2851 /* new SMB session uses our server ref */
2852 ses->server = server;
2853 if (server->dstaddr.ss_family == AF_INET6)
2854 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2856 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2858 if (volume_info->username) {
2859 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2860 if (!ses->user_name)
2864 /* volume_info->password freed at unmount */
2865 if (volume_info->password) {
2866 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2870 if (volume_info->domainname) {
2871 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2872 if (!ses->domainName)
2875 if (volume_info->domainauto)
2876 ses->domainAuto = volume_info->domainauto;
2877 ses->cred_uid = volume_info->cred_uid;
2878 ses->linux_uid = volume_info->linux_uid;
2880 ses->sectype = volume_info->sectype;
2881 ses->sign = volume_info->sign;
2883 mutex_lock(&ses->session_mutex);
2884 rc = cifs_negotiate_protocol(xid, ses);
2886 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2887 mutex_unlock(&ses->session_mutex);
2891 /* success, put it on the list */
2892 spin_lock(&cifs_tcp_ses_lock);
2893 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2894 spin_unlock(&cifs_tcp_ses_lock);
2898 cifs_setup_ipc(ses, volume_info);
2908 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
2910 if (tcon->tidStatus == CifsExiting)
2912 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
2914 if (tcon->seal != volume_info->seal)
2916 if (tcon->snapshot_time != volume_info->snapshot_time)
2921 static struct cifs_tcon *
2922 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2924 struct list_head *tmp;
2925 struct cifs_tcon *tcon;
2927 spin_lock(&cifs_tcp_ses_lock);
2928 list_for_each(tmp, &ses->tcon_list) {
2929 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2930 if (!match_tcon(tcon, volume_info))
2933 spin_unlock(&cifs_tcp_ses_lock);
2936 spin_unlock(&cifs_tcp_ses_lock);
2941 cifs_put_tcon(struct cifs_tcon *tcon)
2944 struct cifs_ses *ses;
2947 * IPC tcon share the lifetime of their session and are
2948 * destroyed in the session put function
2950 if (tcon == NULL || tcon->ipc)
2954 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2955 spin_lock(&cifs_tcp_ses_lock);
2956 if (--tcon->tc_count > 0) {
2957 spin_unlock(&cifs_tcp_ses_lock);
2961 list_del_init(&tcon->tcon_list);
2962 spin_unlock(&cifs_tcp_ses_lock);
2965 if (ses->server->ops->tree_disconnect)
2966 ses->server->ops->tree_disconnect(xid, tcon);
2969 cifs_fscache_release_super_cookie(tcon);
2971 cifs_put_smb_ses(ses);
2975 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
2977 * - tcon refcount is the number of mount points using the tcon.
2978 * - ses refcount is the number of tcon using the session.
2980 * 1. This function assumes it is being called from cifs_mount() where
2981 * we already got a session reference (ses refcount +1).
2983 * 2. Since we're in the context of adding a mount point, the end
2984 * result should be either:
2986 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2987 * its session refcount incremented (1 new tcon). This +1 was
2988 * already done in (1).
2990 * b) an existing tcon with refcount+1 (add a mount point to it) and
2991 * identical ses refcount (no new tcon). Because of (1) we need to
2992 * decrement the ses refcount.
2994 static struct cifs_tcon *
2995 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2998 struct cifs_tcon *tcon;
3000 tcon = cifs_find_tcon(ses, volume_info);
3003 * tcon has refcount already incremented but we need to
3004 * decrement extra ses reference gotten by caller (case b)
3006 cifs_dbg(FYI, "Found match on UNC path\n");
3007 cifs_put_smb_ses(ses);
3011 if (!ses->server->ops->tree_connect) {
3016 tcon = tconInfoAlloc();
3022 if (volume_info->snapshot_time) {
3023 if (ses->server->vals->protocol_id == 0) {
3025 "Use SMB2 or later for snapshot mount option\n");
3029 tcon->snapshot_time = volume_info->snapshot_time;
3033 if (volume_info->password) {
3034 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3035 if (!tcon->password) {
3041 if (volume_info->seal) {
3042 if (ses->server->vals->protocol_id == 0) {
3044 "SMB3 or later required for encryption\n");
3047 } else if (tcon->ses->server->capabilities &
3048 SMB2_GLOBAL_CAP_ENCRYPTION)
3051 cifs_dbg(VFS, "Encryption is not supported on share\n");
3057 if (volume_info->linux_ext) {
3058 if (ses->server->posix_ext_supported) {
3059 tcon->posix_extensions = true;
3060 printk_once(KERN_WARNING
3061 "SMB3.11 POSIX Extensions are experimental\n");
3063 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3070 * BB Do we need to wrap session_mutex around this TCon call and Unix
3071 * SetFS as we do on SessSetup and reconnect?
3074 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3075 volume_info->local_nls);
3077 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3081 if (volume_info->nodfs) {
3082 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
3083 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
3085 tcon->use_persistent = false;
3086 /* check if SMB2 or later, CIFS does not support persistent handles */
3087 if (volume_info->persistent) {
3088 if (ses->server->vals->protocol_id == 0) {
3090 "SMB3 or later required for persistent handles\n");
3093 } else if (ses->server->capabilities &
3094 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3095 tcon->use_persistent = true;
3096 else /* persistent handles requested but not supported */ {
3098 "Persistent handles not supported on share\n");
3102 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3103 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3104 && (volume_info->nopersistent == false)) {
3105 cifs_dbg(FYI, "enabling persistent handles\n");
3106 tcon->use_persistent = true;
3107 } else if (volume_info->resilient) {
3108 if (ses->server->vals->protocol_id == 0) {
3110 "SMB2.1 or later required for resilient handles\n");
3114 tcon->use_resilient = true;
3118 * We can have only one retry value for a connection to a share so for
3119 * resources mounted more than once to the same server share the last
3120 * value passed in for the retry flag is used.
3122 tcon->retry = volume_info->retry;
3123 tcon->nocase = volume_info->nocase;
3124 tcon->nohandlecache = volume_info->nohandlecache;
3125 tcon->local_lease = volume_info->local_lease;
3126 INIT_LIST_HEAD(&tcon->pending_opens);
3128 spin_lock(&cifs_tcp_ses_lock);
3129 list_add(&tcon->tcon_list, &ses->tcon_list);
3130 spin_unlock(&cifs_tcp_ses_lock);
3132 cifs_fscache_get_super_cookie(tcon);
3142 cifs_put_tlink(struct tcon_link *tlink)
3144 if (!tlink || IS_ERR(tlink))
3147 if (!atomic_dec_and_test(&tlink->tl_count) ||
3148 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3149 tlink->tl_time = jiffies;
3153 if (!IS_ERR(tlink_tcon(tlink)))
3154 cifs_put_tcon(tlink_tcon(tlink));
3160 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3162 struct cifs_sb_info *old = CIFS_SB(sb);
3163 struct cifs_sb_info *new = mnt_data->cifs_sb;
3165 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3168 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3169 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3173 * We want to share sb only if we don't specify an r/wsize or
3174 * specified r/wsize is greater than or equal to existing one.
3176 if (new->wsize && new->wsize < old->wsize)
3179 if (new->rsize && new->rsize < old->rsize)
3182 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3185 if (old->mnt_file_mode != new->mnt_file_mode ||
3186 old->mnt_dir_mode != new->mnt_dir_mode)
3189 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3192 if (old->actimeo != new->actimeo)
3199 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3201 struct cifs_sb_info *old = CIFS_SB(sb);
3202 struct cifs_sb_info *new = mnt_data->cifs_sb;
3203 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3204 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3206 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3208 else if (!old_set && !new_set)
3215 cifs_match_super(struct super_block *sb, void *data)
3217 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3218 struct smb_vol *volume_info;
3219 struct cifs_sb_info *cifs_sb;
3220 struct TCP_Server_Info *tcp_srv;
3221 struct cifs_ses *ses;
3222 struct cifs_tcon *tcon;
3223 struct tcon_link *tlink;
3226 spin_lock(&cifs_tcp_ses_lock);
3227 cifs_sb = CIFS_SB(sb);
3228 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3229 if (IS_ERR(tlink)) {
3230 spin_unlock(&cifs_tcp_ses_lock);
3233 tcon = tlink_tcon(tlink);
3235 tcp_srv = ses->server;
3237 volume_info = mnt_data->vol;
3239 if (!match_server(tcp_srv, volume_info) ||
3240 !match_session(ses, volume_info) ||
3241 !match_tcon(tcon, volume_info) ||
3242 !match_prepath(sb, mnt_data)) {
3247 rc = compare_mount_options(sb, mnt_data);
3249 spin_unlock(&cifs_tcp_ses_lock);
3250 cifs_put_tlink(tlink);
3255 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
3256 const struct nls_table *nls_codepage, unsigned int *num_referrals,
3257 struct dfs_info3_param **referrals, int remap)
3261 if (!ses->server->ops->get_dfs_refer)
3267 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
3268 referrals, num_referrals,
3269 nls_codepage, remap);
3273 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3274 static struct lock_class_key cifs_key[2];
3275 static struct lock_class_key cifs_slock_key[2];
3278 cifs_reclassify_socket4(struct socket *sock)
3280 struct sock *sk = sock->sk;
3281 BUG_ON(!sock_allow_reclassification(sk));
3282 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3283 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3287 cifs_reclassify_socket6(struct socket *sock)
3289 struct sock *sk = sock->sk;
3290 BUG_ON(!sock_allow_reclassification(sk));
3291 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3292 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3296 cifs_reclassify_socket4(struct socket *sock)
3301 cifs_reclassify_socket6(struct socket *sock)
3306 /* See RFC1001 section 14 on representation of Netbios names */
3307 static void rfc1002mangle(char *target, char *source, unsigned int length)
3311 for (i = 0, j = 0; i < (length); i++) {
3312 /* mask a nibble at a time and encode */
3313 target[j] = 'A' + (0x0F & (source[i] >> 4));
3314 target[j+1] = 'A' + (0x0F & source[i]);
3321 bind_socket(struct TCP_Server_Info *server)
3324 if (server->srcaddr.ss_family != AF_UNSPEC) {
3325 /* Bind to the specified local IP address */
3326 struct socket *socket = server->ssocket;
3327 rc = socket->ops->bind(socket,
3328 (struct sockaddr *) &server->srcaddr,
3329 sizeof(server->srcaddr));
3331 struct sockaddr_in *saddr4;
3332 struct sockaddr_in6 *saddr6;
3333 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3334 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3335 if (saddr6->sin6_family == AF_INET6)
3336 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3337 &saddr6->sin6_addr, rc);
3339 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3340 &saddr4->sin_addr.s_addr, rc);
3347 ip_rfc1001_connect(struct TCP_Server_Info *server)
3351 * some servers require RFC1001 sessinit before sending
3352 * negprot - BB check reconnection in case where second
3353 * sessinit is sent but no second negprot
3355 struct rfc1002_session_packet *ses_init_buf;
3356 struct smb_hdr *smb_buf;
3357 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3360 ses_init_buf->trailer.session_req.called_len = 32;
3362 if (server->server_RFC1001_name[0] != 0)
3363 rfc1002mangle(ses_init_buf->trailer.
3364 session_req.called_name,
3365 server->server_RFC1001_name,
3366 RFC1001_NAME_LEN_WITH_NULL);
3368 rfc1002mangle(ses_init_buf->trailer.
3369 session_req.called_name,
3370 DEFAULT_CIFS_CALLED_NAME,
3371 RFC1001_NAME_LEN_WITH_NULL);
3373 ses_init_buf->trailer.session_req.calling_len = 32;
3376 * calling name ends in null (byte 16) from old smb
3379 if (server->workstation_RFC1001_name[0] != 0)
3380 rfc1002mangle(ses_init_buf->trailer.
3381 session_req.calling_name,
3382 server->workstation_RFC1001_name,
3383 RFC1001_NAME_LEN_WITH_NULL);
3385 rfc1002mangle(ses_init_buf->trailer.
3386 session_req.calling_name,
3388 RFC1001_NAME_LEN_WITH_NULL);
3390 ses_init_buf->trailer.session_req.scope1 = 0;
3391 ses_init_buf->trailer.session_req.scope2 = 0;
3392 smb_buf = (struct smb_hdr *)ses_init_buf;
3394 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3395 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3396 rc = smb_send(server, smb_buf, 0x44);
3397 kfree(ses_init_buf);
3399 * RFC1001 layer in at least one server
3400 * requires very short break before negprot
3401 * presumably because not expecting negprot
3402 * to follow so fast. This is a simple
3403 * solution that works without
3404 * complicating the code and causes no
3405 * significant slowing down on mount
3408 usleep_range(1000, 2000);
3411 * else the negprot may still work without this
3412 * even though malloc failed
3419 generic_ip_connect(struct TCP_Server_Info *server)
3424 struct socket *socket = server->ssocket;
3425 struct sockaddr *saddr;
3427 saddr = (struct sockaddr *) &server->dstaddr;
3429 if (server->dstaddr.ss_family == AF_INET6) {
3430 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3431 slen = sizeof(struct sockaddr_in6);
3434 sport = ((struct sockaddr_in *) saddr)->sin_port;
3435 slen = sizeof(struct sockaddr_in);
3439 if (socket == NULL) {
3440 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3441 IPPROTO_TCP, &socket, 1);
3443 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3444 server->ssocket = NULL;
3448 /* BB other socket options to set KEEPALIVE, NODELAY? */
3449 cifs_dbg(FYI, "Socket created\n");
3450 server->ssocket = socket;
3451 socket->sk->sk_allocation = GFP_NOFS;
3452 if (sfamily == AF_INET6)
3453 cifs_reclassify_socket6(socket);
3455 cifs_reclassify_socket4(socket);
3458 rc = bind_socket(server);
3463 * Eventually check for other socket options to change from
3464 * the default. sock_setsockopt not used because it expects
3467 socket->sk->sk_rcvtimeo = 7 * HZ;
3468 socket->sk->sk_sndtimeo = 5 * HZ;
3470 /* make the bufsizes depend on wsize/rsize and max requests */
3471 if (server->noautotune) {
3472 if (socket->sk->sk_sndbuf < (200 * 1024))
3473 socket->sk->sk_sndbuf = 200 * 1024;
3474 if (socket->sk->sk_rcvbuf < (140 * 1024))
3475 socket->sk->sk_rcvbuf = 140 * 1024;
3478 if (server->tcp_nodelay) {
3480 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3481 (char *)&val, sizeof(val));
3483 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3487 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3488 socket->sk->sk_sndbuf,
3489 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3491 rc = socket->ops->connect(socket, saddr, slen, 0);
3493 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3494 sock_release(socket);
3495 server->ssocket = NULL;
3499 if (sport == htons(RFC1001_PORT))
3500 rc = ip_rfc1001_connect(server);
3506 ip_connect(struct TCP_Server_Info *server)
3509 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3510 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3512 if (server->dstaddr.ss_family == AF_INET6)
3513 sport = &addr6->sin6_port;
3515 sport = &addr->sin_port;
3520 /* try with 445 port at first */
3521 *sport = htons(CIFS_PORT);
3523 rc = generic_ip_connect(server);
3527 /* if it failed, try with 139 port */
3528 *sport = htons(RFC1001_PORT);
3531 return generic_ip_connect(server);
3534 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3535 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3537 /* if we are reconnecting then should we check to see if
3538 * any requested capabilities changed locally e.g. via
3539 * remount but we can not do much about it here
3540 * if they have (even if we could detect it by the following)
3541 * Perhaps we could add a backpointer to array of sb from tcon
3542 * or if we change to make all sb to same share the same
3543 * sb as NFS - then we only have one backpointer to sb.
3544 * What if we wanted to mount the server share twice once with
3545 * and once without posixacls or posix paths? */
3546 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3548 if (vol_info && vol_info->no_linux_ext) {
3549 tcon->fsUnixInfo.Capability = 0;
3550 tcon->unix_ext = 0; /* Unix Extensions disabled */
3551 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3553 } else if (vol_info)
3554 tcon->unix_ext = 1; /* Unix Extensions supported */
3556 if (tcon->unix_ext == 0) {
3557 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3561 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3562 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3563 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3564 /* check for reconnect case in which we do not
3565 want to change the mount behavior if we can avoid it */
3566 if (vol_info == NULL) {
3567 /* turn off POSIX ACL and PATHNAMES if not set
3568 originally at mount time */
3569 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3570 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3571 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3572 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3573 cifs_dbg(VFS, "POSIXPATH support change\n");
3574 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3575 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3576 cifs_dbg(VFS, "possible reconnect error\n");
3577 cifs_dbg(VFS, "server disabled POSIX path support\n");
3581 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3582 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3584 cap &= CIFS_UNIX_CAP_MASK;
3585 if (vol_info && vol_info->no_psx_acl)
3586 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3587 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3588 cifs_dbg(FYI, "negotiated posix acl support\n");
3590 cifs_sb->mnt_cifs_flags |=
3591 CIFS_MOUNT_POSIXACL;
3594 if (vol_info && vol_info->posix_paths == 0)
3595 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3596 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3597 cifs_dbg(FYI, "negotiate posix pathnames\n");
3599 cifs_sb->mnt_cifs_flags |=
3600 CIFS_MOUNT_POSIX_PATHS;
3603 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3604 #ifdef CONFIG_CIFS_DEBUG2
3605 if (cap & CIFS_UNIX_FCNTL_CAP)
3606 cifs_dbg(FYI, "FCNTL cap\n");
3607 if (cap & CIFS_UNIX_EXTATTR_CAP)
3608 cifs_dbg(FYI, "EXTATTR cap\n");
3609 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3610 cifs_dbg(FYI, "POSIX path cap\n");
3611 if (cap & CIFS_UNIX_XATTR_CAP)
3612 cifs_dbg(FYI, "XATTR cap\n");
3613 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3614 cifs_dbg(FYI, "POSIX ACL cap\n");
3615 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3616 cifs_dbg(FYI, "very large read cap\n");
3617 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3618 cifs_dbg(FYI, "very large write cap\n");
3619 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3620 cifs_dbg(FYI, "transport encryption cap\n");
3621 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3622 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3623 #endif /* CIFS_DEBUG2 */
3624 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3625 if (vol_info == NULL) {
3626 cifs_dbg(FYI, "resetting capabilities failed\n");
3628 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");
3634 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3635 struct cifs_sb_info *cifs_sb)
3637 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3639 spin_lock_init(&cifs_sb->tlink_tree_lock);
3640 cifs_sb->tlink_tree = RB_ROOT;
3643 * Temporarily set r/wsize for matching superblock. If we end up using
3644 * new sb then client will later negotiate it downward if needed.
3646 cifs_sb->rsize = pvolume_info->rsize;
3647 cifs_sb->wsize = pvolume_info->wsize;
3649 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3650 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3651 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3652 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3653 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3654 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3656 cifs_sb->actimeo = pvolume_info->actimeo;
3657 cifs_sb->local_nls = pvolume_info->local_nls;
3659 if (pvolume_info->noperm)
3660 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3661 if (pvolume_info->setuids)
3662 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3663 if (pvolume_info->setuidfromacl)
3664 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3665 if (pvolume_info->server_ino)
3666 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3667 if (pvolume_info->remap)
3668 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3669 if (pvolume_info->sfu_remap)
3670 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3671 if (pvolume_info->no_xattr)
3672 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3673 if (pvolume_info->sfu_emul)
3674 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3675 if (pvolume_info->nobrl)
3676 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3677 if (pvolume_info->nohandlecache)
3678 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3679 if (pvolume_info->nostrictsync)
3680 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3681 if (pvolume_info->mand_lock)
3682 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3683 if (pvolume_info->rwpidforward)
3684 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3685 if (pvolume_info->cifs_acl)
3686 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3687 if (pvolume_info->backupuid_specified) {
3688 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3689 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3691 if (pvolume_info->backupgid_specified) {
3692 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3693 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3695 if (pvolume_info->override_uid)
3696 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3697 if (pvolume_info->override_gid)
3698 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3699 if (pvolume_info->dynperm)
3700 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3701 if (pvolume_info->fsc)
3702 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3703 if (pvolume_info->multiuser)
3704 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3705 CIFS_MOUNT_NO_PERM);
3706 if (pvolume_info->strict_io)
3707 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3708 if (pvolume_info->direct_io) {
3709 cifs_dbg(FYI, "mounting share using direct i/o\n");
3710 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3712 if (pvolume_info->mfsymlinks) {
3713 if (pvolume_info->sfu_emul) {
3715 * Our SFU ("Services for Unix" emulation does not allow
3716 * creating symlinks but does allow reading existing SFU
3717 * symlinks (it does allow both creating and reading SFU
3718 * style mknod and FIFOs though). When "mfsymlinks" and
3719 * "sfu" are both enabled at the same time, it allows
3720 * reading both types of symlinks, but will only create
3721 * them with mfsymlinks format. This allows better
3722 * Apple compatibility (probably better for Samba too)
3723 * while still recognizing old Windows style symlinks.
3725 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3727 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3730 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3731 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3733 if (pvolume_info->prepath) {
3734 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3735 if (cifs_sb->prepath == NULL)
3743 cleanup_volume_info_contents(struct smb_vol *volume_info)
3745 kfree(volume_info->username);
3746 kzfree(volume_info->password);
3747 kfree(volume_info->UNC);
3748 kfree(volume_info->domainname);
3749 kfree(volume_info->iocharset);
3750 kfree(volume_info->prepath);
3754 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3758 cleanup_volume_info_contents(volume_info);
3763 #ifdef CONFIG_CIFS_DFS_UPCALL
3765 * cifs_build_path_to_root returns full path to root when we do not have an
3766 * exiting connection (tcon)
3769 build_unc_path_to_root(const struct smb_vol *vol,
3770 const struct cifs_sb_info *cifs_sb)
3772 char *full_path, *pos;
3773 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3774 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3776 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3777 if (full_path == NULL)
3778 return ERR_PTR(-ENOMEM);
3780 strncpy(full_path, vol->UNC, unc_len);
3781 pos = full_path + unc_len;
3784 *pos = CIFS_DIR_SEP(cifs_sb);
3785 strncpy(pos + 1, vol->prepath, pplen);
3789 *pos = '\0'; /* add trailing null */
3790 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3791 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3796 * Perform a dfs referral query for a share and (optionally) prefix
3798 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3799 * to a string containing updated options for the submount. Otherwise it
3800 * will be left untouched.
3802 * Returns the rc from get_dfs_path to the caller, which can be used to
3803 * determine whether there were referrals.
3806 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3807 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3811 unsigned int num_referrals = 0;
3812 struct dfs_info3_param *referrals = NULL;
3813 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3815 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3816 if (IS_ERR(full_path))
3817 return PTR_ERR(full_path);
3819 /* For DFS paths, skip the first '\' of the UNC */
3820 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3822 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3823 &num_referrals, &referrals, cifs_remap(cifs_sb));
3825 if (!rc && num_referrals > 0) {
3826 char *fake_devname = NULL;
3828 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3829 full_path + 1, referrals,
3832 free_dfs_info_array(referrals, num_referrals);
3834 if (IS_ERR(mdata)) {
3835 rc = PTR_ERR(mdata);
3838 cleanup_volume_info_contents(volume_info);
3839 rc = cifs_setup_volume_info(volume_info, mdata,
3840 fake_devname, false);
3842 kfree(fake_devname);
3843 kfree(cifs_sb->mountdata);
3844 cifs_sb->mountdata = mdata;
3852 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3853 const char *devname, bool is_smb3)
3857 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
3860 if (volume_info->nullauth) {
3861 cifs_dbg(FYI, "Anonymous login\n");
3862 kfree(volume_info->username);
3863 volume_info->username = NULL;
3864 } else if (volume_info->username) {
3865 /* BB fixme parse for domain name here */
3866 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3868 cifs_dbg(VFS, "No username specified\n");
3869 /* In userspace mount helper we can get user name from alternate
3870 locations such as env variables and files on disk */
3874 /* this is needed for ASCII cp to Unicode converts */
3875 if (volume_info->iocharset == NULL) {
3876 /* load_nls_default cannot return null */
3877 volume_info->local_nls = load_nls_default();
3879 volume_info->local_nls = load_nls(volume_info->iocharset);
3880 if (volume_info->local_nls == NULL) {
3881 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3882 volume_info->iocharset);
3891 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
3894 struct smb_vol *volume_info;
3896 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3898 return ERR_PTR(-ENOMEM);
3900 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
3902 cifs_cleanup_volume_info(volume_info);
3903 volume_info = ERR_PTR(rc);
3910 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3912 struct cifs_tcon *tcon,
3913 struct cifs_sb_info *cifs_sb,
3920 sep = CIFS_DIR_SEP(cifs_sb);
3923 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3925 /* skip separators */
3930 /* next separator */
3931 while (*s && *s != sep)
3935 * temporarily null-terminate the path at the end of
3936 * the current component
3940 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3948 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3952 struct cifs_ses *ses;
3953 struct cifs_tcon *tcon;
3954 struct TCP_Server_Info *server;
3956 struct tcon_link *tlink;
3957 #ifdef CONFIG_CIFS_DFS_UPCALL
3958 int referral_walks_count = 0;
3961 #ifdef CONFIG_CIFS_DFS_UPCALL
3963 /* cleanup activities if we're chasing a referral */
3964 if (referral_walks_count) {
3966 cifs_put_tcon(tcon);
3968 cifs_put_smb_ses(ses);
3970 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3984 /* get a reference to a tcp session */
3985 server = cifs_get_tcp_session(volume_info);
3986 if (IS_ERR(server)) {
3987 rc = PTR_ERR(server);
3990 if ((volume_info->max_credits < 20) ||
3991 (volume_info->max_credits > 60000))
3992 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3994 server->max_credits = volume_info->max_credits;
3995 /* get a reference to a SMB session */
3996 ses = cifs_get_smb_ses(server, volume_info);
4000 goto mount_fail_check;
4003 if ((volume_info->persistent == true) && ((ses->server->capabilities &
4004 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
4005 cifs_dbg(VFS, "persistent handles not supported by server\n");
4007 goto mount_fail_check;
4010 /* search for existing tcon to this server share */
4011 tcon = cifs_get_tcon(ses, volume_info);
4016 goto mount_fail_check;
4018 goto remote_path_check;
4021 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4022 if (tcon->posix_extensions)
4023 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4025 /* tell server which Unix caps we support */
4026 if (cap_unix(tcon->ses)) {
4027 /* reset of caps checks mount to see if unix extensions
4028 disabled for just this mount */
4029 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
4030 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4031 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4032 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
4034 goto mount_fail_check;
4037 tcon->unix_ext = 0; /* server does not support them */
4039 /* do not care if a following call succeed - informational */
4040 if (!tcon->pipe && server->ops->qfs_tcon)
4041 server->ops->qfs_tcon(xid, tcon);
4043 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
4044 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
4047 #ifdef CONFIG_CIFS_DFS_UPCALL
4049 * Perform an unconditional check for whether there are DFS
4050 * referrals for this path without prefix, to provide support
4051 * for DFS referrals from w2k8 servers which don't seem to respond
4052 * with PATH_NOT_COVERED to requests that include the prefix.
4053 * Chase the referral if found, otherwise continue normally.
4055 if (referral_walks_count == 0) {
4056 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
4059 referral_walks_count++;
4060 goto try_mount_again;
4065 /* check if a whole path is not remote */
4067 if (!server->ops->is_path_accessible) {
4069 goto mount_fail_check;
4072 * cifs_build_path_to_root works only when we have a valid tcon
4074 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon,
4075 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4076 if (full_path == NULL) {
4078 goto mount_fail_check;
4080 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4082 if (rc != 0 && rc != -EREMOTE) {
4084 goto mount_fail_check;
4087 if (rc != -EREMOTE) {
4088 rc = cifs_are_all_path_components_accessible(server,
4092 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4093 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4094 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4101 /* get referral if needed */
4102 if (rc == -EREMOTE) {
4103 #ifdef CONFIG_CIFS_DFS_UPCALL
4104 if (referral_walks_count > MAX_NESTED_LINKS) {
4106 * BB: when we implement proper loop detection,
4107 * we will remove this check. But now we need it
4108 * to prevent an indefinite loop if 'DFS tree' is
4109 * misconfigured (i.e. has loops).
4112 goto mount_fail_check;
4115 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
4118 referral_walks_count++;
4119 goto try_mount_again;
4121 goto mount_fail_check;
4122 #else /* No DFS support, return error on mount */
4128 goto mount_fail_check;
4130 /* now, hang the tcon off of the superblock */
4131 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
4132 if (tlink == NULL) {
4134 goto mount_fail_check;
4137 tlink->tl_uid = ses->linux_uid;
4138 tlink->tl_tcon = tcon;
4139 tlink->tl_time = jiffies;
4140 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4141 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4143 cifs_sb->master_tlink = tlink;
4144 spin_lock(&cifs_sb->tlink_tree_lock);
4145 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4146 spin_unlock(&cifs_sb->tlink_tree_lock);
4148 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4152 /* on error free sesinfo and tcon struct if needed */
4154 /* If find_unc succeeded then rc == 0 so we can not end */
4155 /* up accidentally freeing someone elses tcon struct */
4157 cifs_put_tcon(tcon);
4159 cifs_put_smb_ses(ses);
4161 cifs_put_tcp_session(server, 0);
4170 * Issue a TREE_CONNECT request.
4173 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4174 const char *tree, struct cifs_tcon *tcon,
4175 const struct nls_table *nls_codepage)
4177 struct smb_hdr *smb_buffer;
4178 struct smb_hdr *smb_buffer_response;
4181 unsigned char *bcc_ptr;
4184 __u16 bytes_left, count;
4189 smb_buffer = cifs_buf_get();
4190 if (smb_buffer == NULL)
4193 smb_buffer_response = smb_buffer;
4195 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4196 NULL /*no tid */ , 4 /*wct */ );
4198 smb_buffer->Mid = get_next_mid(ses->server);
4199 smb_buffer->Uid = ses->Suid;
4200 pSMB = (TCONX_REQ *) smb_buffer;
4201 pSMBr = (TCONX_RSP *) smb_buffer_response;
4203 pSMB->AndXCommand = 0xFF;
4204 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4205 bcc_ptr = &pSMB->Password[0];
4206 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4207 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4208 *bcc_ptr = 0; /* password is null byte */
4209 bcc_ptr++; /* skip password */
4210 /* already aligned so no need to do it below */
4212 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4213 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4214 specified as required (when that support is added to
4215 the vfs in the future) as only NTLM or the much
4216 weaker LANMAN (which we do not send by default) is accepted
4217 by Samba (not sure whether other servers allow
4218 NTLMv2 password here) */
4219 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4220 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4221 (ses->sectype == LANMAN))
4222 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4223 ses->server->sec_mode &
4224 SECMODE_PW_ENCRYPT ? true : false,
4227 #endif /* CIFS_WEAK_PW_HASH */
4228 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4229 bcc_ptr, nls_codepage);
4231 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4233 cifs_buf_release(smb_buffer);
4237 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4238 if (ses->capabilities & CAP_UNICODE) {
4239 /* must align unicode strings */
4240 *bcc_ptr = 0; /* null byte password */
4245 if (ses->server->sign)
4246 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4248 if (ses->capabilities & CAP_STATUS32) {
4249 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4251 if (ses->capabilities & CAP_DFS) {
4252 smb_buffer->Flags2 |= SMBFLG2_DFS;
4254 if (ses->capabilities & CAP_UNICODE) {
4255 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4257 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4258 6 /* max utf8 char length in bytes */ *
4259 (/* server len*/ + 256 /* share len */), nls_codepage);
4260 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4261 bcc_ptr += 2; /* skip trailing null */
4262 } else { /* ASCII */
4263 strcpy(bcc_ptr, tree);
4264 bcc_ptr += strlen(tree) + 1;
4266 strcpy(bcc_ptr, "?????");
4267 bcc_ptr += strlen("?????");
4269 count = bcc_ptr - &pSMB->Password[0];
4270 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4271 pSMB->hdr.smb_buf_length) + count);
4272 pSMB->ByteCount = cpu_to_le16(count);
4274 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4277 /* above now done in SendReceive */
4281 tcon->tidStatus = CifsGood;
4282 tcon->need_reconnect = false;
4283 tcon->tid = smb_buffer_response->Tid;
4284 bcc_ptr = pByteArea(smb_buffer_response);
4285 bytes_left = get_bcc(smb_buffer_response);
4286 length = strnlen(bcc_ptr, bytes_left - 2);
4287 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4293 /* skip service field (NB: this field is always ASCII) */
4295 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4296 (bcc_ptr[2] == 'C')) {
4297 cifs_dbg(FYI, "IPC connection\n");
4301 } else if (length == 2) {
4302 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4303 /* the most common case */
4304 cifs_dbg(FYI, "disk share connection\n");
4307 bcc_ptr += length + 1;
4308 bytes_left -= (length + 1);
4309 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4311 /* mostly informational -- no need to fail on error here */
4312 kfree(tcon->nativeFileSystem);
4313 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4314 bytes_left, is_unicode,
4317 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4319 if ((smb_buffer_response->WordCount == 3) ||
4320 (smb_buffer_response->WordCount == 7))
4321 /* field is in same location */
4322 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4325 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4328 cifs_buf_release(smb_buffer);
4332 static void delayed_free(struct rcu_head *p)
4334 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4335 unload_nls(sbi->local_nls);
4340 cifs_umount(struct cifs_sb_info *cifs_sb)
4342 struct rb_root *root = &cifs_sb->tlink_tree;
4343 struct rb_node *node;
4344 struct tcon_link *tlink;
4346 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4348 spin_lock(&cifs_sb->tlink_tree_lock);
4349 while ((node = rb_first(root))) {
4350 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4351 cifs_get_tlink(tlink);
4352 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4353 rb_erase(node, root);
4355 spin_unlock(&cifs_sb->tlink_tree_lock);
4356 cifs_put_tlink(tlink);
4357 spin_lock(&cifs_sb->tlink_tree_lock);
4359 spin_unlock(&cifs_sb->tlink_tree_lock);
4361 kfree(cifs_sb->mountdata);
4362 kfree(cifs_sb->prepath);
4363 call_rcu(&cifs_sb->rcu, delayed_free);
4367 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4370 struct TCP_Server_Info *server = ses->server;
4372 if (!server->ops->need_neg || !server->ops->negotiate)
4375 /* only send once per connect */
4376 if (!server->ops->need_neg(server))
4379 set_credits(server, 1);
4381 rc = server->ops->negotiate(xid, ses);
4383 spin_lock(&GlobalMid_Lock);
4384 if (server->tcpStatus == CifsNeedNegotiate)
4385 server->tcpStatus = CifsGood;
4388 spin_unlock(&GlobalMid_Lock);
4395 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4396 struct nls_table *nls_info)
4399 struct TCP_Server_Info *server = ses->server;
4401 ses->capabilities = server->capabilities;
4402 if (linuxExtEnabled == 0)
4403 ses->capabilities &= (~server->vals->cap_unix);
4405 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4406 server->sec_mode, server->capabilities, server->timeAdj);
4408 if (ses->auth_key.response) {
4409 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4410 ses->auth_key.response);
4411 kfree(ses->auth_key.response);
4412 ses->auth_key.response = NULL;
4413 ses->auth_key.len = 0;
4416 if (server->ops->sess_setup)
4417 rc = server->ops->sess_setup(xid, ses, nls_info);
4420 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4426 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4428 vol->sectype = ses->sectype;
4430 /* krb5 is special, since we don't need username or pw */
4431 if (vol->sectype == Kerberos)
4434 return cifs_set_cifscreds(vol, ses);
4437 static struct cifs_tcon *
4438 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4441 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4442 struct cifs_ses *ses;
4443 struct cifs_tcon *tcon = NULL;
4444 struct smb_vol *vol_info;
4446 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4447 if (vol_info == NULL)
4448 return ERR_PTR(-ENOMEM);
4450 vol_info->local_nls = cifs_sb->local_nls;
4451 vol_info->linux_uid = fsuid;
4452 vol_info->cred_uid = fsuid;
4453 vol_info->UNC = master_tcon->treeName;
4454 vol_info->retry = master_tcon->retry;
4455 vol_info->nocase = master_tcon->nocase;
4456 vol_info->nohandlecache = master_tcon->nohandlecache;
4457 vol_info->local_lease = master_tcon->local_lease;
4458 vol_info->no_linux_ext = !master_tcon->unix_ext;
4459 vol_info->sectype = master_tcon->ses->sectype;
4460 vol_info->sign = master_tcon->ses->sign;
4462 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4468 /* get a reference for the same TCP session */
4469 spin_lock(&cifs_tcp_ses_lock);
4470 ++master_tcon->ses->server->srv_count;
4471 spin_unlock(&cifs_tcp_ses_lock);
4473 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4475 tcon = (struct cifs_tcon *)ses;
4476 cifs_put_tcp_session(master_tcon->ses->server, 0);
4480 tcon = cifs_get_tcon(ses, vol_info);
4482 cifs_put_smb_ses(ses);
4486 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4487 if (tcon->posix_extensions)
4488 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4491 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4494 kfree(vol_info->username);
4495 kzfree(vol_info->password);
4502 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4504 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4507 /* find and return a tlink with given uid */
4508 static struct tcon_link *
4509 tlink_rb_search(struct rb_root *root, kuid_t uid)
4511 struct rb_node *node = root->rb_node;
4512 struct tcon_link *tlink;
4515 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4517 if (uid_gt(tlink->tl_uid, uid))
4518 node = node->rb_left;
4519 else if (uid_lt(tlink->tl_uid, uid))
4520 node = node->rb_right;
4527 /* insert a tcon_link into the tree */
4529 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4531 struct rb_node **new = &(root->rb_node), *parent = NULL;
4532 struct tcon_link *tlink;
4535 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4538 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4539 new = &((*new)->rb_left);
4541 new = &((*new)->rb_right);
4544 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4545 rb_insert_color(&new_tlink->tl_rbnode, root);
4549 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4552 * If the superblock doesn't refer to a multiuser mount, then just return
4553 * the master tcon for the mount.
4555 * First, search the rbtree for an existing tcon for this fsuid. If one
4556 * exists, then check to see if it's pending construction. If it is then wait
4557 * for construction to complete. Once it's no longer pending, check to see if
4558 * it failed and either return an error or retry construction, depending on
4561 * If one doesn't exist then insert a new tcon_link struct into the tree and
4562 * try to construct a new one.
4565 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4568 kuid_t fsuid = current_fsuid();
4569 struct tcon_link *tlink, *newtlink;
4571 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4572 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4574 spin_lock(&cifs_sb->tlink_tree_lock);
4575 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4577 cifs_get_tlink(tlink);
4578 spin_unlock(&cifs_sb->tlink_tree_lock);
4580 if (tlink == NULL) {
4581 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4582 if (newtlink == NULL)
4583 return ERR_PTR(-ENOMEM);
4584 newtlink->tl_uid = fsuid;
4585 newtlink->tl_tcon = ERR_PTR(-EACCES);
4586 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4587 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4588 cifs_get_tlink(newtlink);
4590 spin_lock(&cifs_sb->tlink_tree_lock);
4591 /* was one inserted after previous search? */
4592 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4594 cifs_get_tlink(tlink);
4595 spin_unlock(&cifs_sb->tlink_tree_lock);
4597 goto wait_for_construction;
4600 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4601 spin_unlock(&cifs_sb->tlink_tree_lock);
4603 wait_for_construction:
4604 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4605 TASK_INTERRUPTIBLE);
4607 cifs_put_tlink(tlink);
4608 return ERR_PTR(-ERESTARTSYS);
4611 /* if it's good, return it */
4612 if (!IS_ERR(tlink->tl_tcon))
4615 /* return error if we tried this already recently */
4616 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4617 cifs_put_tlink(tlink);
4618 return ERR_PTR(-EACCES);
4621 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4622 goto wait_for_construction;
4625 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4626 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4627 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4629 if (IS_ERR(tlink->tl_tcon)) {
4630 cifs_put_tlink(tlink);
4631 return ERR_PTR(-EACCES);
4638 * periodic workqueue job that scans tcon_tree for a superblock and closes
4642 cifs_prune_tlinks(struct work_struct *work)
4644 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4646 struct rb_root *root = &cifs_sb->tlink_tree;
4647 struct rb_node *node;
4648 struct rb_node *tmp;
4649 struct tcon_link *tlink;
4652 * Because we drop the spinlock in the loop in order to put the tlink
4653 * it's not guarded against removal of links from the tree. The only
4654 * places that remove entries from the tree are this function and
4655 * umounts. Because this function is non-reentrant and is canceled
4656 * before umount can proceed, this is safe.
4658 spin_lock(&cifs_sb->tlink_tree_lock);
4659 node = rb_first(root);
4660 while (node != NULL) {
4662 node = rb_next(tmp);
4663 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4665 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4666 atomic_read(&tlink->tl_count) != 0 ||
4667 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4670 cifs_get_tlink(tlink);
4671 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4672 rb_erase(tmp, root);
4674 spin_unlock(&cifs_sb->tlink_tree_lock);
4675 cifs_put_tlink(tlink);
4676 spin_lock(&cifs_sb->tlink_tree_lock);
4678 spin_unlock(&cifs_sb->tlink_tree_lock);
4680 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,