4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
49 #include "cifsproto.h"
50 #include "cifs_unicode.h"
51 #include "cifs_debug.h"
52 #include "cifs_fs_sb.h"
55 #include "rfc1002pdu.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
61 #define RFC1001_PORT 139
63 extern mempool_t *cifs_req_poolp;
64 extern bool disable_legacy_dialects;
66 /* FIXME: should these be tunable? */
67 #define TLINK_ERROR_EXPIRE (1 * HZ)
68 #define TLINK_IDLE_EXPIRE (600 * HZ)
71 /* Mount options that take no arguments */
72 Opt_user_xattr, Opt_nouser_xattr,
73 Opt_forceuid, Opt_noforceuid,
74 Opt_forcegid, Opt_noforcegid,
75 Opt_noblocksend, Opt_noautotune,
76 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
77 Opt_mapposix, Opt_nomapposix,
78 Opt_mapchars, Opt_nomapchars, Opt_sfu,
79 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
80 Opt_noposixpaths, Opt_nounix, Opt_unix,
83 Opt_handlecache, Opt_nohandlecache,
84 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
85 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
86 Opt_nohard, Opt_nosoft,
88 Opt_nostrictsync, Opt_strictsync,
89 Opt_serverino, Opt_noserverino,
90 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
91 Opt_acl, Opt_noacl, Opt_locallease,
92 Opt_sign, Opt_seal, Opt_noac,
93 Opt_fsc, Opt_mfsymlinks,
94 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
95 Opt_persistent, Opt_nopersistent,
96 Opt_resilient, Opt_noresilient,
97 Opt_domainauto, Opt_rdma,
99 /* Mount options which take numeric value */
100 Opt_backupuid, Opt_backupgid, Opt_uid,
101 Opt_cruid, Opt_gid, Opt_file_mode,
102 Opt_dirmode, Opt_port,
103 Opt_rsize, Opt_wsize, Opt_actimeo,
104 Opt_echo_interval, Opt_max_credits,
107 /* Mount options which take string value */
108 Opt_user, Opt_pass, Opt_ip,
109 Opt_domain, Opt_srcaddr, Opt_iocharset,
110 Opt_netbiosname, Opt_servern,
111 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
113 /* Mount options to be ignored */
116 /* Options which could be blank */
124 static const match_table_t cifs_mount_option_tokens = {
126 { Opt_user_xattr, "user_xattr" },
127 { Opt_nouser_xattr, "nouser_xattr" },
128 { Opt_forceuid, "forceuid" },
129 { Opt_noforceuid, "noforceuid" },
130 { Opt_forcegid, "forcegid" },
131 { Opt_noforcegid, "noforcegid" },
132 { Opt_noblocksend, "noblocksend" },
133 { Opt_noautotune, "noautotune" },
134 { Opt_hard, "hard" },
135 { Opt_soft, "soft" },
136 { Opt_perm, "perm" },
137 { Opt_noperm, "noperm" },
138 { Opt_mapchars, "mapchars" }, /* SFU style */
139 { Opt_nomapchars, "nomapchars" },
140 { Opt_mapposix, "mapposix" }, /* SFM style */
141 { Opt_nomapposix, "nomapposix" },
143 { Opt_nosfu, "nosfu" },
144 { Opt_nodfs, "nodfs" },
145 { Opt_posixpaths, "posixpaths" },
146 { Opt_noposixpaths, "noposixpaths" },
147 { Opt_nounix, "nounix" },
148 { Opt_nounix, "nolinux" },
149 { Opt_nounix, "noposix" },
150 { Opt_unix, "unix" },
151 { Opt_unix, "linux" },
152 { Opt_unix, "posix" },
153 { Opt_nocase, "nocase" },
154 { Opt_nocase, "ignorecase" },
156 { Opt_nobrl, "nobrl" },
157 { Opt_handlecache, "handlecache" },
158 { Opt_nohandlecache, "nohandlecache" },
159 { Opt_nobrl, "nolock" },
160 { Opt_forcemandatorylock, "forcemandatorylock" },
161 { Opt_forcemandatorylock, "forcemand" },
162 { Opt_setuids, "setuids" },
163 { Opt_nosetuids, "nosetuids" },
164 { Opt_setuidfromacl, "idsfromsid" },
165 { Opt_dynperm, "dynperm" },
166 { Opt_nodynperm, "nodynperm" },
167 { Opt_nohard, "nohard" },
168 { Opt_nosoft, "nosoft" },
169 { Opt_nointr, "nointr" },
170 { Opt_intr, "intr" },
171 { Opt_nostrictsync, "nostrictsync" },
172 { Opt_strictsync, "strictsync" },
173 { Opt_serverino, "serverino" },
174 { Opt_noserverino, "noserverino" },
175 { Opt_rwpidforward, "rwpidforward" },
176 { Opt_cifsacl, "cifsacl" },
177 { Opt_nocifsacl, "nocifsacl" },
179 { Opt_noacl, "noacl" },
180 { Opt_locallease, "locallease" },
181 { Opt_sign, "sign" },
182 { Opt_seal, "seal" },
183 { Opt_noac, "noac" },
185 { Opt_mfsymlinks, "mfsymlinks" },
186 { Opt_multiuser, "multiuser" },
187 { Opt_sloppy, "sloppy" },
188 { Opt_nosharesock, "nosharesock" },
189 { Opt_persistent, "persistenthandles"},
190 { Opt_nopersistent, "nopersistenthandles"},
191 { Opt_resilient, "resilienthandles"},
192 { Opt_noresilient, "noresilienthandles"},
193 { Opt_domainauto, "domainauto"},
196 { Opt_backupuid, "backupuid=%s" },
197 { Opt_backupgid, "backupgid=%s" },
198 { Opt_uid, "uid=%s" },
199 { Opt_cruid, "cruid=%s" },
200 { Opt_gid, "gid=%s" },
201 { Opt_file_mode, "file_mode=%s" },
202 { Opt_dirmode, "dirmode=%s" },
203 { Opt_dirmode, "dir_mode=%s" },
204 { Opt_port, "port=%s" },
205 { Opt_rsize, "rsize=%s" },
206 { Opt_wsize, "wsize=%s" },
207 { Opt_actimeo, "actimeo=%s" },
208 { Opt_echo_interval, "echo_interval=%s" },
209 { Opt_max_credits, "max_credits=%s" },
210 { Opt_snapshot, "snapshot=%s" },
212 { Opt_blank_user, "user=" },
213 { Opt_blank_user, "username=" },
214 { Opt_user, "user=%s" },
215 { Opt_user, "username=%s" },
216 { Opt_blank_pass, "pass=" },
217 { Opt_blank_pass, "password=" },
218 { Opt_pass, "pass=%s" },
219 { Opt_pass, "password=%s" },
220 { Opt_blank_ip, "ip=" },
221 { Opt_blank_ip, "addr=" },
223 { Opt_ip, "addr=%s" },
224 { Opt_ignore, "unc=%s" },
225 { Opt_ignore, "target=%s" },
226 { Opt_ignore, "path=%s" },
227 { Opt_domain, "dom=%s" },
228 { Opt_domain, "domain=%s" },
229 { Opt_domain, "workgroup=%s" },
230 { Opt_srcaddr, "srcaddr=%s" },
231 { Opt_ignore, "prefixpath=%s" },
232 { Opt_iocharset, "iocharset=%s" },
233 { Opt_netbiosname, "netbiosname=%s" },
234 { Opt_servern, "servern=%s" },
235 { Opt_ver, "ver=%s" },
236 { Opt_vers, "vers=%s" },
237 { Opt_sec, "sec=%s" },
238 { Opt_cache, "cache=%s" },
240 { Opt_ignore, "cred" },
241 { Opt_ignore, "credentials" },
242 { Opt_ignore, "cred=%s" },
243 { Opt_ignore, "credentials=%s" },
244 { Opt_ignore, "guest" },
245 { Opt_ignore, "rw" },
246 { Opt_ignore, "ro" },
247 { Opt_ignore, "suid" },
248 { Opt_ignore, "nosuid" },
249 { Opt_ignore, "exec" },
250 { Opt_ignore, "noexec" },
251 { Opt_ignore, "nodev" },
252 { Opt_ignore, "noauto" },
253 { Opt_ignore, "dev" },
254 { Opt_ignore, "mand" },
255 { Opt_ignore, "nomand" },
256 { Opt_ignore, "_netdev" },
262 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
263 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
264 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
265 Opt_sec_ntlmv2i, Opt_sec_lanman,
271 static const match_table_t cifs_secflavor_tokens = {
272 { Opt_sec_krb5, "krb5" },
273 { Opt_sec_krb5i, "krb5i" },
274 { Opt_sec_krb5p, "krb5p" },
275 { Opt_sec_ntlmsspi, "ntlmsspi" },
276 { Opt_sec_ntlmssp, "ntlmssp" },
277 { Opt_ntlm, "ntlm" },
278 { Opt_sec_ntlmi, "ntlmi" },
279 { Opt_sec_ntlmv2, "nontlm" },
280 { Opt_sec_ntlmv2, "ntlmv2" },
281 { Opt_sec_ntlmv2i, "ntlmv2i" },
282 { Opt_sec_lanman, "lanman" },
283 { Opt_sec_none, "none" },
285 { Opt_sec_err, NULL }
296 static const match_table_t cifs_cacheflavor_tokens = {
297 { Opt_cache_loose, "loose" },
298 { Opt_cache_strict, "strict" },
299 { Opt_cache_none, "none" },
300 { Opt_cache_err, NULL }
303 static const match_table_t cifs_smb_version_tokens = {
304 { Smb_1, SMB1_VERSION_STRING },
305 { Smb_20, SMB20_VERSION_STRING},
306 { Smb_21, SMB21_VERSION_STRING },
307 { Smb_30, SMB30_VERSION_STRING },
308 { Smb_302, SMB302_VERSION_STRING },
309 #ifdef CONFIG_CIFS_SMB311
310 { Smb_311, SMB311_VERSION_STRING },
311 { Smb_311, ALT_SMB311_VERSION_STRING },
313 { Smb_3any, SMB3ANY_VERSION_STRING },
314 { Smb_default, SMBDEFAULT_VERSION_STRING },
315 { Smb_version_err, NULL }
318 static int ip_connect(struct TCP_Server_Info *server);
319 static int generic_ip_connect(struct TCP_Server_Info *server);
320 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
321 static void cifs_prune_tlinks(struct work_struct *work);
322 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
323 const char *devname);
326 * cifs tcp session reconnection
328 * mark tcp session as reconnecting so temporarily locked
329 * mark all smb sessions as reconnecting for tcp session
330 * reconnect tcp session
331 * wake up waiters on reconnection? - (not needed currently)
334 cifs_reconnect(struct TCP_Server_Info *server)
337 struct list_head *tmp, *tmp2;
338 struct cifs_ses *ses;
339 struct cifs_tcon *tcon;
340 struct mid_q_entry *mid_entry;
341 struct list_head retry_list;
343 spin_lock(&GlobalMid_Lock);
344 if (server->tcpStatus == CifsExiting) {
345 /* the demux thread will exit normally
346 next time through the loop */
347 spin_unlock(&GlobalMid_Lock);
350 server->tcpStatus = CifsNeedReconnect;
351 spin_unlock(&GlobalMid_Lock);
353 server->max_read = 0;
355 cifs_dbg(FYI, "Reconnecting tcp session\n");
357 /* before reconnecting the tcp session, mark the smb session (uid)
358 and the tid bad so they are not used until reconnected */
359 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
361 spin_lock(&cifs_tcp_ses_lock);
362 list_for_each(tmp, &server->smb_ses_list) {
363 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
364 ses->need_reconnect = true;
365 list_for_each(tmp2, &ses->tcon_list) {
366 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
367 tcon->need_reconnect = true;
370 ses->tcon_ipc->need_reconnect = true;
372 spin_unlock(&cifs_tcp_ses_lock);
374 /* do not want to be sending data on a socket we are freeing */
375 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
376 mutex_lock(&server->srv_mutex);
377 if (server->ssocket) {
378 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
379 server->ssocket->state, server->ssocket->flags);
380 kernel_sock_shutdown(server->ssocket, SHUT_WR);
381 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
382 server->ssocket->state, server->ssocket->flags);
383 sock_release(server->ssocket);
384 server->ssocket = NULL;
386 server->sequence_number = 0;
387 server->session_estab = false;
388 kfree(server->session_key.response);
389 server->session_key.response = NULL;
390 server->session_key.len = 0;
391 server->lstrp = jiffies;
393 /* mark submitted MIDs for retry and issue callback */
394 INIT_LIST_HEAD(&retry_list);
395 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
396 spin_lock(&GlobalMid_Lock);
397 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
398 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
399 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
400 mid_entry->mid_state = MID_RETRY_NEEDED;
401 list_move(&mid_entry->qhead, &retry_list);
403 spin_unlock(&GlobalMid_Lock);
404 mutex_unlock(&server->srv_mutex);
406 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
407 list_for_each_safe(tmp, tmp2, &retry_list) {
408 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
409 list_del_init(&mid_entry->qhead);
410 mid_entry->callback(mid_entry);
416 /* we should try only the port we connected to before */
417 mutex_lock(&server->srv_mutex);
418 if (cifs_rdma_enabled(server))
419 rc = smbd_reconnect(server);
421 rc = generic_ip_connect(server);
423 cifs_dbg(FYI, "reconnect error %d\n", rc);
424 mutex_unlock(&server->srv_mutex);
427 atomic_inc(&tcpSesReconnectCount);
428 spin_lock(&GlobalMid_Lock);
429 if (server->tcpStatus != CifsExiting)
430 server->tcpStatus = CifsNeedNegotiate;
431 spin_unlock(&GlobalMid_Lock);
432 mutex_unlock(&server->srv_mutex);
434 } while (server->tcpStatus == CifsNeedReconnect);
436 if (server->tcpStatus == CifsNeedNegotiate)
437 mod_delayed_work(cifsiod_wq, &server->echo, 0);
443 cifs_echo_request(struct work_struct *work)
446 struct TCP_Server_Info *server = container_of(work,
447 struct TCP_Server_Info, echo.work);
448 unsigned long echo_interval;
451 * If we need to renegotiate, set echo interval to zero to
452 * immediately call echo service where we can renegotiate.
454 if (server->tcpStatus == CifsNeedNegotiate)
457 echo_interval = server->echo_interval;
460 * We cannot send an echo if it is disabled.
461 * Also, no need to ping if we got a response recently.
464 if (server->tcpStatus == CifsNeedReconnect ||
465 server->tcpStatus == CifsExiting ||
466 server->tcpStatus == CifsNew ||
467 (server->ops->can_echo && !server->ops->can_echo(server)) ||
468 time_before(jiffies, server->lstrp + echo_interval - HZ))
471 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
473 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
477 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
481 allocate_buffers(struct TCP_Server_Info *server)
483 if (!server->bigbuf) {
484 server->bigbuf = (char *)cifs_buf_get();
485 if (!server->bigbuf) {
486 cifs_dbg(VFS, "No memory for large SMB response\n");
488 /* retry will check if exiting */
491 } else if (server->large_buf) {
492 /* we are reusing a dirty large buf, clear its start */
493 memset(server->bigbuf, 0, HEADER_SIZE(server));
496 if (!server->smallbuf) {
497 server->smallbuf = (char *)cifs_small_buf_get();
498 if (!server->smallbuf) {
499 cifs_dbg(VFS, "No memory for SMB response\n");
501 /* retry will check if exiting */
504 /* beginning of smb buffer is cleared in our buf_get */
506 /* if existing small buf clear beginning */
507 memset(server->smallbuf, 0, HEADER_SIZE(server));
514 server_unresponsive(struct TCP_Server_Info *server)
517 * We need to wait 2 echo intervals to make sure we handle such
519 * 1s client sends a normal SMB request
520 * 2s client gets a response
521 * 30s echo workqueue job pops, and decides we got a response recently
522 * and don't need to send another
524 * 65s kernel_recvmsg times out, and we see that we haven't gotten
525 * a response in >60s.
527 if ((server->tcpStatus == CifsGood ||
528 server->tcpStatus == CifsNeedNegotiate) &&
529 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
530 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
531 server->hostname, (2 * server->echo_interval) / HZ);
532 cifs_reconnect(server);
533 wake_up(&server->response_q);
541 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
546 smb_msg->msg_control = NULL;
547 smb_msg->msg_controllen = 0;
549 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
552 if (server_unresponsive(server))
553 return -ECONNABORTED;
554 if (cifs_rdma_enabled(server) && server->smbd_conn)
555 length = smbd_recv(server->smbd_conn, smb_msg);
557 length = sock_recvmsg(server->ssocket, smb_msg, 0);
559 if (server->tcpStatus == CifsExiting)
562 if (server->tcpStatus == CifsNeedReconnect) {
563 cifs_reconnect(server);
564 return -ECONNABORTED;
567 if (length == -ERESTARTSYS ||
571 * Minimum sleep to prevent looping, allowing socket
572 * to clear and app threads to set tcpStatus
573 * CifsNeedReconnect if server hung.
575 usleep_range(1000, 2000);
581 cifs_dbg(FYI, "Received no data or error: %d\n", length);
582 cifs_reconnect(server);
583 return -ECONNABORTED;
590 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
591 unsigned int to_read)
593 struct msghdr smb_msg;
594 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
595 iov_iter_kvec(&smb_msg.msg_iter, READ | ITER_KVEC, &iov, 1, to_read);
597 return cifs_readv_from_socket(server, &smb_msg);
601 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
602 unsigned int page_offset, unsigned int to_read)
604 struct msghdr smb_msg;
605 struct bio_vec bv = {
606 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
607 iov_iter_bvec(&smb_msg.msg_iter, READ | ITER_BVEC, &bv, 1, to_read);
608 return cifs_readv_from_socket(server, &smb_msg);
612 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
615 * The first byte big endian of the length field,
616 * is actually not part of the length but the type
617 * with the most common, zero, as regular data.
620 case RFC1002_SESSION_MESSAGE:
621 /* Regular SMB response */
623 case RFC1002_SESSION_KEEP_ALIVE:
624 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
626 case RFC1002_POSITIVE_SESSION_RESPONSE:
627 cifs_dbg(FYI, "RFC 1002 positive session response\n");
629 case RFC1002_NEGATIVE_SESSION_RESPONSE:
631 * We get this from Windows 98 instead of an error on
632 * SMB negprot response.
634 cifs_dbg(FYI, "RFC 1002 negative session response\n");
635 /* give server a second to clean up */
638 * Always try 445 first on reconnect since we get NACK
639 * on some if we ever connected to port 139 (the NACK
640 * is since we do not begin with RFC1001 session
643 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
644 cifs_reconnect(server);
645 wake_up(&server->response_q);
648 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
649 cifs_reconnect(server);
656 dequeue_mid(struct mid_q_entry *mid, bool malformed)
658 #ifdef CONFIG_CIFS_STATS2
659 mid->when_received = jiffies;
661 spin_lock(&GlobalMid_Lock);
663 mid->mid_state = MID_RESPONSE_RECEIVED;
665 mid->mid_state = MID_RESPONSE_MALFORMED;
666 list_del_init(&mid->qhead);
667 spin_unlock(&GlobalMid_Lock);
671 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
672 char *buf, int malformed)
674 if (server->ops->check_trans2 &&
675 server->ops->check_trans2(mid, server, buf, malformed))
678 mid->large_buf = server->large_buf;
679 /* Was previous buf put in mpx struct for multi-rsp? */
680 if (!mid->multiRsp) {
681 /* smb buffer will be freed by user thread */
682 if (server->large_buf)
683 server->bigbuf = NULL;
685 server->smallbuf = NULL;
687 dequeue_mid(mid, malformed);
690 static void clean_demultiplex_info(struct TCP_Server_Info *server)
694 /* take it off the list, if it's not already */
695 spin_lock(&cifs_tcp_ses_lock);
696 list_del_init(&server->tcp_ses_list);
697 spin_unlock(&cifs_tcp_ses_lock);
699 spin_lock(&GlobalMid_Lock);
700 server->tcpStatus = CifsExiting;
701 spin_unlock(&GlobalMid_Lock);
702 wake_up_all(&server->response_q);
704 /* check if we have blocked requests that need to free */
705 spin_lock(&server->req_lock);
706 if (server->credits <= 0)
708 spin_unlock(&server->req_lock);
710 * Although there should not be any requests blocked on this queue it
711 * can not hurt to be paranoid and try to wake up requests that may
712 * haven been blocked when more than 50 at time were on the wire to the
713 * same server - they now will see the session is in exit state and get
714 * out of SendReceive.
716 wake_up_all(&server->request_q);
717 /* give those requests time to exit */
719 if (cifs_rdma_enabled(server) && server->smbd_conn) {
720 smbd_destroy(server->smbd_conn);
721 server->smbd_conn = NULL;
723 if (server->ssocket) {
724 sock_release(server->ssocket);
725 server->ssocket = NULL;
728 if (!list_empty(&server->pending_mid_q)) {
729 struct list_head dispose_list;
730 struct mid_q_entry *mid_entry;
731 struct list_head *tmp, *tmp2;
733 INIT_LIST_HEAD(&dispose_list);
734 spin_lock(&GlobalMid_Lock);
735 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
736 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
737 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
738 mid_entry->mid_state = MID_SHUTDOWN;
739 list_move(&mid_entry->qhead, &dispose_list);
741 spin_unlock(&GlobalMid_Lock);
743 /* now walk dispose list and issue callbacks */
744 list_for_each_safe(tmp, tmp2, &dispose_list) {
745 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
746 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
747 list_del_init(&mid_entry->qhead);
748 mid_entry->callback(mid_entry);
750 /* 1/8th of sec is more than enough time for them to exit */
754 if (!list_empty(&server->pending_mid_q)) {
756 * mpx threads have not exited yet give them at least the smb
757 * send timeout time for long ops.
759 * Due to delays on oplock break requests, we need to wait at
760 * least 45 seconds before giving up on a request getting a
761 * response and going ahead and killing cifsd.
763 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
766 * If threads still have not exited they are probably never
767 * coming home not much else we can do but free the memory.
771 kfree(server->hostname);
774 length = atomic_dec_return(&tcpSesAllocCount);
776 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
780 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
783 char *buf = server->smallbuf;
784 unsigned int pdu_length = server->pdu_size;
786 /* make sure this will fit in a large buffer */
787 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
788 server->vals->header_preamble_size) {
789 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
790 cifs_reconnect(server);
791 wake_up(&server->response_q);
792 return -ECONNABORTED;
795 /* switch to large buffer if too big for a small one */
796 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
797 server->large_buf = true;
798 memcpy(server->bigbuf, buf, server->total_read);
799 buf = server->bigbuf;
802 /* now read the rest */
803 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
804 pdu_length - HEADER_SIZE(server) + 1
805 + server->vals->header_preamble_size);
809 server->total_read += length;
811 dump_smb(buf, server->total_read);
813 return cifs_handle_standard(server, mid);
817 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
819 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
823 * We know that we received enough to get to the MID as we
824 * checked the pdu_length earlier. Now check to see
825 * if the rest of the header is OK. We borrow the length
826 * var for the rest of the loop to avoid a new stack var.
828 * 48 bytes is enough to display the header and a little bit
829 * into the payload for debugging purposes.
831 length = server->ops->check_message(buf, server->total_read, server);
833 cifs_dump_mem("Bad SMB: ", buf,
834 min_t(unsigned int, server->total_read, 48));
836 if (server->ops->is_session_expired &&
837 server->ops->is_session_expired(buf)) {
838 cifs_reconnect(server);
839 wake_up(&server->response_q);
843 if (server->ops->is_status_pending &&
844 server->ops->is_status_pending(buf, server, length))
850 handle_mid(mid, server, buf, length);
855 cifs_demultiplex_thread(void *p)
858 struct TCP_Server_Info *server = p;
859 unsigned int pdu_length;
860 unsigned int next_offset;
862 struct task_struct *task_to_wake = NULL;
863 struct mid_q_entry *mid_entry;
865 current->flags |= PF_MEMALLOC;
866 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
868 length = atomic_inc_return(&tcpSesAllocCount);
870 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
873 while (server->tcpStatus != CifsExiting) {
877 if (!allocate_buffers(server))
880 server->large_buf = false;
881 buf = server->smallbuf;
882 pdu_length = 4; /* enough to get RFC1001 header */
884 length = cifs_read_from_socket(server, buf, pdu_length);
888 if (server->vals->header_preamble_size == 0)
889 server->total_read = 0;
891 server->total_read = length;
894 * The right amount was read from socket - 4 bytes,
895 * so we can now interpret the length field.
897 pdu_length = get_rfc1002_length(buf);
899 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
900 if (!is_smb_response(server, buf[0]))
903 server->pdu_size = pdu_length;
905 /* make sure we have enough to get to the MID */
906 if (server->pdu_size < HEADER_SIZE(server) - 1 -
907 server->vals->header_preamble_size) {
908 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
910 cifs_reconnect(server);
911 wake_up(&server->response_q);
915 /* read down to the MID */
916 length = cifs_read_from_socket(server,
917 buf + server->vals->header_preamble_size,
918 HEADER_SIZE(server) - 1
919 - server->vals->header_preamble_size);
922 server->total_read += length;
924 if (server->ops->next_header) {
925 next_offset = server->ops->next_header(buf);
927 server->pdu_size = next_offset;
930 if (server->ops->is_transform_hdr &&
931 server->ops->receive_transform &&
932 server->ops->is_transform_hdr(buf)) {
933 length = server->ops->receive_transform(server,
936 mid_entry = server->ops->find_mid(server, buf);
938 if (!mid_entry || !mid_entry->receive)
939 length = standard_receive3(server, mid_entry);
941 length = mid_entry->receive(server, mid_entry);
947 if (server->large_buf)
948 buf = server->bigbuf;
950 server->lstrp = jiffies;
951 if (mid_entry != NULL) {
952 mid_entry->resp_buf_size = server->pdu_size;
953 if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
954 mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
955 server->ops->handle_cancelled_mid)
956 server->ops->handle_cancelled_mid(
960 if (!mid_entry->multiRsp || mid_entry->multiEnd)
961 mid_entry->callback(mid_entry);
962 } else if (server->ops->is_oplock_break &&
963 server->ops->is_oplock_break(buf, server)) {
964 cifs_dbg(FYI, "Received oplock break\n");
966 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
967 atomic_read(&midCount));
968 cifs_dump_mem("Received Data is: ", buf,
969 HEADER_SIZE(server));
970 #ifdef CONFIG_CIFS_DEBUG2
971 if (server->ops->dump_detail)
972 server->ops->dump_detail(buf, server);
973 cifs_dump_mids(server);
974 #endif /* CIFS_DEBUG2 */
976 if (pdu_length > server->pdu_size) {
977 if (!allocate_buffers(server))
979 pdu_length -= server->pdu_size;
980 server->total_read = 0;
981 server->large_buf = false;
982 buf = server->smallbuf;
985 } /* end while !EXITING */
987 /* buffer usually freed in free_mid - need to free it here on exit */
988 cifs_buf_release(server->bigbuf);
989 if (server->smallbuf) /* no sense logging a debug message if NULL */
990 cifs_small_buf_release(server->smallbuf);
992 task_to_wake = xchg(&server->tsk, NULL);
993 clean_demultiplex_info(server);
995 /* if server->tsk was NULL then wait for a signal before exiting */
997 set_current_state(TASK_INTERRUPTIBLE);
998 while (!signal_pending(current)) {
1000 set_current_state(TASK_INTERRUPTIBLE);
1002 set_current_state(TASK_RUNNING);
1005 module_put_and_exit(0);
1008 /* extract the host portion of the UNC string */
1010 extract_hostname(const char *unc)
1016 /* skip double chars at beginning of string */
1017 /* BB: check validity of these bytes? */
1020 /* delimiter between hostname and sharename is always '\\' now */
1021 delim = strchr(src, '\\');
1023 return ERR_PTR(-EINVAL);
1026 dst = kmalloc((len + 1), GFP_KERNEL);
1028 return ERR_PTR(-ENOMEM);
1030 memcpy(dst, src, len);
1036 static int get_option_ul(substring_t args[], unsigned long *option)
1041 string = match_strdup(args);
1044 rc = kstrtoul(string, 0, option);
1050 static int get_option_uid(substring_t args[], kuid_t *result)
1052 unsigned long value;
1056 rc = get_option_ul(args, &value);
1060 uid = make_kuid(current_user_ns(), value);
1061 if (!uid_valid(uid))
1068 static int get_option_gid(substring_t args[], kgid_t *result)
1070 unsigned long value;
1074 rc = get_option_ul(args, &value);
1078 gid = make_kgid(current_user_ns(), value);
1079 if (!gid_valid(gid))
1086 static int cifs_parse_security_flavors(char *value,
1087 struct smb_vol *vol)
1090 substring_t args[MAX_OPT_ARGS];
1093 * With mount options, the last one should win. Reset any existing
1094 * settings back to default.
1096 vol->sectype = Unspecified;
1099 switch (match_token(value, cifs_secflavor_tokens, args)) {
1101 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1107 vol->sectype = Kerberos;
1109 case Opt_sec_ntlmsspi:
1112 case Opt_sec_ntlmssp:
1113 vol->sectype = RawNTLMSSP;
1119 vol->sectype = NTLM;
1121 case Opt_sec_ntlmv2i:
1124 case Opt_sec_ntlmv2:
1125 vol->sectype = NTLMv2;
1127 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1128 case Opt_sec_lanman:
1129 vol->sectype = LANMAN;
1136 cifs_dbg(VFS, "bad security option: %s\n", value);
1144 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1146 substring_t args[MAX_OPT_ARGS];
1148 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1149 case Opt_cache_loose:
1150 vol->direct_io = false;
1151 vol->strict_io = false;
1153 case Opt_cache_strict:
1154 vol->direct_io = false;
1155 vol->strict_io = true;
1157 case Opt_cache_none:
1158 vol->direct_io = true;
1159 vol->strict_io = false;
1162 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1169 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1171 substring_t args[MAX_OPT_ARGS];
1173 switch (match_token(value, cifs_smb_version_tokens, args)) {
1175 if (disable_legacy_dialects) {
1176 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1179 vol->ops = &smb1_operations;
1180 vol->vals = &smb1_values;
1183 if (disable_legacy_dialects) {
1184 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1187 vol->ops = &smb20_operations;
1188 vol->vals = &smb20_values;
1191 vol->ops = &smb21_operations;
1192 vol->vals = &smb21_values;
1195 vol->ops = &smb30_operations;
1196 vol->vals = &smb30_values;
1199 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1200 vol->vals = &smb302_values;
1202 #ifdef CONFIG_CIFS_SMB311
1204 vol->ops = &smb311_operations;
1205 vol->vals = &smb311_values;
1209 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1210 vol->vals = &smb3any_values;
1213 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1214 vol->vals = &smbdefault_values;
1217 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1224 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1225 * fields with the result. Returns 0 on success and an error otherwise.
1228 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1231 const char *delims = "/\\";
1234 /* make sure we have a valid UNC double delimiter prefix */
1235 len = strspn(devname, delims);
1239 /* find delimiter between host and sharename */
1240 pos = strpbrk(devname + 2, delims);
1244 /* skip past delimiter */
1247 /* now go until next delimiter or end of string */
1248 len = strcspn(pos, delims);
1250 /* move "pos" up to delimiter or NULL */
1252 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1256 convert_delimiter(vol->UNC, '\\');
1258 /* skip any delimiter */
1259 if (*pos == '/' || *pos == '\\')
1262 /* If pos is NULL then no prepath */
1266 vol->prepath = kstrdup(pos, GFP_KERNEL);
1274 cifs_parse_mount_options(const char *mountdata, const char *devname,
1275 struct smb_vol *vol)
1278 char *mountdata_copy = NULL, *options;
1279 unsigned int temp_len, i, j;
1281 short int override_uid = -1;
1282 short int override_gid = -1;
1283 bool uid_specified = false;
1284 bool gid_specified = false;
1285 bool sloppy = false;
1286 char *invalid = NULL;
1287 char *nodename = utsname()->nodename;
1288 char *string = NULL;
1289 char *tmp_end, *value;
1291 bool got_ip = false;
1292 bool got_version = false;
1293 unsigned short port = 0;
1294 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1298 delim = separator[0];
1300 /* ensure we always start with zeroed-out smb_vol */
1301 memset(vol, 0, sizeof(*vol));
1304 * does not have to be perfect mapping since field is
1305 * informational, only used for servers that do not support
1306 * port 445 and it can be overridden at mount time
1308 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1309 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1310 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1312 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1313 /* null target name indicates to use *SMBSERVR default called name
1314 if we end up sending RFC1001 session initialize */
1315 vol->target_rfc1001_name[0] = 0;
1316 vol->cred_uid = current_uid();
1317 vol->linux_uid = current_uid();
1318 vol->linux_gid = current_gid();
1321 * default to SFM style remapping of seven reserved characters
1322 * unless user overrides it or we negotiate CIFS POSIX where
1323 * it is unnecessary. Can not simultaneously use more than one mapping
1324 * since then readdir could list files that open could not open
1328 /* default to only allowing write access to owner of the mount */
1329 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1331 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1332 /* default is always to request posix paths. */
1333 vol->posix_paths = 1;
1334 /* default to using server inode numbers where available */
1335 vol->server_ino = 1;
1337 /* default is to use strict cifs caching semantics */
1338 vol->strict_io = true;
1340 vol->actimeo = CIFS_DEF_ACTIMEO;
1342 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1343 vol->ops = &smb30_operations;
1344 vol->vals = &smbdefault_values;
1346 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1349 goto cifs_parse_mount_err;
1351 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1352 if (!mountdata_copy)
1353 goto cifs_parse_mount_err;
1355 options = mountdata_copy;
1356 end = options + strlen(options);
1358 if (strncmp(options, "sep=", 4) == 0) {
1359 if (options[4] != 0) {
1360 separator[0] = options[4];
1363 cifs_dbg(FYI, "Null separator not allowed\n");
1366 vol->backupuid_specified = false; /* no backup intent for a user */
1367 vol->backupgid_specified = false; /* no backup intent for a group */
1369 switch (cifs_parse_devname(devname, vol)) {
1373 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1374 goto cifs_parse_mount_err;
1376 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1377 goto cifs_parse_mount_err;
1379 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1380 goto cifs_parse_mount_err;
1383 while ((data = strsep(&options, separator)) != NULL) {
1384 substring_t args[MAX_OPT_ARGS];
1385 unsigned long option;
1391 token = match_token(data, cifs_mount_option_tokens, args);
1395 /* Ingnore the following */
1399 /* Boolean values */
1400 case Opt_user_xattr:
1403 case Opt_nouser_xattr:
1409 case Opt_noforceuid:
1415 case Opt_noforcegid:
1418 case Opt_noblocksend:
1419 vol->noblocksnd = 1;
1421 case Opt_noautotune:
1422 vol->noautotune = 1;
1437 vol->sfu_remap = true;
1438 vol->remap = false; /* disable SFM mapping */
1440 case Opt_nomapchars:
1441 vol->sfu_remap = false;
1445 vol->sfu_remap = false; /* disable SFU mapping */
1447 case Opt_nomapposix:
1459 case Opt_posixpaths:
1460 vol->posix_paths = 1;
1462 case Opt_noposixpaths:
1463 vol->posix_paths = 0;
1468 "conflicting unix mount options\n");
1469 vol->no_linux_ext = 1;
1472 if (vol->no_linux_ext)
1474 "conflicting unix mount options\n");
1486 * turn off mandatory locking in mode
1487 * if remote locking is turned off since the
1488 * local vfs will do advisory
1490 if (vol->file_mode ==
1491 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1492 vol->file_mode = S_IALLUGO;
1494 case Opt_nohandlecache:
1495 vol->nohandlecache = 1;
1497 case Opt_handlecache:
1498 vol->nohandlecache = 0;
1500 case Opt_forcemandatorylock:
1509 case Opt_setuidfromacl:
1510 vol->setuidfromacl = 1;
1513 vol->dynperm = true;
1516 vol->dynperm = false;
1530 case Opt_nostrictsync:
1531 vol->nostrictsync = 1;
1533 case Opt_strictsync:
1534 vol->nostrictsync = 0;
1537 vol->server_ino = 1;
1539 case Opt_noserverino:
1540 vol->server_ino = 0;
1542 case Opt_rwpidforward:
1543 vol->rwpidforward = 1;
1552 vol->no_psx_acl = 0;
1555 vol->no_psx_acl = 1;
1557 case Opt_locallease:
1558 vol->local_lease = 1;
1564 /* we do not do the following in secFlags because seal
1565 * is a per tree connection (mount) not a per socket
1566 * or per-smb connection option in the protocol
1567 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1572 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1575 #ifndef CONFIG_CIFS_FSCACHE
1576 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1577 goto cifs_parse_mount_err;
1581 case Opt_mfsymlinks:
1582 vol->mfsymlinks = true;
1585 vol->multiuser = true;
1590 case Opt_nosharesock:
1591 vol->nosharesock = true;
1593 case Opt_nopersistent:
1594 vol->nopersistent = true;
1595 if (vol->persistent) {
1597 "persistenthandles mount options conflict\n");
1598 goto cifs_parse_mount_err;
1601 case Opt_persistent:
1602 vol->persistent = true;
1603 if ((vol->nopersistent) || (vol->resilient)) {
1605 "persistenthandles mount options conflict\n");
1606 goto cifs_parse_mount_err;
1610 vol->resilient = true;
1611 if (vol->persistent) {
1613 "persistenthandles mount options conflict\n");
1614 goto cifs_parse_mount_err;
1617 case Opt_noresilient:
1618 vol->resilient = false; /* already the default */
1620 case Opt_domainauto:
1621 vol->domainauto = true;
1627 /* Numeric Values */
1629 if (get_option_uid(args, &vol->backupuid)) {
1630 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1632 goto cifs_parse_mount_err;
1634 vol->backupuid_specified = true;
1637 if (get_option_gid(args, &vol->backupgid)) {
1638 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1640 goto cifs_parse_mount_err;
1642 vol->backupgid_specified = true;
1645 if (get_option_uid(args, &vol->linux_uid)) {
1646 cifs_dbg(VFS, "%s: Invalid uid value\n",
1648 goto cifs_parse_mount_err;
1650 uid_specified = true;
1653 if (get_option_uid(args, &vol->cred_uid)) {
1654 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1656 goto cifs_parse_mount_err;
1660 if (get_option_gid(args, &vol->linux_gid)) {
1661 cifs_dbg(VFS, "%s: Invalid gid value\n",
1663 goto cifs_parse_mount_err;
1665 gid_specified = true;
1668 if (get_option_ul(args, &option)) {
1669 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1671 goto cifs_parse_mount_err;
1673 vol->file_mode = option;
1676 if (get_option_ul(args, &option)) {
1677 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1679 goto cifs_parse_mount_err;
1681 vol->dir_mode = option;
1684 if (get_option_ul(args, &option) ||
1685 option > USHRT_MAX) {
1686 cifs_dbg(VFS, "%s: Invalid port value\n",
1688 goto cifs_parse_mount_err;
1690 port = (unsigned short)option;
1693 if (get_option_ul(args, &option)) {
1694 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1696 goto cifs_parse_mount_err;
1698 vol->rsize = option;
1701 if (get_option_ul(args, &option)) {
1702 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1704 goto cifs_parse_mount_err;
1706 vol->wsize = option;
1709 if (get_option_ul(args, &option)) {
1710 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1712 goto cifs_parse_mount_err;
1714 vol->actimeo = HZ * option;
1715 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1716 cifs_dbg(VFS, "attribute cache timeout too large\n");
1717 goto cifs_parse_mount_err;
1720 case Opt_echo_interval:
1721 if (get_option_ul(args, &option)) {
1722 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1724 goto cifs_parse_mount_err;
1726 vol->echo_interval = option;
1729 if (get_option_ul(args, &option)) {
1730 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1732 goto cifs_parse_mount_err;
1734 vol->snapshot_time = option;
1736 case Opt_max_credits:
1737 if (get_option_ul(args, &option) || (option < 20) ||
1739 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1741 goto cifs_parse_mount_err;
1743 vol->max_credits = option;
1746 /* String Arguments */
1748 case Opt_blank_user:
1749 /* null user, ie. anonymous authentication */
1751 vol->username = NULL;
1754 string = match_strdup(args);
1758 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1759 CIFS_MAX_USERNAME_LEN) {
1760 pr_warn("CIFS: username too long\n");
1761 goto cifs_parse_mount_err;
1764 kfree(vol->username);
1765 vol->username = kstrdup(string, GFP_KERNEL);
1767 goto cifs_parse_mount_err;
1769 case Opt_blank_pass:
1770 /* passwords have to be handled differently
1771 * to allow the character used for deliminator
1772 * to be passed within them
1776 * Check if this is a case where the password
1777 * starts with a delimiter
1779 tmp_end = strchr(data, '=');
1781 if (!(tmp_end < end && tmp_end[1] == delim)) {
1782 /* No it is not. Set the password to NULL */
1783 kzfree(vol->password);
1784 vol->password = NULL;
1787 /* Yes it is. Drop down to Opt_pass below.*/
1789 /* Obtain the value string */
1790 value = strchr(data, '=');
1793 /* Set tmp_end to end of the string */
1794 tmp_end = (char *) value + strlen(value);
1796 /* Check if following character is the deliminator
1797 * If yes, we have encountered a double deliminator
1798 * reset the NULL character to the deliminator
1800 if (tmp_end < end && tmp_end[1] == delim) {
1803 /* Keep iterating until we get to a single
1804 * deliminator OR the end
1806 while ((tmp_end = strchr(tmp_end, delim))
1807 != NULL && (tmp_end[1] == delim)) {
1808 tmp_end = (char *) &tmp_end[2];
1811 /* Reset var options to point to next element */
1814 options = (char *) &tmp_end[1];
1816 /* Reached the end of the mount option
1821 kzfree(vol->password);
1822 /* Now build new password string */
1823 temp_len = strlen(value);
1824 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1825 if (vol->password == NULL) {
1826 pr_warn("CIFS: no memory for password\n");
1827 goto cifs_parse_mount_err;
1830 for (i = 0, j = 0; i < temp_len; i++, j++) {
1831 vol->password[j] = value[i];
1832 if ((value[i] == delim) &&
1833 value[i+1] == delim)
1834 /* skip the second deliminator */
1837 vol->password[j] = '\0';
1840 /* FIXME: should this be an error instead? */
1844 string = match_strdup(args);
1848 if (!cifs_convert_address(dstaddr, string,
1850 pr_err("CIFS: bad ip= option (%s).\n", string);
1851 goto cifs_parse_mount_err;
1856 string = match_strdup(args);
1860 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1861 == CIFS_MAX_DOMAINNAME_LEN) {
1862 pr_warn("CIFS: domain name too long\n");
1863 goto cifs_parse_mount_err;
1866 kfree(vol->domainname);
1867 vol->domainname = kstrdup(string, GFP_KERNEL);
1868 if (!vol->domainname) {
1869 pr_warn("CIFS: no memory for domainname\n");
1870 goto cifs_parse_mount_err;
1872 cifs_dbg(FYI, "Domain name set\n");
1875 string = match_strdup(args);
1879 if (!cifs_convert_address(
1880 (struct sockaddr *)&vol->srcaddr,
1881 string, strlen(string))) {
1882 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1884 goto cifs_parse_mount_err;
1888 string = match_strdup(args);
1892 if (strnlen(string, 1024) >= 65) {
1893 pr_warn("CIFS: iocharset name too long.\n");
1894 goto cifs_parse_mount_err;
1897 if (strncasecmp(string, "default", 7) != 0) {
1898 kfree(vol->iocharset);
1899 vol->iocharset = kstrdup(string,
1901 if (!vol->iocharset) {
1902 pr_warn("CIFS: no memory for charset\n");
1903 goto cifs_parse_mount_err;
1906 /* if iocharset not set then load_nls_default
1909 cifs_dbg(FYI, "iocharset set to %s\n", string);
1911 case Opt_netbiosname:
1912 string = match_strdup(args);
1916 memset(vol->source_rfc1001_name, 0x20,
1919 * FIXME: are there cases in which a comma can
1920 * be valid in workstation netbios name (and
1921 * need special handling)?
1923 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1924 /* don't ucase netbiosname for user */
1927 vol->source_rfc1001_name[i] = string[i];
1929 /* The string has 16th byte zero still from
1930 * set at top of the function
1932 if (i == RFC1001_NAME_LEN && string[i] != 0)
1933 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1936 /* servernetbiosname specified override *SMBSERVER */
1937 string = match_strdup(args);
1941 /* last byte, type, is 0x20 for servr type */
1942 memset(vol->target_rfc1001_name, 0x20,
1943 RFC1001_NAME_LEN_WITH_NULL);
1945 /* BB are there cases in which a comma can be
1946 valid in this workstation netbios name
1947 (and need special handling)? */
1949 /* user or mount helper must uppercase the
1951 for (i = 0; i < 15; i++) {
1954 vol->target_rfc1001_name[i] = string[i];
1956 /* The string has 16th byte zero still from
1957 set at top of the function */
1958 if (i == RFC1001_NAME_LEN && string[i] != 0)
1959 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1962 /* version of mount userspace tools, not dialect */
1963 string = match_strdup(args);
1967 /* If interface changes in mount.cifs bump to new ver */
1968 if (strncasecmp(string, "1", 1) == 0) {
1969 if (strlen(string) > 1) {
1970 pr_warn("Bad mount helper ver=%s. Did "
1971 "you want SMB1 (CIFS) dialect "
1972 "and mean to type vers=1.0 "
1973 "instead?\n", string);
1974 goto cifs_parse_mount_err;
1976 /* This is the default */
1979 /* For all other value, error */
1980 pr_warn("CIFS: Invalid mount helper version specified\n");
1981 goto cifs_parse_mount_err;
1983 /* protocol version (dialect) */
1984 string = match_strdup(args);
1988 if (cifs_parse_smb_version(string, vol) != 0)
1989 goto cifs_parse_mount_err;
1993 string = match_strdup(args);
1997 if (cifs_parse_security_flavors(string, vol) != 0)
1998 goto cifs_parse_mount_err;
2001 string = match_strdup(args);
2005 if (cifs_parse_cache_flavor(string, vol) != 0)
2006 goto cifs_parse_mount_err;
2010 * An option we don't recognize. Save it off for later
2011 * if we haven't already found one
2017 /* Free up any allocated string */
2022 if (!sloppy && invalid) {
2023 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2024 goto cifs_parse_mount_err;
2027 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2028 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2029 goto cifs_parse_mount_err;
2033 /* Muliuser mounts require CONFIG_KEYS support */
2034 if (vol->multiuser) {
2035 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2036 goto cifs_parse_mount_err;
2040 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2041 goto cifs_parse_mount_err;
2044 /* make sure UNC has a share name */
2045 if (!strchr(vol->UNC + 3, '\\')) {
2046 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2047 goto cifs_parse_mount_err;
2054 /* No ip= option specified? Try to get it from UNC */
2055 /* Use the address part of the UNC. */
2056 slash = strchr(&vol->UNC[2], '\\');
2057 len = slash - &vol->UNC[2];
2058 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2059 pr_err("Unable to determine destination address.\n");
2060 goto cifs_parse_mount_err;
2064 /* set the port that we got earlier */
2065 cifs_set_port(dstaddr, port);
2068 vol->override_uid = override_uid;
2069 else if (override_uid == 1)
2070 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2073 vol->override_gid = override_gid;
2074 else if (override_gid == 1)
2075 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2077 if (got_version == false)
2078 pr_warn("No dialect specified on mount. Default has changed to "
2079 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2080 "(SMB1). To use the less secure SMB1 dialect to access "
2081 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2084 kfree(mountdata_copy);
2088 pr_warn("Could not allocate temporary buffer\n");
2089 cifs_parse_mount_err:
2091 kfree(mountdata_copy);
2095 /** Returns true if srcaddr isn't specified and rhs isn't
2096 * specified, or if srcaddr is specified and
2097 * matches the IP address of the rhs argument.
2100 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2102 switch (srcaddr->sa_family) {
2104 return (rhs->sa_family == AF_UNSPEC);
2106 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2107 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2108 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2111 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2112 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2113 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2117 return false; /* don't expect to be here */
2122 * If no port is specified in addr structure, we try to match with 445 port
2123 * and if it fails - with 139 ports. It should be called only if address
2124 * families of server and addr are equal.
2127 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2129 __be16 port, *sport;
2131 switch (addr->sa_family) {
2133 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2134 port = ((struct sockaddr_in *) addr)->sin_port;
2137 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2138 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2146 port = htons(CIFS_PORT);
2150 port = htons(RFC1001_PORT);
2153 return port == *sport;
2157 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2158 struct sockaddr *srcaddr)
2160 switch (addr->sa_family) {
2162 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2163 struct sockaddr_in *srv_addr4 =
2164 (struct sockaddr_in *)&server->dstaddr;
2166 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2171 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2172 struct sockaddr_in6 *srv_addr6 =
2173 (struct sockaddr_in6 *)&server->dstaddr;
2175 if (!ipv6_addr_equal(&addr6->sin6_addr,
2176 &srv_addr6->sin6_addr))
2178 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2184 return false; /* don't expect to be here */
2187 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2194 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2197 * The select_sectype function should either return the vol->sectype
2198 * that was specified, or "Unspecified" if that sectype was not
2199 * compatible with the given NEGOTIATE request.
2201 if (server->ops->select_sectype(server, vol->sectype)
2206 * Now check if signing mode is acceptable. No need to check
2207 * global_secflags at this point since if MUST_SIGN is set then
2208 * the server->sign had better be too.
2210 if (vol->sign && !server->sign)
2216 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2218 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2220 if (vol->nosharesock)
2223 /* BB update this for smb3any and default case */
2224 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2227 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2230 if (!match_address(server, addr,
2231 (struct sockaddr *)&vol->srcaddr))
2234 if (!match_port(server, addr))
2237 if (!match_security(server, vol))
2240 if (server->echo_interval != vol->echo_interval * HZ)
2243 if (server->rdma != vol->rdma)
2249 static struct TCP_Server_Info *
2250 cifs_find_tcp_session(struct smb_vol *vol)
2252 struct TCP_Server_Info *server;
2254 spin_lock(&cifs_tcp_ses_lock);
2255 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2256 if (!match_server(server, vol))
2259 ++server->srv_count;
2260 spin_unlock(&cifs_tcp_ses_lock);
2261 cifs_dbg(FYI, "Existing tcp session with server found\n");
2264 spin_unlock(&cifs_tcp_ses_lock);
2269 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2271 struct task_struct *task;
2273 spin_lock(&cifs_tcp_ses_lock);
2274 if (--server->srv_count > 0) {
2275 spin_unlock(&cifs_tcp_ses_lock);
2279 put_net(cifs_net_ns(server));
2281 list_del_init(&server->tcp_ses_list);
2282 spin_unlock(&cifs_tcp_ses_lock);
2284 cancel_delayed_work_sync(&server->echo);
2288 * Avoid deadlock here: reconnect work calls
2289 * cifs_put_tcp_session() at its end. Need to be sure
2290 * that reconnect work does nothing with server pointer after
2293 cancel_delayed_work(&server->reconnect);
2295 cancel_delayed_work_sync(&server->reconnect);
2297 spin_lock(&GlobalMid_Lock);
2298 server->tcpStatus = CifsExiting;
2299 spin_unlock(&GlobalMid_Lock);
2301 cifs_crypto_secmech_release(server);
2302 cifs_fscache_release_client_cookie(server);
2304 kfree(server->session_key.response);
2305 server->session_key.response = NULL;
2306 server->session_key.len = 0;
2308 task = xchg(&server->tsk, NULL);
2310 force_sig(SIGKILL, task);
2313 static struct TCP_Server_Info *
2314 cifs_get_tcp_session(struct smb_vol *volume_info)
2316 struct TCP_Server_Info *tcp_ses = NULL;
2319 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2321 /* see if we already have a matching tcp_ses */
2322 tcp_ses = cifs_find_tcp_session(volume_info);
2326 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2332 tcp_ses->ops = volume_info->ops;
2333 tcp_ses->vals = volume_info->vals;
2334 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2335 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2336 if (IS_ERR(tcp_ses->hostname)) {
2337 rc = PTR_ERR(tcp_ses->hostname);
2338 goto out_err_crypto_release;
2341 tcp_ses->noblocksnd = volume_info->noblocksnd;
2342 tcp_ses->noautotune = volume_info->noautotune;
2343 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2344 tcp_ses->rdma = volume_info->rdma;
2345 tcp_ses->in_flight = 0;
2346 tcp_ses->credits = 1;
2347 init_waitqueue_head(&tcp_ses->response_q);
2348 init_waitqueue_head(&tcp_ses->request_q);
2349 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2350 mutex_init(&tcp_ses->srv_mutex);
2351 memcpy(tcp_ses->workstation_RFC1001_name,
2352 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2353 memcpy(tcp_ses->server_RFC1001_name,
2354 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2355 tcp_ses->session_estab = false;
2356 tcp_ses->sequence_number = 0;
2357 tcp_ses->lstrp = jiffies;
2358 spin_lock_init(&tcp_ses->req_lock);
2359 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2360 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2361 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2362 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2363 mutex_init(&tcp_ses->reconnect_mutex);
2364 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2365 sizeof(tcp_ses->srcaddr));
2366 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2367 sizeof(tcp_ses->dstaddr));
2368 generate_random_uuid(tcp_ses->client_guid);
2370 * at this point we are the only ones with the pointer
2371 * to the struct since the kernel thread not created yet
2372 * no need to spinlock this init of tcpStatus or srv_count
2374 tcp_ses->tcpStatus = CifsNew;
2375 ++tcp_ses->srv_count;
2377 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2378 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2379 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2381 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2382 if (tcp_ses->rdma) {
2383 #ifndef CONFIG_CIFS_SMB_DIRECT
2384 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2386 goto out_err_crypto_release;
2388 tcp_ses->smbd_conn = smbd_get_connection(
2389 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2390 if (tcp_ses->smbd_conn) {
2391 cifs_dbg(VFS, "RDMA transport established\n");
2393 goto smbd_connected;
2396 goto out_err_crypto_release;
2399 rc = ip_connect(tcp_ses);
2401 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2402 goto out_err_crypto_release;
2406 * since we're in a cifs function already, we know that
2407 * this will succeed. No need for try_module_get().
2409 __module_get(THIS_MODULE);
2410 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2412 if (IS_ERR(tcp_ses->tsk)) {
2413 rc = PTR_ERR(tcp_ses->tsk);
2414 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2415 module_put(THIS_MODULE);
2416 goto out_err_crypto_release;
2418 tcp_ses->tcpStatus = CifsNeedNegotiate;
2420 /* thread spawned, put it on the list */
2421 spin_lock(&cifs_tcp_ses_lock);
2422 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2423 spin_unlock(&cifs_tcp_ses_lock);
2425 cifs_fscache_get_client_cookie(tcp_ses);
2427 /* queue echo request delayed work */
2428 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2432 out_err_crypto_release:
2433 cifs_crypto_secmech_release(tcp_ses);
2435 put_net(cifs_net_ns(tcp_ses));
2439 if (!IS_ERR(tcp_ses->hostname))
2440 kfree(tcp_ses->hostname);
2441 if (tcp_ses->ssocket)
2442 sock_release(tcp_ses->ssocket);
2448 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2450 if (vol->sectype != Unspecified &&
2451 vol->sectype != ses->sectype)
2454 switch (ses->sectype) {
2456 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2460 /* NULL username means anonymous session */
2461 if (ses->user_name == NULL) {
2467 /* anything else takes username/password */
2468 if (strncmp(ses->user_name,
2469 vol->username ? vol->username : "",
2470 CIFS_MAX_USERNAME_LEN))
2472 if ((vol->username && strlen(vol->username) != 0) &&
2473 ses->password != NULL &&
2474 strncmp(ses->password,
2475 vol->password ? vol->password : "",
2476 CIFS_MAX_PASSWORD_LEN))
2483 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2485 * A new IPC connection is made and stored in the session
2486 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2489 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2492 struct cifs_tcon *tcon;
2493 struct nls_table *nls_codepage;
2494 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2498 * If the mount request that resulted in the creation of the
2499 * session requires encryption, force IPC to be encrypted too.
2501 if (volume_info->seal) {
2502 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2506 "IPC: server doesn't support encryption\n");
2511 tcon = tconInfoAlloc();
2515 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->serverName);
2518 nls_codepage = load_nls_default();
2524 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2528 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2533 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2535 ses->tcon_ipc = tcon;
2537 unload_nls(nls_codepage);
2542 * cifs_free_ipc - helper to release the session IPC tcon
2544 * Needs to be called everytime a session is destroyed
2547 cifs_free_ipc(struct cifs_ses *ses)
2550 struct cifs_tcon *tcon = ses->tcon_ipc;
2555 if (ses->server->ops->tree_disconnect) {
2557 rc = ses->server->ops->tree_disconnect(xid, tcon);
2562 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2565 ses->tcon_ipc = NULL;
2569 static struct cifs_ses *
2570 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2572 struct cifs_ses *ses;
2574 spin_lock(&cifs_tcp_ses_lock);
2575 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2576 if (ses->status == CifsExiting)
2578 if (!match_session(ses, vol))
2581 spin_unlock(&cifs_tcp_ses_lock);
2584 spin_unlock(&cifs_tcp_ses_lock);
2589 cifs_put_smb_ses(struct cifs_ses *ses)
2591 unsigned int rc, xid;
2592 struct TCP_Server_Info *server = ses->server;
2594 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2596 spin_lock(&cifs_tcp_ses_lock);
2597 if (ses->status == CifsExiting) {
2598 spin_unlock(&cifs_tcp_ses_lock);
2601 if (--ses->ses_count > 0) {
2602 spin_unlock(&cifs_tcp_ses_lock);
2605 if (ses->status == CifsGood)
2606 ses->status = CifsExiting;
2607 spin_unlock(&cifs_tcp_ses_lock);
2611 if (ses->status == CifsExiting && server->ops->logoff) {
2613 rc = server->ops->logoff(xid, ses);
2615 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2620 spin_lock(&cifs_tcp_ses_lock);
2621 list_del_init(&ses->smb_ses_list);
2622 spin_unlock(&cifs_tcp_ses_lock);
2625 cifs_put_tcp_session(server, 0);
2630 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2631 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2633 /* Populate username and pw fields from keyring if possible */
2635 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2638 const char *delim, *payload;
2642 struct TCP_Server_Info *server = ses->server;
2643 struct sockaddr_in *sa;
2644 struct sockaddr_in6 *sa6;
2645 const struct user_key_payload *upayload;
2647 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2651 /* try to find an address key first */
2652 switch (server->dstaddr.ss_family) {
2654 sa = (struct sockaddr_in *)&server->dstaddr;
2655 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2658 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2659 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2662 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2663 server->dstaddr.ss_family);
2668 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2669 key = request_key(&key_type_logon, desc, "");
2671 if (!ses->domainName) {
2672 cifs_dbg(FYI, "domainName is NULL\n");
2677 /* didn't work, try to find a domain key */
2678 sprintf(desc, "cifs:d:%s", ses->domainName);
2679 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2680 key = request_key(&key_type_logon, desc, "");
2687 down_read(&key->sem);
2688 upayload = user_key_payload_locked(key);
2689 if (IS_ERR_OR_NULL(upayload)) {
2690 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2694 /* find first : in payload */
2695 payload = upayload->data;
2696 delim = strnchr(payload, upayload->datalen, ':');
2697 cifs_dbg(FYI, "payload=%s\n", payload);
2699 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2705 len = delim - payload;
2706 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2707 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2713 vol->username = kstrndup(payload, len, GFP_KERNEL);
2714 if (!vol->username) {
2715 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2720 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2722 len = key->datalen - (len + 1);
2723 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2724 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2726 kfree(vol->username);
2727 vol->username = NULL;
2732 vol->password = kstrndup(delim, len, GFP_KERNEL);
2733 if (!vol->password) {
2734 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2737 kfree(vol->username);
2738 vol->username = NULL;
2747 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2750 #else /* ! CONFIG_KEYS */
2752 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2753 struct cifs_ses *ses __attribute__((unused)))
2757 #endif /* CONFIG_KEYS */
2760 * cifs_get_smb_ses - get a session matching @volume_info data from @server
2762 * This function assumes it is being called from cifs_mount() where we
2763 * already got a server reference (server refcount +1). See
2764 * cifs_get_tcon() for refcount explanations.
2766 static struct cifs_ses *
2767 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2771 struct cifs_ses *ses;
2772 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2773 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2777 ses = cifs_find_smb_ses(server, volume_info);
2779 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2782 mutex_lock(&ses->session_mutex);
2783 rc = cifs_negotiate_protocol(xid, ses);
2785 mutex_unlock(&ses->session_mutex);
2786 /* problem -- put our ses reference */
2787 cifs_put_smb_ses(ses);
2791 if (ses->need_reconnect) {
2792 cifs_dbg(FYI, "Session needs reconnect\n");
2793 rc = cifs_setup_session(xid, ses,
2794 volume_info->local_nls);
2796 mutex_unlock(&ses->session_mutex);
2797 /* problem -- put our reference */
2798 cifs_put_smb_ses(ses);
2803 mutex_unlock(&ses->session_mutex);
2805 /* existing SMB ses has a server reference already */
2806 cifs_put_tcp_session(server, 0);
2811 cifs_dbg(FYI, "Existing smb sess not found\n");
2812 ses = sesInfoAlloc();
2816 /* new SMB session uses our server ref */
2817 ses->server = server;
2818 if (server->dstaddr.ss_family == AF_INET6)
2819 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2821 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2823 if (volume_info->username) {
2824 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2825 if (!ses->user_name)
2829 /* volume_info->password freed at unmount */
2830 if (volume_info->password) {
2831 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2835 if (volume_info->domainname) {
2836 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2837 if (!ses->domainName)
2840 if (volume_info->domainauto)
2841 ses->domainAuto = volume_info->domainauto;
2842 ses->cred_uid = volume_info->cred_uid;
2843 ses->linux_uid = volume_info->linux_uid;
2845 ses->sectype = volume_info->sectype;
2846 ses->sign = volume_info->sign;
2848 mutex_lock(&ses->session_mutex);
2849 rc = cifs_negotiate_protocol(xid, ses);
2851 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2852 mutex_unlock(&ses->session_mutex);
2856 /* success, put it on the list */
2857 spin_lock(&cifs_tcp_ses_lock);
2858 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2859 spin_unlock(&cifs_tcp_ses_lock);
2863 cifs_setup_ipc(ses, volume_info);
2873 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
2875 if (tcon->tidStatus == CifsExiting)
2877 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
2879 if (tcon->seal != volume_info->seal)
2881 if (tcon->snapshot_time != volume_info->snapshot_time)
2886 static struct cifs_tcon *
2887 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2889 struct list_head *tmp;
2890 struct cifs_tcon *tcon;
2892 spin_lock(&cifs_tcp_ses_lock);
2893 list_for_each(tmp, &ses->tcon_list) {
2894 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2895 if (!match_tcon(tcon, volume_info))
2898 spin_unlock(&cifs_tcp_ses_lock);
2901 spin_unlock(&cifs_tcp_ses_lock);
2906 cifs_put_tcon(struct cifs_tcon *tcon)
2909 struct cifs_ses *ses;
2912 * IPC tcon share the lifetime of their session and are
2913 * destroyed in the session put function
2915 if (tcon == NULL || tcon->ipc)
2919 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2920 spin_lock(&cifs_tcp_ses_lock);
2921 if (--tcon->tc_count > 0) {
2922 spin_unlock(&cifs_tcp_ses_lock);
2926 list_del_init(&tcon->tcon_list);
2927 spin_unlock(&cifs_tcp_ses_lock);
2930 if (ses->server->ops->tree_disconnect)
2931 ses->server->ops->tree_disconnect(xid, tcon);
2934 cifs_fscache_release_super_cookie(tcon);
2936 cifs_put_smb_ses(ses);
2940 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
2942 * - tcon refcount is the number of mount points using the tcon.
2943 * - ses refcount is the number of tcon using the session.
2945 * 1. This function assumes it is being called from cifs_mount() where
2946 * we already got a session reference (ses refcount +1).
2948 * 2. Since we're in the context of adding a mount point, the end
2949 * result should be either:
2951 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2952 * its session refcount incremented (1 new tcon). This +1 was
2953 * already done in (1).
2955 * b) an existing tcon with refcount+1 (add a mount point to it) and
2956 * identical ses refcount (no new tcon). Because of (1) we need to
2957 * decrement the ses refcount.
2959 static struct cifs_tcon *
2960 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2963 struct cifs_tcon *tcon;
2965 tcon = cifs_find_tcon(ses, volume_info);
2968 * tcon has refcount already incremented but we need to
2969 * decrement extra ses reference gotten by caller (case b)
2971 cifs_dbg(FYI, "Found match on UNC path\n");
2972 cifs_put_smb_ses(ses);
2976 if (!ses->server->ops->tree_connect) {
2981 tcon = tconInfoAlloc();
2987 if (volume_info->snapshot_time) {
2988 if (ses->server->vals->protocol_id == 0) {
2990 "Use SMB2 or later for snapshot mount option\n");
2994 tcon->snapshot_time = volume_info->snapshot_time;
2998 if (volume_info->password) {
2999 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3000 if (!tcon->password) {
3006 if (volume_info->seal) {
3007 if (ses->server->vals->protocol_id == 0) {
3009 "SMB3 or later required for encryption\n");
3012 } else if (tcon->ses->server->capabilities &
3013 SMB2_GLOBAL_CAP_ENCRYPTION)
3016 cifs_dbg(VFS, "Encryption is not supported on share\n");
3022 #ifdef CONFIG_CIFS_SMB311
3023 if ((volume_info->linux_ext) && (ses->server->posix_ext_supported)) {
3024 if (ses->server->vals->protocol_id == SMB311_PROT_ID)
3025 tcon->posix_extensions = true;
3030 * BB Do we need to wrap session_mutex around this TCon call and Unix
3031 * SetFS as we do on SessSetup and reconnect?
3034 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3035 volume_info->local_nls);
3037 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3041 if (volume_info->nodfs) {
3042 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
3043 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
3045 tcon->use_persistent = false;
3046 /* check if SMB2 or later, CIFS does not support persistent handles */
3047 if (volume_info->persistent) {
3048 if (ses->server->vals->protocol_id == 0) {
3050 "SMB3 or later required for persistent handles\n");
3053 } else if (ses->server->capabilities &
3054 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3055 tcon->use_persistent = true;
3056 else /* persistent handles requested but not supported */ {
3058 "Persistent handles not supported on share\n");
3062 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3063 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3064 && (volume_info->nopersistent == false)) {
3065 cifs_dbg(FYI, "enabling persistent handles\n");
3066 tcon->use_persistent = true;
3067 } else if (volume_info->resilient) {
3068 if (ses->server->vals->protocol_id == 0) {
3070 "SMB2.1 or later required for resilient handles\n");
3074 tcon->use_resilient = true;
3078 * We can have only one retry value for a connection to a share so for
3079 * resources mounted more than once to the same server share the last
3080 * value passed in for the retry flag is used.
3082 tcon->retry = volume_info->retry;
3083 tcon->nocase = volume_info->nocase;
3084 tcon->nohandlecache = volume_info->nohandlecache;
3085 tcon->local_lease = volume_info->local_lease;
3086 INIT_LIST_HEAD(&tcon->pending_opens);
3088 spin_lock(&cifs_tcp_ses_lock);
3089 list_add(&tcon->tcon_list, &ses->tcon_list);
3090 spin_unlock(&cifs_tcp_ses_lock);
3092 cifs_fscache_get_super_cookie(tcon);
3102 cifs_put_tlink(struct tcon_link *tlink)
3104 if (!tlink || IS_ERR(tlink))
3107 if (!atomic_dec_and_test(&tlink->tl_count) ||
3108 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3109 tlink->tl_time = jiffies;
3113 if (!IS_ERR(tlink_tcon(tlink)))
3114 cifs_put_tcon(tlink_tcon(tlink));
3119 static inline struct tcon_link *
3120 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
3122 return cifs_sb->master_tlink;
3126 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3128 struct cifs_sb_info *old = CIFS_SB(sb);
3129 struct cifs_sb_info *new = mnt_data->cifs_sb;
3131 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3134 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3135 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3139 * We want to share sb only if we don't specify an r/wsize or
3140 * specified r/wsize is greater than or equal to existing one.
3142 if (new->wsize && new->wsize < old->wsize)
3145 if (new->rsize && new->rsize < old->rsize)
3148 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3151 if (old->mnt_file_mode != new->mnt_file_mode ||
3152 old->mnt_dir_mode != new->mnt_dir_mode)
3155 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3158 if (old->actimeo != new->actimeo)
3165 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3167 struct cifs_sb_info *old = CIFS_SB(sb);
3168 struct cifs_sb_info *new = mnt_data->cifs_sb;
3169 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3170 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3172 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3174 else if (!old_set && !new_set)
3181 cifs_match_super(struct super_block *sb, void *data)
3183 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3184 struct smb_vol *volume_info;
3185 struct cifs_sb_info *cifs_sb;
3186 struct TCP_Server_Info *tcp_srv;
3187 struct cifs_ses *ses;
3188 struct cifs_tcon *tcon;
3189 struct tcon_link *tlink;
3192 spin_lock(&cifs_tcp_ses_lock);
3193 cifs_sb = CIFS_SB(sb);
3194 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3195 if (IS_ERR(tlink)) {
3196 spin_unlock(&cifs_tcp_ses_lock);
3199 tcon = tlink_tcon(tlink);
3201 tcp_srv = ses->server;
3203 volume_info = mnt_data->vol;
3205 if (!match_server(tcp_srv, volume_info) ||
3206 !match_session(ses, volume_info) ||
3207 !match_tcon(tcon, volume_info) ||
3208 !match_prepath(sb, mnt_data)) {
3213 rc = compare_mount_options(sb, mnt_data);
3215 spin_unlock(&cifs_tcp_ses_lock);
3216 cifs_put_tlink(tlink);
3221 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
3222 const struct nls_table *nls_codepage, unsigned int *num_referrals,
3223 struct dfs_info3_param **referrals, int remap)
3227 if (!ses->server->ops->get_dfs_refer)
3233 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
3234 referrals, num_referrals,
3235 nls_codepage, remap);
3239 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3240 static struct lock_class_key cifs_key[2];
3241 static struct lock_class_key cifs_slock_key[2];
3244 cifs_reclassify_socket4(struct socket *sock)
3246 struct sock *sk = sock->sk;
3247 BUG_ON(!sock_allow_reclassification(sk));
3248 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3249 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3253 cifs_reclassify_socket6(struct socket *sock)
3255 struct sock *sk = sock->sk;
3256 BUG_ON(!sock_allow_reclassification(sk));
3257 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3258 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3262 cifs_reclassify_socket4(struct socket *sock)
3267 cifs_reclassify_socket6(struct socket *sock)
3272 /* See RFC1001 section 14 on representation of Netbios names */
3273 static void rfc1002mangle(char *target, char *source, unsigned int length)
3277 for (i = 0, j = 0; i < (length); i++) {
3278 /* mask a nibble at a time and encode */
3279 target[j] = 'A' + (0x0F & (source[i] >> 4));
3280 target[j+1] = 'A' + (0x0F & source[i]);
3287 bind_socket(struct TCP_Server_Info *server)
3290 if (server->srcaddr.ss_family != AF_UNSPEC) {
3291 /* Bind to the specified local IP address */
3292 struct socket *socket = server->ssocket;
3293 rc = socket->ops->bind(socket,
3294 (struct sockaddr *) &server->srcaddr,
3295 sizeof(server->srcaddr));
3297 struct sockaddr_in *saddr4;
3298 struct sockaddr_in6 *saddr6;
3299 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3300 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3301 if (saddr6->sin6_family == AF_INET6)
3302 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3303 &saddr6->sin6_addr, rc);
3305 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3306 &saddr4->sin_addr.s_addr, rc);
3313 ip_rfc1001_connect(struct TCP_Server_Info *server)
3317 * some servers require RFC1001 sessinit before sending
3318 * negprot - BB check reconnection in case where second
3319 * sessinit is sent but no second negprot
3321 struct rfc1002_session_packet *ses_init_buf;
3322 struct smb_hdr *smb_buf;
3323 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3326 ses_init_buf->trailer.session_req.called_len = 32;
3328 if (server->server_RFC1001_name[0] != 0)
3329 rfc1002mangle(ses_init_buf->trailer.
3330 session_req.called_name,
3331 server->server_RFC1001_name,
3332 RFC1001_NAME_LEN_WITH_NULL);
3334 rfc1002mangle(ses_init_buf->trailer.
3335 session_req.called_name,
3336 DEFAULT_CIFS_CALLED_NAME,
3337 RFC1001_NAME_LEN_WITH_NULL);
3339 ses_init_buf->trailer.session_req.calling_len = 32;
3342 * calling name ends in null (byte 16) from old smb
3345 if (server->workstation_RFC1001_name[0] != 0)
3346 rfc1002mangle(ses_init_buf->trailer.
3347 session_req.calling_name,
3348 server->workstation_RFC1001_name,
3349 RFC1001_NAME_LEN_WITH_NULL);
3351 rfc1002mangle(ses_init_buf->trailer.
3352 session_req.calling_name,
3354 RFC1001_NAME_LEN_WITH_NULL);
3356 ses_init_buf->trailer.session_req.scope1 = 0;
3357 ses_init_buf->trailer.session_req.scope2 = 0;
3358 smb_buf = (struct smb_hdr *)ses_init_buf;
3360 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3361 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3362 rc = smb_send(server, smb_buf, 0x44);
3363 kfree(ses_init_buf);
3365 * RFC1001 layer in at least one server
3366 * requires very short break before negprot
3367 * presumably because not expecting negprot
3368 * to follow so fast. This is a simple
3369 * solution that works without
3370 * complicating the code and causes no
3371 * significant slowing down on mount
3374 usleep_range(1000, 2000);
3377 * else the negprot may still work without this
3378 * even though malloc failed
3385 generic_ip_connect(struct TCP_Server_Info *server)
3390 struct socket *socket = server->ssocket;
3391 struct sockaddr *saddr;
3393 saddr = (struct sockaddr *) &server->dstaddr;
3395 if (server->dstaddr.ss_family == AF_INET6) {
3396 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3397 slen = sizeof(struct sockaddr_in6);
3400 sport = ((struct sockaddr_in *) saddr)->sin_port;
3401 slen = sizeof(struct sockaddr_in);
3405 if (socket == NULL) {
3406 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3407 IPPROTO_TCP, &socket, 1);
3409 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3410 server->ssocket = NULL;
3414 /* BB other socket options to set KEEPALIVE, NODELAY? */
3415 cifs_dbg(FYI, "Socket created\n");
3416 server->ssocket = socket;
3417 socket->sk->sk_allocation = GFP_NOFS;
3418 if (sfamily == AF_INET6)
3419 cifs_reclassify_socket6(socket);
3421 cifs_reclassify_socket4(socket);
3424 rc = bind_socket(server);
3429 * Eventually check for other socket options to change from
3430 * the default. sock_setsockopt not used because it expects
3433 socket->sk->sk_rcvtimeo = 7 * HZ;
3434 socket->sk->sk_sndtimeo = 5 * HZ;
3436 /* make the bufsizes depend on wsize/rsize and max requests */
3437 if (server->noautotune) {
3438 if (socket->sk->sk_sndbuf < (200 * 1024))
3439 socket->sk->sk_sndbuf = 200 * 1024;
3440 if (socket->sk->sk_rcvbuf < (140 * 1024))
3441 socket->sk->sk_rcvbuf = 140 * 1024;
3444 if (server->tcp_nodelay) {
3446 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3447 (char *)&val, sizeof(val));
3449 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3453 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3454 socket->sk->sk_sndbuf,
3455 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3457 rc = socket->ops->connect(socket, saddr, slen, 0);
3459 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3460 sock_release(socket);
3461 server->ssocket = NULL;
3465 if (sport == htons(RFC1001_PORT))
3466 rc = ip_rfc1001_connect(server);
3472 ip_connect(struct TCP_Server_Info *server)
3475 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3476 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3478 if (server->dstaddr.ss_family == AF_INET6)
3479 sport = &addr6->sin6_port;
3481 sport = &addr->sin_port;
3486 /* try with 445 port at first */
3487 *sport = htons(CIFS_PORT);
3489 rc = generic_ip_connect(server);
3493 /* if it failed, try with 139 port */
3494 *sport = htons(RFC1001_PORT);
3497 return generic_ip_connect(server);
3500 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3501 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3503 /* if we are reconnecting then should we check to see if
3504 * any requested capabilities changed locally e.g. via
3505 * remount but we can not do much about it here
3506 * if they have (even if we could detect it by the following)
3507 * Perhaps we could add a backpointer to array of sb from tcon
3508 * or if we change to make all sb to same share the same
3509 * sb as NFS - then we only have one backpointer to sb.
3510 * What if we wanted to mount the server share twice once with
3511 * and once without posixacls or posix paths? */
3512 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3514 if (vol_info && vol_info->no_linux_ext) {
3515 tcon->fsUnixInfo.Capability = 0;
3516 tcon->unix_ext = 0; /* Unix Extensions disabled */
3517 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3519 } else if (vol_info)
3520 tcon->unix_ext = 1; /* Unix Extensions supported */
3522 if (tcon->unix_ext == 0) {
3523 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3527 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3528 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3529 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3530 /* check for reconnect case in which we do not
3531 want to change the mount behavior if we can avoid it */
3532 if (vol_info == NULL) {
3533 /* turn off POSIX ACL and PATHNAMES if not set
3534 originally at mount time */
3535 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3536 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3537 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3538 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3539 cifs_dbg(VFS, "POSIXPATH support change\n");
3540 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3541 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3542 cifs_dbg(VFS, "possible reconnect error\n");
3543 cifs_dbg(VFS, "server disabled POSIX path support\n");
3547 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3548 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3550 cap &= CIFS_UNIX_CAP_MASK;
3551 if (vol_info && vol_info->no_psx_acl)
3552 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3553 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3554 cifs_dbg(FYI, "negotiated posix acl support\n");
3556 cifs_sb->mnt_cifs_flags |=
3557 CIFS_MOUNT_POSIXACL;
3560 if (vol_info && vol_info->posix_paths == 0)
3561 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3562 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3563 cifs_dbg(FYI, "negotiate posix pathnames\n");
3565 cifs_sb->mnt_cifs_flags |=
3566 CIFS_MOUNT_POSIX_PATHS;
3569 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3570 #ifdef CONFIG_CIFS_DEBUG2
3571 if (cap & CIFS_UNIX_FCNTL_CAP)
3572 cifs_dbg(FYI, "FCNTL cap\n");
3573 if (cap & CIFS_UNIX_EXTATTR_CAP)
3574 cifs_dbg(FYI, "EXTATTR cap\n");
3575 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3576 cifs_dbg(FYI, "POSIX path cap\n");
3577 if (cap & CIFS_UNIX_XATTR_CAP)
3578 cifs_dbg(FYI, "XATTR cap\n");
3579 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3580 cifs_dbg(FYI, "POSIX ACL cap\n");
3581 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3582 cifs_dbg(FYI, "very large read cap\n");
3583 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3584 cifs_dbg(FYI, "very large write cap\n");
3585 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3586 cifs_dbg(FYI, "transport encryption cap\n");
3587 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3588 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3589 #endif /* CIFS_DEBUG2 */
3590 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3591 if (vol_info == NULL) {
3592 cifs_dbg(FYI, "resetting capabilities failed\n");
3594 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");
3600 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3601 struct cifs_sb_info *cifs_sb)
3603 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3605 spin_lock_init(&cifs_sb->tlink_tree_lock);
3606 cifs_sb->tlink_tree = RB_ROOT;
3609 * Temporarily set r/wsize for matching superblock. If we end up using
3610 * new sb then client will later negotiate it downward if needed.
3612 cifs_sb->rsize = pvolume_info->rsize;
3613 cifs_sb->wsize = pvolume_info->wsize;
3615 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3616 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3617 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3618 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3619 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3620 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3622 cifs_sb->actimeo = pvolume_info->actimeo;
3623 cifs_sb->local_nls = pvolume_info->local_nls;
3625 if (pvolume_info->noperm)
3626 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3627 if (pvolume_info->setuids)
3628 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3629 if (pvolume_info->setuidfromacl)
3630 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3631 if (pvolume_info->server_ino)
3632 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3633 if (pvolume_info->remap)
3634 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3635 if (pvolume_info->sfu_remap)
3636 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3637 if (pvolume_info->no_xattr)
3638 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3639 if (pvolume_info->sfu_emul)
3640 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3641 if (pvolume_info->nobrl)
3642 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3643 if (pvolume_info->nohandlecache)
3644 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3645 if (pvolume_info->nostrictsync)
3646 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3647 if (pvolume_info->mand_lock)
3648 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3649 if (pvolume_info->rwpidforward)
3650 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3651 if (pvolume_info->cifs_acl)
3652 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3653 if (pvolume_info->backupuid_specified) {
3654 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3655 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3657 if (pvolume_info->backupgid_specified) {
3658 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3659 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3661 if (pvolume_info->override_uid)
3662 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3663 if (pvolume_info->override_gid)
3664 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3665 if (pvolume_info->dynperm)
3666 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3667 if (pvolume_info->fsc)
3668 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3669 if (pvolume_info->multiuser)
3670 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3671 CIFS_MOUNT_NO_PERM);
3672 if (pvolume_info->strict_io)
3673 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3674 if (pvolume_info->direct_io) {
3675 cifs_dbg(FYI, "mounting share using direct i/o\n");
3676 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3678 if (pvolume_info->mfsymlinks) {
3679 if (pvolume_info->sfu_emul) {
3681 * Our SFU ("Services for Unix" emulation does not allow
3682 * creating symlinks but does allow reading existing SFU
3683 * symlinks (it does allow both creating and reading SFU
3684 * style mknod and FIFOs though). When "mfsymlinks" and
3685 * "sfu" are both enabled at the same time, it allows
3686 * reading both types of symlinks, but will only create
3687 * them with mfsymlinks format. This allows better
3688 * Apple compatibility (probably better for Samba too)
3689 * while still recognizing old Windows style symlinks.
3691 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3693 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3696 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3697 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3699 if (pvolume_info->prepath) {
3700 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3701 if (cifs_sb->prepath == NULL)
3709 cleanup_volume_info_contents(struct smb_vol *volume_info)
3711 kfree(volume_info->username);
3712 kzfree(volume_info->password);
3713 kfree(volume_info->UNC);
3714 kfree(volume_info->domainname);
3715 kfree(volume_info->iocharset);
3716 kfree(volume_info->prepath);
3720 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3724 cleanup_volume_info_contents(volume_info);
3729 #ifdef CONFIG_CIFS_DFS_UPCALL
3731 * cifs_build_path_to_root returns full path to root when we do not have an
3732 * exiting connection (tcon)
3735 build_unc_path_to_root(const struct smb_vol *vol,
3736 const struct cifs_sb_info *cifs_sb)
3738 char *full_path, *pos;
3739 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3740 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3742 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3743 if (full_path == NULL)
3744 return ERR_PTR(-ENOMEM);
3746 strncpy(full_path, vol->UNC, unc_len);
3747 pos = full_path + unc_len;
3750 *pos = CIFS_DIR_SEP(cifs_sb);
3751 strncpy(pos + 1, vol->prepath, pplen);
3755 *pos = '\0'; /* add trailing null */
3756 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3757 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3762 * Perform a dfs referral query for a share and (optionally) prefix
3764 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3765 * to a string containing updated options for the submount. Otherwise it
3766 * will be left untouched.
3768 * Returns the rc from get_dfs_path to the caller, which can be used to
3769 * determine whether there were referrals.
3772 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3773 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3777 unsigned int num_referrals = 0;
3778 struct dfs_info3_param *referrals = NULL;
3779 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3781 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3782 if (IS_ERR(full_path))
3783 return PTR_ERR(full_path);
3785 /* For DFS paths, skip the first '\' of the UNC */
3786 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3788 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3789 &num_referrals, &referrals, cifs_remap(cifs_sb));
3791 if (!rc && num_referrals > 0) {
3792 char *fake_devname = NULL;
3794 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3795 full_path + 1, referrals,
3798 free_dfs_info_array(referrals, num_referrals);
3800 if (IS_ERR(mdata)) {
3801 rc = PTR_ERR(mdata);
3804 cleanup_volume_info_contents(volume_info);
3805 rc = cifs_setup_volume_info(volume_info, mdata,
3808 kfree(fake_devname);
3809 kfree(cifs_sb->mountdata);
3810 cifs_sb->mountdata = mdata;
3818 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3819 const char *devname)
3823 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3826 if (volume_info->nullauth) {
3827 cifs_dbg(FYI, "Anonymous login\n");
3828 kfree(volume_info->username);
3829 volume_info->username = NULL;
3830 } else if (volume_info->username) {
3831 /* BB fixme parse for domain name here */
3832 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3834 cifs_dbg(VFS, "No username specified\n");
3835 /* In userspace mount helper we can get user name from alternate
3836 locations such as env variables and files on disk */
3840 /* this is needed for ASCII cp to Unicode converts */
3841 if (volume_info->iocharset == NULL) {
3842 /* load_nls_default cannot return null */
3843 volume_info->local_nls = load_nls_default();
3845 volume_info->local_nls = load_nls(volume_info->iocharset);
3846 if (volume_info->local_nls == NULL) {
3847 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3848 volume_info->iocharset);
3857 cifs_get_volume_info(char *mount_data, const char *devname)
3860 struct smb_vol *volume_info;
3862 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3864 return ERR_PTR(-ENOMEM);
3866 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3868 cifs_cleanup_volume_info(volume_info);
3869 volume_info = ERR_PTR(rc);
3876 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3878 struct cifs_tcon *tcon,
3879 struct cifs_sb_info *cifs_sb,
3886 sep = CIFS_DIR_SEP(cifs_sb);
3889 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3891 /* skip separators */
3896 /* next separator */
3897 while (*s && *s != sep)
3901 * temporarily null-terminate the path at the end of
3902 * the current component
3906 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3914 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3918 struct cifs_ses *ses;
3919 struct cifs_tcon *tcon;
3920 struct TCP_Server_Info *server;
3922 struct tcon_link *tlink;
3923 #ifdef CONFIG_CIFS_DFS_UPCALL
3924 int referral_walks_count = 0;
3927 #ifdef CONFIG_CIFS_DFS_UPCALL
3929 /* cleanup activities if we're chasing a referral */
3930 if (referral_walks_count) {
3932 cifs_put_tcon(tcon);
3934 cifs_put_smb_ses(ses);
3936 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3950 /* get a reference to a tcp session */
3951 server = cifs_get_tcp_session(volume_info);
3952 if (IS_ERR(server)) {
3953 rc = PTR_ERR(server);
3956 if ((volume_info->max_credits < 20) ||
3957 (volume_info->max_credits > 60000))
3958 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3960 server->max_credits = volume_info->max_credits;
3961 /* get a reference to a SMB session */
3962 ses = cifs_get_smb_ses(server, volume_info);
3966 goto mount_fail_check;
3969 if ((volume_info->persistent == true) && ((ses->server->capabilities &
3970 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
3971 cifs_dbg(VFS, "persistent handles not supported by server\n");
3973 goto mount_fail_check;
3976 /* search for existing tcon to this server share */
3977 tcon = cifs_get_tcon(ses, volume_info);
3982 goto mount_fail_check;
3984 goto remote_path_check;
3987 #ifdef CONFIG_CIFS_SMB311
3988 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
3989 if (tcon->posix_extensions)
3990 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
3991 #endif /* SMB3.11 */
3993 /* tell server which Unix caps we support */
3994 if (cap_unix(tcon->ses)) {
3995 /* reset of caps checks mount to see if unix extensions
3996 disabled for just this mount */
3997 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3998 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3999 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4000 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
4002 goto mount_fail_check;
4005 tcon->unix_ext = 0; /* server does not support them */
4007 /* do not care if a following call succeed - informational */
4008 if (!tcon->pipe && server->ops->qfs_tcon)
4009 server->ops->qfs_tcon(xid, tcon);
4011 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
4012 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
4015 #ifdef CONFIG_CIFS_DFS_UPCALL
4017 * Perform an unconditional check for whether there are DFS
4018 * referrals for this path without prefix, to provide support
4019 * for DFS referrals from w2k8 servers which don't seem to respond
4020 * with PATH_NOT_COVERED to requests that include the prefix.
4021 * Chase the referral if found, otherwise continue normally.
4023 if (referral_walks_count == 0) {
4024 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
4027 referral_walks_count++;
4028 goto try_mount_again;
4033 /* check if a whole path is not remote */
4035 if (!server->ops->is_path_accessible) {
4037 goto mount_fail_check;
4040 * cifs_build_path_to_root works only when we have a valid tcon
4042 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon,
4043 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4044 if (full_path == NULL) {
4046 goto mount_fail_check;
4048 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4050 if (rc != 0 && rc != -EREMOTE) {
4052 goto mount_fail_check;
4055 if (rc != -EREMOTE) {
4056 rc = cifs_are_all_path_components_accessible(server,
4060 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4061 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4062 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4069 /* get referral if needed */
4070 if (rc == -EREMOTE) {
4071 #ifdef CONFIG_CIFS_DFS_UPCALL
4072 if (referral_walks_count > MAX_NESTED_LINKS) {
4074 * BB: when we implement proper loop detection,
4075 * we will remove this check. But now we need it
4076 * to prevent an indefinite loop if 'DFS tree' is
4077 * misconfigured (i.e. has loops).
4080 goto mount_fail_check;
4083 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
4086 referral_walks_count++;
4087 goto try_mount_again;
4089 goto mount_fail_check;
4090 #else /* No DFS support, return error on mount */
4096 goto mount_fail_check;
4098 /* now, hang the tcon off of the superblock */
4099 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
4100 if (tlink == NULL) {
4102 goto mount_fail_check;
4105 tlink->tl_uid = ses->linux_uid;
4106 tlink->tl_tcon = tcon;
4107 tlink->tl_time = jiffies;
4108 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4109 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4111 cifs_sb->master_tlink = tlink;
4112 spin_lock(&cifs_sb->tlink_tree_lock);
4113 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4114 spin_unlock(&cifs_sb->tlink_tree_lock);
4116 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4120 /* on error free sesinfo and tcon struct if needed */
4122 /* If find_unc succeeded then rc == 0 so we can not end */
4123 /* up accidentally freeing someone elses tcon struct */
4125 cifs_put_tcon(tcon);
4127 cifs_put_smb_ses(ses);
4129 cifs_put_tcp_session(server, 0);
4138 * Issue a TREE_CONNECT request.
4141 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4142 const char *tree, struct cifs_tcon *tcon,
4143 const struct nls_table *nls_codepage)
4145 struct smb_hdr *smb_buffer;
4146 struct smb_hdr *smb_buffer_response;
4149 unsigned char *bcc_ptr;
4152 __u16 bytes_left, count;
4157 smb_buffer = cifs_buf_get();
4158 if (smb_buffer == NULL)
4161 smb_buffer_response = smb_buffer;
4163 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4164 NULL /*no tid */ , 4 /*wct */ );
4166 smb_buffer->Mid = get_next_mid(ses->server);
4167 smb_buffer->Uid = ses->Suid;
4168 pSMB = (TCONX_REQ *) smb_buffer;
4169 pSMBr = (TCONX_RSP *) smb_buffer_response;
4171 pSMB->AndXCommand = 0xFF;
4172 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4173 bcc_ptr = &pSMB->Password[0];
4174 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4175 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4176 *bcc_ptr = 0; /* password is null byte */
4177 bcc_ptr++; /* skip password */
4178 /* already aligned so no need to do it below */
4180 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4181 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4182 specified as required (when that support is added to
4183 the vfs in the future) as only NTLM or the much
4184 weaker LANMAN (which we do not send by default) is accepted
4185 by Samba (not sure whether other servers allow
4186 NTLMv2 password here) */
4187 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4188 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4189 (ses->sectype == LANMAN))
4190 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4191 ses->server->sec_mode &
4192 SECMODE_PW_ENCRYPT ? true : false,
4195 #endif /* CIFS_WEAK_PW_HASH */
4196 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4197 bcc_ptr, nls_codepage);
4199 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4201 cifs_buf_release(smb_buffer);
4205 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4206 if (ses->capabilities & CAP_UNICODE) {
4207 /* must align unicode strings */
4208 *bcc_ptr = 0; /* null byte password */
4213 if (ses->server->sign)
4214 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4216 if (ses->capabilities & CAP_STATUS32) {
4217 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4219 if (ses->capabilities & CAP_DFS) {
4220 smb_buffer->Flags2 |= SMBFLG2_DFS;
4222 if (ses->capabilities & CAP_UNICODE) {
4223 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4225 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4226 6 /* max utf8 char length in bytes */ *
4227 (/* server len*/ + 256 /* share len */), nls_codepage);
4228 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4229 bcc_ptr += 2; /* skip trailing null */
4230 } else { /* ASCII */
4231 strcpy(bcc_ptr, tree);
4232 bcc_ptr += strlen(tree) + 1;
4234 strcpy(bcc_ptr, "?????");
4235 bcc_ptr += strlen("?????");
4237 count = bcc_ptr - &pSMB->Password[0];
4238 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4239 pSMB->hdr.smb_buf_length) + count);
4240 pSMB->ByteCount = cpu_to_le16(count);
4242 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4245 /* above now done in SendReceive */
4249 tcon->tidStatus = CifsGood;
4250 tcon->need_reconnect = false;
4251 tcon->tid = smb_buffer_response->Tid;
4252 bcc_ptr = pByteArea(smb_buffer_response);
4253 bytes_left = get_bcc(smb_buffer_response);
4254 length = strnlen(bcc_ptr, bytes_left - 2);
4255 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4261 /* skip service field (NB: this field is always ASCII) */
4263 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4264 (bcc_ptr[2] == 'C')) {
4265 cifs_dbg(FYI, "IPC connection\n");
4269 } else if (length == 2) {
4270 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4271 /* the most common case */
4272 cifs_dbg(FYI, "disk share connection\n");
4275 bcc_ptr += length + 1;
4276 bytes_left -= (length + 1);
4277 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4279 /* mostly informational -- no need to fail on error here */
4280 kfree(tcon->nativeFileSystem);
4281 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4282 bytes_left, is_unicode,
4285 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4287 if ((smb_buffer_response->WordCount == 3) ||
4288 (smb_buffer_response->WordCount == 7))
4289 /* field is in same location */
4290 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4293 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4296 cifs_buf_release(smb_buffer);
4300 static void delayed_free(struct rcu_head *p)
4302 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4303 unload_nls(sbi->local_nls);
4308 cifs_umount(struct cifs_sb_info *cifs_sb)
4310 struct rb_root *root = &cifs_sb->tlink_tree;
4311 struct rb_node *node;
4312 struct tcon_link *tlink;
4314 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4316 spin_lock(&cifs_sb->tlink_tree_lock);
4317 while ((node = rb_first(root))) {
4318 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4319 cifs_get_tlink(tlink);
4320 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4321 rb_erase(node, root);
4323 spin_unlock(&cifs_sb->tlink_tree_lock);
4324 cifs_put_tlink(tlink);
4325 spin_lock(&cifs_sb->tlink_tree_lock);
4327 spin_unlock(&cifs_sb->tlink_tree_lock);
4329 kfree(cifs_sb->mountdata);
4330 kfree(cifs_sb->prepath);
4331 call_rcu(&cifs_sb->rcu, delayed_free);
4335 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4338 struct TCP_Server_Info *server = ses->server;
4340 if (!server->ops->need_neg || !server->ops->negotiate)
4343 /* only send once per connect */
4344 if (!server->ops->need_neg(server))
4347 set_credits(server, 1);
4349 rc = server->ops->negotiate(xid, ses);
4351 spin_lock(&GlobalMid_Lock);
4352 if (server->tcpStatus == CifsNeedNegotiate)
4353 server->tcpStatus = CifsGood;
4356 spin_unlock(&GlobalMid_Lock);
4363 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4364 struct nls_table *nls_info)
4367 struct TCP_Server_Info *server = ses->server;
4369 ses->capabilities = server->capabilities;
4370 if (linuxExtEnabled == 0)
4371 ses->capabilities &= (~server->vals->cap_unix);
4373 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4374 server->sec_mode, server->capabilities, server->timeAdj);
4376 if (ses->auth_key.response) {
4377 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4378 ses->auth_key.response);
4379 kfree(ses->auth_key.response);
4380 ses->auth_key.response = NULL;
4381 ses->auth_key.len = 0;
4384 if (server->ops->sess_setup)
4385 rc = server->ops->sess_setup(xid, ses, nls_info);
4388 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4394 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4396 vol->sectype = ses->sectype;
4398 /* krb5 is special, since we don't need username or pw */
4399 if (vol->sectype == Kerberos)
4402 return cifs_set_cifscreds(vol, ses);
4405 static struct cifs_tcon *
4406 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4409 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4410 struct cifs_ses *ses;
4411 struct cifs_tcon *tcon = NULL;
4412 struct smb_vol *vol_info;
4414 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4415 if (vol_info == NULL)
4416 return ERR_PTR(-ENOMEM);
4418 vol_info->local_nls = cifs_sb->local_nls;
4419 vol_info->linux_uid = fsuid;
4420 vol_info->cred_uid = fsuid;
4421 vol_info->UNC = master_tcon->treeName;
4422 vol_info->retry = master_tcon->retry;
4423 vol_info->nocase = master_tcon->nocase;
4424 vol_info->nohandlecache = master_tcon->nohandlecache;
4425 vol_info->local_lease = master_tcon->local_lease;
4426 vol_info->no_linux_ext = !master_tcon->unix_ext;
4427 vol_info->sectype = master_tcon->ses->sectype;
4428 vol_info->sign = master_tcon->ses->sign;
4430 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4436 /* get a reference for the same TCP session */
4437 spin_lock(&cifs_tcp_ses_lock);
4438 ++master_tcon->ses->server->srv_count;
4439 spin_unlock(&cifs_tcp_ses_lock);
4441 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4443 tcon = (struct cifs_tcon *)ses;
4444 cifs_put_tcp_session(master_tcon->ses->server, 0);
4448 tcon = cifs_get_tcon(ses, vol_info);
4450 cifs_put_smb_ses(ses);
4454 #ifdef CONFIG_CIFS_SMB311
4455 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4456 if (tcon->posix_extensions)
4457 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4458 #endif /* SMB3.11 */
4460 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4463 kfree(vol_info->username);
4464 kzfree(vol_info->password);
4471 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4473 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4476 /* find and return a tlink with given uid */
4477 static struct tcon_link *
4478 tlink_rb_search(struct rb_root *root, kuid_t uid)
4480 struct rb_node *node = root->rb_node;
4481 struct tcon_link *tlink;
4484 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4486 if (uid_gt(tlink->tl_uid, uid))
4487 node = node->rb_left;
4488 else if (uid_lt(tlink->tl_uid, uid))
4489 node = node->rb_right;
4496 /* insert a tcon_link into the tree */
4498 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4500 struct rb_node **new = &(root->rb_node), *parent = NULL;
4501 struct tcon_link *tlink;
4504 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4507 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4508 new = &((*new)->rb_left);
4510 new = &((*new)->rb_right);
4513 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4514 rb_insert_color(&new_tlink->tl_rbnode, root);
4518 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4521 * If the superblock doesn't refer to a multiuser mount, then just return
4522 * the master tcon for the mount.
4524 * First, search the rbtree for an existing tcon for this fsuid. If one
4525 * exists, then check to see if it's pending construction. If it is then wait
4526 * for construction to complete. Once it's no longer pending, check to see if
4527 * it failed and either return an error or retry construction, depending on
4530 * If one doesn't exist then insert a new tcon_link struct into the tree and
4531 * try to construct a new one.
4534 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4537 kuid_t fsuid = current_fsuid();
4538 struct tcon_link *tlink, *newtlink;
4540 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4541 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4543 spin_lock(&cifs_sb->tlink_tree_lock);
4544 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4546 cifs_get_tlink(tlink);
4547 spin_unlock(&cifs_sb->tlink_tree_lock);
4549 if (tlink == NULL) {
4550 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4551 if (newtlink == NULL)
4552 return ERR_PTR(-ENOMEM);
4553 newtlink->tl_uid = fsuid;
4554 newtlink->tl_tcon = ERR_PTR(-EACCES);
4555 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4556 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4557 cifs_get_tlink(newtlink);
4559 spin_lock(&cifs_sb->tlink_tree_lock);
4560 /* was one inserted after previous search? */
4561 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4563 cifs_get_tlink(tlink);
4564 spin_unlock(&cifs_sb->tlink_tree_lock);
4566 goto wait_for_construction;
4569 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4570 spin_unlock(&cifs_sb->tlink_tree_lock);
4572 wait_for_construction:
4573 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4574 TASK_INTERRUPTIBLE);
4576 cifs_put_tlink(tlink);
4577 return ERR_PTR(-ERESTARTSYS);
4580 /* if it's good, return it */
4581 if (!IS_ERR(tlink->tl_tcon))
4584 /* return error if we tried this already recently */
4585 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4586 cifs_put_tlink(tlink);
4587 return ERR_PTR(-EACCES);
4590 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4591 goto wait_for_construction;
4594 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4595 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4596 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4598 if (IS_ERR(tlink->tl_tcon)) {
4599 cifs_put_tlink(tlink);
4600 return ERR_PTR(-EACCES);
4607 * periodic workqueue job that scans tcon_tree for a superblock and closes
4611 cifs_prune_tlinks(struct work_struct *work)
4613 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4615 struct rb_root *root = &cifs_sb->tlink_tree;
4616 struct rb_node *node;
4617 struct rb_node *tmp;
4618 struct tcon_link *tlink;
4621 * Because we drop the spinlock in the loop in order to put the tlink
4622 * it's not guarded against removal of links from the tree. The only
4623 * places that remove entries from the tree are this function and
4624 * umounts. Because this function is non-reentrant and is canceled
4625 * before umount can proceed, this is safe.
4627 spin_lock(&cifs_sb->tlink_tree_lock);
4628 node = rb_first(root);
4629 while (node != NULL) {
4631 node = rb_next(tmp);
4632 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4634 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4635 atomic_read(&tlink->tl_count) != 0 ||
4636 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4639 cifs_get_tlink(tlink);
4640 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4641 rb_erase(tmp, root);
4643 spin_unlock(&cifs_sb->tlink_tree_lock);
4644 cifs_put_tlink(tlink);
4645 spin_lock(&cifs_sb->tlink_tree_lock);
4647 spin_unlock(&cifs_sb->tlink_tree_lock);
4649 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,