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 to_read)
604 struct msghdr smb_msg;
605 struct bio_vec bv = {.bv_page = page, .bv_len = to_read};
606 iov_iter_bvec(&smb_msg.msg_iter, READ | ITER_BVEC, &bv, 1, to_read);
607 return cifs_readv_from_socket(server, &smb_msg);
611 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
614 * The first byte big endian of the length field,
615 * is actually not part of the length but the type
616 * with the most common, zero, as regular data.
619 case RFC1002_SESSION_MESSAGE:
620 /* Regular SMB response */
622 case RFC1002_SESSION_KEEP_ALIVE:
623 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
625 case RFC1002_POSITIVE_SESSION_RESPONSE:
626 cifs_dbg(FYI, "RFC 1002 positive session response\n");
628 case RFC1002_NEGATIVE_SESSION_RESPONSE:
630 * We get this from Windows 98 instead of an error on
631 * SMB negprot response.
633 cifs_dbg(FYI, "RFC 1002 negative session response\n");
634 /* give server a second to clean up */
637 * Always try 445 first on reconnect since we get NACK
638 * on some if we ever connected to port 139 (the NACK
639 * is since we do not begin with RFC1001 session
642 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
643 cifs_reconnect(server);
644 wake_up(&server->response_q);
647 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
648 cifs_reconnect(server);
655 dequeue_mid(struct mid_q_entry *mid, bool malformed)
657 #ifdef CONFIG_CIFS_STATS2
658 mid->when_received = jiffies;
660 spin_lock(&GlobalMid_Lock);
662 mid->mid_state = MID_RESPONSE_RECEIVED;
664 mid->mid_state = MID_RESPONSE_MALFORMED;
665 list_del_init(&mid->qhead);
666 spin_unlock(&GlobalMid_Lock);
670 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
671 char *buf, int malformed)
673 if (server->ops->check_trans2 &&
674 server->ops->check_trans2(mid, server, buf, malformed))
677 mid->large_buf = server->large_buf;
678 /* Was previous buf put in mpx struct for multi-rsp? */
679 if (!mid->multiRsp) {
680 /* smb buffer will be freed by user thread */
681 if (server->large_buf)
682 server->bigbuf = NULL;
684 server->smallbuf = NULL;
686 dequeue_mid(mid, malformed);
689 static void clean_demultiplex_info(struct TCP_Server_Info *server)
693 /* take it off the list, if it's not already */
694 spin_lock(&cifs_tcp_ses_lock);
695 list_del_init(&server->tcp_ses_list);
696 spin_unlock(&cifs_tcp_ses_lock);
698 spin_lock(&GlobalMid_Lock);
699 server->tcpStatus = CifsExiting;
700 spin_unlock(&GlobalMid_Lock);
701 wake_up_all(&server->response_q);
703 /* check if we have blocked requests that need to free */
704 spin_lock(&server->req_lock);
705 if (server->credits <= 0)
707 spin_unlock(&server->req_lock);
709 * Although there should not be any requests blocked on this queue it
710 * can not hurt to be paranoid and try to wake up requests that may
711 * haven been blocked when more than 50 at time were on the wire to the
712 * same server - they now will see the session is in exit state and get
713 * out of SendReceive.
715 wake_up_all(&server->request_q);
716 /* give those requests time to exit */
718 if (cifs_rdma_enabled(server) && server->smbd_conn) {
719 smbd_destroy(server->smbd_conn);
720 server->smbd_conn = NULL;
722 if (server->ssocket) {
723 sock_release(server->ssocket);
724 server->ssocket = NULL;
727 if (!list_empty(&server->pending_mid_q)) {
728 struct list_head dispose_list;
729 struct mid_q_entry *mid_entry;
730 struct list_head *tmp, *tmp2;
732 INIT_LIST_HEAD(&dispose_list);
733 spin_lock(&GlobalMid_Lock);
734 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
735 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
736 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
737 mid_entry->mid_state = MID_SHUTDOWN;
738 list_move(&mid_entry->qhead, &dispose_list);
740 spin_unlock(&GlobalMid_Lock);
742 /* now walk dispose list and issue callbacks */
743 list_for_each_safe(tmp, tmp2, &dispose_list) {
744 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
745 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
746 list_del_init(&mid_entry->qhead);
747 mid_entry->callback(mid_entry);
749 /* 1/8th of sec is more than enough time for them to exit */
753 if (!list_empty(&server->pending_mid_q)) {
755 * mpx threads have not exited yet give them at least the smb
756 * send timeout time for long ops.
758 * Due to delays on oplock break requests, we need to wait at
759 * least 45 seconds before giving up on a request getting a
760 * response and going ahead and killing cifsd.
762 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
765 * If threads still have not exited they are probably never
766 * coming home not much else we can do but free the memory.
770 kfree(server->hostname);
773 length = atomic_dec_return(&tcpSesAllocCount);
775 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
779 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
782 char *buf = server->smallbuf;
783 unsigned int pdu_length = server->pdu_size;
785 /* make sure this will fit in a large buffer */
786 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
787 server->vals->header_preamble_size) {
788 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
789 cifs_reconnect(server);
790 wake_up(&server->response_q);
791 return -ECONNABORTED;
794 /* switch to large buffer if too big for a small one */
795 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
796 server->large_buf = true;
797 memcpy(server->bigbuf, buf, server->total_read);
798 buf = server->bigbuf;
801 /* now read the rest */
802 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
803 pdu_length - HEADER_SIZE(server) + 1
804 + server->vals->header_preamble_size);
808 server->total_read += length;
810 dump_smb(buf, server->total_read);
812 return cifs_handle_standard(server, mid);
816 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
818 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
822 * We know that we received enough to get to the MID as we
823 * checked the pdu_length earlier. Now check to see
824 * if the rest of the header is OK. We borrow the length
825 * var for the rest of the loop to avoid a new stack var.
827 * 48 bytes is enough to display the header and a little bit
828 * into the payload for debugging purposes.
830 length = server->ops->check_message(buf, server->total_read, server);
832 cifs_dump_mem("Bad SMB: ", buf,
833 min_t(unsigned int, server->total_read, 48));
835 if (server->ops->is_session_expired &&
836 server->ops->is_session_expired(buf)) {
837 cifs_reconnect(server);
838 wake_up(&server->response_q);
842 if (server->ops->is_status_pending &&
843 server->ops->is_status_pending(buf, server, length))
849 handle_mid(mid, server, buf, length);
854 cifs_demultiplex_thread(void *p)
857 struct TCP_Server_Info *server = p;
858 unsigned int pdu_length;
860 struct task_struct *task_to_wake = NULL;
861 struct mid_q_entry *mid_entry;
863 current->flags |= PF_MEMALLOC;
864 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
866 length = atomic_inc_return(&tcpSesAllocCount);
868 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
871 while (server->tcpStatus != CifsExiting) {
875 if (!allocate_buffers(server))
878 server->large_buf = false;
879 buf = server->smallbuf;
880 pdu_length = 4; /* enough to get RFC1001 header */
882 length = cifs_read_from_socket(server, buf, pdu_length);
885 server->total_read = length;
888 * The right amount was read from socket - 4 bytes,
889 * so we can now interpret the length field.
891 pdu_length = get_rfc1002_length(buf);
892 server->pdu_size = pdu_length;
894 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
895 if (!is_smb_response(server, buf[0]))
898 /* make sure we have enough to get to the MID */
899 if (pdu_length < HEADER_SIZE(server) - 1 -
900 server->vals->header_preamble_size) {
901 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
903 cifs_reconnect(server);
904 wake_up(&server->response_q);
908 /* read down to the MID */
909 length = cifs_read_from_socket(server,
910 buf + server->vals->header_preamble_size,
911 HEADER_SIZE(server) - 1
912 - server->vals->header_preamble_size);
915 server->total_read += length;
917 if (server->ops->is_transform_hdr &&
918 server->ops->receive_transform &&
919 server->ops->is_transform_hdr(buf)) {
920 length = server->ops->receive_transform(server,
923 mid_entry = server->ops->find_mid(server, buf);
925 if (!mid_entry || !mid_entry->receive)
926 length = standard_receive3(server, mid_entry);
928 length = mid_entry->receive(server, mid_entry);
934 if (server->large_buf)
935 buf = server->bigbuf;
937 server->lstrp = jiffies;
938 if (mid_entry != NULL) {
939 mid_entry->resp_buf_size = server->pdu_size;
940 if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
941 mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
942 server->ops->handle_cancelled_mid)
943 server->ops->handle_cancelled_mid(
947 if (!mid_entry->multiRsp || mid_entry->multiEnd)
948 mid_entry->callback(mid_entry);
949 } else if (server->ops->is_oplock_break &&
950 server->ops->is_oplock_break(buf, server)) {
951 cifs_dbg(FYI, "Received oplock break\n");
953 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
954 atomic_read(&midCount));
955 cifs_dump_mem("Received Data is: ", buf,
956 HEADER_SIZE(server));
957 #ifdef CONFIG_CIFS_DEBUG2
958 if (server->ops->dump_detail)
959 server->ops->dump_detail(buf, server);
960 cifs_dump_mids(server);
961 #endif /* CIFS_DEBUG2 */
964 } /* end while !EXITING */
966 /* buffer usually freed in free_mid - need to free it here on exit */
967 cifs_buf_release(server->bigbuf);
968 if (server->smallbuf) /* no sense logging a debug message if NULL */
969 cifs_small_buf_release(server->smallbuf);
971 task_to_wake = xchg(&server->tsk, NULL);
972 clean_demultiplex_info(server);
974 /* if server->tsk was NULL then wait for a signal before exiting */
976 set_current_state(TASK_INTERRUPTIBLE);
977 while (!signal_pending(current)) {
979 set_current_state(TASK_INTERRUPTIBLE);
981 set_current_state(TASK_RUNNING);
984 module_put_and_exit(0);
987 /* extract the host portion of the UNC string */
989 extract_hostname(const char *unc)
995 /* skip double chars at beginning of string */
996 /* BB: check validity of these bytes? */
999 /* delimiter between hostname and sharename is always '\\' now */
1000 delim = strchr(src, '\\');
1002 return ERR_PTR(-EINVAL);
1005 dst = kmalloc((len + 1), GFP_KERNEL);
1007 return ERR_PTR(-ENOMEM);
1009 memcpy(dst, src, len);
1015 static int get_option_ul(substring_t args[], unsigned long *option)
1020 string = match_strdup(args);
1023 rc = kstrtoul(string, 0, option);
1029 static int get_option_uid(substring_t args[], kuid_t *result)
1031 unsigned long value;
1035 rc = get_option_ul(args, &value);
1039 uid = make_kuid(current_user_ns(), value);
1040 if (!uid_valid(uid))
1047 static int get_option_gid(substring_t args[], kgid_t *result)
1049 unsigned long value;
1053 rc = get_option_ul(args, &value);
1057 gid = make_kgid(current_user_ns(), value);
1058 if (!gid_valid(gid))
1065 static int cifs_parse_security_flavors(char *value,
1066 struct smb_vol *vol)
1069 substring_t args[MAX_OPT_ARGS];
1072 * With mount options, the last one should win. Reset any existing
1073 * settings back to default.
1075 vol->sectype = Unspecified;
1078 switch (match_token(value, cifs_secflavor_tokens, args)) {
1080 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1086 vol->sectype = Kerberos;
1088 case Opt_sec_ntlmsspi:
1091 case Opt_sec_ntlmssp:
1092 vol->sectype = RawNTLMSSP;
1098 vol->sectype = NTLM;
1100 case Opt_sec_ntlmv2i:
1103 case Opt_sec_ntlmv2:
1104 vol->sectype = NTLMv2;
1106 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1107 case Opt_sec_lanman:
1108 vol->sectype = LANMAN;
1115 cifs_dbg(VFS, "bad security option: %s\n", value);
1123 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1125 substring_t args[MAX_OPT_ARGS];
1127 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1128 case Opt_cache_loose:
1129 vol->direct_io = false;
1130 vol->strict_io = false;
1132 case Opt_cache_strict:
1133 vol->direct_io = false;
1134 vol->strict_io = true;
1136 case Opt_cache_none:
1137 vol->direct_io = true;
1138 vol->strict_io = false;
1141 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1148 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1150 substring_t args[MAX_OPT_ARGS];
1152 switch (match_token(value, cifs_smb_version_tokens, args)) {
1154 if (disable_legacy_dialects) {
1155 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1158 vol->ops = &smb1_operations;
1159 vol->vals = &smb1_values;
1162 if (disable_legacy_dialects) {
1163 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1166 vol->ops = &smb20_operations;
1167 vol->vals = &smb20_values;
1170 vol->ops = &smb21_operations;
1171 vol->vals = &smb21_values;
1174 vol->ops = &smb30_operations;
1175 vol->vals = &smb30_values;
1178 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1179 vol->vals = &smb302_values;
1181 #ifdef CONFIG_CIFS_SMB311
1183 vol->ops = &smb311_operations;
1184 vol->vals = &smb311_values;
1188 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1189 vol->vals = &smb3any_values;
1192 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1193 vol->vals = &smbdefault_values;
1196 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1203 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1204 * fields with the result. Returns 0 on success and an error otherwise.
1207 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1210 const char *delims = "/\\";
1213 /* make sure we have a valid UNC double delimiter prefix */
1214 len = strspn(devname, delims);
1218 /* find delimiter between host and sharename */
1219 pos = strpbrk(devname + 2, delims);
1223 /* skip past delimiter */
1226 /* now go until next delimiter or end of string */
1227 len = strcspn(pos, delims);
1229 /* move "pos" up to delimiter or NULL */
1231 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1235 convert_delimiter(vol->UNC, '\\');
1237 /* skip any delimiter */
1238 if (*pos == '/' || *pos == '\\')
1241 /* If pos is NULL then no prepath */
1245 vol->prepath = kstrdup(pos, GFP_KERNEL);
1253 cifs_parse_mount_options(const char *mountdata, const char *devname,
1254 struct smb_vol *vol)
1257 char *mountdata_copy = NULL, *options;
1258 unsigned int temp_len, i, j;
1260 short int override_uid = -1;
1261 short int override_gid = -1;
1262 bool uid_specified = false;
1263 bool gid_specified = false;
1264 bool sloppy = false;
1265 char *invalid = NULL;
1266 char *nodename = utsname()->nodename;
1267 char *string = NULL;
1268 char *tmp_end, *value;
1270 bool got_ip = false;
1271 bool got_version = false;
1272 unsigned short port = 0;
1273 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1277 delim = separator[0];
1279 /* ensure we always start with zeroed-out smb_vol */
1280 memset(vol, 0, sizeof(*vol));
1283 * does not have to be perfect mapping since field is
1284 * informational, only used for servers that do not support
1285 * port 445 and it can be overridden at mount time
1287 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1288 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1289 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1291 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1292 /* null target name indicates to use *SMBSERVR default called name
1293 if we end up sending RFC1001 session initialize */
1294 vol->target_rfc1001_name[0] = 0;
1295 vol->cred_uid = current_uid();
1296 vol->linux_uid = current_uid();
1297 vol->linux_gid = current_gid();
1300 * default to SFM style remapping of seven reserved characters
1301 * unless user overrides it or we negotiate CIFS POSIX where
1302 * it is unnecessary. Can not simultaneously use more than one mapping
1303 * since then readdir could list files that open could not open
1307 /* default to only allowing write access to owner of the mount */
1308 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1310 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1311 /* default is always to request posix paths. */
1312 vol->posix_paths = 1;
1313 /* default to using server inode numbers where available */
1314 vol->server_ino = 1;
1316 /* default is to use strict cifs caching semantics */
1317 vol->strict_io = true;
1319 vol->actimeo = CIFS_DEF_ACTIMEO;
1321 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1322 vol->ops = &smb30_operations;
1323 vol->vals = &smbdefault_values;
1325 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1328 goto cifs_parse_mount_err;
1330 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1331 if (!mountdata_copy)
1332 goto cifs_parse_mount_err;
1334 options = mountdata_copy;
1335 end = options + strlen(options);
1337 if (strncmp(options, "sep=", 4) == 0) {
1338 if (options[4] != 0) {
1339 separator[0] = options[4];
1342 cifs_dbg(FYI, "Null separator not allowed\n");
1345 vol->backupuid_specified = false; /* no backup intent for a user */
1346 vol->backupgid_specified = false; /* no backup intent for a group */
1348 switch (cifs_parse_devname(devname, vol)) {
1352 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1353 goto cifs_parse_mount_err;
1355 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1356 goto cifs_parse_mount_err;
1358 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1359 goto cifs_parse_mount_err;
1362 while ((data = strsep(&options, separator)) != NULL) {
1363 substring_t args[MAX_OPT_ARGS];
1364 unsigned long option;
1370 token = match_token(data, cifs_mount_option_tokens, args);
1374 /* Ingnore the following */
1378 /* Boolean values */
1379 case Opt_user_xattr:
1382 case Opt_nouser_xattr:
1388 case Opt_noforceuid:
1394 case Opt_noforcegid:
1397 case Opt_noblocksend:
1398 vol->noblocksnd = 1;
1400 case Opt_noautotune:
1401 vol->noautotune = 1;
1416 vol->sfu_remap = true;
1417 vol->remap = false; /* disable SFM mapping */
1419 case Opt_nomapchars:
1420 vol->sfu_remap = false;
1424 vol->sfu_remap = false; /* disable SFU mapping */
1426 case Opt_nomapposix:
1438 case Opt_posixpaths:
1439 vol->posix_paths = 1;
1441 case Opt_noposixpaths:
1442 vol->posix_paths = 0;
1447 "conflicting unix mount options\n");
1448 vol->no_linux_ext = 1;
1451 if (vol->no_linux_ext)
1453 "conflicting unix mount options\n");
1465 * turn off mandatory locking in mode
1466 * if remote locking is turned off since the
1467 * local vfs will do advisory
1469 if (vol->file_mode ==
1470 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1471 vol->file_mode = S_IALLUGO;
1473 case Opt_nohandlecache:
1474 vol->nohandlecache = 1;
1476 case Opt_handlecache:
1477 vol->nohandlecache = 0;
1479 case Opt_forcemandatorylock:
1488 case Opt_setuidfromacl:
1489 vol->setuidfromacl = 1;
1492 vol->dynperm = true;
1495 vol->dynperm = false;
1509 case Opt_nostrictsync:
1510 vol->nostrictsync = 1;
1512 case Opt_strictsync:
1513 vol->nostrictsync = 0;
1516 vol->server_ino = 1;
1518 case Opt_noserverino:
1519 vol->server_ino = 0;
1521 case Opt_rwpidforward:
1522 vol->rwpidforward = 1;
1531 vol->no_psx_acl = 0;
1534 vol->no_psx_acl = 1;
1536 case Opt_locallease:
1537 vol->local_lease = 1;
1543 /* we do not do the following in secFlags because seal
1544 * is a per tree connection (mount) not a per socket
1545 * or per-smb connection option in the protocol
1546 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1551 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1554 #ifndef CONFIG_CIFS_FSCACHE
1555 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1556 goto cifs_parse_mount_err;
1560 case Opt_mfsymlinks:
1561 vol->mfsymlinks = true;
1564 vol->multiuser = true;
1569 case Opt_nosharesock:
1570 vol->nosharesock = true;
1572 case Opt_nopersistent:
1573 vol->nopersistent = true;
1574 if (vol->persistent) {
1576 "persistenthandles mount options conflict\n");
1577 goto cifs_parse_mount_err;
1580 case Opt_persistent:
1581 vol->persistent = true;
1582 if ((vol->nopersistent) || (vol->resilient)) {
1584 "persistenthandles mount options conflict\n");
1585 goto cifs_parse_mount_err;
1589 vol->resilient = true;
1590 if (vol->persistent) {
1592 "persistenthandles mount options conflict\n");
1593 goto cifs_parse_mount_err;
1596 case Opt_noresilient:
1597 vol->resilient = false; /* already the default */
1599 case Opt_domainauto:
1600 vol->domainauto = true;
1606 /* Numeric Values */
1608 if (get_option_uid(args, &vol->backupuid)) {
1609 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1611 goto cifs_parse_mount_err;
1613 vol->backupuid_specified = true;
1616 if (get_option_gid(args, &vol->backupgid)) {
1617 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1619 goto cifs_parse_mount_err;
1621 vol->backupgid_specified = true;
1624 if (get_option_uid(args, &vol->linux_uid)) {
1625 cifs_dbg(VFS, "%s: Invalid uid value\n",
1627 goto cifs_parse_mount_err;
1629 uid_specified = true;
1632 if (get_option_uid(args, &vol->cred_uid)) {
1633 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1635 goto cifs_parse_mount_err;
1639 if (get_option_gid(args, &vol->linux_gid)) {
1640 cifs_dbg(VFS, "%s: Invalid gid value\n",
1642 goto cifs_parse_mount_err;
1644 gid_specified = true;
1647 if (get_option_ul(args, &option)) {
1648 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1650 goto cifs_parse_mount_err;
1652 vol->file_mode = option;
1655 if (get_option_ul(args, &option)) {
1656 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1658 goto cifs_parse_mount_err;
1660 vol->dir_mode = option;
1663 if (get_option_ul(args, &option) ||
1664 option > USHRT_MAX) {
1665 cifs_dbg(VFS, "%s: Invalid port value\n",
1667 goto cifs_parse_mount_err;
1669 port = (unsigned short)option;
1672 if (get_option_ul(args, &option)) {
1673 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1675 goto cifs_parse_mount_err;
1677 vol->rsize = option;
1680 if (get_option_ul(args, &option)) {
1681 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1683 goto cifs_parse_mount_err;
1685 vol->wsize = option;
1688 if (get_option_ul(args, &option)) {
1689 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1691 goto cifs_parse_mount_err;
1693 vol->actimeo = HZ * option;
1694 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1695 cifs_dbg(VFS, "attribute cache timeout too large\n");
1696 goto cifs_parse_mount_err;
1699 case Opt_echo_interval:
1700 if (get_option_ul(args, &option)) {
1701 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1703 goto cifs_parse_mount_err;
1705 vol->echo_interval = option;
1708 if (get_option_ul(args, &option)) {
1709 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1711 goto cifs_parse_mount_err;
1713 vol->snapshot_time = option;
1715 case Opt_max_credits:
1716 if (get_option_ul(args, &option) || (option < 20) ||
1718 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1720 goto cifs_parse_mount_err;
1722 vol->max_credits = option;
1725 /* String Arguments */
1727 case Opt_blank_user:
1728 /* null user, ie. anonymous authentication */
1730 vol->username = NULL;
1733 string = match_strdup(args);
1737 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1738 CIFS_MAX_USERNAME_LEN) {
1739 pr_warn("CIFS: username too long\n");
1740 goto cifs_parse_mount_err;
1743 kfree(vol->username);
1744 vol->username = kstrdup(string, GFP_KERNEL);
1746 goto cifs_parse_mount_err;
1748 case Opt_blank_pass:
1749 /* passwords have to be handled differently
1750 * to allow the character used for deliminator
1751 * to be passed within them
1755 * Check if this is a case where the password
1756 * starts with a delimiter
1758 tmp_end = strchr(data, '=');
1760 if (!(tmp_end < end && tmp_end[1] == delim)) {
1761 /* No it is not. Set the password to NULL */
1762 kzfree(vol->password);
1763 vol->password = NULL;
1766 /* Yes it is. Drop down to Opt_pass below.*/
1768 /* Obtain the value string */
1769 value = strchr(data, '=');
1772 /* Set tmp_end to end of the string */
1773 tmp_end = (char *) value + strlen(value);
1775 /* Check if following character is the deliminator
1776 * If yes, we have encountered a double deliminator
1777 * reset the NULL character to the deliminator
1779 if (tmp_end < end && tmp_end[1] == delim) {
1782 /* Keep iterating until we get to a single
1783 * deliminator OR the end
1785 while ((tmp_end = strchr(tmp_end, delim))
1786 != NULL && (tmp_end[1] == delim)) {
1787 tmp_end = (char *) &tmp_end[2];
1790 /* Reset var options to point to next element */
1793 options = (char *) &tmp_end[1];
1795 /* Reached the end of the mount option
1800 kzfree(vol->password);
1801 /* Now build new password string */
1802 temp_len = strlen(value);
1803 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1804 if (vol->password == NULL) {
1805 pr_warn("CIFS: no memory for password\n");
1806 goto cifs_parse_mount_err;
1809 for (i = 0, j = 0; i < temp_len; i++, j++) {
1810 vol->password[j] = value[i];
1811 if ((value[i] == delim) &&
1812 value[i+1] == delim)
1813 /* skip the second deliminator */
1816 vol->password[j] = '\0';
1819 /* FIXME: should this be an error instead? */
1823 string = match_strdup(args);
1827 if (!cifs_convert_address(dstaddr, string,
1829 pr_err("CIFS: bad ip= option (%s).\n", string);
1830 goto cifs_parse_mount_err;
1835 string = match_strdup(args);
1839 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1840 == CIFS_MAX_DOMAINNAME_LEN) {
1841 pr_warn("CIFS: domain name too long\n");
1842 goto cifs_parse_mount_err;
1845 kfree(vol->domainname);
1846 vol->domainname = kstrdup(string, GFP_KERNEL);
1847 if (!vol->domainname) {
1848 pr_warn("CIFS: no memory for domainname\n");
1849 goto cifs_parse_mount_err;
1851 cifs_dbg(FYI, "Domain name set\n");
1854 string = match_strdup(args);
1858 if (!cifs_convert_address(
1859 (struct sockaddr *)&vol->srcaddr,
1860 string, strlen(string))) {
1861 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1863 goto cifs_parse_mount_err;
1867 string = match_strdup(args);
1871 if (strnlen(string, 1024) >= 65) {
1872 pr_warn("CIFS: iocharset name too long.\n");
1873 goto cifs_parse_mount_err;
1876 if (strncasecmp(string, "default", 7) != 0) {
1877 kfree(vol->iocharset);
1878 vol->iocharset = kstrdup(string,
1880 if (!vol->iocharset) {
1881 pr_warn("CIFS: no memory for charset\n");
1882 goto cifs_parse_mount_err;
1885 /* if iocharset not set then load_nls_default
1888 cifs_dbg(FYI, "iocharset set to %s\n", string);
1890 case Opt_netbiosname:
1891 string = match_strdup(args);
1895 memset(vol->source_rfc1001_name, 0x20,
1898 * FIXME: are there cases in which a comma can
1899 * be valid in workstation netbios name (and
1900 * need special handling)?
1902 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1903 /* don't ucase netbiosname for user */
1906 vol->source_rfc1001_name[i] = string[i];
1908 /* The string has 16th byte zero still from
1909 * set at top of the function
1911 if (i == RFC1001_NAME_LEN && string[i] != 0)
1912 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1915 /* servernetbiosname specified override *SMBSERVER */
1916 string = match_strdup(args);
1920 /* last byte, type, is 0x20 for servr type */
1921 memset(vol->target_rfc1001_name, 0x20,
1922 RFC1001_NAME_LEN_WITH_NULL);
1924 /* BB are there cases in which a comma can be
1925 valid in this workstation netbios name
1926 (and need special handling)? */
1928 /* user or mount helper must uppercase the
1930 for (i = 0; i < 15; i++) {
1933 vol->target_rfc1001_name[i] = string[i];
1935 /* The string has 16th byte zero still from
1936 set at top of the function */
1937 if (i == RFC1001_NAME_LEN && string[i] != 0)
1938 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1941 /* version of mount userspace tools, not dialect */
1942 string = match_strdup(args);
1946 /* If interface changes in mount.cifs bump to new ver */
1947 if (strncasecmp(string, "1", 1) == 0) {
1948 if (strlen(string) > 1) {
1949 pr_warn("Bad mount helper ver=%s. Did "
1950 "you want SMB1 (CIFS) dialect "
1951 "and mean to type vers=1.0 "
1952 "instead?\n", string);
1953 goto cifs_parse_mount_err;
1955 /* This is the default */
1958 /* For all other value, error */
1959 pr_warn("CIFS: Invalid mount helper version specified\n");
1960 goto cifs_parse_mount_err;
1962 /* protocol version (dialect) */
1963 string = match_strdup(args);
1967 if (cifs_parse_smb_version(string, vol) != 0)
1968 goto cifs_parse_mount_err;
1972 string = match_strdup(args);
1976 if (cifs_parse_security_flavors(string, vol) != 0)
1977 goto cifs_parse_mount_err;
1980 string = match_strdup(args);
1984 if (cifs_parse_cache_flavor(string, vol) != 0)
1985 goto cifs_parse_mount_err;
1989 * An option we don't recognize. Save it off for later
1990 * if we haven't already found one
1996 /* Free up any allocated string */
2001 if (!sloppy && invalid) {
2002 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2003 goto cifs_parse_mount_err;
2006 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2007 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2008 goto cifs_parse_mount_err;
2012 /* Muliuser mounts require CONFIG_KEYS support */
2013 if (vol->multiuser) {
2014 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2015 goto cifs_parse_mount_err;
2019 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2020 goto cifs_parse_mount_err;
2023 /* make sure UNC has a share name */
2024 if (!strchr(vol->UNC + 3, '\\')) {
2025 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2026 goto cifs_parse_mount_err;
2033 /* No ip= option specified? Try to get it from UNC */
2034 /* Use the address part of the UNC. */
2035 slash = strchr(&vol->UNC[2], '\\');
2036 len = slash - &vol->UNC[2];
2037 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2038 pr_err("Unable to determine destination address.\n");
2039 goto cifs_parse_mount_err;
2043 /* set the port that we got earlier */
2044 cifs_set_port(dstaddr, port);
2047 vol->override_uid = override_uid;
2048 else if (override_uid == 1)
2049 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2052 vol->override_gid = override_gid;
2053 else if (override_gid == 1)
2054 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2056 if (got_version == false)
2057 pr_warn("No dialect specified on mount. Default has changed to "
2058 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2059 "(SMB1). To use the less secure SMB1 dialect to access "
2060 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2063 kfree(mountdata_copy);
2067 pr_warn("Could not allocate temporary buffer\n");
2068 cifs_parse_mount_err:
2070 kfree(mountdata_copy);
2074 /** Returns true if srcaddr isn't specified and rhs isn't
2075 * specified, or if srcaddr is specified and
2076 * matches the IP address of the rhs argument.
2079 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2081 switch (srcaddr->sa_family) {
2083 return (rhs->sa_family == AF_UNSPEC);
2085 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2086 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2087 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2090 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2091 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2092 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2096 return false; /* don't expect to be here */
2101 * If no port is specified in addr structure, we try to match with 445 port
2102 * and if it fails - with 139 ports. It should be called only if address
2103 * families of server and addr are equal.
2106 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2108 __be16 port, *sport;
2110 switch (addr->sa_family) {
2112 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2113 port = ((struct sockaddr_in *) addr)->sin_port;
2116 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2117 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2125 port = htons(CIFS_PORT);
2129 port = htons(RFC1001_PORT);
2132 return port == *sport;
2136 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2137 struct sockaddr *srcaddr)
2139 switch (addr->sa_family) {
2141 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2142 struct sockaddr_in *srv_addr4 =
2143 (struct sockaddr_in *)&server->dstaddr;
2145 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2150 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2151 struct sockaddr_in6 *srv_addr6 =
2152 (struct sockaddr_in6 *)&server->dstaddr;
2154 if (!ipv6_addr_equal(&addr6->sin6_addr,
2155 &srv_addr6->sin6_addr))
2157 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2163 return false; /* don't expect to be here */
2166 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2173 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2176 * The select_sectype function should either return the vol->sectype
2177 * that was specified, or "Unspecified" if that sectype was not
2178 * compatible with the given NEGOTIATE request.
2180 if (server->ops->select_sectype(server, vol->sectype)
2185 * Now check if signing mode is acceptable. No need to check
2186 * global_secflags at this point since if MUST_SIGN is set then
2187 * the server->sign had better be too.
2189 if (vol->sign && !server->sign)
2195 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2197 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2199 if (vol->nosharesock)
2202 /* BB update this for smb3any and default case */
2203 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2206 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2209 if (!match_address(server, addr,
2210 (struct sockaddr *)&vol->srcaddr))
2213 if (!match_port(server, addr))
2216 if (!match_security(server, vol))
2219 if (server->echo_interval != vol->echo_interval * HZ)
2222 if (server->rdma != vol->rdma)
2228 static struct TCP_Server_Info *
2229 cifs_find_tcp_session(struct smb_vol *vol)
2231 struct TCP_Server_Info *server;
2233 spin_lock(&cifs_tcp_ses_lock);
2234 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2235 if (!match_server(server, vol))
2238 ++server->srv_count;
2239 spin_unlock(&cifs_tcp_ses_lock);
2240 cifs_dbg(FYI, "Existing tcp session with server found\n");
2243 spin_unlock(&cifs_tcp_ses_lock);
2248 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2250 struct task_struct *task;
2252 spin_lock(&cifs_tcp_ses_lock);
2253 if (--server->srv_count > 0) {
2254 spin_unlock(&cifs_tcp_ses_lock);
2258 put_net(cifs_net_ns(server));
2260 list_del_init(&server->tcp_ses_list);
2261 spin_unlock(&cifs_tcp_ses_lock);
2263 cancel_delayed_work_sync(&server->echo);
2267 * Avoid deadlock here: reconnect work calls
2268 * cifs_put_tcp_session() at its end. Need to be sure
2269 * that reconnect work does nothing with server pointer after
2272 cancel_delayed_work(&server->reconnect);
2274 cancel_delayed_work_sync(&server->reconnect);
2276 spin_lock(&GlobalMid_Lock);
2277 server->tcpStatus = CifsExiting;
2278 spin_unlock(&GlobalMid_Lock);
2280 cifs_crypto_secmech_release(server);
2281 cifs_fscache_release_client_cookie(server);
2283 kfree(server->session_key.response);
2284 server->session_key.response = NULL;
2285 server->session_key.len = 0;
2287 task = xchg(&server->tsk, NULL);
2289 force_sig(SIGKILL, task);
2292 static struct TCP_Server_Info *
2293 cifs_get_tcp_session(struct smb_vol *volume_info)
2295 struct TCP_Server_Info *tcp_ses = NULL;
2298 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2300 /* see if we already have a matching tcp_ses */
2301 tcp_ses = cifs_find_tcp_session(volume_info);
2305 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2311 tcp_ses->ops = volume_info->ops;
2312 tcp_ses->vals = volume_info->vals;
2313 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2314 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2315 if (IS_ERR(tcp_ses->hostname)) {
2316 rc = PTR_ERR(tcp_ses->hostname);
2317 goto out_err_crypto_release;
2320 tcp_ses->noblocksnd = volume_info->noblocksnd;
2321 tcp_ses->noautotune = volume_info->noautotune;
2322 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2323 tcp_ses->rdma = volume_info->rdma;
2324 tcp_ses->in_flight = 0;
2325 tcp_ses->credits = 1;
2326 init_waitqueue_head(&tcp_ses->response_q);
2327 init_waitqueue_head(&tcp_ses->request_q);
2328 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2329 mutex_init(&tcp_ses->srv_mutex);
2330 memcpy(tcp_ses->workstation_RFC1001_name,
2331 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2332 memcpy(tcp_ses->server_RFC1001_name,
2333 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2334 tcp_ses->session_estab = false;
2335 tcp_ses->sequence_number = 0;
2336 tcp_ses->lstrp = jiffies;
2337 spin_lock_init(&tcp_ses->req_lock);
2338 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2339 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2340 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2341 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2342 mutex_init(&tcp_ses->reconnect_mutex);
2343 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2344 sizeof(tcp_ses->srcaddr));
2345 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2346 sizeof(tcp_ses->dstaddr));
2347 generate_random_uuid(tcp_ses->client_guid);
2349 * at this point we are the only ones with the pointer
2350 * to the struct since the kernel thread not created yet
2351 * no need to spinlock this init of tcpStatus or srv_count
2353 tcp_ses->tcpStatus = CifsNew;
2354 ++tcp_ses->srv_count;
2356 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2357 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2358 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2360 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2361 if (tcp_ses->rdma) {
2362 #ifndef CONFIG_CIFS_SMB_DIRECT
2363 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2365 goto out_err_crypto_release;
2367 tcp_ses->smbd_conn = smbd_get_connection(
2368 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2369 if (tcp_ses->smbd_conn) {
2370 cifs_dbg(VFS, "RDMA transport established\n");
2372 goto smbd_connected;
2375 goto out_err_crypto_release;
2378 rc = ip_connect(tcp_ses);
2380 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2381 goto out_err_crypto_release;
2385 * since we're in a cifs function already, we know that
2386 * this will succeed. No need for try_module_get().
2388 __module_get(THIS_MODULE);
2389 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2391 if (IS_ERR(tcp_ses->tsk)) {
2392 rc = PTR_ERR(tcp_ses->tsk);
2393 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2394 module_put(THIS_MODULE);
2395 goto out_err_crypto_release;
2397 tcp_ses->tcpStatus = CifsNeedNegotiate;
2399 /* thread spawned, put it on the list */
2400 spin_lock(&cifs_tcp_ses_lock);
2401 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2402 spin_unlock(&cifs_tcp_ses_lock);
2404 cifs_fscache_get_client_cookie(tcp_ses);
2406 /* queue echo request delayed work */
2407 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2411 out_err_crypto_release:
2412 cifs_crypto_secmech_release(tcp_ses);
2414 put_net(cifs_net_ns(tcp_ses));
2418 if (!IS_ERR(tcp_ses->hostname))
2419 kfree(tcp_ses->hostname);
2420 if (tcp_ses->ssocket)
2421 sock_release(tcp_ses->ssocket);
2427 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2429 if (vol->sectype != Unspecified &&
2430 vol->sectype != ses->sectype)
2433 switch (ses->sectype) {
2435 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2439 /* NULL username means anonymous session */
2440 if (ses->user_name == NULL) {
2446 /* anything else takes username/password */
2447 if (strncmp(ses->user_name,
2448 vol->username ? vol->username : "",
2449 CIFS_MAX_USERNAME_LEN))
2451 if ((vol->username && strlen(vol->username) != 0) &&
2452 ses->password != NULL &&
2453 strncmp(ses->password,
2454 vol->password ? vol->password : "",
2455 CIFS_MAX_PASSWORD_LEN))
2462 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2464 * A new IPC connection is made and stored in the session
2465 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2468 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2471 struct cifs_tcon *tcon;
2472 struct nls_table *nls_codepage;
2473 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2477 * If the mount request that resulted in the creation of the
2478 * session requires encryption, force IPC to be encrypted too.
2480 if (volume_info->seal) {
2481 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2485 "IPC: server doesn't support encryption\n");
2490 tcon = tconInfoAlloc();
2494 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->serverName);
2497 nls_codepage = load_nls_default();
2503 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2507 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2512 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2514 ses->tcon_ipc = tcon;
2516 unload_nls(nls_codepage);
2521 * cifs_free_ipc - helper to release the session IPC tcon
2523 * Needs to be called everytime a session is destroyed
2526 cifs_free_ipc(struct cifs_ses *ses)
2529 struct cifs_tcon *tcon = ses->tcon_ipc;
2534 if (ses->server->ops->tree_disconnect) {
2536 rc = ses->server->ops->tree_disconnect(xid, tcon);
2541 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2544 ses->tcon_ipc = NULL;
2548 static struct cifs_ses *
2549 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2551 struct cifs_ses *ses;
2553 spin_lock(&cifs_tcp_ses_lock);
2554 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2555 if (ses->status == CifsExiting)
2557 if (!match_session(ses, vol))
2560 spin_unlock(&cifs_tcp_ses_lock);
2563 spin_unlock(&cifs_tcp_ses_lock);
2568 cifs_put_smb_ses(struct cifs_ses *ses)
2570 unsigned int rc, xid;
2571 struct TCP_Server_Info *server = ses->server;
2573 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2575 spin_lock(&cifs_tcp_ses_lock);
2576 if (ses->status == CifsExiting) {
2577 spin_unlock(&cifs_tcp_ses_lock);
2580 if (--ses->ses_count > 0) {
2581 spin_unlock(&cifs_tcp_ses_lock);
2584 if (ses->status == CifsGood)
2585 ses->status = CifsExiting;
2586 spin_unlock(&cifs_tcp_ses_lock);
2590 if (ses->status == CifsExiting && server->ops->logoff) {
2592 rc = server->ops->logoff(xid, ses);
2594 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2599 spin_lock(&cifs_tcp_ses_lock);
2600 list_del_init(&ses->smb_ses_list);
2601 spin_unlock(&cifs_tcp_ses_lock);
2604 cifs_put_tcp_session(server, 0);
2609 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2610 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2612 /* Populate username and pw fields from keyring if possible */
2614 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2617 const char *delim, *payload;
2621 struct TCP_Server_Info *server = ses->server;
2622 struct sockaddr_in *sa;
2623 struct sockaddr_in6 *sa6;
2624 const struct user_key_payload *upayload;
2626 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2630 /* try to find an address key first */
2631 switch (server->dstaddr.ss_family) {
2633 sa = (struct sockaddr_in *)&server->dstaddr;
2634 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2637 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2638 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2641 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2642 server->dstaddr.ss_family);
2647 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2648 key = request_key(&key_type_logon, desc, "");
2650 if (!ses->domainName) {
2651 cifs_dbg(FYI, "domainName is NULL\n");
2656 /* didn't work, try to find a domain key */
2657 sprintf(desc, "cifs:d:%s", ses->domainName);
2658 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2659 key = request_key(&key_type_logon, desc, "");
2666 down_read(&key->sem);
2667 upayload = user_key_payload_locked(key);
2668 if (IS_ERR_OR_NULL(upayload)) {
2669 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2673 /* find first : in payload */
2674 payload = upayload->data;
2675 delim = strnchr(payload, upayload->datalen, ':');
2676 cifs_dbg(FYI, "payload=%s\n", payload);
2678 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2684 len = delim - payload;
2685 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2686 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2692 vol->username = kstrndup(payload, len, GFP_KERNEL);
2693 if (!vol->username) {
2694 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2699 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2701 len = key->datalen - (len + 1);
2702 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2703 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2705 kfree(vol->username);
2706 vol->username = NULL;
2711 vol->password = kstrndup(delim, len, GFP_KERNEL);
2712 if (!vol->password) {
2713 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2716 kfree(vol->username);
2717 vol->username = NULL;
2726 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2729 #else /* ! CONFIG_KEYS */
2731 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2732 struct cifs_ses *ses __attribute__((unused)))
2736 #endif /* CONFIG_KEYS */
2739 * cifs_get_smb_ses - get a session matching @volume_info data from @server
2741 * This function assumes it is being called from cifs_mount() where we
2742 * already got a server reference (server refcount +1). See
2743 * cifs_get_tcon() for refcount explanations.
2745 static struct cifs_ses *
2746 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2750 struct cifs_ses *ses;
2751 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2752 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2756 ses = cifs_find_smb_ses(server, volume_info);
2758 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2761 mutex_lock(&ses->session_mutex);
2762 rc = cifs_negotiate_protocol(xid, ses);
2764 mutex_unlock(&ses->session_mutex);
2765 /* problem -- put our ses reference */
2766 cifs_put_smb_ses(ses);
2770 if (ses->need_reconnect) {
2771 cifs_dbg(FYI, "Session needs reconnect\n");
2772 rc = cifs_setup_session(xid, ses,
2773 volume_info->local_nls);
2775 mutex_unlock(&ses->session_mutex);
2776 /* problem -- put our reference */
2777 cifs_put_smb_ses(ses);
2782 mutex_unlock(&ses->session_mutex);
2784 /* existing SMB ses has a server reference already */
2785 cifs_put_tcp_session(server, 0);
2790 cifs_dbg(FYI, "Existing smb sess not found\n");
2791 ses = sesInfoAlloc();
2795 /* new SMB session uses our server ref */
2796 ses->server = server;
2797 if (server->dstaddr.ss_family == AF_INET6)
2798 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2800 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2802 if (volume_info->username) {
2803 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2804 if (!ses->user_name)
2808 /* volume_info->password freed at unmount */
2809 if (volume_info->password) {
2810 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2814 if (volume_info->domainname) {
2815 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2816 if (!ses->domainName)
2819 if (volume_info->domainauto)
2820 ses->domainAuto = volume_info->domainauto;
2821 ses->cred_uid = volume_info->cred_uid;
2822 ses->linux_uid = volume_info->linux_uid;
2824 ses->sectype = volume_info->sectype;
2825 ses->sign = volume_info->sign;
2827 mutex_lock(&ses->session_mutex);
2828 rc = cifs_negotiate_protocol(xid, ses);
2830 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2831 mutex_unlock(&ses->session_mutex);
2835 /* success, put it on the list */
2836 spin_lock(&cifs_tcp_ses_lock);
2837 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2838 spin_unlock(&cifs_tcp_ses_lock);
2842 cifs_setup_ipc(ses, volume_info);
2852 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
2854 if (tcon->tidStatus == CifsExiting)
2856 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
2858 if (tcon->seal != volume_info->seal)
2860 if (tcon->snapshot_time != volume_info->snapshot_time)
2865 static struct cifs_tcon *
2866 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2868 struct list_head *tmp;
2869 struct cifs_tcon *tcon;
2871 spin_lock(&cifs_tcp_ses_lock);
2872 list_for_each(tmp, &ses->tcon_list) {
2873 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2874 if (!match_tcon(tcon, volume_info))
2877 spin_unlock(&cifs_tcp_ses_lock);
2880 spin_unlock(&cifs_tcp_ses_lock);
2885 cifs_put_tcon(struct cifs_tcon *tcon)
2888 struct cifs_ses *ses;
2891 * IPC tcon share the lifetime of their session and are
2892 * destroyed in the session put function
2894 if (tcon == NULL || tcon->ipc)
2898 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2899 spin_lock(&cifs_tcp_ses_lock);
2900 if (--tcon->tc_count > 0) {
2901 spin_unlock(&cifs_tcp_ses_lock);
2905 list_del_init(&tcon->tcon_list);
2906 spin_unlock(&cifs_tcp_ses_lock);
2909 if (ses->server->ops->tree_disconnect)
2910 ses->server->ops->tree_disconnect(xid, tcon);
2913 cifs_fscache_release_super_cookie(tcon);
2915 cifs_put_smb_ses(ses);
2919 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
2921 * - tcon refcount is the number of mount points using the tcon.
2922 * - ses refcount is the number of tcon using the session.
2924 * 1. This function assumes it is being called from cifs_mount() where
2925 * we already got a session reference (ses refcount +1).
2927 * 2. Since we're in the context of adding a mount point, the end
2928 * result should be either:
2930 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2931 * its session refcount incremented (1 new tcon). This +1 was
2932 * already done in (1).
2934 * b) an existing tcon with refcount+1 (add a mount point to it) and
2935 * identical ses refcount (no new tcon). Because of (1) we need to
2936 * decrement the ses refcount.
2938 static struct cifs_tcon *
2939 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2942 struct cifs_tcon *tcon;
2944 tcon = cifs_find_tcon(ses, volume_info);
2947 * tcon has refcount already incremented but we need to
2948 * decrement extra ses reference gotten by caller (case b)
2950 cifs_dbg(FYI, "Found match on UNC path\n");
2951 cifs_put_smb_ses(ses);
2955 if (!ses->server->ops->tree_connect) {
2960 tcon = tconInfoAlloc();
2966 if (volume_info->snapshot_time) {
2967 if (ses->server->vals->protocol_id == 0) {
2969 "Use SMB2 or later for snapshot mount option\n");
2973 tcon->snapshot_time = volume_info->snapshot_time;
2977 if (volume_info->password) {
2978 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2979 if (!tcon->password) {
2985 if (volume_info->seal) {
2986 if (ses->server->vals->protocol_id == 0) {
2988 "SMB3 or later required for encryption\n");
2991 } else if (tcon->ses->server->capabilities &
2992 SMB2_GLOBAL_CAP_ENCRYPTION)
2995 cifs_dbg(VFS, "Encryption is not supported on share\n");
3001 #ifdef CONFIG_CIFS_SMB311
3002 if ((volume_info->linux_ext) && (ses->server->posix_ext_supported)) {
3003 if (ses->server->vals->protocol_id == SMB311_PROT_ID)
3004 tcon->posix_extensions = true;
3009 * BB Do we need to wrap session_mutex around this TCon call and Unix
3010 * SetFS as we do on SessSetup and reconnect?
3013 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3014 volume_info->local_nls);
3016 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3020 if (volume_info->nodfs) {
3021 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
3022 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
3024 tcon->use_persistent = false;
3025 /* check if SMB2 or later, CIFS does not support persistent handles */
3026 if (volume_info->persistent) {
3027 if (ses->server->vals->protocol_id == 0) {
3029 "SMB3 or later required for persistent handles\n");
3032 } else if (ses->server->capabilities &
3033 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3034 tcon->use_persistent = true;
3035 else /* persistent handles requested but not supported */ {
3037 "Persistent handles not supported on share\n");
3041 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3042 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3043 && (volume_info->nopersistent == false)) {
3044 cifs_dbg(FYI, "enabling persistent handles\n");
3045 tcon->use_persistent = true;
3046 } else if (volume_info->resilient) {
3047 if (ses->server->vals->protocol_id == 0) {
3049 "SMB2.1 or later required for resilient handles\n");
3053 tcon->use_resilient = true;
3057 * We can have only one retry value for a connection to a share so for
3058 * resources mounted more than once to the same server share the last
3059 * value passed in for the retry flag is used.
3061 tcon->retry = volume_info->retry;
3062 tcon->nocase = volume_info->nocase;
3063 tcon->nohandlecache = volume_info->nohandlecache;
3064 tcon->local_lease = volume_info->local_lease;
3065 INIT_LIST_HEAD(&tcon->pending_opens);
3067 spin_lock(&cifs_tcp_ses_lock);
3068 list_add(&tcon->tcon_list, &ses->tcon_list);
3069 spin_unlock(&cifs_tcp_ses_lock);
3071 cifs_fscache_get_super_cookie(tcon);
3081 cifs_put_tlink(struct tcon_link *tlink)
3083 if (!tlink || IS_ERR(tlink))
3086 if (!atomic_dec_and_test(&tlink->tl_count) ||
3087 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3088 tlink->tl_time = jiffies;
3092 if (!IS_ERR(tlink_tcon(tlink)))
3093 cifs_put_tcon(tlink_tcon(tlink));
3098 static inline struct tcon_link *
3099 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
3101 return cifs_sb->master_tlink;
3105 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3107 struct cifs_sb_info *old = CIFS_SB(sb);
3108 struct cifs_sb_info *new = mnt_data->cifs_sb;
3110 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3113 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3114 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3118 * We want to share sb only if we don't specify an r/wsize or
3119 * specified r/wsize is greater than or equal to existing one.
3121 if (new->wsize && new->wsize < old->wsize)
3124 if (new->rsize && new->rsize < old->rsize)
3127 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3130 if (old->mnt_file_mode != new->mnt_file_mode ||
3131 old->mnt_dir_mode != new->mnt_dir_mode)
3134 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3137 if (old->actimeo != new->actimeo)
3144 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3146 struct cifs_sb_info *old = CIFS_SB(sb);
3147 struct cifs_sb_info *new = mnt_data->cifs_sb;
3148 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3149 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3151 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3153 else if (!old_set && !new_set)
3160 cifs_match_super(struct super_block *sb, void *data)
3162 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3163 struct smb_vol *volume_info;
3164 struct cifs_sb_info *cifs_sb;
3165 struct TCP_Server_Info *tcp_srv;
3166 struct cifs_ses *ses;
3167 struct cifs_tcon *tcon;
3168 struct tcon_link *tlink;
3171 spin_lock(&cifs_tcp_ses_lock);
3172 cifs_sb = CIFS_SB(sb);
3173 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3174 if (IS_ERR(tlink)) {
3175 spin_unlock(&cifs_tcp_ses_lock);
3178 tcon = tlink_tcon(tlink);
3180 tcp_srv = ses->server;
3182 volume_info = mnt_data->vol;
3184 if (!match_server(tcp_srv, volume_info) ||
3185 !match_session(ses, volume_info) ||
3186 !match_tcon(tcon, volume_info) ||
3187 !match_prepath(sb, mnt_data)) {
3192 rc = compare_mount_options(sb, mnt_data);
3194 spin_unlock(&cifs_tcp_ses_lock);
3195 cifs_put_tlink(tlink);
3200 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
3201 const struct nls_table *nls_codepage, unsigned int *num_referrals,
3202 struct dfs_info3_param **referrals, int remap)
3206 if (!ses->server->ops->get_dfs_refer)
3212 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
3213 referrals, num_referrals,
3214 nls_codepage, remap);
3218 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3219 static struct lock_class_key cifs_key[2];
3220 static struct lock_class_key cifs_slock_key[2];
3223 cifs_reclassify_socket4(struct socket *sock)
3225 struct sock *sk = sock->sk;
3226 BUG_ON(!sock_allow_reclassification(sk));
3227 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3228 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3232 cifs_reclassify_socket6(struct socket *sock)
3234 struct sock *sk = sock->sk;
3235 BUG_ON(!sock_allow_reclassification(sk));
3236 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3237 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3241 cifs_reclassify_socket4(struct socket *sock)
3246 cifs_reclassify_socket6(struct socket *sock)
3251 /* See RFC1001 section 14 on representation of Netbios names */
3252 static void rfc1002mangle(char *target, char *source, unsigned int length)
3256 for (i = 0, j = 0; i < (length); i++) {
3257 /* mask a nibble at a time and encode */
3258 target[j] = 'A' + (0x0F & (source[i] >> 4));
3259 target[j+1] = 'A' + (0x0F & source[i]);
3266 bind_socket(struct TCP_Server_Info *server)
3269 if (server->srcaddr.ss_family != AF_UNSPEC) {
3270 /* Bind to the specified local IP address */
3271 struct socket *socket = server->ssocket;
3272 rc = socket->ops->bind(socket,
3273 (struct sockaddr *) &server->srcaddr,
3274 sizeof(server->srcaddr));
3276 struct sockaddr_in *saddr4;
3277 struct sockaddr_in6 *saddr6;
3278 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3279 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3280 if (saddr6->sin6_family == AF_INET6)
3281 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3282 &saddr6->sin6_addr, rc);
3284 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3285 &saddr4->sin_addr.s_addr, rc);
3292 ip_rfc1001_connect(struct TCP_Server_Info *server)
3296 * some servers require RFC1001 sessinit before sending
3297 * negprot - BB check reconnection in case where second
3298 * sessinit is sent but no second negprot
3300 struct rfc1002_session_packet *ses_init_buf;
3301 struct smb_hdr *smb_buf;
3302 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3305 ses_init_buf->trailer.session_req.called_len = 32;
3307 if (server->server_RFC1001_name[0] != 0)
3308 rfc1002mangle(ses_init_buf->trailer.
3309 session_req.called_name,
3310 server->server_RFC1001_name,
3311 RFC1001_NAME_LEN_WITH_NULL);
3313 rfc1002mangle(ses_init_buf->trailer.
3314 session_req.called_name,
3315 DEFAULT_CIFS_CALLED_NAME,
3316 RFC1001_NAME_LEN_WITH_NULL);
3318 ses_init_buf->trailer.session_req.calling_len = 32;
3321 * calling name ends in null (byte 16) from old smb
3324 if (server->workstation_RFC1001_name[0] != 0)
3325 rfc1002mangle(ses_init_buf->trailer.
3326 session_req.calling_name,
3327 server->workstation_RFC1001_name,
3328 RFC1001_NAME_LEN_WITH_NULL);
3330 rfc1002mangle(ses_init_buf->trailer.
3331 session_req.calling_name,
3333 RFC1001_NAME_LEN_WITH_NULL);
3335 ses_init_buf->trailer.session_req.scope1 = 0;
3336 ses_init_buf->trailer.session_req.scope2 = 0;
3337 smb_buf = (struct smb_hdr *)ses_init_buf;
3339 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3340 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3341 rc = smb_send(server, smb_buf, 0x44);
3342 kfree(ses_init_buf);
3344 * RFC1001 layer in at least one server
3345 * requires very short break before negprot
3346 * presumably because not expecting negprot
3347 * to follow so fast. This is a simple
3348 * solution that works without
3349 * complicating the code and causes no
3350 * significant slowing down on mount
3353 usleep_range(1000, 2000);
3356 * else the negprot may still work without this
3357 * even though malloc failed
3364 generic_ip_connect(struct TCP_Server_Info *server)
3369 struct socket *socket = server->ssocket;
3370 struct sockaddr *saddr;
3372 saddr = (struct sockaddr *) &server->dstaddr;
3374 if (server->dstaddr.ss_family == AF_INET6) {
3375 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3376 slen = sizeof(struct sockaddr_in6);
3379 sport = ((struct sockaddr_in *) saddr)->sin_port;
3380 slen = sizeof(struct sockaddr_in);
3384 if (socket == NULL) {
3385 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3386 IPPROTO_TCP, &socket, 1);
3388 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3389 server->ssocket = NULL;
3393 /* BB other socket options to set KEEPALIVE, NODELAY? */
3394 cifs_dbg(FYI, "Socket created\n");
3395 server->ssocket = socket;
3396 socket->sk->sk_allocation = GFP_NOFS;
3397 if (sfamily == AF_INET6)
3398 cifs_reclassify_socket6(socket);
3400 cifs_reclassify_socket4(socket);
3403 rc = bind_socket(server);
3408 * Eventually check for other socket options to change from
3409 * the default. sock_setsockopt not used because it expects
3412 socket->sk->sk_rcvtimeo = 7 * HZ;
3413 socket->sk->sk_sndtimeo = 5 * HZ;
3415 /* make the bufsizes depend on wsize/rsize and max requests */
3416 if (server->noautotune) {
3417 if (socket->sk->sk_sndbuf < (200 * 1024))
3418 socket->sk->sk_sndbuf = 200 * 1024;
3419 if (socket->sk->sk_rcvbuf < (140 * 1024))
3420 socket->sk->sk_rcvbuf = 140 * 1024;
3423 if (server->tcp_nodelay) {
3425 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3426 (char *)&val, sizeof(val));
3428 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3432 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3433 socket->sk->sk_sndbuf,
3434 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3436 rc = socket->ops->connect(socket, saddr, slen, 0);
3438 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3439 sock_release(socket);
3440 server->ssocket = NULL;
3444 if (sport == htons(RFC1001_PORT))
3445 rc = ip_rfc1001_connect(server);
3451 ip_connect(struct TCP_Server_Info *server)
3454 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3455 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3457 if (server->dstaddr.ss_family == AF_INET6)
3458 sport = &addr6->sin6_port;
3460 sport = &addr->sin_port;
3465 /* try with 445 port at first */
3466 *sport = htons(CIFS_PORT);
3468 rc = generic_ip_connect(server);
3472 /* if it failed, try with 139 port */
3473 *sport = htons(RFC1001_PORT);
3476 return generic_ip_connect(server);
3479 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3480 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3482 /* if we are reconnecting then should we check to see if
3483 * any requested capabilities changed locally e.g. via
3484 * remount but we can not do much about it here
3485 * if they have (even if we could detect it by the following)
3486 * Perhaps we could add a backpointer to array of sb from tcon
3487 * or if we change to make all sb to same share the same
3488 * sb as NFS - then we only have one backpointer to sb.
3489 * What if we wanted to mount the server share twice once with
3490 * and once without posixacls or posix paths? */
3491 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3493 if (vol_info && vol_info->no_linux_ext) {
3494 tcon->fsUnixInfo.Capability = 0;
3495 tcon->unix_ext = 0; /* Unix Extensions disabled */
3496 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3498 } else if (vol_info)
3499 tcon->unix_ext = 1; /* Unix Extensions supported */
3501 if (tcon->unix_ext == 0) {
3502 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3506 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3507 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3508 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3509 /* check for reconnect case in which we do not
3510 want to change the mount behavior if we can avoid it */
3511 if (vol_info == NULL) {
3512 /* turn off POSIX ACL and PATHNAMES if not set
3513 originally at mount time */
3514 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3515 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3516 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3517 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3518 cifs_dbg(VFS, "POSIXPATH support change\n");
3519 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3520 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3521 cifs_dbg(VFS, "possible reconnect error\n");
3522 cifs_dbg(VFS, "server disabled POSIX path support\n");
3526 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3527 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3529 cap &= CIFS_UNIX_CAP_MASK;
3530 if (vol_info && vol_info->no_psx_acl)
3531 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3532 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3533 cifs_dbg(FYI, "negotiated posix acl support\n");
3535 cifs_sb->mnt_cifs_flags |=
3536 CIFS_MOUNT_POSIXACL;
3539 if (vol_info && vol_info->posix_paths == 0)
3540 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3541 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3542 cifs_dbg(FYI, "negotiate posix pathnames\n");
3544 cifs_sb->mnt_cifs_flags |=
3545 CIFS_MOUNT_POSIX_PATHS;
3548 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3549 #ifdef CONFIG_CIFS_DEBUG2
3550 if (cap & CIFS_UNIX_FCNTL_CAP)
3551 cifs_dbg(FYI, "FCNTL cap\n");
3552 if (cap & CIFS_UNIX_EXTATTR_CAP)
3553 cifs_dbg(FYI, "EXTATTR cap\n");
3554 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3555 cifs_dbg(FYI, "POSIX path cap\n");
3556 if (cap & CIFS_UNIX_XATTR_CAP)
3557 cifs_dbg(FYI, "XATTR cap\n");
3558 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3559 cifs_dbg(FYI, "POSIX ACL cap\n");
3560 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3561 cifs_dbg(FYI, "very large read cap\n");
3562 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3563 cifs_dbg(FYI, "very large write cap\n");
3564 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3565 cifs_dbg(FYI, "transport encryption cap\n");
3566 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3567 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3568 #endif /* CIFS_DEBUG2 */
3569 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3570 if (vol_info == NULL) {
3571 cifs_dbg(FYI, "resetting capabilities failed\n");
3573 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");
3579 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3580 struct cifs_sb_info *cifs_sb)
3582 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3584 spin_lock_init(&cifs_sb->tlink_tree_lock);
3585 cifs_sb->tlink_tree = RB_ROOT;
3588 * Temporarily set r/wsize for matching superblock. If we end up using
3589 * new sb then client will later negotiate it downward if needed.
3591 cifs_sb->rsize = pvolume_info->rsize;
3592 cifs_sb->wsize = pvolume_info->wsize;
3594 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3595 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3596 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3597 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3598 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3599 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3601 cifs_sb->actimeo = pvolume_info->actimeo;
3602 cifs_sb->local_nls = pvolume_info->local_nls;
3604 if (pvolume_info->noperm)
3605 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3606 if (pvolume_info->setuids)
3607 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3608 if (pvolume_info->setuidfromacl)
3609 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3610 if (pvolume_info->server_ino)
3611 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3612 if (pvolume_info->remap)
3613 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3614 if (pvolume_info->sfu_remap)
3615 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3616 if (pvolume_info->no_xattr)
3617 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3618 if (pvolume_info->sfu_emul)
3619 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3620 if (pvolume_info->nobrl)
3621 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3622 if (pvolume_info->nohandlecache)
3623 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3624 if (pvolume_info->nostrictsync)
3625 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3626 if (pvolume_info->mand_lock)
3627 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3628 if (pvolume_info->rwpidforward)
3629 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3630 if (pvolume_info->cifs_acl)
3631 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3632 if (pvolume_info->backupuid_specified) {
3633 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3634 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3636 if (pvolume_info->backupgid_specified) {
3637 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3638 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3640 if (pvolume_info->override_uid)
3641 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3642 if (pvolume_info->override_gid)
3643 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3644 if (pvolume_info->dynperm)
3645 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3646 if (pvolume_info->fsc)
3647 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3648 if (pvolume_info->multiuser)
3649 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3650 CIFS_MOUNT_NO_PERM);
3651 if (pvolume_info->strict_io)
3652 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3653 if (pvolume_info->direct_io) {
3654 cifs_dbg(FYI, "mounting share using direct i/o\n");
3655 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3657 if (pvolume_info->mfsymlinks) {
3658 if (pvolume_info->sfu_emul) {
3660 * Our SFU ("Services for Unix" emulation does not allow
3661 * creating symlinks but does allow reading existing SFU
3662 * symlinks (it does allow both creating and reading SFU
3663 * style mknod and FIFOs though). When "mfsymlinks" and
3664 * "sfu" are both enabled at the same time, it allows
3665 * reading both types of symlinks, but will only create
3666 * them with mfsymlinks format. This allows better
3667 * Apple compatibility (probably better for Samba too)
3668 * while still recognizing old Windows style symlinks.
3670 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3672 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3675 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3676 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3678 if (pvolume_info->prepath) {
3679 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3680 if (cifs_sb->prepath == NULL)
3688 cleanup_volume_info_contents(struct smb_vol *volume_info)
3690 kfree(volume_info->username);
3691 kzfree(volume_info->password);
3692 kfree(volume_info->UNC);
3693 kfree(volume_info->domainname);
3694 kfree(volume_info->iocharset);
3695 kfree(volume_info->prepath);
3699 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3703 cleanup_volume_info_contents(volume_info);
3708 #ifdef CONFIG_CIFS_DFS_UPCALL
3710 * cifs_build_path_to_root returns full path to root when we do not have an
3711 * exiting connection (tcon)
3714 build_unc_path_to_root(const struct smb_vol *vol,
3715 const struct cifs_sb_info *cifs_sb)
3717 char *full_path, *pos;
3718 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3719 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3721 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3722 if (full_path == NULL)
3723 return ERR_PTR(-ENOMEM);
3725 strncpy(full_path, vol->UNC, unc_len);
3726 pos = full_path + unc_len;
3729 *pos = CIFS_DIR_SEP(cifs_sb);
3730 strncpy(pos + 1, vol->prepath, pplen);
3734 *pos = '\0'; /* add trailing null */
3735 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3736 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3741 * Perform a dfs referral query for a share and (optionally) prefix
3743 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3744 * to a string containing updated options for the submount. Otherwise it
3745 * will be left untouched.
3747 * Returns the rc from get_dfs_path to the caller, which can be used to
3748 * determine whether there were referrals.
3751 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3752 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3756 unsigned int num_referrals = 0;
3757 struct dfs_info3_param *referrals = NULL;
3758 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3760 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3761 if (IS_ERR(full_path))
3762 return PTR_ERR(full_path);
3764 /* For DFS paths, skip the first '\' of the UNC */
3765 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3767 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3768 &num_referrals, &referrals, cifs_remap(cifs_sb));
3770 if (!rc && num_referrals > 0) {
3771 char *fake_devname = NULL;
3773 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3774 full_path + 1, referrals,
3777 free_dfs_info_array(referrals, num_referrals);
3779 if (IS_ERR(mdata)) {
3780 rc = PTR_ERR(mdata);
3783 cleanup_volume_info_contents(volume_info);
3784 rc = cifs_setup_volume_info(volume_info, mdata,
3787 kfree(fake_devname);
3788 kfree(cifs_sb->mountdata);
3789 cifs_sb->mountdata = mdata;
3797 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3798 const char *devname)
3802 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3805 if (volume_info->nullauth) {
3806 cifs_dbg(FYI, "Anonymous login\n");
3807 kfree(volume_info->username);
3808 volume_info->username = NULL;
3809 } else if (volume_info->username) {
3810 /* BB fixme parse for domain name here */
3811 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3813 cifs_dbg(VFS, "No username specified\n");
3814 /* In userspace mount helper we can get user name from alternate
3815 locations such as env variables and files on disk */
3819 /* this is needed for ASCII cp to Unicode converts */
3820 if (volume_info->iocharset == NULL) {
3821 /* load_nls_default cannot return null */
3822 volume_info->local_nls = load_nls_default();
3824 volume_info->local_nls = load_nls(volume_info->iocharset);
3825 if (volume_info->local_nls == NULL) {
3826 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3827 volume_info->iocharset);
3836 cifs_get_volume_info(char *mount_data, const char *devname)
3839 struct smb_vol *volume_info;
3841 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3843 return ERR_PTR(-ENOMEM);
3845 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3847 cifs_cleanup_volume_info(volume_info);
3848 volume_info = ERR_PTR(rc);
3855 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3857 struct cifs_tcon *tcon,
3858 struct cifs_sb_info *cifs_sb,
3865 sep = CIFS_DIR_SEP(cifs_sb);
3868 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3870 /* skip separators */
3875 /* next separator */
3876 while (*s && *s != sep)
3880 * temporarily null-terminate the path at the end of
3881 * the current component
3885 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3893 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3897 struct cifs_ses *ses;
3898 struct cifs_tcon *tcon;
3899 struct TCP_Server_Info *server;
3901 struct tcon_link *tlink;
3902 #ifdef CONFIG_CIFS_DFS_UPCALL
3903 int referral_walks_count = 0;
3906 #ifdef CONFIG_CIFS_DFS_UPCALL
3908 /* cleanup activities if we're chasing a referral */
3909 if (referral_walks_count) {
3911 cifs_put_tcon(tcon);
3913 cifs_put_smb_ses(ses);
3915 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3929 /* get a reference to a tcp session */
3930 server = cifs_get_tcp_session(volume_info);
3931 if (IS_ERR(server)) {
3932 rc = PTR_ERR(server);
3935 if ((volume_info->max_credits < 20) ||
3936 (volume_info->max_credits > 60000))
3937 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3939 server->max_credits = volume_info->max_credits;
3940 /* get a reference to a SMB session */
3941 ses = cifs_get_smb_ses(server, volume_info);
3945 goto mount_fail_check;
3948 if ((volume_info->persistent == true) && ((ses->server->capabilities &
3949 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
3950 cifs_dbg(VFS, "persistent handles not supported by server\n");
3952 goto mount_fail_check;
3955 /* search for existing tcon to this server share */
3956 tcon = cifs_get_tcon(ses, volume_info);
3961 goto mount_fail_check;
3963 goto remote_path_check;
3966 /* tell server which Unix caps we support */
3967 if (cap_unix(tcon->ses)) {
3968 /* reset of caps checks mount to see if unix extensions
3969 disabled for just this mount */
3970 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3971 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3972 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3973 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3975 goto mount_fail_check;
3978 tcon->unix_ext = 0; /* server does not support them */
3980 /* do not care if a following call succeed - informational */
3981 if (!tcon->pipe && server->ops->qfs_tcon)
3982 server->ops->qfs_tcon(xid, tcon);
3984 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3985 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3988 #ifdef CONFIG_CIFS_DFS_UPCALL
3990 * Perform an unconditional check for whether there are DFS
3991 * referrals for this path without prefix, to provide support
3992 * for DFS referrals from w2k8 servers which don't seem to respond
3993 * with PATH_NOT_COVERED to requests that include the prefix.
3994 * Chase the referral if found, otherwise continue normally.
3996 if (referral_walks_count == 0) {
3997 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
4000 referral_walks_count++;
4001 goto try_mount_again;
4006 /* check if a whole path is not remote */
4008 if (!server->ops->is_path_accessible) {
4010 goto mount_fail_check;
4013 * cifs_build_path_to_root works only when we have a valid tcon
4015 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon,
4016 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4017 if (full_path == NULL) {
4019 goto mount_fail_check;
4021 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4023 if (rc != 0 && rc != -EREMOTE) {
4025 goto mount_fail_check;
4028 if (rc != -EREMOTE) {
4029 rc = cifs_are_all_path_components_accessible(server,
4033 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4034 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4035 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4042 /* get referral if needed */
4043 if (rc == -EREMOTE) {
4044 #ifdef CONFIG_CIFS_DFS_UPCALL
4045 if (referral_walks_count > MAX_NESTED_LINKS) {
4047 * BB: when we implement proper loop detection,
4048 * we will remove this check. But now we need it
4049 * to prevent an indefinite loop if 'DFS tree' is
4050 * misconfigured (i.e. has loops).
4053 goto mount_fail_check;
4056 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
4059 referral_walks_count++;
4060 goto try_mount_again;
4062 goto mount_fail_check;
4063 #else /* No DFS support, return error on mount */
4069 goto mount_fail_check;
4071 /* now, hang the tcon off of the superblock */
4072 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
4073 if (tlink == NULL) {
4075 goto mount_fail_check;
4078 tlink->tl_uid = ses->linux_uid;
4079 tlink->tl_tcon = tcon;
4080 tlink->tl_time = jiffies;
4081 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4082 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4084 cifs_sb->master_tlink = tlink;
4085 spin_lock(&cifs_sb->tlink_tree_lock);
4086 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4087 spin_unlock(&cifs_sb->tlink_tree_lock);
4089 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4093 /* on error free sesinfo and tcon struct if needed */
4095 /* If find_unc succeeded then rc == 0 so we can not end */
4096 /* up accidentally freeing someone elses tcon struct */
4098 cifs_put_tcon(tcon);
4100 cifs_put_smb_ses(ses);
4102 cifs_put_tcp_session(server, 0);
4111 * Issue a TREE_CONNECT request.
4114 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4115 const char *tree, struct cifs_tcon *tcon,
4116 const struct nls_table *nls_codepage)
4118 struct smb_hdr *smb_buffer;
4119 struct smb_hdr *smb_buffer_response;
4122 unsigned char *bcc_ptr;
4125 __u16 bytes_left, count;
4130 smb_buffer = cifs_buf_get();
4131 if (smb_buffer == NULL)
4134 smb_buffer_response = smb_buffer;
4136 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4137 NULL /*no tid */ , 4 /*wct */ );
4139 smb_buffer->Mid = get_next_mid(ses->server);
4140 smb_buffer->Uid = ses->Suid;
4141 pSMB = (TCONX_REQ *) smb_buffer;
4142 pSMBr = (TCONX_RSP *) smb_buffer_response;
4144 pSMB->AndXCommand = 0xFF;
4145 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4146 bcc_ptr = &pSMB->Password[0];
4147 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4148 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4149 *bcc_ptr = 0; /* password is null byte */
4150 bcc_ptr++; /* skip password */
4151 /* already aligned so no need to do it below */
4153 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4154 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4155 specified as required (when that support is added to
4156 the vfs in the future) as only NTLM or the much
4157 weaker LANMAN (which we do not send by default) is accepted
4158 by Samba (not sure whether other servers allow
4159 NTLMv2 password here) */
4160 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4161 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4162 (ses->sectype == LANMAN))
4163 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4164 ses->server->sec_mode &
4165 SECMODE_PW_ENCRYPT ? true : false,
4168 #endif /* CIFS_WEAK_PW_HASH */
4169 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4170 bcc_ptr, nls_codepage);
4172 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4174 cifs_buf_release(smb_buffer);
4178 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4179 if (ses->capabilities & CAP_UNICODE) {
4180 /* must align unicode strings */
4181 *bcc_ptr = 0; /* null byte password */
4186 if (ses->server->sign)
4187 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4189 if (ses->capabilities & CAP_STATUS32) {
4190 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4192 if (ses->capabilities & CAP_DFS) {
4193 smb_buffer->Flags2 |= SMBFLG2_DFS;
4195 if (ses->capabilities & CAP_UNICODE) {
4196 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4198 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4199 6 /* max utf8 char length in bytes */ *
4200 (/* server len*/ + 256 /* share len */), nls_codepage);
4201 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4202 bcc_ptr += 2; /* skip trailing null */
4203 } else { /* ASCII */
4204 strcpy(bcc_ptr, tree);
4205 bcc_ptr += strlen(tree) + 1;
4207 strcpy(bcc_ptr, "?????");
4208 bcc_ptr += strlen("?????");
4210 count = bcc_ptr - &pSMB->Password[0];
4211 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4212 pSMB->hdr.smb_buf_length) + count);
4213 pSMB->ByteCount = cpu_to_le16(count);
4215 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4218 /* above now done in SendReceive */
4222 tcon->tidStatus = CifsGood;
4223 tcon->need_reconnect = false;
4224 tcon->tid = smb_buffer_response->Tid;
4225 bcc_ptr = pByteArea(smb_buffer_response);
4226 bytes_left = get_bcc(smb_buffer_response);
4227 length = strnlen(bcc_ptr, bytes_left - 2);
4228 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4234 /* skip service field (NB: this field is always ASCII) */
4236 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4237 (bcc_ptr[2] == 'C')) {
4238 cifs_dbg(FYI, "IPC connection\n");
4242 } else if (length == 2) {
4243 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4244 /* the most common case */
4245 cifs_dbg(FYI, "disk share connection\n");
4248 bcc_ptr += length + 1;
4249 bytes_left -= (length + 1);
4250 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4252 /* mostly informational -- no need to fail on error here */
4253 kfree(tcon->nativeFileSystem);
4254 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4255 bytes_left, is_unicode,
4258 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4260 if ((smb_buffer_response->WordCount == 3) ||
4261 (smb_buffer_response->WordCount == 7))
4262 /* field is in same location */
4263 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4266 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4269 cifs_buf_release(smb_buffer);
4273 static void delayed_free(struct rcu_head *p)
4275 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4276 unload_nls(sbi->local_nls);
4281 cifs_umount(struct cifs_sb_info *cifs_sb)
4283 struct rb_root *root = &cifs_sb->tlink_tree;
4284 struct rb_node *node;
4285 struct tcon_link *tlink;
4287 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4289 spin_lock(&cifs_sb->tlink_tree_lock);
4290 while ((node = rb_first(root))) {
4291 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4292 cifs_get_tlink(tlink);
4293 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4294 rb_erase(node, root);
4296 spin_unlock(&cifs_sb->tlink_tree_lock);
4297 cifs_put_tlink(tlink);
4298 spin_lock(&cifs_sb->tlink_tree_lock);
4300 spin_unlock(&cifs_sb->tlink_tree_lock);
4302 kfree(cifs_sb->mountdata);
4303 kfree(cifs_sb->prepath);
4304 call_rcu(&cifs_sb->rcu, delayed_free);
4308 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4311 struct TCP_Server_Info *server = ses->server;
4313 if (!server->ops->need_neg || !server->ops->negotiate)
4316 /* only send once per connect */
4317 if (!server->ops->need_neg(server))
4320 set_credits(server, 1);
4322 rc = server->ops->negotiate(xid, ses);
4324 spin_lock(&GlobalMid_Lock);
4325 if (server->tcpStatus == CifsNeedNegotiate)
4326 server->tcpStatus = CifsGood;
4329 spin_unlock(&GlobalMid_Lock);
4336 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4337 struct nls_table *nls_info)
4340 struct TCP_Server_Info *server = ses->server;
4342 ses->capabilities = server->capabilities;
4343 if (linuxExtEnabled == 0)
4344 ses->capabilities &= (~server->vals->cap_unix);
4346 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4347 server->sec_mode, server->capabilities, server->timeAdj);
4349 if (ses->auth_key.response) {
4350 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4351 ses->auth_key.response);
4352 kfree(ses->auth_key.response);
4353 ses->auth_key.response = NULL;
4354 ses->auth_key.len = 0;
4357 if (server->ops->sess_setup)
4358 rc = server->ops->sess_setup(xid, ses, nls_info);
4361 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4367 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4369 vol->sectype = ses->sectype;
4371 /* krb5 is special, since we don't need username or pw */
4372 if (vol->sectype == Kerberos)
4375 return cifs_set_cifscreds(vol, ses);
4378 static struct cifs_tcon *
4379 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4382 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4383 struct cifs_ses *ses;
4384 struct cifs_tcon *tcon = NULL;
4385 struct smb_vol *vol_info;
4387 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4388 if (vol_info == NULL)
4389 return ERR_PTR(-ENOMEM);
4391 vol_info->local_nls = cifs_sb->local_nls;
4392 vol_info->linux_uid = fsuid;
4393 vol_info->cred_uid = fsuid;
4394 vol_info->UNC = master_tcon->treeName;
4395 vol_info->retry = master_tcon->retry;
4396 vol_info->nocase = master_tcon->nocase;
4397 vol_info->nohandlecache = master_tcon->nohandlecache;
4398 vol_info->local_lease = master_tcon->local_lease;
4399 vol_info->no_linux_ext = !master_tcon->unix_ext;
4400 vol_info->sectype = master_tcon->ses->sectype;
4401 vol_info->sign = master_tcon->ses->sign;
4403 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4409 /* get a reference for the same TCP session */
4410 spin_lock(&cifs_tcp_ses_lock);
4411 ++master_tcon->ses->server->srv_count;
4412 spin_unlock(&cifs_tcp_ses_lock);
4414 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4416 tcon = (struct cifs_tcon *)ses;
4417 cifs_put_tcp_session(master_tcon->ses->server, 0);
4421 tcon = cifs_get_tcon(ses, vol_info);
4423 cifs_put_smb_ses(ses);
4428 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4431 kfree(vol_info->username);
4432 kzfree(vol_info->password);
4439 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4441 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4444 /* find and return a tlink with given uid */
4445 static struct tcon_link *
4446 tlink_rb_search(struct rb_root *root, kuid_t uid)
4448 struct rb_node *node = root->rb_node;
4449 struct tcon_link *tlink;
4452 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4454 if (uid_gt(tlink->tl_uid, uid))
4455 node = node->rb_left;
4456 else if (uid_lt(tlink->tl_uid, uid))
4457 node = node->rb_right;
4464 /* insert a tcon_link into the tree */
4466 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4468 struct rb_node **new = &(root->rb_node), *parent = NULL;
4469 struct tcon_link *tlink;
4472 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4475 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4476 new = &((*new)->rb_left);
4478 new = &((*new)->rb_right);
4481 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4482 rb_insert_color(&new_tlink->tl_rbnode, root);
4486 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4489 * If the superblock doesn't refer to a multiuser mount, then just return
4490 * the master tcon for the mount.
4492 * First, search the rbtree for an existing tcon for this fsuid. If one
4493 * exists, then check to see if it's pending construction. If it is then wait
4494 * for construction to complete. Once it's no longer pending, check to see if
4495 * it failed and either return an error or retry construction, depending on
4498 * If one doesn't exist then insert a new tcon_link struct into the tree and
4499 * try to construct a new one.
4502 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4505 kuid_t fsuid = current_fsuid();
4506 struct tcon_link *tlink, *newtlink;
4508 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4509 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4511 spin_lock(&cifs_sb->tlink_tree_lock);
4512 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4514 cifs_get_tlink(tlink);
4515 spin_unlock(&cifs_sb->tlink_tree_lock);
4517 if (tlink == NULL) {
4518 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4519 if (newtlink == NULL)
4520 return ERR_PTR(-ENOMEM);
4521 newtlink->tl_uid = fsuid;
4522 newtlink->tl_tcon = ERR_PTR(-EACCES);
4523 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4524 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4525 cifs_get_tlink(newtlink);
4527 spin_lock(&cifs_sb->tlink_tree_lock);
4528 /* was one inserted after previous search? */
4529 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4531 cifs_get_tlink(tlink);
4532 spin_unlock(&cifs_sb->tlink_tree_lock);
4534 goto wait_for_construction;
4537 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4538 spin_unlock(&cifs_sb->tlink_tree_lock);
4540 wait_for_construction:
4541 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4542 TASK_INTERRUPTIBLE);
4544 cifs_put_tlink(tlink);
4545 return ERR_PTR(-ERESTARTSYS);
4548 /* if it's good, return it */
4549 if (!IS_ERR(tlink->tl_tcon))
4552 /* return error if we tried this already recently */
4553 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4554 cifs_put_tlink(tlink);
4555 return ERR_PTR(-EACCES);
4558 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4559 goto wait_for_construction;
4562 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4563 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4564 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4566 if (IS_ERR(tlink->tl_tcon)) {
4567 cifs_put_tlink(tlink);
4568 return ERR_PTR(-EACCES);
4575 * periodic workqueue job that scans tcon_tree for a superblock and closes
4579 cifs_prune_tlinks(struct work_struct *work)
4581 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4583 struct rb_root *root = &cifs_sb->tlink_tree;
4584 struct rb_node *node;
4585 struct rb_node *tmp;
4586 struct tcon_link *tlink;
4589 * Because we drop the spinlock in the loop in order to put the tlink
4590 * it's not guarded against removal of links from the tree. The only
4591 * places that remove entries from the tree are this function and
4592 * umounts. Because this function is non-reentrant and is canceled
4593 * before umount can proceed, this is safe.
4595 spin_lock(&cifs_sb->tlink_tree_lock);
4596 node = rb_first(root);
4597 while (node != NULL) {
4599 node = rb_next(tmp);
4600 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4602 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4603 atomic_read(&tlink->tl_count) != 0 ||
4604 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4607 cifs_get_tlink(tlink);
4608 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4609 rb_erase(tmp, root);
4611 spin_unlock(&cifs_sb->tlink_tree_lock);
4612 cifs_put_tlink(tlink);
4613 spin_lock(&cifs_sb->tlink_tree_lock);
4615 spin_unlock(&cifs_sb->tlink_tree_lock);
4617 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,