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>
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
56 #include "rfc1002pdu.h"
58 #include "smb2proto.h"
61 #define RFC1001_PORT 139
63 extern mempool_t *cifs_req_poolp;
65 /* FIXME: should these be tunable? */
66 #define TLINK_ERROR_EXPIRE (1 * HZ)
67 #define TLINK_IDLE_EXPIRE (600 * HZ)
70 /* Mount options that take no arguments */
71 Opt_user_xattr, Opt_nouser_xattr,
72 Opt_forceuid, Opt_noforceuid,
73 Opt_forcegid, Opt_noforcegid,
74 Opt_noblocksend, Opt_noautotune,
75 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
76 Opt_mapposix, Opt_nomapposix,
77 Opt_mapchars, Opt_nomapchars, Opt_sfu,
78 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
79 Opt_noposixpaths, Opt_nounix,
82 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
83 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
84 Opt_nohard, Opt_nosoft,
86 Opt_nostrictsync, Opt_strictsync,
87 Opt_serverino, Opt_noserverino,
88 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
89 Opt_acl, Opt_noacl, Opt_locallease,
90 Opt_sign, Opt_seal, Opt_noac,
91 Opt_fsc, Opt_mfsymlinks,
92 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
93 Opt_persistent, Opt_nopersistent,
94 Opt_resilient, Opt_noresilient,
97 /* Mount options which take numeric value */
98 Opt_backupuid, Opt_backupgid, Opt_uid,
99 Opt_cruid, Opt_gid, Opt_file_mode,
100 Opt_dirmode, Opt_port,
101 Opt_rsize, Opt_wsize, Opt_actimeo,
102 Opt_echo_interval, Opt_max_credits,
105 /* Mount options which take string value */
106 Opt_user, Opt_pass, Opt_ip,
107 Opt_domain, Opt_srcaddr, Opt_iocharset,
108 Opt_netbiosname, Opt_servern,
109 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
111 /* Mount options to be ignored */
114 /* Options which could be blank */
122 static const match_table_t cifs_mount_option_tokens = {
124 { Opt_user_xattr, "user_xattr" },
125 { Opt_nouser_xattr, "nouser_xattr" },
126 { Opt_forceuid, "forceuid" },
127 { Opt_noforceuid, "noforceuid" },
128 { Opt_forcegid, "forcegid" },
129 { Opt_noforcegid, "noforcegid" },
130 { Opt_noblocksend, "noblocksend" },
131 { Opt_noautotune, "noautotune" },
132 { Opt_hard, "hard" },
133 { Opt_soft, "soft" },
134 { Opt_perm, "perm" },
135 { Opt_noperm, "noperm" },
136 { Opt_mapchars, "mapchars" }, /* SFU style */
137 { Opt_nomapchars, "nomapchars" },
138 { Opt_mapposix, "mapposix" }, /* SFM style */
139 { Opt_nomapposix, "nomapposix" },
141 { Opt_nosfu, "nosfu" },
142 { Opt_nodfs, "nodfs" },
143 { Opt_posixpaths, "posixpaths" },
144 { Opt_noposixpaths, "noposixpaths" },
145 { Opt_nounix, "nounix" },
146 { Opt_nounix, "nolinux" },
147 { Opt_nocase, "nocase" },
148 { Opt_nocase, "ignorecase" },
150 { Opt_nobrl, "nobrl" },
151 { Opt_nobrl, "nolock" },
152 { Opt_forcemandatorylock, "forcemandatorylock" },
153 { Opt_forcemandatorylock, "forcemand" },
154 { Opt_setuids, "setuids" },
155 { Opt_nosetuids, "nosetuids" },
156 { Opt_setuidfromacl, "idsfromsid" },
157 { Opt_dynperm, "dynperm" },
158 { Opt_nodynperm, "nodynperm" },
159 { Opt_nohard, "nohard" },
160 { Opt_nosoft, "nosoft" },
161 { Opt_nointr, "nointr" },
162 { Opt_intr, "intr" },
163 { Opt_nostrictsync, "nostrictsync" },
164 { Opt_strictsync, "strictsync" },
165 { Opt_serverino, "serverino" },
166 { Opt_noserverino, "noserverino" },
167 { Opt_rwpidforward, "rwpidforward" },
168 { Opt_cifsacl, "cifsacl" },
169 { Opt_nocifsacl, "nocifsacl" },
171 { Opt_noacl, "noacl" },
172 { Opt_locallease, "locallease" },
173 { Opt_sign, "sign" },
174 { Opt_seal, "seal" },
175 { Opt_noac, "noac" },
177 { Opt_mfsymlinks, "mfsymlinks" },
178 { Opt_multiuser, "multiuser" },
179 { Opt_sloppy, "sloppy" },
180 { Opt_nosharesock, "nosharesock" },
181 { Opt_persistent, "persistenthandles"},
182 { Opt_nopersistent, "nopersistenthandles"},
183 { Opt_resilient, "resilienthandles"},
184 { Opt_noresilient, "noresilienthandles"},
185 { Opt_domainauto, "domainauto"},
187 { Opt_backupuid, "backupuid=%s" },
188 { Opt_backupgid, "backupgid=%s" },
189 { Opt_uid, "uid=%s" },
190 { Opt_cruid, "cruid=%s" },
191 { Opt_gid, "gid=%s" },
192 { Opt_file_mode, "file_mode=%s" },
193 { Opt_dirmode, "dirmode=%s" },
194 { Opt_dirmode, "dir_mode=%s" },
195 { Opt_port, "port=%s" },
196 { Opt_rsize, "rsize=%s" },
197 { Opt_wsize, "wsize=%s" },
198 { Opt_actimeo, "actimeo=%s" },
199 { Opt_echo_interval, "echo_interval=%s" },
200 { Opt_max_credits, "max_credits=%s" },
201 { Opt_snapshot, "snapshot=%s" },
203 { Opt_blank_user, "user=" },
204 { Opt_blank_user, "username=" },
205 { Opt_user, "user=%s" },
206 { Opt_user, "username=%s" },
207 { Opt_blank_pass, "pass=" },
208 { Opt_blank_pass, "password=" },
209 { Opt_pass, "pass=%s" },
210 { Opt_pass, "password=%s" },
211 { Opt_blank_ip, "ip=" },
212 { Opt_blank_ip, "addr=" },
214 { Opt_ip, "addr=%s" },
215 { Opt_ignore, "unc=%s" },
216 { Opt_ignore, "target=%s" },
217 { Opt_ignore, "path=%s" },
218 { Opt_domain, "dom=%s" },
219 { Opt_domain, "domain=%s" },
220 { Opt_domain, "workgroup=%s" },
221 { Opt_srcaddr, "srcaddr=%s" },
222 { Opt_ignore, "prefixpath=%s" },
223 { Opt_iocharset, "iocharset=%s" },
224 { Opt_netbiosname, "netbiosname=%s" },
225 { Opt_servern, "servern=%s" },
226 { Opt_ver, "ver=%s" },
227 { Opt_vers, "vers=%s" },
228 { Opt_sec, "sec=%s" },
229 { Opt_cache, "cache=%s" },
231 { Opt_ignore, "cred" },
232 { Opt_ignore, "credentials" },
233 { Opt_ignore, "cred=%s" },
234 { Opt_ignore, "credentials=%s" },
235 { Opt_ignore, "guest" },
236 { Opt_ignore, "rw" },
237 { Opt_ignore, "ro" },
238 { Opt_ignore, "suid" },
239 { Opt_ignore, "nosuid" },
240 { Opt_ignore, "exec" },
241 { Opt_ignore, "noexec" },
242 { Opt_ignore, "nodev" },
243 { Opt_ignore, "noauto" },
244 { Opt_ignore, "dev" },
245 { Opt_ignore, "mand" },
246 { Opt_ignore, "nomand" },
247 { Opt_ignore, "_netdev" },
253 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
254 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
255 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
256 Opt_sec_ntlmv2i, Opt_sec_lanman,
262 static const match_table_t cifs_secflavor_tokens = {
263 { Opt_sec_krb5, "krb5" },
264 { Opt_sec_krb5i, "krb5i" },
265 { Opt_sec_krb5p, "krb5p" },
266 { Opt_sec_ntlmsspi, "ntlmsspi" },
267 { Opt_sec_ntlmssp, "ntlmssp" },
268 { Opt_ntlm, "ntlm" },
269 { Opt_sec_ntlmi, "ntlmi" },
270 { Opt_sec_ntlmv2, "nontlm" },
271 { Opt_sec_ntlmv2, "ntlmv2" },
272 { Opt_sec_ntlmv2i, "ntlmv2i" },
273 { Opt_sec_lanman, "lanman" },
274 { Opt_sec_none, "none" },
276 { Opt_sec_err, NULL }
287 static const match_table_t cifs_cacheflavor_tokens = {
288 { Opt_cache_loose, "loose" },
289 { Opt_cache_strict, "strict" },
290 { Opt_cache_none, "none" },
291 { Opt_cache_err, NULL }
294 static const match_table_t cifs_smb_version_tokens = {
295 { Smb_1, SMB1_VERSION_STRING },
296 { Smb_20, SMB20_VERSION_STRING},
297 { Smb_21, SMB21_VERSION_STRING },
298 { Smb_30, SMB30_VERSION_STRING },
299 { Smb_302, SMB302_VERSION_STRING },
300 #ifdef CONFIG_CIFS_SMB311
301 { Smb_311, SMB311_VERSION_STRING },
302 { Smb_311, ALT_SMB311_VERSION_STRING },
304 { Smb_version_err, NULL }
307 static int ip_connect(struct TCP_Server_Info *server);
308 static int generic_ip_connect(struct TCP_Server_Info *server);
309 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
310 static void cifs_prune_tlinks(struct work_struct *work);
311 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
312 const char *devname);
315 * cifs tcp session reconnection
317 * mark tcp session as reconnecting so temporarily locked
318 * mark all smb sessions as reconnecting for tcp session
319 * reconnect tcp session
320 * wake up waiters on reconnection? - (not needed currently)
323 cifs_reconnect(struct TCP_Server_Info *server)
326 struct list_head *tmp, *tmp2;
327 struct cifs_ses *ses;
328 struct cifs_tcon *tcon;
329 struct mid_q_entry *mid_entry;
330 struct list_head retry_list;
332 spin_lock(&GlobalMid_Lock);
333 if (server->tcpStatus == CifsExiting) {
334 /* the demux thread will exit normally
335 next time through the loop */
336 spin_unlock(&GlobalMid_Lock);
339 server->tcpStatus = CifsNeedReconnect;
340 spin_unlock(&GlobalMid_Lock);
342 server->max_read = 0;
344 cifs_dbg(FYI, "Reconnecting tcp session\n");
346 /* before reconnecting the tcp session, mark the smb session (uid)
347 and the tid bad so they are not used until reconnected */
348 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
350 spin_lock(&cifs_tcp_ses_lock);
351 list_for_each(tmp, &server->smb_ses_list) {
352 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
353 ses->need_reconnect = true;
355 list_for_each(tmp2, &ses->tcon_list) {
356 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
357 tcon->need_reconnect = true;
360 spin_unlock(&cifs_tcp_ses_lock);
362 /* do not want to be sending data on a socket we are freeing */
363 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
364 mutex_lock(&server->srv_mutex);
365 if (server->ssocket) {
366 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
367 server->ssocket->state, server->ssocket->flags);
368 kernel_sock_shutdown(server->ssocket, SHUT_WR);
369 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
370 server->ssocket->state, server->ssocket->flags);
371 sock_release(server->ssocket);
372 server->ssocket = NULL;
374 server->sequence_number = 0;
375 server->session_estab = false;
376 kfree(server->session_key.response);
377 server->session_key.response = NULL;
378 server->session_key.len = 0;
379 server->lstrp = jiffies;
381 /* mark submitted MIDs for retry and issue callback */
382 INIT_LIST_HEAD(&retry_list);
383 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
384 spin_lock(&GlobalMid_Lock);
385 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
386 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
387 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
388 mid_entry->mid_state = MID_RETRY_NEEDED;
389 list_move(&mid_entry->qhead, &retry_list);
391 spin_unlock(&GlobalMid_Lock);
392 mutex_unlock(&server->srv_mutex);
394 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
395 list_for_each_safe(tmp, tmp2, &retry_list) {
396 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
397 list_del_init(&mid_entry->qhead);
398 mid_entry->callback(mid_entry);
404 /* we should try only the port we connected to before */
405 mutex_lock(&server->srv_mutex);
406 rc = generic_ip_connect(server);
408 cifs_dbg(FYI, "reconnect error %d\n", rc);
409 mutex_unlock(&server->srv_mutex);
412 atomic_inc(&tcpSesReconnectCount);
413 spin_lock(&GlobalMid_Lock);
414 if (server->tcpStatus != CifsExiting)
415 server->tcpStatus = CifsNeedNegotiate;
416 spin_unlock(&GlobalMid_Lock);
417 mutex_unlock(&server->srv_mutex);
419 } while (server->tcpStatus == CifsNeedReconnect);
421 if (server->tcpStatus == CifsNeedNegotiate)
422 mod_delayed_work(cifsiod_wq, &server->echo, 0);
428 cifs_echo_request(struct work_struct *work)
431 struct TCP_Server_Info *server = container_of(work,
432 struct TCP_Server_Info, echo.work);
433 unsigned long echo_interval;
436 * If we need to renegotiate, set echo interval to zero to
437 * immediately call echo service where we can renegotiate.
439 if (server->tcpStatus == CifsNeedNegotiate)
442 echo_interval = server->echo_interval;
445 * We cannot send an echo if it is disabled.
446 * Also, no need to ping if we got a response recently.
449 if (server->tcpStatus == CifsNeedReconnect ||
450 server->tcpStatus == CifsExiting ||
451 server->tcpStatus == CifsNew ||
452 (server->ops->can_echo && !server->ops->can_echo(server)) ||
453 time_before(jiffies, server->lstrp + echo_interval - HZ))
456 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
458 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
462 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
466 allocate_buffers(struct TCP_Server_Info *server)
468 if (!server->bigbuf) {
469 server->bigbuf = (char *)cifs_buf_get();
470 if (!server->bigbuf) {
471 cifs_dbg(VFS, "No memory for large SMB response\n");
473 /* retry will check if exiting */
476 } else if (server->large_buf) {
477 /* we are reusing a dirty large buf, clear its start */
478 memset(server->bigbuf, 0, HEADER_SIZE(server));
481 if (!server->smallbuf) {
482 server->smallbuf = (char *)cifs_small_buf_get();
483 if (!server->smallbuf) {
484 cifs_dbg(VFS, "No memory for SMB response\n");
486 /* retry will check if exiting */
489 /* beginning of smb buffer is cleared in our buf_get */
491 /* if existing small buf clear beginning */
492 memset(server->smallbuf, 0, HEADER_SIZE(server));
499 server_unresponsive(struct TCP_Server_Info *server)
502 * We need to wait 2 echo intervals to make sure we handle such
504 * 1s client sends a normal SMB request
505 * 2s client gets a response
506 * 30s echo workqueue job pops, and decides we got a response recently
507 * and don't need to send another
509 * 65s kernel_recvmsg times out, and we see that we haven't gotten
510 * a response in >60s.
512 if ((server->tcpStatus == CifsGood ||
513 server->tcpStatus == CifsNeedNegotiate) &&
514 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
515 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
516 server->hostname, (2 * server->echo_interval) / HZ);
517 cifs_reconnect(server);
518 wake_up(&server->response_q);
526 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
531 smb_msg->msg_control = NULL;
532 smb_msg->msg_controllen = 0;
534 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
537 if (server_unresponsive(server))
538 return -ECONNABORTED;
540 length = sock_recvmsg(server->ssocket, smb_msg, 0);
542 if (server->tcpStatus == CifsExiting)
545 if (server->tcpStatus == CifsNeedReconnect) {
546 cifs_reconnect(server);
547 return -ECONNABORTED;
550 if (length == -ERESTARTSYS ||
554 * Minimum sleep to prevent looping, allowing socket
555 * to clear and app threads to set tcpStatus
556 * CifsNeedReconnect if server hung.
558 usleep_range(1000, 2000);
564 cifs_dbg(FYI, "Received no data or error: %d\n", length);
565 cifs_reconnect(server);
566 return -ECONNABORTED;
573 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
574 unsigned int to_read)
576 struct msghdr smb_msg;
577 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
578 iov_iter_kvec(&smb_msg.msg_iter, READ | ITER_KVEC, &iov, 1, to_read);
580 return cifs_readv_from_socket(server, &smb_msg);
584 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
585 unsigned int to_read)
587 struct msghdr smb_msg;
588 struct bio_vec bv = {.bv_page = page, .bv_len = to_read};
589 iov_iter_bvec(&smb_msg.msg_iter, READ | ITER_BVEC, &bv, 1, to_read);
590 return cifs_readv_from_socket(server, &smb_msg);
594 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
597 * The first byte big endian of the length field,
598 * is actually not part of the length but the type
599 * with the most common, zero, as regular data.
602 case RFC1002_SESSION_MESSAGE:
603 /* Regular SMB response */
605 case RFC1002_SESSION_KEEP_ALIVE:
606 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
608 case RFC1002_POSITIVE_SESSION_RESPONSE:
609 cifs_dbg(FYI, "RFC 1002 positive session response\n");
611 case RFC1002_NEGATIVE_SESSION_RESPONSE:
613 * We get this from Windows 98 instead of an error on
614 * SMB negprot response.
616 cifs_dbg(FYI, "RFC 1002 negative session response\n");
617 /* give server a second to clean up */
620 * Always try 445 first on reconnect since we get NACK
621 * on some if we ever connected to port 139 (the NACK
622 * is since we do not begin with RFC1001 session
625 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
626 cifs_reconnect(server);
627 wake_up(&server->response_q);
630 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
631 cifs_reconnect(server);
638 dequeue_mid(struct mid_q_entry *mid, bool malformed)
640 #ifdef CONFIG_CIFS_STATS2
641 mid->when_received = jiffies;
643 spin_lock(&GlobalMid_Lock);
645 mid->mid_state = MID_RESPONSE_RECEIVED;
647 mid->mid_state = MID_RESPONSE_MALFORMED;
648 list_del_init(&mid->qhead);
649 spin_unlock(&GlobalMid_Lock);
653 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
654 char *buf, int malformed)
656 if (server->ops->check_trans2 &&
657 server->ops->check_trans2(mid, server, buf, malformed))
660 mid->large_buf = server->large_buf;
661 /* Was previous buf put in mpx struct for multi-rsp? */
662 if (!mid->multiRsp) {
663 /* smb buffer will be freed by user thread */
664 if (server->large_buf)
665 server->bigbuf = NULL;
667 server->smallbuf = NULL;
669 dequeue_mid(mid, malformed);
672 static void clean_demultiplex_info(struct TCP_Server_Info *server)
676 /* take it off the list, if it's not already */
677 spin_lock(&cifs_tcp_ses_lock);
678 list_del_init(&server->tcp_ses_list);
679 spin_unlock(&cifs_tcp_ses_lock);
681 spin_lock(&GlobalMid_Lock);
682 server->tcpStatus = CifsExiting;
683 spin_unlock(&GlobalMid_Lock);
684 wake_up_all(&server->response_q);
686 /* check if we have blocked requests that need to free */
687 spin_lock(&server->req_lock);
688 if (server->credits <= 0)
690 spin_unlock(&server->req_lock);
692 * Although there should not be any requests blocked on this queue it
693 * can not hurt to be paranoid and try to wake up requests that may
694 * haven been blocked when more than 50 at time were on the wire to the
695 * same server - they now will see the session is in exit state and get
696 * out of SendReceive.
698 wake_up_all(&server->request_q);
699 /* give those requests time to exit */
702 if (server->ssocket) {
703 sock_release(server->ssocket);
704 server->ssocket = NULL;
707 if (!list_empty(&server->pending_mid_q)) {
708 struct list_head dispose_list;
709 struct mid_q_entry *mid_entry;
710 struct list_head *tmp, *tmp2;
712 INIT_LIST_HEAD(&dispose_list);
713 spin_lock(&GlobalMid_Lock);
714 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
715 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
716 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
717 mid_entry->mid_state = MID_SHUTDOWN;
718 list_move(&mid_entry->qhead, &dispose_list);
720 spin_unlock(&GlobalMid_Lock);
722 /* now walk dispose list and issue callbacks */
723 list_for_each_safe(tmp, tmp2, &dispose_list) {
724 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
725 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
726 list_del_init(&mid_entry->qhead);
727 mid_entry->callback(mid_entry);
729 /* 1/8th of sec is more than enough time for them to exit */
733 if (!list_empty(&server->pending_mid_q)) {
735 * mpx threads have not exited yet give them at least the smb
736 * send timeout time for long ops.
738 * Due to delays on oplock break requests, we need to wait at
739 * least 45 seconds before giving up on a request getting a
740 * response and going ahead and killing cifsd.
742 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
745 * If threads still have not exited they are probably never
746 * coming home not much else we can do but free the memory.
750 kfree(server->hostname);
753 length = atomic_dec_return(&tcpSesAllocCount);
755 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
759 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
762 char *buf = server->smallbuf;
763 unsigned int pdu_length = get_rfc1002_length(buf);
765 /* make sure this will fit in a large buffer */
766 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
767 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
768 cifs_reconnect(server);
769 wake_up(&server->response_q);
770 return -ECONNABORTED;
773 /* switch to large buffer if too big for a small one */
774 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
775 server->large_buf = true;
776 memcpy(server->bigbuf, buf, server->total_read);
777 buf = server->bigbuf;
780 /* now read the rest */
781 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
782 pdu_length - HEADER_SIZE(server) + 1 + 4);
785 server->total_read += length;
787 dump_smb(buf, server->total_read);
789 return cifs_handle_standard(server, mid);
793 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
795 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
799 * We know that we received enough to get to the MID as we
800 * checked the pdu_length earlier. Now check to see
801 * if the rest of the header is OK. We borrow the length
802 * var for the rest of the loop to avoid a new stack var.
804 * 48 bytes is enough to display the header and a little bit
805 * into the payload for debugging purposes.
807 length = server->ops->check_message(buf, server->total_read, server);
809 cifs_dump_mem("Bad SMB: ", buf,
810 min_t(unsigned int, server->total_read, 48));
812 if (server->ops->is_session_expired &&
813 server->ops->is_session_expired(buf)) {
814 cifs_reconnect(server);
815 wake_up(&server->response_q);
819 if (server->ops->is_status_pending &&
820 server->ops->is_status_pending(buf, server, length))
826 handle_mid(mid, server, buf, length);
831 cifs_demultiplex_thread(void *p)
834 struct TCP_Server_Info *server = p;
835 unsigned int pdu_length;
837 struct task_struct *task_to_wake = NULL;
838 struct mid_q_entry *mid_entry;
840 current->flags |= PF_MEMALLOC;
841 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
843 length = atomic_inc_return(&tcpSesAllocCount);
845 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
848 while (server->tcpStatus != CifsExiting) {
852 if (!allocate_buffers(server))
855 server->large_buf = false;
856 buf = server->smallbuf;
857 pdu_length = 4; /* enough to get RFC1001 header */
859 length = cifs_read_from_socket(server, buf, pdu_length);
862 server->total_read = length;
865 * The right amount was read from socket - 4 bytes,
866 * so we can now interpret the length field.
868 pdu_length = get_rfc1002_length(buf);
870 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
871 if (!is_smb_response(server, buf[0]))
874 /* make sure we have enough to get to the MID */
875 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
876 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
878 cifs_reconnect(server);
879 wake_up(&server->response_q);
883 /* read down to the MID */
884 length = cifs_read_from_socket(server, buf + 4,
885 HEADER_SIZE(server) - 1 - 4);
888 server->total_read += length;
890 if (server->ops->is_transform_hdr &&
891 server->ops->receive_transform &&
892 server->ops->is_transform_hdr(buf)) {
893 length = server->ops->receive_transform(server,
896 mid_entry = server->ops->find_mid(server, buf);
898 if (!mid_entry || !mid_entry->receive)
899 length = standard_receive3(server, mid_entry);
901 length = mid_entry->receive(server, mid_entry);
907 if (server->large_buf)
908 buf = server->bigbuf;
910 server->lstrp = jiffies;
911 if (mid_entry != NULL) {
912 if ((mid_entry->mid_flags & MID_WAIT_CANCELLED) &&
913 mid_entry->mid_state == MID_RESPONSE_RECEIVED &&
914 server->ops->handle_cancelled_mid)
915 server->ops->handle_cancelled_mid(
919 if (!mid_entry->multiRsp || mid_entry->multiEnd)
920 mid_entry->callback(mid_entry);
921 } else if (server->ops->is_oplock_break &&
922 server->ops->is_oplock_break(buf, server)) {
923 cifs_dbg(FYI, "Received oplock break\n");
925 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
926 atomic_read(&midCount));
927 cifs_dump_mem("Received Data is: ", buf,
928 HEADER_SIZE(server));
929 #ifdef CONFIG_CIFS_DEBUG2
930 if (server->ops->dump_detail)
931 server->ops->dump_detail(buf);
932 cifs_dump_mids(server);
933 #endif /* CIFS_DEBUG2 */
936 } /* end while !EXITING */
938 /* buffer usually freed in free_mid - need to free it here on exit */
939 cifs_buf_release(server->bigbuf);
940 if (server->smallbuf) /* no sense logging a debug message if NULL */
941 cifs_small_buf_release(server->smallbuf);
943 task_to_wake = xchg(&server->tsk, NULL);
944 clean_demultiplex_info(server);
946 /* if server->tsk was NULL then wait for a signal before exiting */
948 set_current_state(TASK_INTERRUPTIBLE);
949 while (!signal_pending(current)) {
951 set_current_state(TASK_INTERRUPTIBLE);
953 set_current_state(TASK_RUNNING);
956 module_put_and_exit(0);
959 /* extract the host portion of the UNC string */
961 extract_hostname(const char *unc)
967 /* skip double chars at beginning of string */
968 /* BB: check validity of these bytes? */
971 /* delimiter between hostname and sharename is always '\\' now */
972 delim = strchr(src, '\\');
974 return ERR_PTR(-EINVAL);
977 dst = kmalloc((len + 1), GFP_KERNEL);
979 return ERR_PTR(-ENOMEM);
981 memcpy(dst, src, len);
987 static int get_option_ul(substring_t args[], unsigned long *option)
992 string = match_strdup(args);
995 rc = kstrtoul(string, 0, option);
1001 static int get_option_uid(substring_t args[], kuid_t *result)
1003 unsigned long value;
1007 rc = get_option_ul(args, &value);
1011 uid = make_kuid(current_user_ns(), value);
1012 if (!uid_valid(uid))
1019 static int get_option_gid(substring_t args[], kgid_t *result)
1021 unsigned long value;
1025 rc = get_option_ul(args, &value);
1029 gid = make_kgid(current_user_ns(), value);
1030 if (!gid_valid(gid))
1037 static int cifs_parse_security_flavors(char *value,
1038 struct smb_vol *vol)
1041 substring_t args[MAX_OPT_ARGS];
1044 * With mount options, the last one should win. Reset any existing
1045 * settings back to default.
1047 vol->sectype = Unspecified;
1050 switch (match_token(value, cifs_secflavor_tokens, args)) {
1052 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1058 vol->sectype = Kerberos;
1060 case Opt_sec_ntlmsspi:
1063 case Opt_sec_ntlmssp:
1064 vol->sectype = RawNTLMSSP;
1070 vol->sectype = NTLM;
1072 case Opt_sec_ntlmv2i:
1075 case Opt_sec_ntlmv2:
1076 vol->sectype = NTLMv2;
1078 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1079 case Opt_sec_lanman:
1080 vol->sectype = LANMAN;
1087 cifs_dbg(VFS, "bad security option: %s\n", value);
1095 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1097 substring_t args[MAX_OPT_ARGS];
1099 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1100 case Opt_cache_loose:
1101 vol->direct_io = false;
1102 vol->strict_io = false;
1104 case Opt_cache_strict:
1105 vol->direct_io = false;
1106 vol->strict_io = true;
1108 case Opt_cache_none:
1109 vol->direct_io = true;
1110 vol->strict_io = false;
1113 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1120 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1122 substring_t args[MAX_OPT_ARGS];
1124 switch (match_token(value, cifs_smb_version_tokens, args)) {
1126 vol->ops = &smb1_operations;
1127 vol->vals = &smb1_values;
1130 vol->ops = &smb20_operations;
1131 vol->vals = &smb20_values;
1134 vol->ops = &smb21_operations;
1135 vol->vals = &smb21_values;
1138 vol->ops = &smb30_operations;
1139 vol->vals = &smb30_values;
1142 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1143 vol->vals = &smb302_values;
1145 #ifdef CONFIG_CIFS_SMB311
1147 vol->ops = &smb311_operations;
1148 vol->vals = &smb311_values;
1152 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1159 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1160 * fields with the result. Returns 0 on success and an error otherwise.
1163 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1166 const char *delims = "/\\";
1169 /* make sure we have a valid UNC double delimiter prefix */
1170 len = strspn(devname, delims);
1174 /* find delimiter between host and sharename */
1175 pos = strpbrk(devname + 2, delims);
1179 /* skip past delimiter */
1182 /* now go until next delimiter or end of string */
1183 len = strcspn(pos, delims);
1185 /* move "pos" up to delimiter or NULL */
1187 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1191 convert_delimiter(vol->UNC, '\\');
1193 /* skip any delimiter */
1194 if (*pos == '/' || *pos == '\\')
1197 /* If pos is NULL then no prepath */
1201 vol->prepath = kstrdup(pos, GFP_KERNEL);
1209 cifs_parse_mount_options(const char *mountdata, const char *devname,
1210 struct smb_vol *vol)
1213 char *mountdata_copy = NULL, *options;
1214 unsigned int temp_len, i, j;
1216 short int override_uid = -1;
1217 short int override_gid = -1;
1218 bool uid_specified = false;
1219 bool gid_specified = false;
1220 bool sloppy = false;
1221 char *invalid = NULL;
1222 char *nodename = utsname()->nodename;
1223 char *string = NULL;
1224 char *tmp_end, *value;
1226 bool got_ip = false;
1227 bool got_version = false;
1228 unsigned short port = 0;
1229 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1233 delim = separator[0];
1235 /* ensure we always start with zeroed-out smb_vol */
1236 memset(vol, 0, sizeof(*vol));
1239 * does not have to be perfect mapping since field is
1240 * informational, only used for servers that do not support
1241 * port 445 and it can be overridden at mount time
1243 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1244 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1245 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1247 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1248 /* null target name indicates to use *SMBSERVR default called name
1249 if we end up sending RFC1001 session initialize */
1250 vol->target_rfc1001_name[0] = 0;
1251 vol->cred_uid = current_uid();
1252 vol->linux_uid = current_uid();
1253 vol->linux_gid = current_gid();
1256 * default to SFM style remapping of seven reserved characters
1257 * unless user overrides it or we negotiate CIFS POSIX where
1258 * it is unnecessary. Can not simultaneously use more than one mapping
1259 * since then readdir could list files that open could not open
1263 /* default to only allowing write access to owner of the mount */
1264 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1266 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1267 /* default is always to request posix paths. */
1268 vol->posix_paths = 1;
1269 /* default to using server inode numbers where available */
1270 vol->server_ino = 1;
1272 /* default is to use strict cifs caching semantics */
1273 vol->strict_io = true;
1275 vol->actimeo = CIFS_DEF_ACTIMEO;
1277 /* FIXME: add autonegotiation for SMB3 or later rather than just SMB3 */
1278 vol->ops = &smb30_operations; /* both secure and accepted widely */
1279 vol->vals = &smb30_values;
1281 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1284 goto cifs_parse_mount_err;
1286 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1287 if (!mountdata_copy)
1288 goto cifs_parse_mount_err;
1290 options = mountdata_copy;
1291 end = options + strlen(options);
1293 if (strncmp(options, "sep=", 4) == 0) {
1294 if (options[4] != 0) {
1295 separator[0] = options[4];
1298 cifs_dbg(FYI, "Null separator not allowed\n");
1301 vol->backupuid_specified = false; /* no backup intent for a user */
1302 vol->backupgid_specified = false; /* no backup intent for a group */
1304 switch (cifs_parse_devname(devname, vol)) {
1308 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1309 goto cifs_parse_mount_err;
1311 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1312 goto cifs_parse_mount_err;
1314 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1315 goto cifs_parse_mount_err;
1318 while ((data = strsep(&options, separator)) != NULL) {
1319 substring_t args[MAX_OPT_ARGS];
1320 unsigned long option;
1326 token = match_token(data, cifs_mount_option_tokens, args);
1330 /* Ingnore the following */
1334 /* Boolean values */
1335 case Opt_user_xattr:
1338 case Opt_nouser_xattr:
1344 case Opt_noforceuid:
1350 case Opt_noforcegid:
1353 case Opt_noblocksend:
1354 vol->noblocksnd = 1;
1356 case Opt_noautotune:
1357 vol->noautotune = 1;
1372 vol->sfu_remap = true;
1373 vol->remap = false; /* disable SFM mapping */
1375 case Opt_nomapchars:
1376 vol->sfu_remap = false;
1380 vol->sfu_remap = false; /* disable SFU mapping */
1382 case Opt_nomapposix:
1394 case Opt_posixpaths:
1395 vol->posix_paths = 1;
1397 case Opt_noposixpaths:
1398 vol->posix_paths = 0;
1401 vol->no_linux_ext = 1;
1412 * turn off mandatory locking in mode
1413 * if remote locking is turned off since the
1414 * local vfs will do advisory
1416 if (vol->file_mode ==
1417 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1418 vol->file_mode = S_IALLUGO;
1420 case Opt_forcemandatorylock:
1429 case Opt_setuidfromacl:
1430 vol->setuidfromacl = 1;
1433 vol->dynperm = true;
1436 vol->dynperm = false;
1450 case Opt_nostrictsync:
1451 vol->nostrictsync = 1;
1453 case Opt_strictsync:
1454 vol->nostrictsync = 0;
1457 vol->server_ino = 1;
1459 case Opt_noserverino:
1460 vol->server_ino = 0;
1462 case Opt_rwpidforward:
1463 vol->rwpidforward = 1;
1472 vol->no_psx_acl = 0;
1475 vol->no_psx_acl = 1;
1477 case Opt_locallease:
1478 vol->local_lease = 1;
1484 /* we do not do the following in secFlags because seal
1485 * is a per tree connection (mount) not a per socket
1486 * or per-smb connection option in the protocol
1487 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1492 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1495 #ifndef CONFIG_CIFS_FSCACHE
1496 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1497 goto cifs_parse_mount_err;
1501 case Opt_mfsymlinks:
1502 vol->mfsymlinks = true;
1505 vol->multiuser = true;
1510 case Opt_nosharesock:
1511 vol->nosharesock = true;
1513 case Opt_nopersistent:
1514 vol->nopersistent = true;
1515 if (vol->persistent) {
1517 "persistenthandles mount options conflict\n");
1518 goto cifs_parse_mount_err;
1521 case Opt_persistent:
1522 vol->persistent = true;
1523 if ((vol->nopersistent) || (vol->resilient)) {
1525 "persistenthandles mount options conflict\n");
1526 goto cifs_parse_mount_err;
1530 vol->resilient = true;
1531 if (vol->persistent) {
1533 "persistenthandles mount options conflict\n");
1534 goto cifs_parse_mount_err;
1537 case Opt_noresilient:
1538 vol->resilient = false; /* already the default */
1540 case Opt_domainauto:
1541 vol->domainauto = true;
1544 /* Numeric Values */
1546 if (get_option_uid(args, &vol->backupuid)) {
1547 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1549 goto cifs_parse_mount_err;
1551 vol->backupuid_specified = true;
1554 if (get_option_gid(args, &vol->backupgid)) {
1555 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1557 goto cifs_parse_mount_err;
1559 vol->backupgid_specified = true;
1562 if (get_option_uid(args, &vol->linux_uid)) {
1563 cifs_dbg(VFS, "%s: Invalid uid value\n",
1565 goto cifs_parse_mount_err;
1567 uid_specified = true;
1570 if (get_option_uid(args, &vol->cred_uid)) {
1571 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1573 goto cifs_parse_mount_err;
1577 if (get_option_gid(args, &vol->linux_gid)) {
1578 cifs_dbg(VFS, "%s: Invalid gid value\n",
1580 goto cifs_parse_mount_err;
1582 gid_specified = true;
1585 if (get_option_ul(args, &option)) {
1586 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1588 goto cifs_parse_mount_err;
1590 vol->file_mode = option;
1593 if (get_option_ul(args, &option)) {
1594 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1596 goto cifs_parse_mount_err;
1598 vol->dir_mode = option;
1601 if (get_option_ul(args, &option) ||
1602 option > USHRT_MAX) {
1603 cifs_dbg(VFS, "%s: Invalid port value\n",
1605 goto cifs_parse_mount_err;
1607 port = (unsigned short)option;
1610 if (get_option_ul(args, &option)) {
1611 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1613 goto cifs_parse_mount_err;
1615 vol->rsize = option;
1618 if (get_option_ul(args, &option)) {
1619 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1621 goto cifs_parse_mount_err;
1623 vol->wsize = option;
1626 if (get_option_ul(args, &option)) {
1627 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1629 goto cifs_parse_mount_err;
1631 vol->actimeo = HZ * option;
1632 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1633 cifs_dbg(VFS, "attribute cache timeout too large\n");
1634 goto cifs_parse_mount_err;
1637 case Opt_echo_interval:
1638 if (get_option_ul(args, &option)) {
1639 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1641 goto cifs_parse_mount_err;
1643 vol->echo_interval = option;
1646 if (get_option_ul(args, &option)) {
1647 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1649 goto cifs_parse_mount_err;
1651 vol->snapshot_time = option;
1653 case Opt_max_credits:
1654 if (get_option_ul(args, &option) || (option < 20) ||
1656 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1658 goto cifs_parse_mount_err;
1660 vol->max_credits = option;
1663 /* String Arguments */
1665 case Opt_blank_user:
1666 /* null user, ie. anonymous authentication */
1668 vol->username = NULL;
1671 string = match_strdup(args);
1675 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1676 CIFS_MAX_USERNAME_LEN) {
1677 pr_warn("CIFS: username too long\n");
1678 goto cifs_parse_mount_err;
1681 kfree(vol->username);
1682 vol->username = kstrdup(string, GFP_KERNEL);
1684 goto cifs_parse_mount_err;
1686 case Opt_blank_pass:
1687 /* passwords have to be handled differently
1688 * to allow the character used for deliminator
1689 * to be passed within them
1693 * Check if this is a case where the password
1694 * starts with a delimiter
1696 tmp_end = strchr(data, '=');
1698 if (!(tmp_end < end && tmp_end[1] == delim)) {
1699 /* No it is not. Set the password to NULL */
1700 kfree(vol->password);
1701 vol->password = NULL;
1704 /* Yes it is. Drop down to Opt_pass below.*/
1706 /* Obtain the value string */
1707 value = strchr(data, '=');
1710 /* Set tmp_end to end of the string */
1711 tmp_end = (char *) value + strlen(value);
1713 /* Check if following character is the deliminator
1714 * If yes, we have encountered a double deliminator
1715 * reset the NULL character to the deliminator
1717 if (tmp_end < end && tmp_end[1] == delim) {
1720 /* Keep iterating until we get to a single
1721 * deliminator OR the end
1723 while ((tmp_end = strchr(tmp_end, delim))
1724 != NULL && (tmp_end[1] == delim)) {
1725 tmp_end = (char *) &tmp_end[2];
1728 /* Reset var options to point to next element */
1731 options = (char *) &tmp_end[1];
1733 /* Reached the end of the mount option
1738 kfree(vol->password);
1739 /* Now build new password string */
1740 temp_len = strlen(value);
1741 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1742 if (vol->password == NULL) {
1743 pr_warn("CIFS: no memory for password\n");
1744 goto cifs_parse_mount_err;
1747 for (i = 0, j = 0; i < temp_len; i++, j++) {
1748 vol->password[j] = value[i];
1749 if ((value[i] == delim) &&
1750 value[i+1] == delim)
1751 /* skip the second deliminator */
1754 vol->password[j] = '\0';
1757 /* FIXME: should this be an error instead? */
1761 string = match_strdup(args);
1765 if (!cifs_convert_address(dstaddr, string,
1767 pr_err("CIFS: bad ip= option (%s).\n", string);
1768 goto cifs_parse_mount_err;
1773 string = match_strdup(args);
1777 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1778 == CIFS_MAX_DOMAINNAME_LEN) {
1779 pr_warn("CIFS: domain name too long\n");
1780 goto cifs_parse_mount_err;
1783 kfree(vol->domainname);
1784 vol->domainname = kstrdup(string, GFP_KERNEL);
1785 if (!vol->domainname) {
1786 pr_warn("CIFS: no memory for domainname\n");
1787 goto cifs_parse_mount_err;
1789 cifs_dbg(FYI, "Domain name set\n");
1792 string = match_strdup(args);
1796 if (!cifs_convert_address(
1797 (struct sockaddr *)&vol->srcaddr,
1798 string, strlen(string))) {
1799 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1801 goto cifs_parse_mount_err;
1805 string = match_strdup(args);
1809 if (strnlen(string, 1024) >= 65) {
1810 pr_warn("CIFS: iocharset name too long.\n");
1811 goto cifs_parse_mount_err;
1814 if (strncasecmp(string, "default", 7) != 0) {
1815 kfree(vol->iocharset);
1816 vol->iocharset = kstrdup(string,
1818 if (!vol->iocharset) {
1819 pr_warn("CIFS: no memory for charset\n");
1820 goto cifs_parse_mount_err;
1823 /* if iocharset not set then load_nls_default
1826 cifs_dbg(FYI, "iocharset set to %s\n", string);
1828 case Opt_netbiosname:
1829 string = match_strdup(args);
1833 memset(vol->source_rfc1001_name, 0x20,
1836 * FIXME: are there cases in which a comma can
1837 * be valid in workstation netbios name (and
1838 * need special handling)?
1840 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1841 /* don't ucase netbiosname for user */
1844 vol->source_rfc1001_name[i] = string[i];
1846 /* The string has 16th byte zero still from
1847 * set at top of the function
1849 if (i == RFC1001_NAME_LEN && string[i] != 0)
1850 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1853 /* servernetbiosname specified override *SMBSERVER */
1854 string = match_strdup(args);
1858 /* last byte, type, is 0x20 for servr type */
1859 memset(vol->target_rfc1001_name, 0x20,
1860 RFC1001_NAME_LEN_WITH_NULL);
1862 /* BB are there cases in which a comma can be
1863 valid in this workstation netbios name
1864 (and need special handling)? */
1866 /* user or mount helper must uppercase the
1868 for (i = 0; i < 15; i++) {
1871 vol->target_rfc1001_name[i] = string[i];
1873 /* The string has 16th byte zero still from
1874 set at top of the function */
1875 if (i == RFC1001_NAME_LEN && string[i] != 0)
1876 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1879 /* version of mount userspace tools, not dialect */
1880 string = match_strdup(args);
1884 /* If interface changes in mount.cifs bump to new ver */
1885 if (strncasecmp(string, "1", 1) == 0) {
1886 if (strlen(string) > 1) {
1887 pr_warn("Bad mount helper ver=%s. Did "
1888 "you want SMB1 (CIFS) dialect "
1889 "and mean to type vers=1.0 "
1890 "instead?\n", string);
1891 goto cifs_parse_mount_err;
1893 /* This is the default */
1896 /* For all other value, error */
1897 pr_warn("CIFS: Invalid mount helper version specified\n");
1898 goto cifs_parse_mount_err;
1900 /* protocol version (dialect) */
1901 string = match_strdup(args);
1905 if (cifs_parse_smb_version(string, vol) != 0)
1906 goto cifs_parse_mount_err;
1910 string = match_strdup(args);
1914 if (cifs_parse_security_flavors(string, vol) != 0)
1915 goto cifs_parse_mount_err;
1918 string = match_strdup(args);
1922 if (cifs_parse_cache_flavor(string, vol) != 0)
1923 goto cifs_parse_mount_err;
1927 * An option we don't recognize. Save it off for later
1928 * if we haven't already found one
1934 /* Free up any allocated string */
1939 if (!sloppy && invalid) {
1940 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
1941 goto cifs_parse_mount_err;
1945 /* Muliuser mounts require CONFIG_KEYS support */
1946 if (vol->multiuser) {
1947 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1948 goto cifs_parse_mount_err;
1952 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
1953 goto cifs_parse_mount_err;
1956 /* make sure UNC has a share name */
1957 if (!strchr(vol->UNC + 3, '\\')) {
1958 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
1959 goto cifs_parse_mount_err;
1966 /* No ip= option specified? Try to get it from UNC */
1967 /* Use the address part of the UNC. */
1968 slash = strchr(&vol->UNC[2], '\\');
1969 len = slash - &vol->UNC[2];
1970 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
1971 pr_err("Unable to determine destination address.\n");
1972 goto cifs_parse_mount_err;
1976 /* set the port that we got earlier */
1977 cifs_set_port(dstaddr, port);
1980 vol->override_uid = override_uid;
1981 else if (override_uid == 1)
1982 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
1985 vol->override_gid = override_gid;
1986 else if (override_gid == 1)
1987 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
1989 if (got_version == false)
1990 pr_warn("No dialect specified on mount. Default has changed to "
1991 "a more secure dialect, SMB3 (vers=3.0), from CIFS "
1992 "(SMB1). To use the less secure SMB1 dialect to access "
1993 "old servers which do not support SMB3 specify vers=1.0"
1994 " on mount. For somewhat newer servers such as Windows "
1995 "7 try vers=2.1.\n");
1997 kfree(mountdata_copy);
2001 pr_warn("Could not allocate temporary buffer\n");
2002 cifs_parse_mount_err:
2004 kfree(mountdata_copy);
2008 /** Returns true if srcaddr isn't specified and rhs isn't
2009 * specified, or if srcaddr is specified and
2010 * matches the IP address of the rhs argument.
2013 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2015 switch (srcaddr->sa_family) {
2017 return (rhs->sa_family == AF_UNSPEC);
2019 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2020 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2021 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2024 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2025 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2026 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2030 return false; /* don't expect to be here */
2035 * If no port is specified in addr structure, we try to match with 445 port
2036 * and if it fails - with 139 ports. It should be called only if address
2037 * families of server and addr are equal.
2040 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2042 __be16 port, *sport;
2044 switch (addr->sa_family) {
2046 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2047 port = ((struct sockaddr_in *) addr)->sin_port;
2050 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2051 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2059 port = htons(CIFS_PORT);
2063 port = htons(RFC1001_PORT);
2066 return port == *sport;
2070 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2071 struct sockaddr *srcaddr)
2073 switch (addr->sa_family) {
2075 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2076 struct sockaddr_in *srv_addr4 =
2077 (struct sockaddr_in *)&server->dstaddr;
2079 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2084 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2085 struct sockaddr_in6 *srv_addr6 =
2086 (struct sockaddr_in6 *)&server->dstaddr;
2088 if (!ipv6_addr_equal(&addr6->sin6_addr,
2089 &srv_addr6->sin6_addr))
2091 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2097 return false; /* don't expect to be here */
2100 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2107 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2110 * The select_sectype function should either return the vol->sectype
2111 * that was specified, or "Unspecified" if that sectype was not
2112 * compatible with the given NEGOTIATE request.
2114 if (server->ops->select_sectype(server, vol->sectype)
2119 * Now check if signing mode is acceptable. No need to check
2120 * global_secflags at this point since if MUST_SIGN is set then
2121 * the server->sign had better be too.
2123 if (vol->sign && !server->sign)
2129 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2131 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2133 if (vol->nosharesock)
2136 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2139 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2142 if (!match_address(server, addr,
2143 (struct sockaddr *)&vol->srcaddr))
2146 if (!match_port(server, addr))
2149 if (!match_security(server, vol))
2152 if (server->echo_interval != vol->echo_interval * HZ)
2158 static struct TCP_Server_Info *
2159 cifs_find_tcp_session(struct smb_vol *vol)
2161 struct TCP_Server_Info *server;
2163 spin_lock(&cifs_tcp_ses_lock);
2164 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2165 if (!match_server(server, vol))
2168 ++server->srv_count;
2169 spin_unlock(&cifs_tcp_ses_lock);
2170 cifs_dbg(FYI, "Existing tcp session with server found\n");
2173 spin_unlock(&cifs_tcp_ses_lock);
2178 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2180 struct task_struct *task;
2182 spin_lock(&cifs_tcp_ses_lock);
2183 if (--server->srv_count > 0) {
2184 spin_unlock(&cifs_tcp_ses_lock);
2188 put_net(cifs_net_ns(server));
2190 list_del_init(&server->tcp_ses_list);
2191 spin_unlock(&cifs_tcp_ses_lock);
2193 cancel_delayed_work_sync(&server->echo);
2197 * Avoid deadlock here: reconnect work calls
2198 * cifs_put_tcp_session() at its end. Need to be sure
2199 * that reconnect work does nothing with server pointer after
2202 cancel_delayed_work(&server->reconnect);
2204 cancel_delayed_work_sync(&server->reconnect);
2206 spin_lock(&GlobalMid_Lock);
2207 server->tcpStatus = CifsExiting;
2208 spin_unlock(&GlobalMid_Lock);
2210 cifs_crypto_secmech_release(server);
2211 cifs_fscache_release_client_cookie(server);
2213 kfree(server->session_key.response);
2214 server->session_key.response = NULL;
2215 server->session_key.len = 0;
2217 task = xchg(&server->tsk, NULL);
2219 force_sig(SIGKILL, task);
2222 static struct TCP_Server_Info *
2223 cifs_get_tcp_session(struct smb_vol *volume_info)
2225 struct TCP_Server_Info *tcp_ses = NULL;
2228 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2230 /* see if we already have a matching tcp_ses */
2231 tcp_ses = cifs_find_tcp_session(volume_info);
2235 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2241 tcp_ses->ops = volume_info->ops;
2242 tcp_ses->vals = volume_info->vals;
2243 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2244 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2245 if (IS_ERR(tcp_ses->hostname)) {
2246 rc = PTR_ERR(tcp_ses->hostname);
2247 goto out_err_crypto_release;
2250 tcp_ses->noblocksnd = volume_info->noblocksnd;
2251 tcp_ses->noautotune = volume_info->noautotune;
2252 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2253 tcp_ses->in_flight = 0;
2254 tcp_ses->credits = 1;
2255 init_waitqueue_head(&tcp_ses->response_q);
2256 init_waitqueue_head(&tcp_ses->request_q);
2257 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2258 mutex_init(&tcp_ses->srv_mutex);
2259 memcpy(tcp_ses->workstation_RFC1001_name,
2260 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2261 memcpy(tcp_ses->server_RFC1001_name,
2262 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2263 tcp_ses->session_estab = false;
2264 tcp_ses->sequence_number = 0;
2265 tcp_ses->lstrp = jiffies;
2266 spin_lock_init(&tcp_ses->req_lock);
2267 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2268 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2269 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2270 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2271 mutex_init(&tcp_ses->reconnect_mutex);
2272 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2273 sizeof(tcp_ses->srcaddr));
2274 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2275 sizeof(tcp_ses->dstaddr));
2276 generate_random_uuid(tcp_ses->client_guid);
2278 * at this point we are the only ones with the pointer
2279 * to the struct since the kernel thread not created yet
2280 * no need to spinlock this init of tcpStatus or srv_count
2282 tcp_ses->tcpStatus = CifsNew;
2283 ++tcp_ses->srv_count;
2285 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2286 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2287 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2289 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2291 rc = ip_connect(tcp_ses);
2293 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2294 goto out_err_crypto_release;
2298 * since we're in a cifs function already, we know that
2299 * this will succeed. No need for try_module_get().
2301 __module_get(THIS_MODULE);
2302 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2304 if (IS_ERR(tcp_ses->tsk)) {
2305 rc = PTR_ERR(tcp_ses->tsk);
2306 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2307 module_put(THIS_MODULE);
2308 goto out_err_crypto_release;
2310 tcp_ses->tcpStatus = CifsNeedNegotiate;
2312 /* thread spawned, put it on the list */
2313 spin_lock(&cifs_tcp_ses_lock);
2314 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2315 spin_unlock(&cifs_tcp_ses_lock);
2317 cifs_fscache_get_client_cookie(tcp_ses);
2319 /* queue echo request delayed work */
2320 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2324 out_err_crypto_release:
2325 cifs_crypto_secmech_release(tcp_ses);
2327 put_net(cifs_net_ns(tcp_ses));
2331 if (!IS_ERR(tcp_ses->hostname))
2332 kfree(tcp_ses->hostname);
2333 if (tcp_ses->ssocket)
2334 sock_release(tcp_ses->ssocket);
2340 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2342 if (vol->sectype != Unspecified &&
2343 vol->sectype != ses->sectype)
2346 switch (ses->sectype) {
2348 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2352 /* NULL username means anonymous session */
2353 if (ses->user_name == NULL) {
2359 /* anything else takes username/password */
2360 if (strncmp(ses->user_name,
2361 vol->username ? vol->username : "",
2362 CIFS_MAX_USERNAME_LEN))
2364 if ((vol->username && strlen(vol->username) != 0) &&
2365 ses->password != NULL &&
2366 strncmp(ses->password,
2367 vol->password ? vol->password : "",
2368 CIFS_MAX_PASSWORD_LEN))
2374 static struct cifs_ses *
2375 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2377 struct cifs_ses *ses;
2379 spin_lock(&cifs_tcp_ses_lock);
2380 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2381 if (ses->status == CifsExiting)
2383 if (!match_session(ses, vol))
2386 spin_unlock(&cifs_tcp_ses_lock);
2389 spin_unlock(&cifs_tcp_ses_lock);
2394 cifs_put_smb_ses(struct cifs_ses *ses)
2396 unsigned int rc, xid;
2397 struct TCP_Server_Info *server = ses->server;
2399 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2401 spin_lock(&cifs_tcp_ses_lock);
2402 if (ses->status == CifsExiting) {
2403 spin_unlock(&cifs_tcp_ses_lock);
2406 if (--ses->ses_count > 0) {
2407 spin_unlock(&cifs_tcp_ses_lock);
2410 if (ses->status == CifsGood)
2411 ses->status = CifsExiting;
2412 spin_unlock(&cifs_tcp_ses_lock);
2414 if (ses->status == CifsExiting && server->ops->logoff) {
2416 rc = server->ops->logoff(xid, ses);
2418 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2423 spin_lock(&cifs_tcp_ses_lock);
2424 list_del_init(&ses->smb_ses_list);
2425 spin_unlock(&cifs_tcp_ses_lock);
2428 cifs_put_tcp_session(server, 0);
2433 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2434 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2436 /* Populate username and pw fields from keyring if possible */
2438 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2441 const char *delim, *payload;
2445 struct TCP_Server_Info *server = ses->server;
2446 struct sockaddr_in *sa;
2447 struct sockaddr_in6 *sa6;
2448 const struct user_key_payload *upayload;
2450 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2454 /* try to find an address key first */
2455 switch (server->dstaddr.ss_family) {
2457 sa = (struct sockaddr_in *)&server->dstaddr;
2458 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2461 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2462 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2465 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2466 server->dstaddr.ss_family);
2471 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2472 key = request_key(&key_type_logon, desc, "");
2474 if (!ses->domainName) {
2475 cifs_dbg(FYI, "domainName is NULL\n");
2480 /* didn't work, try to find a domain key */
2481 sprintf(desc, "cifs:d:%s", ses->domainName);
2482 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2483 key = request_key(&key_type_logon, desc, "");
2490 down_read(&key->sem);
2491 upayload = user_key_payload_locked(key);
2492 if (IS_ERR_OR_NULL(upayload)) {
2493 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2497 /* find first : in payload */
2498 payload = upayload->data;
2499 delim = strnchr(payload, upayload->datalen, ':');
2500 cifs_dbg(FYI, "payload=%s\n", payload);
2502 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2508 len = delim - payload;
2509 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2510 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2516 vol->username = kstrndup(payload, len, GFP_KERNEL);
2517 if (!vol->username) {
2518 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2523 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2525 len = key->datalen - (len + 1);
2526 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2527 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2529 kfree(vol->username);
2530 vol->username = NULL;
2535 vol->password = kstrndup(delim, len, GFP_KERNEL);
2536 if (!vol->password) {
2537 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2540 kfree(vol->username);
2541 vol->username = NULL;
2550 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2553 #else /* ! CONFIG_KEYS */
2555 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2556 struct cifs_ses *ses __attribute__((unused)))
2560 #endif /* CONFIG_KEYS */
2562 static struct cifs_ses *
2563 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2567 struct cifs_ses *ses;
2568 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2569 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2573 ses = cifs_find_smb_ses(server, volume_info);
2575 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2578 mutex_lock(&ses->session_mutex);
2579 rc = cifs_negotiate_protocol(xid, ses);
2581 mutex_unlock(&ses->session_mutex);
2582 /* problem -- put our ses reference */
2583 cifs_put_smb_ses(ses);
2587 if (ses->need_reconnect) {
2588 cifs_dbg(FYI, "Session needs reconnect\n");
2589 rc = cifs_setup_session(xid, ses,
2590 volume_info->local_nls);
2592 mutex_unlock(&ses->session_mutex);
2593 /* problem -- put our reference */
2594 cifs_put_smb_ses(ses);
2599 mutex_unlock(&ses->session_mutex);
2601 /* existing SMB ses has a server reference already */
2602 cifs_put_tcp_session(server, 0);
2607 cifs_dbg(FYI, "Existing smb sess not found\n");
2608 ses = sesInfoAlloc();
2612 /* new SMB session uses our server ref */
2613 ses->server = server;
2614 if (server->dstaddr.ss_family == AF_INET6)
2615 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2617 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2619 if (volume_info->username) {
2620 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2621 if (!ses->user_name)
2625 /* volume_info->password freed at unmount */
2626 if (volume_info->password) {
2627 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2631 if (volume_info->domainname) {
2632 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2633 if (!ses->domainName)
2636 if (volume_info->domainauto)
2637 ses->domainAuto = volume_info->domainauto;
2638 ses->cred_uid = volume_info->cred_uid;
2639 ses->linux_uid = volume_info->linux_uid;
2641 ses->sectype = volume_info->sectype;
2642 ses->sign = volume_info->sign;
2644 mutex_lock(&ses->session_mutex);
2645 rc = cifs_negotiate_protocol(xid, ses);
2647 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2648 mutex_unlock(&ses->session_mutex);
2652 /* success, put it on the list */
2653 spin_lock(&cifs_tcp_ses_lock);
2654 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2655 spin_unlock(&cifs_tcp_ses_lock);
2666 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
2668 if (tcon->tidStatus == CifsExiting)
2670 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
2672 if (tcon->seal != volume_info->seal)
2674 if (tcon->snapshot_time != volume_info->snapshot_time)
2679 static struct cifs_tcon *
2680 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2682 struct list_head *tmp;
2683 struct cifs_tcon *tcon;
2685 spin_lock(&cifs_tcp_ses_lock);
2686 list_for_each(tmp, &ses->tcon_list) {
2687 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2688 if (!match_tcon(tcon, volume_info))
2691 spin_unlock(&cifs_tcp_ses_lock);
2694 spin_unlock(&cifs_tcp_ses_lock);
2699 cifs_put_tcon(struct cifs_tcon *tcon)
2702 struct cifs_ses *ses = tcon->ses;
2704 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2705 spin_lock(&cifs_tcp_ses_lock);
2706 if (--tcon->tc_count > 0) {
2707 spin_unlock(&cifs_tcp_ses_lock);
2711 list_del_init(&tcon->tcon_list);
2712 spin_unlock(&cifs_tcp_ses_lock);
2715 if (ses->server->ops->tree_disconnect)
2716 ses->server->ops->tree_disconnect(xid, tcon);
2719 cifs_fscache_release_super_cookie(tcon);
2721 cifs_put_smb_ses(ses);
2724 static struct cifs_tcon *
2725 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2728 struct cifs_tcon *tcon;
2730 tcon = cifs_find_tcon(ses, volume_info);
2732 cifs_dbg(FYI, "Found match on UNC path\n");
2733 /* existing tcon already has a reference */
2734 cifs_put_smb_ses(ses);
2738 if (!ses->server->ops->tree_connect) {
2743 tcon = tconInfoAlloc();
2749 if (volume_info->snapshot_time) {
2750 if (ses->server->vals->protocol_id == 0) {
2752 "Use SMB2 or later for snapshot mount option\n");
2756 tcon->snapshot_time = volume_info->snapshot_time;
2760 if (volume_info->password) {
2761 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2762 if (!tcon->password) {
2769 * BB Do we need to wrap session_mutex around this TCon call and Unix
2770 * SetFS as we do on SessSetup and reconnect?
2773 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2774 volume_info->local_nls);
2776 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2780 if (volume_info->nodfs) {
2781 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2782 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
2784 tcon->use_persistent = false;
2785 /* check if SMB2 or later, CIFS does not support persistent handles */
2786 if (volume_info->persistent) {
2787 if (ses->server->vals->protocol_id == 0) {
2789 "SMB3 or later required for persistent handles\n");
2792 } else if (ses->server->capabilities &
2793 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2794 tcon->use_persistent = true;
2795 else /* persistent handles requested but not supported */ {
2797 "Persistent handles not supported on share\n");
2801 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2802 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2803 && (volume_info->nopersistent == false)) {
2804 cifs_dbg(FYI, "enabling persistent handles\n");
2805 tcon->use_persistent = true;
2806 } else if (volume_info->resilient) {
2807 if (ses->server->vals->protocol_id == 0) {
2809 "SMB2.1 or later required for resilient handles\n");
2813 tcon->use_resilient = true;
2816 if (volume_info->seal) {
2817 if (ses->server->vals->protocol_id == 0) {
2819 "SMB3 or later required for encryption\n");
2822 } else if (tcon->ses->server->capabilities &
2823 SMB2_GLOBAL_CAP_ENCRYPTION)
2826 cifs_dbg(VFS, "Encryption is not supported on share\n");
2833 * We can have only one retry value for a connection to a share so for
2834 * resources mounted more than once to the same server share the last
2835 * value passed in for the retry flag is used.
2837 tcon->retry = volume_info->retry;
2838 tcon->nocase = volume_info->nocase;
2839 tcon->local_lease = volume_info->local_lease;
2840 INIT_LIST_HEAD(&tcon->pending_opens);
2842 spin_lock(&cifs_tcp_ses_lock);
2843 list_add(&tcon->tcon_list, &ses->tcon_list);
2844 spin_unlock(&cifs_tcp_ses_lock);
2846 cifs_fscache_get_super_cookie(tcon);
2856 cifs_put_tlink(struct tcon_link *tlink)
2858 if (!tlink || IS_ERR(tlink))
2861 if (!atomic_dec_and_test(&tlink->tl_count) ||
2862 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2863 tlink->tl_time = jiffies;
2867 if (!IS_ERR(tlink_tcon(tlink)))
2868 cifs_put_tcon(tlink_tcon(tlink));
2873 static inline struct tcon_link *
2874 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2876 return cifs_sb->master_tlink;
2880 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2882 struct cifs_sb_info *old = CIFS_SB(sb);
2883 struct cifs_sb_info *new = mnt_data->cifs_sb;
2885 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2888 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2889 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2893 * We want to share sb only if we don't specify an r/wsize or
2894 * specified r/wsize is greater than or equal to existing one.
2896 if (new->wsize && new->wsize < old->wsize)
2899 if (new->rsize && new->rsize < old->rsize)
2902 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
2905 if (old->mnt_file_mode != new->mnt_file_mode ||
2906 old->mnt_dir_mode != new->mnt_dir_mode)
2909 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2912 if (old->actimeo != new->actimeo)
2919 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2921 struct cifs_sb_info *old = CIFS_SB(sb);
2922 struct cifs_sb_info *new = mnt_data->cifs_sb;
2923 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
2924 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
2926 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2928 else if (!old_set && !new_set)
2935 cifs_match_super(struct super_block *sb, void *data)
2937 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2938 struct smb_vol *volume_info;
2939 struct cifs_sb_info *cifs_sb;
2940 struct TCP_Server_Info *tcp_srv;
2941 struct cifs_ses *ses;
2942 struct cifs_tcon *tcon;
2943 struct tcon_link *tlink;
2946 spin_lock(&cifs_tcp_ses_lock);
2947 cifs_sb = CIFS_SB(sb);
2948 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2949 if (IS_ERR(tlink)) {
2950 spin_unlock(&cifs_tcp_ses_lock);
2953 tcon = tlink_tcon(tlink);
2955 tcp_srv = ses->server;
2957 volume_info = mnt_data->vol;
2959 if (!match_server(tcp_srv, volume_info) ||
2960 !match_session(ses, volume_info) ||
2961 !match_tcon(tcon, volume_info) ||
2962 !match_prepath(sb, mnt_data)) {
2967 rc = compare_mount_options(sb, mnt_data);
2969 spin_unlock(&cifs_tcp_ses_lock);
2970 cifs_put_tlink(tlink);
2975 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2976 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2977 struct dfs_info3_param **referrals, int remap)
2982 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2988 if (ses->ipc_tid == 0) {
2989 temp_unc = kmalloc(2 /* for slashes */ +
2990 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2991 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2992 if (temp_unc == NULL)
2996 strcpy(temp_unc + 2, ses->serverName);
2997 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2998 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
3000 cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
3004 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
3005 referrals, num_referrals,
3006 nls_codepage, remap);
3008 * BB - map targetUNCs to dfs_info3 structures, here or in
3009 * ses->server->ops->get_dfs_refer.
3015 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3016 static struct lock_class_key cifs_key[2];
3017 static struct lock_class_key cifs_slock_key[2];
3020 cifs_reclassify_socket4(struct socket *sock)
3022 struct sock *sk = sock->sk;
3023 BUG_ON(!sock_allow_reclassification(sk));
3024 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3025 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3029 cifs_reclassify_socket6(struct socket *sock)
3031 struct sock *sk = sock->sk;
3032 BUG_ON(!sock_allow_reclassification(sk));
3033 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3034 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3038 cifs_reclassify_socket4(struct socket *sock)
3043 cifs_reclassify_socket6(struct socket *sock)
3048 /* See RFC1001 section 14 on representation of Netbios names */
3049 static void rfc1002mangle(char *target, char *source, unsigned int length)
3053 for (i = 0, j = 0; i < (length); i++) {
3054 /* mask a nibble at a time and encode */
3055 target[j] = 'A' + (0x0F & (source[i] >> 4));
3056 target[j+1] = 'A' + (0x0F & source[i]);
3063 bind_socket(struct TCP_Server_Info *server)
3066 if (server->srcaddr.ss_family != AF_UNSPEC) {
3067 /* Bind to the specified local IP address */
3068 struct socket *socket = server->ssocket;
3069 rc = socket->ops->bind(socket,
3070 (struct sockaddr *) &server->srcaddr,
3071 sizeof(server->srcaddr));
3073 struct sockaddr_in *saddr4;
3074 struct sockaddr_in6 *saddr6;
3075 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3076 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3077 if (saddr6->sin6_family == AF_INET6)
3078 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3079 &saddr6->sin6_addr, rc);
3081 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3082 &saddr4->sin_addr.s_addr, rc);
3089 ip_rfc1001_connect(struct TCP_Server_Info *server)
3093 * some servers require RFC1001 sessinit before sending
3094 * negprot - BB check reconnection in case where second
3095 * sessinit is sent but no second negprot
3097 struct rfc1002_session_packet *ses_init_buf;
3098 struct smb_hdr *smb_buf;
3099 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3102 ses_init_buf->trailer.session_req.called_len = 32;
3104 if (server->server_RFC1001_name[0] != 0)
3105 rfc1002mangle(ses_init_buf->trailer.
3106 session_req.called_name,
3107 server->server_RFC1001_name,
3108 RFC1001_NAME_LEN_WITH_NULL);
3110 rfc1002mangle(ses_init_buf->trailer.
3111 session_req.called_name,
3112 DEFAULT_CIFS_CALLED_NAME,
3113 RFC1001_NAME_LEN_WITH_NULL);
3115 ses_init_buf->trailer.session_req.calling_len = 32;
3118 * calling name ends in null (byte 16) from old smb
3121 if (server->workstation_RFC1001_name[0] != 0)
3122 rfc1002mangle(ses_init_buf->trailer.
3123 session_req.calling_name,
3124 server->workstation_RFC1001_name,
3125 RFC1001_NAME_LEN_WITH_NULL);
3127 rfc1002mangle(ses_init_buf->trailer.
3128 session_req.calling_name,
3130 RFC1001_NAME_LEN_WITH_NULL);
3132 ses_init_buf->trailer.session_req.scope1 = 0;
3133 ses_init_buf->trailer.session_req.scope2 = 0;
3134 smb_buf = (struct smb_hdr *)ses_init_buf;
3136 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3137 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3138 rc = smb_send(server, smb_buf, 0x44);
3139 kfree(ses_init_buf);
3141 * RFC1001 layer in at least one server
3142 * requires very short break before negprot
3143 * presumably because not expecting negprot
3144 * to follow so fast. This is a simple
3145 * solution that works without
3146 * complicating the code and causes no
3147 * significant slowing down on mount
3150 usleep_range(1000, 2000);
3153 * else the negprot may still work without this
3154 * even though malloc failed
3161 generic_ip_connect(struct TCP_Server_Info *server)
3166 struct socket *socket = server->ssocket;
3167 struct sockaddr *saddr;
3169 saddr = (struct sockaddr *) &server->dstaddr;
3171 if (server->dstaddr.ss_family == AF_INET6) {
3172 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3173 slen = sizeof(struct sockaddr_in6);
3176 sport = ((struct sockaddr_in *) saddr)->sin_port;
3177 slen = sizeof(struct sockaddr_in);
3181 if (socket == NULL) {
3182 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3183 IPPROTO_TCP, &socket, 1);
3185 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3186 server->ssocket = NULL;
3190 /* BB other socket options to set KEEPALIVE, NODELAY? */
3191 cifs_dbg(FYI, "Socket created\n");
3192 server->ssocket = socket;
3193 socket->sk->sk_allocation = GFP_NOFS;
3194 if (sfamily == AF_INET6)
3195 cifs_reclassify_socket6(socket);
3197 cifs_reclassify_socket4(socket);
3200 rc = bind_socket(server);
3205 * Eventually check for other socket options to change from
3206 * the default. sock_setsockopt not used because it expects
3209 socket->sk->sk_rcvtimeo = 7 * HZ;
3210 socket->sk->sk_sndtimeo = 5 * HZ;
3212 /* make the bufsizes depend on wsize/rsize and max requests */
3213 if (server->noautotune) {
3214 if (socket->sk->sk_sndbuf < (200 * 1024))
3215 socket->sk->sk_sndbuf = 200 * 1024;
3216 if (socket->sk->sk_rcvbuf < (140 * 1024))
3217 socket->sk->sk_rcvbuf = 140 * 1024;
3220 if (server->tcp_nodelay) {
3222 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3223 (char *)&val, sizeof(val));
3225 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3229 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3230 socket->sk->sk_sndbuf,
3231 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3233 rc = socket->ops->connect(socket, saddr, slen, 0);
3235 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3236 sock_release(socket);
3237 server->ssocket = NULL;
3241 if (sport == htons(RFC1001_PORT))
3242 rc = ip_rfc1001_connect(server);
3248 ip_connect(struct TCP_Server_Info *server)
3251 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3252 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3254 if (server->dstaddr.ss_family == AF_INET6)
3255 sport = &addr6->sin6_port;
3257 sport = &addr->sin_port;
3262 /* try with 445 port at first */
3263 *sport = htons(CIFS_PORT);
3265 rc = generic_ip_connect(server);
3269 /* if it failed, try with 139 port */
3270 *sport = htons(RFC1001_PORT);
3273 return generic_ip_connect(server);
3276 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3277 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3279 /* if we are reconnecting then should we check to see if
3280 * any requested capabilities changed locally e.g. via
3281 * remount but we can not do much about it here
3282 * if they have (even if we could detect it by the following)
3283 * Perhaps we could add a backpointer to array of sb from tcon
3284 * or if we change to make all sb to same share the same
3285 * sb as NFS - then we only have one backpointer to sb.
3286 * What if we wanted to mount the server share twice once with
3287 * and once without posixacls or posix paths? */
3288 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3290 if (vol_info && vol_info->no_linux_ext) {
3291 tcon->fsUnixInfo.Capability = 0;
3292 tcon->unix_ext = 0; /* Unix Extensions disabled */
3293 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3295 } else if (vol_info)
3296 tcon->unix_ext = 1; /* Unix Extensions supported */
3298 if (tcon->unix_ext == 0) {
3299 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3303 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3304 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3305 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3306 /* check for reconnect case in which we do not
3307 want to change the mount behavior if we can avoid it */
3308 if (vol_info == NULL) {
3309 /* turn off POSIX ACL and PATHNAMES if not set
3310 originally at mount time */
3311 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3312 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3313 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3314 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3315 cifs_dbg(VFS, "POSIXPATH support change\n");
3316 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3317 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3318 cifs_dbg(VFS, "possible reconnect error\n");
3319 cifs_dbg(VFS, "server disabled POSIX path support\n");
3323 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3324 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3326 cap &= CIFS_UNIX_CAP_MASK;
3327 if (vol_info && vol_info->no_psx_acl)
3328 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3329 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3330 cifs_dbg(FYI, "negotiated posix acl support\n");
3332 cifs_sb->mnt_cifs_flags |=
3333 CIFS_MOUNT_POSIXACL;
3336 if (vol_info && vol_info->posix_paths == 0)
3337 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3338 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3339 cifs_dbg(FYI, "negotiate posix pathnames\n");
3341 cifs_sb->mnt_cifs_flags |=
3342 CIFS_MOUNT_POSIX_PATHS;
3345 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3346 #ifdef CONFIG_CIFS_DEBUG2
3347 if (cap & CIFS_UNIX_FCNTL_CAP)
3348 cifs_dbg(FYI, "FCNTL cap\n");
3349 if (cap & CIFS_UNIX_EXTATTR_CAP)
3350 cifs_dbg(FYI, "EXTATTR cap\n");
3351 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3352 cifs_dbg(FYI, "POSIX path cap\n");
3353 if (cap & CIFS_UNIX_XATTR_CAP)
3354 cifs_dbg(FYI, "XATTR cap\n");
3355 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3356 cifs_dbg(FYI, "POSIX ACL cap\n");
3357 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3358 cifs_dbg(FYI, "very large read cap\n");
3359 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3360 cifs_dbg(FYI, "very large write cap\n");
3361 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3362 cifs_dbg(FYI, "transport encryption cap\n");
3363 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3364 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3365 #endif /* CIFS_DEBUG2 */
3366 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3367 if (vol_info == NULL) {
3368 cifs_dbg(FYI, "resetting capabilities failed\n");
3370 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");
3376 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3377 struct cifs_sb_info *cifs_sb)
3379 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3381 spin_lock_init(&cifs_sb->tlink_tree_lock);
3382 cifs_sb->tlink_tree = RB_ROOT;
3385 * Temporarily set r/wsize for matching superblock. If we end up using
3386 * new sb then client will later negotiate it downward if needed.
3388 cifs_sb->rsize = pvolume_info->rsize;
3389 cifs_sb->wsize = pvolume_info->wsize;
3391 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3392 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3393 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3394 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3395 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3396 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3398 cifs_sb->actimeo = pvolume_info->actimeo;
3399 cifs_sb->local_nls = pvolume_info->local_nls;
3401 if (pvolume_info->noperm)
3402 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3403 if (pvolume_info->setuids)
3404 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3405 if (pvolume_info->setuidfromacl)
3406 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3407 if (pvolume_info->server_ino)
3408 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3409 if (pvolume_info->remap)
3410 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3411 if (pvolume_info->sfu_remap)
3412 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3413 if (pvolume_info->no_xattr)
3414 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3415 if (pvolume_info->sfu_emul)
3416 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3417 if (pvolume_info->nobrl)
3418 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3419 if (pvolume_info->nostrictsync)
3420 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3421 if (pvolume_info->mand_lock)
3422 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3423 if (pvolume_info->rwpidforward)
3424 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3425 if (pvolume_info->cifs_acl)
3426 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3427 if (pvolume_info->backupuid_specified) {
3428 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3429 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3431 if (pvolume_info->backupgid_specified) {
3432 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3433 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3435 if (pvolume_info->override_uid)
3436 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3437 if (pvolume_info->override_gid)
3438 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3439 if (pvolume_info->dynperm)
3440 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3441 if (pvolume_info->fsc)
3442 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3443 if (pvolume_info->multiuser)
3444 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3445 CIFS_MOUNT_NO_PERM);
3446 if (pvolume_info->strict_io)
3447 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3448 if (pvolume_info->direct_io) {
3449 cifs_dbg(FYI, "mounting share using direct i/o\n");
3450 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3452 if (pvolume_info->mfsymlinks) {
3453 if (pvolume_info->sfu_emul) {
3455 * Our SFU ("Services for Unix" emulation does not allow
3456 * creating symlinks but does allow reading existing SFU
3457 * symlinks (it does allow both creating and reading SFU
3458 * style mknod and FIFOs though). When "mfsymlinks" and
3459 * "sfu" are both enabled at the same time, it allows
3460 * reading both types of symlinks, but will only create
3461 * them with mfsymlinks format. This allows better
3462 * Apple compatibility (probably better for Samba too)
3463 * while still recognizing old Windows style symlinks.
3465 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3467 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3470 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3471 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3473 if (pvolume_info->prepath) {
3474 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3475 if (cifs_sb->prepath == NULL)
3483 cleanup_volume_info_contents(struct smb_vol *volume_info)
3485 kfree(volume_info->username);
3486 kzfree(volume_info->password);
3487 kfree(volume_info->UNC);
3488 kfree(volume_info->domainname);
3489 kfree(volume_info->iocharset);
3490 kfree(volume_info->prepath);
3494 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3498 cleanup_volume_info_contents(volume_info);
3503 #ifdef CONFIG_CIFS_DFS_UPCALL
3505 * cifs_build_path_to_root returns full path to root when we do not have an
3506 * exiting connection (tcon)
3509 build_unc_path_to_root(const struct smb_vol *vol,
3510 const struct cifs_sb_info *cifs_sb)
3512 char *full_path, *pos;
3513 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3514 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3516 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3517 if (full_path == NULL)
3518 return ERR_PTR(-ENOMEM);
3520 strncpy(full_path, vol->UNC, unc_len);
3521 pos = full_path + unc_len;
3524 *pos = CIFS_DIR_SEP(cifs_sb);
3525 strncpy(pos + 1, vol->prepath, pplen);
3529 *pos = '\0'; /* add trailing null */
3530 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3531 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3536 * Perform a dfs referral query for a share and (optionally) prefix
3538 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3539 * to a string containing updated options for the submount. Otherwise it
3540 * will be left untouched.
3542 * Returns the rc from get_dfs_path to the caller, which can be used to
3543 * determine whether there were referrals.
3546 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3547 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3551 unsigned int num_referrals = 0;
3552 struct dfs_info3_param *referrals = NULL;
3553 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3555 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3556 if (IS_ERR(full_path))
3557 return PTR_ERR(full_path);
3559 /* For DFS paths, skip the first '\' of the UNC */
3560 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3562 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3563 &num_referrals, &referrals, cifs_remap(cifs_sb));
3565 if (!rc && num_referrals > 0) {
3566 char *fake_devname = NULL;
3568 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3569 full_path + 1, referrals,
3572 free_dfs_info_array(referrals, num_referrals);
3574 if (IS_ERR(mdata)) {
3575 rc = PTR_ERR(mdata);
3578 cleanup_volume_info_contents(volume_info);
3579 rc = cifs_setup_volume_info(volume_info, mdata,
3582 kfree(fake_devname);
3583 kfree(cifs_sb->mountdata);
3584 cifs_sb->mountdata = mdata;
3592 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3593 const char *devname)
3597 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3600 if (volume_info->nullauth) {
3601 cifs_dbg(FYI, "Anonymous login\n");
3602 kfree(volume_info->username);
3603 volume_info->username = NULL;
3604 } else if (volume_info->username) {
3605 /* BB fixme parse for domain name here */
3606 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3608 cifs_dbg(VFS, "No username specified\n");
3609 /* In userspace mount helper we can get user name from alternate
3610 locations such as env variables and files on disk */
3614 /* this is needed for ASCII cp to Unicode converts */
3615 if (volume_info->iocharset == NULL) {
3616 /* load_nls_default cannot return null */
3617 volume_info->local_nls = load_nls_default();
3619 volume_info->local_nls = load_nls(volume_info->iocharset);
3620 if (volume_info->local_nls == NULL) {
3621 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3622 volume_info->iocharset);
3631 cifs_get_volume_info(char *mount_data, const char *devname)
3634 struct smb_vol *volume_info;
3636 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3638 return ERR_PTR(-ENOMEM);
3640 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3642 cifs_cleanup_volume_info(volume_info);
3643 volume_info = ERR_PTR(rc);
3650 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3652 struct cifs_tcon *tcon,
3653 struct cifs_sb_info *cifs_sb,
3660 sep = CIFS_DIR_SEP(cifs_sb);
3663 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3665 /* skip separators */
3670 /* next separator */
3671 while (*s && *s != sep)
3675 * temporarily null-terminate the path at the end of
3676 * the current component
3680 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3688 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3692 struct cifs_ses *ses;
3693 struct cifs_tcon *tcon;
3694 struct TCP_Server_Info *server;
3696 struct tcon_link *tlink;
3697 #ifdef CONFIG_CIFS_DFS_UPCALL
3698 int referral_walks_count = 0;
3701 #ifdef CONFIG_CIFS_DFS_UPCALL
3703 /* cleanup activities if we're chasing a referral */
3704 if (referral_walks_count) {
3706 cifs_put_tcon(tcon);
3708 cifs_put_smb_ses(ses);
3710 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3724 /* get a reference to a tcp session */
3725 server = cifs_get_tcp_session(volume_info);
3726 if (IS_ERR(server)) {
3727 rc = PTR_ERR(server);
3730 if ((volume_info->max_credits < 20) ||
3731 (volume_info->max_credits > 60000))
3732 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3734 server->max_credits = volume_info->max_credits;
3735 /* get a reference to a SMB session */
3736 ses = cifs_get_smb_ses(server, volume_info);
3740 goto mount_fail_check;
3743 if ((volume_info->persistent == true) && ((ses->server->capabilities &
3744 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
3745 cifs_dbg(VFS, "persistent handles not supported by server\n");
3747 goto mount_fail_check;
3750 /* search for existing tcon to this server share */
3751 tcon = cifs_get_tcon(ses, volume_info);
3756 goto mount_fail_check;
3758 goto remote_path_check;
3761 /* tell server which Unix caps we support */
3762 if (cap_unix(tcon->ses)) {
3763 /* reset of caps checks mount to see if unix extensions
3764 disabled for just this mount */
3765 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3766 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3767 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3768 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3770 goto mount_fail_check;
3773 tcon->unix_ext = 0; /* server does not support them */
3775 /* do not care if a following call succeed - informational */
3776 if (!tcon->ipc && server->ops->qfs_tcon)
3777 server->ops->qfs_tcon(xid, tcon);
3779 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3780 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3783 #ifdef CONFIG_CIFS_DFS_UPCALL
3785 * Perform an unconditional check for whether there are DFS
3786 * referrals for this path without prefix, to provide support
3787 * for DFS referrals from w2k8 servers which don't seem to respond
3788 * with PATH_NOT_COVERED to requests that include the prefix.
3789 * Chase the referral if found, otherwise continue normally.
3791 if (referral_walks_count == 0) {
3792 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3795 referral_walks_count++;
3796 goto try_mount_again;
3801 /* check if a whole path is not remote */
3803 if (!server->ops->is_path_accessible) {
3805 goto mount_fail_check;
3808 * cifs_build_path_to_root works only when we have a valid tcon
3810 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon,
3811 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3812 if (full_path == NULL) {
3814 goto mount_fail_check;
3816 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3818 if (rc != 0 && rc != -EREMOTE) {
3820 goto mount_fail_check;
3823 if (rc != -EREMOTE) {
3824 rc = cifs_are_all_path_components_accessible(server,
3828 cifs_dbg(VFS, "cannot query dirs between root and final path, "
3829 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3830 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3837 /* get referral if needed */
3838 if (rc == -EREMOTE) {
3839 #ifdef CONFIG_CIFS_DFS_UPCALL
3840 if (referral_walks_count > MAX_NESTED_LINKS) {
3842 * BB: when we implement proper loop detection,
3843 * we will remove this check. But now we need it
3844 * to prevent an indefinite loop if 'DFS tree' is
3845 * misconfigured (i.e. has loops).
3848 goto mount_fail_check;
3851 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3854 referral_walks_count++;
3855 goto try_mount_again;
3857 goto mount_fail_check;
3858 #else /* No DFS support, return error on mount */
3864 goto mount_fail_check;
3866 /* now, hang the tcon off of the superblock */
3867 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3868 if (tlink == NULL) {
3870 goto mount_fail_check;
3873 tlink->tl_uid = ses->linux_uid;
3874 tlink->tl_tcon = tcon;
3875 tlink->tl_time = jiffies;
3876 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3877 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3879 cifs_sb->master_tlink = tlink;
3880 spin_lock(&cifs_sb->tlink_tree_lock);
3881 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3882 spin_unlock(&cifs_sb->tlink_tree_lock);
3884 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3888 /* on error free sesinfo and tcon struct if needed */
3890 /* If find_unc succeeded then rc == 0 so we can not end */
3891 /* up accidentally freeing someone elses tcon struct */
3893 cifs_put_tcon(tcon);
3895 cifs_put_smb_ses(ses);
3897 cifs_put_tcp_session(server, 0);
3906 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3907 * pointer may be NULL.
3910 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3911 const char *tree, struct cifs_tcon *tcon,
3912 const struct nls_table *nls_codepage)
3914 struct smb_hdr *smb_buffer;
3915 struct smb_hdr *smb_buffer_response;
3918 unsigned char *bcc_ptr;
3921 __u16 bytes_left, count;
3926 smb_buffer = cifs_buf_get();
3927 if (smb_buffer == NULL)
3930 smb_buffer_response = smb_buffer;
3932 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3933 NULL /*no tid */ , 4 /*wct */ );
3935 smb_buffer->Mid = get_next_mid(ses->server);
3936 smb_buffer->Uid = ses->Suid;
3937 pSMB = (TCONX_REQ *) smb_buffer;
3938 pSMBr = (TCONX_RSP *) smb_buffer_response;
3940 pSMB->AndXCommand = 0xFF;
3941 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3942 bcc_ptr = &pSMB->Password[0];
3943 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3944 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3945 *bcc_ptr = 0; /* password is null byte */
3946 bcc_ptr++; /* skip password */
3947 /* already aligned so no need to do it below */
3949 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3950 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3951 specified as required (when that support is added to
3952 the vfs in the future) as only NTLM or the much
3953 weaker LANMAN (which we do not send by default) is accepted
3954 by Samba (not sure whether other servers allow
3955 NTLMv2 password here) */
3956 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3957 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3958 (ses->sectype == LANMAN))
3959 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3960 ses->server->sec_mode &
3961 SECMODE_PW_ENCRYPT ? true : false,
3964 #endif /* CIFS_WEAK_PW_HASH */
3965 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3966 bcc_ptr, nls_codepage);
3968 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3970 cifs_buf_release(smb_buffer);
3974 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3975 if (ses->capabilities & CAP_UNICODE) {
3976 /* must align unicode strings */
3977 *bcc_ptr = 0; /* null byte password */
3982 if (ses->server->sign)
3983 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3985 if (ses->capabilities & CAP_STATUS32) {
3986 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3988 if (ses->capabilities & CAP_DFS) {
3989 smb_buffer->Flags2 |= SMBFLG2_DFS;
3991 if (ses->capabilities & CAP_UNICODE) {
3992 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3994 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3995 6 /* max utf8 char length in bytes */ *
3996 (/* server len*/ + 256 /* share len */), nls_codepage);
3997 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3998 bcc_ptr += 2; /* skip trailing null */
3999 } else { /* ASCII */
4000 strcpy(bcc_ptr, tree);
4001 bcc_ptr += strlen(tree) + 1;
4003 strcpy(bcc_ptr, "?????");
4004 bcc_ptr += strlen("?????");
4006 count = bcc_ptr - &pSMB->Password[0];
4007 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4008 pSMB->hdr.smb_buf_length) + count);
4009 pSMB->ByteCount = cpu_to_le16(count);
4011 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4014 /* above now done in SendReceive */
4015 if ((rc == 0) && (tcon != NULL)) {
4018 tcon->tidStatus = CifsGood;
4019 tcon->need_reconnect = false;
4020 tcon->tid = smb_buffer_response->Tid;
4021 bcc_ptr = pByteArea(smb_buffer_response);
4022 bytes_left = get_bcc(smb_buffer_response);
4023 length = strnlen(bcc_ptr, bytes_left - 2);
4024 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4030 /* skip service field (NB: this field is always ASCII) */
4032 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4033 (bcc_ptr[2] == 'C')) {
4034 cifs_dbg(FYI, "IPC connection\n");
4037 } else if (length == 2) {
4038 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4039 /* the most common case */
4040 cifs_dbg(FYI, "disk share connection\n");
4043 bcc_ptr += length + 1;
4044 bytes_left -= (length + 1);
4045 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4047 /* mostly informational -- no need to fail on error here */
4048 kfree(tcon->nativeFileSystem);
4049 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4050 bytes_left, is_unicode,
4053 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4055 if ((smb_buffer_response->WordCount == 3) ||
4056 (smb_buffer_response->WordCount == 7))
4057 /* field is in same location */
4058 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4061 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4062 } else if ((rc == 0) && tcon == NULL) {
4063 /* all we need to save for IPC$ connection */
4064 ses->ipc_tid = smb_buffer_response->Tid;
4067 cifs_buf_release(smb_buffer);
4071 static void delayed_free(struct rcu_head *p)
4073 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4074 unload_nls(sbi->local_nls);
4079 cifs_umount(struct cifs_sb_info *cifs_sb)
4081 struct rb_root *root = &cifs_sb->tlink_tree;
4082 struct rb_node *node;
4083 struct tcon_link *tlink;
4085 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4087 spin_lock(&cifs_sb->tlink_tree_lock);
4088 while ((node = rb_first(root))) {
4089 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4090 cifs_get_tlink(tlink);
4091 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4092 rb_erase(node, root);
4094 spin_unlock(&cifs_sb->tlink_tree_lock);
4095 cifs_put_tlink(tlink);
4096 spin_lock(&cifs_sb->tlink_tree_lock);
4098 spin_unlock(&cifs_sb->tlink_tree_lock);
4100 kfree(cifs_sb->mountdata);
4101 kfree(cifs_sb->prepath);
4102 call_rcu(&cifs_sb->rcu, delayed_free);
4106 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4109 struct TCP_Server_Info *server = ses->server;
4111 if (!server->ops->need_neg || !server->ops->negotiate)
4114 /* only send once per connect */
4115 if (!server->ops->need_neg(server))
4118 set_credits(server, 1);
4120 rc = server->ops->negotiate(xid, ses);
4122 spin_lock(&GlobalMid_Lock);
4123 if (server->tcpStatus == CifsNeedNegotiate)
4124 server->tcpStatus = CifsGood;
4127 spin_unlock(&GlobalMid_Lock);
4134 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4135 struct nls_table *nls_info)
4138 struct TCP_Server_Info *server = ses->server;
4140 ses->capabilities = server->capabilities;
4141 if (linuxExtEnabled == 0)
4142 ses->capabilities &= (~server->vals->cap_unix);
4144 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4145 server->sec_mode, server->capabilities, server->timeAdj);
4147 if (server->ops->sess_setup)
4148 rc = server->ops->sess_setup(xid, ses, nls_info);
4151 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4157 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4159 vol->sectype = ses->sectype;
4161 /* krb5 is special, since we don't need username or pw */
4162 if (vol->sectype == Kerberos)
4165 return cifs_set_cifscreds(vol, ses);
4168 static struct cifs_tcon *
4169 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4172 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4173 struct cifs_ses *ses;
4174 struct cifs_tcon *tcon = NULL;
4175 struct smb_vol *vol_info;
4177 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4178 if (vol_info == NULL)
4179 return ERR_PTR(-ENOMEM);
4181 vol_info->local_nls = cifs_sb->local_nls;
4182 vol_info->linux_uid = fsuid;
4183 vol_info->cred_uid = fsuid;
4184 vol_info->UNC = master_tcon->treeName;
4185 vol_info->retry = master_tcon->retry;
4186 vol_info->nocase = master_tcon->nocase;
4187 vol_info->local_lease = master_tcon->local_lease;
4188 vol_info->no_linux_ext = !master_tcon->unix_ext;
4189 vol_info->sectype = master_tcon->ses->sectype;
4190 vol_info->sign = master_tcon->ses->sign;
4192 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4198 /* get a reference for the same TCP session */
4199 spin_lock(&cifs_tcp_ses_lock);
4200 ++master_tcon->ses->server->srv_count;
4201 spin_unlock(&cifs_tcp_ses_lock);
4203 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4205 tcon = (struct cifs_tcon *)ses;
4206 cifs_put_tcp_session(master_tcon->ses->server, 0);
4210 tcon = cifs_get_tcon(ses, vol_info);
4212 cifs_put_smb_ses(ses);
4217 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4219 kfree(vol_info->username);
4220 kfree(vol_info->password);
4227 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4229 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4232 /* find and return a tlink with given uid */
4233 static struct tcon_link *
4234 tlink_rb_search(struct rb_root *root, kuid_t uid)
4236 struct rb_node *node = root->rb_node;
4237 struct tcon_link *tlink;
4240 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4242 if (uid_gt(tlink->tl_uid, uid))
4243 node = node->rb_left;
4244 else if (uid_lt(tlink->tl_uid, uid))
4245 node = node->rb_right;
4252 /* insert a tcon_link into the tree */
4254 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4256 struct rb_node **new = &(root->rb_node), *parent = NULL;
4257 struct tcon_link *tlink;
4260 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4263 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4264 new = &((*new)->rb_left);
4266 new = &((*new)->rb_right);
4269 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4270 rb_insert_color(&new_tlink->tl_rbnode, root);
4274 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4277 * If the superblock doesn't refer to a multiuser mount, then just return
4278 * the master tcon for the mount.
4280 * First, search the rbtree for an existing tcon for this fsuid. If one
4281 * exists, then check to see if it's pending construction. If it is then wait
4282 * for construction to complete. Once it's no longer pending, check to see if
4283 * it failed and either return an error or retry construction, depending on
4286 * If one doesn't exist then insert a new tcon_link struct into the tree and
4287 * try to construct a new one.
4290 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4293 kuid_t fsuid = current_fsuid();
4294 struct tcon_link *tlink, *newtlink;
4296 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4297 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4299 spin_lock(&cifs_sb->tlink_tree_lock);
4300 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4302 cifs_get_tlink(tlink);
4303 spin_unlock(&cifs_sb->tlink_tree_lock);
4305 if (tlink == NULL) {
4306 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4307 if (newtlink == NULL)
4308 return ERR_PTR(-ENOMEM);
4309 newtlink->tl_uid = fsuid;
4310 newtlink->tl_tcon = ERR_PTR(-EACCES);
4311 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4312 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4313 cifs_get_tlink(newtlink);
4315 spin_lock(&cifs_sb->tlink_tree_lock);
4316 /* was one inserted after previous search? */
4317 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4319 cifs_get_tlink(tlink);
4320 spin_unlock(&cifs_sb->tlink_tree_lock);
4322 goto wait_for_construction;
4325 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4326 spin_unlock(&cifs_sb->tlink_tree_lock);
4328 wait_for_construction:
4329 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4330 TASK_INTERRUPTIBLE);
4332 cifs_put_tlink(tlink);
4333 return ERR_PTR(-ERESTARTSYS);
4336 /* if it's good, return it */
4337 if (!IS_ERR(tlink->tl_tcon))
4340 /* return error if we tried this already recently */
4341 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4342 cifs_put_tlink(tlink);
4343 return ERR_PTR(-EACCES);
4346 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4347 goto wait_for_construction;
4350 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4351 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4352 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4354 if (IS_ERR(tlink->tl_tcon)) {
4355 cifs_put_tlink(tlink);
4356 return ERR_PTR(-EACCES);
4363 * periodic workqueue job that scans tcon_tree for a superblock and closes
4367 cifs_prune_tlinks(struct work_struct *work)
4369 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4371 struct rb_root *root = &cifs_sb->tlink_tree;
4372 struct rb_node *node = rb_first(root);
4373 struct rb_node *tmp;
4374 struct tcon_link *tlink;
4377 * Because we drop the spinlock in the loop in order to put the tlink
4378 * it's not guarded against removal of links from the tree. The only
4379 * places that remove entries from the tree are this function and
4380 * umounts. Because this function is non-reentrant and is canceled
4381 * before umount can proceed, this is safe.
4383 spin_lock(&cifs_sb->tlink_tree_lock);
4384 node = rb_first(root);
4385 while (node != NULL) {
4387 node = rb_next(tmp);
4388 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4390 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4391 atomic_read(&tlink->tl_count) != 0 ||
4392 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4395 cifs_get_tlink(tlink);
4396 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4397 rb_erase(tmp, root);
4399 spin_unlock(&cifs_sb->tlink_tree_lock);
4400 cifs_put_tlink(tlink);
4401 spin_lock(&cifs_sb->tlink_tree_lock);
4403 spin_unlock(&cifs_sb->tlink_tree_lock);
4405 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,