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/list.h>
25 #include <linux/wait.h>
26 #include <linux/slab.h>
27 #include <linux/pagemap.h>
28 #include <linux/ctype.h>
29 #include <linux/utsname.h>
30 #include <linux/mempool.h>
31 #include <linux/delay.h>
32 #include <linux/completion.h>
33 #include <linux/kthread.h>
34 #include <linux/pagevec.h>
35 #include <linux/freezer.h>
36 #include <linux/namei.h>
37 #include <asm/uaccess.h>
38 #include <asm/processor.h>
39 #include <linux/inet.h>
40 #include <linux/module.h>
41 #include <keys/user-type.h>
43 #include <linux/parser.h>
47 #include "cifsproto.h"
48 #include "cifs_unicode.h"
49 #include "cifs_debug.h"
50 #include "cifs_fs_sb.h"
53 #include "rfc1002pdu.h"
57 #define RFC1001_PORT 139
59 extern mempool_t *cifs_req_poolp;
61 /* FIXME: should these be tunable? */
62 #define TLINK_ERROR_EXPIRE (1 * HZ)
63 #define TLINK_IDLE_EXPIRE (600 * HZ)
67 /* Mount options that take no arguments */
68 Opt_user_xattr, Opt_nouser_xattr,
69 Opt_forceuid, Opt_noforceuid,
70 Opt_forcegid, Opt_noforcegid,
71 Opt_noblocksend, Opt_noautotune,
72 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
73 Opt_mapposix, Opt_nomapposix,
74 Opt_mapchars, Opt_nomapchars, Opt_sfu,
75 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
76 Opt_noposixpaths, Opt_nounix,
79 Opt_forcemandatorylock, Opt_setuids,
80 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
81 Opt_nohard, Opt_nosoft,
83 Opt_nostrictsync, Opt_strictsync,
84 Opt_serverino, Opt_noserverino,
85 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
86 Opt_acl, Opt_noacl, Opt_locallease,
87 Opt_sign, Opt_seal, Opt_noac,
88 Opt_fsc, Opt_mfsymlinks,
89 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
91 /* Mount options which take numeric value */
92 Opt_backupuid, Opt_backupgid, Opt_uid,
93 Opt_cruid, Opt_gid, Opt_file_mode,
94 Opt_dirmode, Opt_port,
95 Opt_rsize, Opt_wsize, Opt_actimeo,
97 /* Mount options which take string value */
98 Opt_user, Opt_pass, Opt_ip,
99 Opt_domain, Opt_srcaddr, Opt_iocharset,
100 Opt_netbiosname, Opt_servern,
101 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
103 /* Mount options to be ignored */
106 /* Options which could be blank */
114 static const match_table_t cifs_mount_option_tokens = {
116 { Opt_user_xattr, "user_xattr" },
117 { Opt_nouser_xattr, "nouser_xattr" },
118 { Opt_forceuid, "forceuid" },
119 { Opt_noforceuid, "noforceuid" },
120 { Opt_forcegid, "forcegid" },
121 { Opt_noforcegid, "noforcegid" },
122 { Opt_noblocksend, "noblocksend" },
123 { Opt_noautotune, "noautotune" },
124 { Opt_hard, "hard" },
125 { Opt_soft, "soft" },
126 { Opt_perm, "perm" },
127 { Opt_noperm, "noperm" },
128 { Opt_mapchars, "mapchars" }, /* SFU style */
129 { Opt_nomapchars, "nomapchars" },
130 { Opt_mapposix, "mapposix" }, /* SFM style */
131 { Opt_nomapposix, "nomapposix" },
133 { Opt_nosfu, "nosfu" },
134 { Opt_nodfs, "nodfs" },
135 { Opt_posixpaths, "posixpaths" },
136 { Opt_noposixpaths, "noposixpaths" },
137 { Opt_nounix, "nounix" },
138 { Opt_nounix, "nolinux" },
139 { Opt_nocase, "nocase" },
140 { Opt_nocase, "ignorecase" },
142 { Opt_nobrl, "nobrl" },
143 { Opt_nobrl, "nolock" },
144 { Opt_forcemandatorylock, "forcemandatorylock" },
145 { Opt_forcemandatorylock, "forcemand" },
146 { Opt_setuids, "setuids" },
147 { Opt_nosetuids, "nosetuids" },
148 { Opt_dynperm, "dynperm" },
149 { Opt_nodynperm, "nodynperm" },
150 { Opt_nohard, "nohard" },
151 { Opt_nosoft, "nosoft" },
152 { Opt_nointr, "nointr" },
153 { Opt_intr, "intr" },
154 { Opt_nostrictsync, "nostrictsync" },
155 { Opt_strictsync, "strictsync" },
156 { Opt_serverino, "serverino" },
157 { Opt_noserverino, "noserverino" },
158 { Opt_rwpidforward, "rwpidforward" },
159 { Opt_cifsacl, "cifsacl" },
160 { Opt_nocifsacl, "nocifsacl" },
162 { Opt_noacl, "noacl" },
163 { Opt_locallease, "locallease" },
164 { Opt_sign, "sign" },
165 { Opt_seal, "seal" },
166 { Opt_noac, "noac" },
168 { Opt_mfsymlinks, "mfsymlinks" },
169 { Opt_multiuser, "multiuser" },
170 { Opt_sloppy, "sloppy" },
171 { Opt_nosharesock, "nosharesock" },
173 { Opt_backupuid, "backupuid=%s" },
174 { Opt_backupgid, "backupgid=%s" },
175 { Opt_uid, "uid=%s" },
176 { Opt_cruid, "cruid=%s" },
177 { Opt_gid, "gid=%s" },
178 { Opt_file_mode, "file_mode=%s" },
179 { Opt_dirmode, "dirmode=%s" },
180 { Opt_dirmode, "dir_mode=%s" },
181 { Opt_port, "port=%s" },
182 { Opt_rsize, "rsize=%s" },
183 { Opt_wsize, "wsize=%s" },
184 { Opt_actimeo, "actimeo=%s" },
186 { Opt_blank_user, "user=" },
187 { Opt_blank_user, "username=" },
188 { Opt_user, "user=%s" },
189 { Opt_user, "username=%s" },
190 { Opt_blank_pass, "pass=" },
191 { Opt_blank_pass, "password=" },
192 { Opt_pass, "pass=%s" },
193 { Opt_pass, "password=%s" },
194 { Opt_blank_ip, "ip=" },
195 { Opt_blank_ip, "addr=" },
197 { Opt_ip, "addr=%s" },
198 { Opt_ignore, "unc=%s" },
199 { Opt_ignore, "target=%s" },
200 { Opt_ignore, "path=%s" },
201 { Opt_domain, "dom=%s" },
202 { Opt_domain, "domain=%s" },
203 { Opt_domain, "workgroup=%s" },
204 { Opt_srcaddr, "srcaddr=%s" },
205 { Opt_ignore, "prefixpath=%s" },
206 { Opt_iocharset, "iocharset=%s" },
207 { Opt_netbiosname, "netbiosname=%s" },
208 { Opt_servern, "servern=%s" },
209 { Opt_ver, "ver=%s" },
210 { Opt_vers, "vers=%s" },
211 { Opt_sec, "sec=%s" },
212 { Opt_cache, "cache=%s" },
214 { Opt_ignore, "cred" },
215 { Opt_ignore, "credentials" },
216 { Opt_ignore, "cred=%s" },
217 { Opt_ignore, "credentials=%s" },
218 { Opt_ignore, "guest" },
219 { Opt_ignore, "rw" },
220 { Opt_ignore, "ro" },
221 { Opt_ignore, "suid" },
222 { Opt_ignore, "nosuid" },
223 { Opt_ignore, "exec" },
224 { Opt_ignore, "noexec" },
225 { Opt_ignore, "nodev" },
226 { Opt_ignore, "noauto" },
227 { Opt_ignore, "dev" },
228 { Opt_ignore, "mand" },
229 { Opt_ignore, "nomand" },
230 { Opt_ignore, "_netdev" },
236 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
237 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
238 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
239 Opt_sec_ntlmv2i, Opt_sec_lanman,
245 static const match_table_t cifs_secflavor_tokens = {
246 { Opt_sec_krb5, "krb5" },
247 { Opt_sec_krb5i, "krb5i" },
248 { Opt_sec_krb5p, "krb5p" },
249 { Opt_sec_ntlmsspi, "ntlmsspi" },
250 { Opt_sec_ntlmssp, "ntlmssp" },
251 { Opt_ntlm, "ntlm" },
252 { Opt_sec_ntlmi, "ntlmi" },
253 { Opt_sec_ntlmv2, "nontlm" },
254 { Opt_sec_ntlmv2, "ntlmv2" },
255 { Opt_sec_ntlmv2i, "ntlmv2i" },
256 { Opt_sec_lanman, "lanman" },
257 { Opt_sec_none, "none" },
259 { Opt_sec_err, NULL }
270 static const match_table_t cifs_cacheflavor_tokens = {
271 { Opt_cache_loose, "loose" },
272 { Opt_cache_strict, "strict" },
273 { Opt_cache_none, "none" },
274 { Opt_cache_err, NULL }
277 static const match_table_t cifs_smb_version_tokens = {
278 { Smb_1, SMB1_VERSION_STRING },
279 { Smb_20, SMB20_VERSION_STRING},
280 { Smb_21, SMB21_VERSION_STRING },
281 { Smb_30, SMB30_VERSION_STRING },
282 { Smb_302, SMB302_VERSION_STRING },
283 #ifdef CONFIG_CIFS_SMB311
284 { Smb_311, SMB311_VERSION_STRING },
286 { Smb_version_err, NULL }
289 static int ip_connect(struct TCP_Server_Info *server);
290 static int generic_ip_connect(struct TCP_Server_Info *server);
291 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
292 static void cifs_prune_tlinks(struct work_struct *work);
293 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
294 const char *devname);
297 * cifs tcp session reconnection
299 * mark tcp session as reconnecting so temporarily locked
300 * mark all smb sessions as reconnecting for tcp session
301 * reconnect tcp session
302 * wake up waiters on reconnection? - (not needed currently)
305 cifs_reconnect(struct TCP_Server_Info *server)
308 struct list_head *tmp, *tmp2;
309 struct cifs_ses *ses;
310 struct cifs_tcon *tcon;
311 struct mid_q_entry *mid_entry;
312 struct list_head retry_list;
314 spin_lock(&GlobalMid_Lock);
315 if (server->tcpStatus == CifsExiting) {
316 /* the demux thread will exit normally
317 next time through the loop */
318 spin_unlock(&GlobalMid_Lock);
321 server->tcpStatus = CifsNeedReconnect;
322 spin_unlock(&GlobalMid_Lock);
324 #ifdef CONFIG_CIFS_SMB2
325 server->max_read = 0;
328 cifs_dbg(FYI, "Reconnecting tcp session\n");
330 /* before reconnecting the tcp session, mark the smb session (uid)
331 and the tid bad so they are not used until reconnected */
332 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
334 spin_lock(&cifs_tcp_ses_lock);
335 list_for_each(tmp, &server->smb_ses_list) {
336 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
337 ses->need_reconnect = true;
339 list_for_each(tmp2, &ses->tcon_list) {
340 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
341 tcon->need_reconnect = true;
344 spin_unlock(&cifs_tcp_ses_lock);
346 /* do not want to be sending data on a socket we are freeing */
347 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
348 mutex_lock(&server->srv_mutex);
349 if (server->ssocket) {
350 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
351 server->ssocket->state, server->ssocket->flags);
352 kernel_sock_shutdown(server->ssocket, SHUT_WR);
353 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
354 server->ssocket->state, server->ssocket->flags);
355 sock_release(server->ssocket);
356 server->ssocket = NULL;
358 server->sequence_number = 0;
359 server->session_estab = false;
360 kfree(server->session_key.response);
361 server->session_key.response = NULL;
362 server->session_key.len = 0;
363 server->lstrp = jiffies;
364 mutex_unlock(&server->srv_mutex);
366 /* mark submitted MIDs for retry and issue callback */
367 INIT_LIST_HEAD(&retry_list);
368 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
369 spin_lock(&GlobalMid_Lock);
370 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
371 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
372 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
373 mid_entry->mid_state = MID_RETRY_NEEDED;
374 list_move(&mid_entry->qhead, &retry_list);
376 spin_unlock(&GlobalMid_Lock);
378 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
379 list_for_each_safe(tmp, tmp2, &retry_list) {
380 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
381 list_del_init(&mid_entry->qhead);
382 mid_entry->callback(mid_entry);
388 /* we should try only the port we connected to before */
389 mutex_lock(&server->srv_mutex);
390 rc = generic_ip_connect(server);
392 cifs_dbg(FYI, "reconnect error %d\n", rc);
393 mutex_unlock(&server->srv_mutex);
396 atomic_inc(&tcpSesReconnectCount);
397 spin_lock(&GlobalMid_Lock);
398 if (server->tcpStatus != CifsExiting)
399 server->tcpStatus = CifsNeedNegotiate;
400 spin_unlock(&GlobalMid_Lock);
401 mutex_unlock(&server->srv_mutex);
403 } while (server->tcpStatus == CifsNeedReconnect);
409 cifs_echo_request(struct work_struct *work)
412 struct TCP_Server_Info *server = container_of(work,
413 struct TCP_Server_Info, echo.work);
416 * We cannot send an echo if it is disabled or until the
417 * NEGOTIATE_PROTOCOL request is done, which is indicated by
418 * server->ops->need_neg() == true. Also, no need to ping if
419 * we got a response recently.
421 if (!server->ops->need_neg || server->ops->need_neg(server) ||
422 (server->ops->can_echo && !server->ops->can_echo(server)) ||
423 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
426 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
428 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
432 queue_delayed_work(cifsiod_wq, &server->echo, SMB_ECHO_INTERVAL);
436 allocate_buffers(struct TCP_Server_Info *server)
438 if (!server->bigbuf) {
439 server->bigbuf = (char *)cifs_buf_get();
440 if (!server->bigbuf) {
441 cifs_dbg(VFS, "No memory for large SMB response\n");
443 /* retry will check if exiting */
446 } else if (server->large_buf) {
447 /* we are reusing a dirty large buf, clear its start */
448 memset(server->bigbuf, 0, HEADER_SIZE(server));
451 if (!server->smallbuf) {
452 server->smallbuf = (char *)cifs_small_buf_get();
453 if (!server->smallbuf) {
454 cifs_dbg(VFS, "No memory for SMB response\n");
456 /* retry will check if exiting */
459 /* beginning of smb buffer is cleared in our buf_get */
461 /* if existing small buf clear beginning */
462 memset(server->smallbuf, 0, HEADER_SIZE(server));
469 server_unresponsive(struct TCP_Server_Info *server)
472 * We need to wait 2 echo intervals to make sure we handle such
474 * 1s client sends a normal SMB request
475 * 2s client gets a response
476 * 30s echo workqueue job pops, and decides we got a response recently
477 * and don't need to send another
479 * 65s kernel_recvmsg times out, and we see that we haven't gotten
480 * a response in >60s.
482 if (server->tcpStatus == CifsGood &&
483 time_after(jiffies, server->lstrp + 2 * SMB_ECHO_INTERVAL)) {
484 cifs_dbg(VFS, "Server %s has not responded in %d seconds. Reconnecting...\n",
485 server->hostname, (2 * SMB_ECHO_INTERVAL) / HZ);
486 cifs_reconnect(server);
487 wake_up(&server->response_q);
495 * kvec_array_init - clone a kvec array, and advance into it
496 * @new: pointer to memory for cloned array
497 * @iov: pointer to original array
498 * @nr_segs: number of members in original array
499 * @bytes: number of bytes to advance into the cloned array
501 * This function will copy the array provided in iov to a section of memory
502 * and advance the specified number of bytes into the new array. It returns
503 * the number of segments in the new array. "new" must be at least as big as
504 * the original iov array.
507 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
512 while (bytes || !iov->iov_len) {
513 int copy = min(bytes, iov->iov_len);
517 if (iov->iov_len == base) {
523 memcpy(new, iov, sizeof(*iov) * nr_segs);
524 new->iov_base += base;
525 new->iov_len -= base;
530 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
532 struct kvec *new_iov;
534 if (server->iov && nr_segs <= server->nr_iov)
537 /* not big enough -- allocate a new one and release the old */
538 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
541 server->iov = new_iov;
542 server->nr_iov = nr_segs;
548 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
549 unsigned int nr_segs, unsigned int to_read)
554 struct msghdr smb_msg;
557 iov = get_server_iovec(server, nr_segs);
561 smb_msg.msg_control = NULL;
562 smb_msg.msg_controllen = 0;
564 for (total_read = 0; to_read; total_read += length, to_read -= length) {
567 if (server_unresponsive(server)) {
568 total_read = -ECONNABORTED;
572 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
574 length = kernel_recvmsg(server->ssocket, &smb_msg,
575 iov, segs, to_read, 0);
577 if (server->tcpStatus == CifsExiting) {
578 total_read = -ESHUTDOWN;
580 } else if (server->tcpStatus == CifsNeedReconnect) {
581 cifs_reconnect(server);
582 total_read = -ECONNABORTED;
584 } else if (length == -ERESTARTSYS ||
588 * Minimum sleep to prevent looping, allowing socket
589 * to clear and app threads to set tcpStatus
590 * CifsNeedReconnect if server hung.
592 usleep_range(1000, 2000);
595 } else if (length <= 0) {
596 cifs_dbg(FYI, "Received no data or error: expecting %d\n"
597 "got %d", to_read, length);
598 cifs_reconnect(server);
599 total_read = -ECONNABORTED;
607 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
608 unsigned int to_read)
613 iov.iov_len = to_read;
615 return cifs_readv_from_socket(server, &iov, 1, to_read);
619 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
622 * The first byte big endian of the length field,
623 * is actually not part of the length but the type
624 * with the most common, zero, as regular data.
627 case RFC1002_SESSION_MESSAGE:
628 /* Regular SMB response */
630 case RFC1002_SESSION_KEEP_ALIVE:
631 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
633 case RFC1002_POSITIVE_SESSION_RESPONSE:
634 cifs_dbg(FYI, "RFC 1002 positive session response\n");
636 case RFC1002_NEGATIVE_SESSION_RESPONSE:
638 * We get this from Windows 98 instead of an error on
639 * SMB negprot response.
641 cifs_dbg(FYI, "RFC 1002 negative session response\n");
642 /* give server a second to clean up */
645 * Always try 445 first on reconnect since we get NACK
646 * on some if we ever connected to port 139 (the NACK
647 * is since we do not begin with RFC1001 session
650 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
651 cifs_reconnect(server);
652 wake_up(&server->response_q);
655 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
656 cifs_reconnect(server);
663 dequeue_mid(struct mid_q_entry *mid, bool malformed)
665 #ifdef CONFIG_CIFS_STATS2
666 mid->when_received = jiffies;
668 spin_lock(&GlobalMid_Lock);
670 mid->mid_state = MID_RESPONSE_RECEIVED;
672 mid->mid_state = MID_RESPONSE_MALFORMED;
673 list_del_init(&mid->qhead);
674 spin_unlock(&GlobalMid_Lock);
678 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
679 char *buf, int malformed)
681 if (server->ops->check_trans2 &&
682 server->ops->check_trans2(mid, server, buf, malformed))
685 mid->large_buf = server->large_buf;
686 /* Was previous buf put in mpx struct for multi-rsp? */
687 if (!mid->multiRsp) {
688 /* smb buffer will be freed by user thread */
689 if (server->large_buf)
690 server->bigbuf = NULL;
692 server->smallbuf = NULL;
694 dequeue_mid(mid, malformed);
697 static void clean_demultiplex_info(struct TCP_Server_Info *server)
701 /* take it off the list, if it's not already */
702 spin_lock(&cifs_tcp_ses_lock);
703 list_del_init(&server->tcp_ses_list);
704 spin_unlock(&cifs_tcp_ses_lock);
706 spin_lock(&GlobalMid_Lock);
707 server->tcpStatus = CifsExiting;
708 spin_unlock(&GlobalMid_Lock);
709 wake_up_all(&server->response_q);
711 /* check if we have blocked requests that need to free */
712 spin_lock(&server->req_lock);
713 if (server->credits <= 0)
715 spin_unlock(&server->req_lock);
717 * Although there should not be any requests blocked on this queue it
718 * can not hurt to be paranoid and try to wake up requests that may
719 * haven been blocked when more than 50 at time were on the wire to the
720 * same server - they now will see the session is in exit state and get
721 * out of SendReceive.
723 wake_up_all(&server->request_q);
724 /* give those requests time to exit */
727 if (server->ssocket) {
728 sock_release(server->ssocket);
729 server->ssocket = NULL;
732 if (!list_empty(&server->pending_mid_q)) {
733 struct list_head dispose_list;
734 struct mid_q_entry *mid_entry;
735 struct list_head *tmp, *tmp2;
737 INIT_LIST_HEAD(&dispose_list);
738 spin_lock(&GlobalMid_Lock);
739 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
740 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
741 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
742 mid_entry->mid_state = MID_SHUTDOWN;
743 list_move(&mid_entry->qhead, &dispose_list);
745 spin_unlock(&GlobalMid_Lock);
747 /* now walk dispose list and issue callbacks */
748 list_for_each_safe(tmp, tmp2, &dispose_list) {
749 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
750 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
751 list_del_init(&mid_entry->qhead);
752 mid_entry->callback(mid_entry);
754 /* 1/8th of sec is more than enough time for them to exit */
758 if (!list_empty(&server->pending_mid_q)) {
760 * mpx threads have not exited yet give them at least the smb
761 * send timeout time for long ops.
763 * Due to delays on oplock break requests, we need to wait at
764 * least 45 seconds before giving up on a request getting a
765 * response and going ahead and killing cifsd.
767 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
770 * If threads still have not exited they are probably never
771 * coming home not much else we can do but free the memory.
775 kfree(server->hostname);
779 length = atomic_dec_return(&tcpSesAllocCount);
781 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
785 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
788 char *buf = server->smallbuf;
789 unsigned int pdu_length = get_rfc1002_length(buf);
791 /* make sure this will fit in a large buffer */
792 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
793 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
794 cifs_reconnect(server);
795 wake_up(&server->response_q);
796 return -ECONNABORTED;
799 /* switch to large buffer if too big for a small one */
800 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
801 server->large_buf = true;
802 memcpy(server->bigbuf, buf, server->total_read);
803 buf = server->bigbuf;
806 /* now read the rest */
807 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
808 pdu_length - HEADER_SIZE(server) + 1 + 4);
811 server->total_read += length;
813 dump_smb(buf, server->total_read);
816 * We know that we received enough to get to the MID as we
817 * checked the pdu_length earlier. Now check to see
818 * if the rest of the header is OK. We borrow the length
819 * var for the rest of the loop to avoid a new stack var.
821 * 48 bytes is enough to display the header and a little bit
822 * into the payload for debugging purposes.
824 length = server->ops->check_message(buf, server->total_read);
826 cifs_dump_mem("Bad SMB: ", buf,
827 min_t(unsigned int, server->total_read, 48));
829 if (server->ops->is_status_pending &&
830 server->ops->is_status_pending(buf, server, length))
836 handle_mid(mid, server, buf, length);
841 cifs_demultiplex_thread(void *p)
844 struct TCP_Server_Info *server = p;
845 unsigned int pdu_length;
847 struct task_struct *task_to_wake = NULL;
848 struct mid_q_entry *mid_entry;
850 current->flags |= PF_MEMALLOC;
851 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
853 length = atomic_inc_return(&tcpSesAllocCount);
855 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
858 while (server->tcpStatus != CifsExiting) {
862 if (!allocate_buffers(server))
865 server->large_buf = false;
866 buf = server->smallbuf;
867 pdu_length = 4; /* enough to get RFC1001 header */
869 length = cifs_read_from_socket(server, buf, pdu_length);
872 server->total_read = length;
875 * The right amount was read from socket - 4 bytes,
876 * so we can now interpret the length field.
878 pdu_length = get_rfc1002_length(buf);
880 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
881 if (!is_smb_response(server, buf[0]))
884 /* make sure we have enough to get to the MID */
885 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
886 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
888 cifs_reconnect(server);
889 wake_up(&server->response_q);
893 /* read down to the MID */
894 length = cifs_read_from_socket(server, buf + 4,
895 HEADER_SIZE(server) - 1 - 4);
898 server->total_read += length;
900 mid_entry = server->ops->find_mid(server, buf);
902 if (!mid_entry || !mid_entry->receive)
903 length = standard_receive3(server, mid_entry);
905 length = mid_entry->receive(server, mid_entry);
910 if (server->large_buf)
911 buf = server->bigbuf;
913 server->lstrp = jiffies;
914 if (mid_entry != NULL) {
915 if (!mid_entry->multiRsp || mid_entry->multiEnd)
916 mid_entry->callback(mid_entry);
917 } else if (!server->ops->is_oplock_break ||
918 !server->ops->is_oplock_break(buf, server)) {
919 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
920 atomic_read(&midCount));
921 cifs_dump_mem("Received Data is: ", buf,
922 HEADER_SIZE(server));
923 #ifdef CONFIG_CIFS_DEBUG2
924 if (server->ops->dump_detail)
925 server->ops->dump_detail(buf);
926 cifs_dump_mids(server);
927 #endif /* CIFS_DEBUG2 */
930 } /* end while !EXITING */
932 /* buffer usually freed in free_mid - need to free it here on exit */
933 cifs_buf_release(server->bigbuf);
934 if (server->smallbuf) /* no sense logging a debug message if NULL */
935 cifs_small_buf_release(server->smallbuf);
937 task_to_wake = xchg(&server->tsk, NULL);
938 clean_demultiplex_info(server);
940 /* if server->tsk was NULL then wait for a signal before exiting */
942 set_current_state(TASK_INTERRUPTIBLE);
943 while (!signal_pending(current)) {
945 set_current_state(TASK_INTERRUPTIBLE);
947 set_current_state(TASK_RUNNING);
950 module_put_and_exit(0);
953 /* extract the host portion of the UNC string */
955 extract_hostname(const char *unc)
961 /* skip double chars at beginning of string */
962 /* BB: check validity of these bytes? */
965 /* delimiter between hostname and sharename is always '\\' now */
966 delim = strchr(src, '\\');
968 return ERR_PTR(-EINVAL);
971 dst = kmalloc((len + 1), GFP_KERNEL);
973 return ERR_PTR(-ENOMEM);
975 memcpy(dst, src, len);
981 static int get_option_ul(substring_t args[], unsigned long *option)
986 string = match_strdup(args);
989 rc = kstrtoul(string, 0, option);
995 static int get_option_uid(substring_t args[], kuid_t *result)
1001 rc = get_option_ul(args, &value);
1005 uid = make_kuid(current_user_ns(), value);
1006 if (!uid_valid(uid))
1013 static int get_option_gid(substring_t args[], kgid_t *result)
1015 unsigned long value;
1019 rc = get_option_ul(args, &value);
1023 gid = make_kgid(current_user_ns(), value);
1024 if (!gid_valid(gid))
1031 static int cifs_parse_security_flavors(char *value,
1032 struct smb_vol *vol)
1035 substring_t args[MAX_OPT_ARGS];
1038 * With mount options, the last one should win. Reset any existing
1039 * settings back to default.
1041 vol->sectype = Unspecified;
1044 switch (match_token(value, cifs_secflavor_tokens, args)) {
1046 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1052 vol->sectype = Kerberos;
1054 case Opt_sec_ntlmsspi:
1057 case Opt_sec_ntlmssp:
1058 vol->sectype = RawNTLMSSP;
1064 vol->sectype = NTLM;
1066 case Opt_sec_ntlmv2i:
1069 case Opt_sec_ntlmv2:
1070 vol->sectype = NTLMv2;
1072 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1073 case Opt_sec_lanman:
1074 vol->sectype = LANMAN;
1081 cifs_dbg(VFS, "bad security option: %s\n", value);
1089 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1091 substring_t args[MAX_OPT_ARGS];
1093 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1094 case Opt_cache_loose:
1095 vol->direct_io = false;
1096 vol->strict_io = false;
1098 case Opt_cache_strict:
1099 vol->direct_io = false;
1100 vol->strict_io = true;
1102 case Opt_cache_none:
1103 vol->direct_io = true;
1104 vol->strict_io = false;
1107 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1114 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1116 substring_t args[MAX_OPT_ARGS];
1118 switch (match_token(value, cifs_smb_version_tokens, args)) {
1120 vol->ops = &smb1_operations;
1121 vol->vals = &smb1_values;
1123 #ifdef CONFIG_CIFS_SMB2
1125 vol->ops = &smb20_operations;
1126 vol->vals = &smb20_values;
1129 vol->ops = &smb21_operations;
1130 vol->vals = &smb21_values;
1133 vol->ops = &smb30_operations;
1134 vol->vals = &smb30_values;
1137 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1138 vol->vals = &smb302_values;
1140 #ifdef CONFIG_CIFS_SMB311
1142 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1143 vol->vals = &smb311_values;
1148 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1155 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1156 * fields with the result. Returns 0 on success and an error otherwise.
1159 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1162 const char *delims = "/\\";
1165 /* make sure we have a valid UNC double delimiter prefix */
1166 len = strspn(devname, delims);
1170 /* find delimiter between host and sharename */
1171 pos = strpbrk(devname + 2, delims);
1175 /* skip past delimiter */
1178 /* now go until next delimiter or end of string */
1179 len = strcspn(pos, delims);
1181 /* move "pos" up to delimiter or NULL */
1183 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1187 convert_delimiter(vol->UNC, '\\');
1189 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1190 if (!*pos++ || !*pos)
1193 vol->prepath = kstrdup(pos, GFP_KERNEL);
1201 cifs_parse_mount_options(const char *mountdata, const char *devname,
1202 struct smb_vol *vol)
1205 char *mountdata_copy = NULL, *options;
1206 unsigned int temp_len, i, j;
1208 short int override_uid = -1;
1209 short int override_gid = -1;
1210 bool uid_specified = false;
1211 bool gid_specified = false;
1212 bool sloppy = false;
1213 char *invalid = NULL;
1214 char *nodename = utsname()->nodename;
1215 char *string = NULL;
1216 char *tmp_end, *value;
1218 bool got_ip = false;
1219 unsigned short port = 0;
1220 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1224 delim = separator[0];
1226 /* ensure we always start with zeroed-out smb_vol */
1227 memset(vol, 0, sizeof(*vol));
1230 * does not have to be perfect mapping since field is
1231 * informational, only used for servers that do not support
1232 * port 445 and it can be overridden at mount time
1234 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1235 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1236 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1238 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1239 /* null target name indicates to use *SMBSERVR default called name
1240 if we end up sending RFC1001 session initialize */
1241 vol->target_rfc1001_name[0] = 0;
1242 vol->cred_uid = current_uid();
1243 vol->linux_uid = current_uid();
1244 vol->linux_gid = current_gid();
1247 * default to SFM style remapping of seven reserved characters
1248 * unless user overrides it or we negotiate CIFS POSIX where
1249 * it is unnecessary. Can not simultaneously use more than one mapping
1250 * since then readdir could list files that open could not open
1254 /* default to only allowing write access to owner of the mount */
1255 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1257 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1258 /* default is always to request posix paths. */
1259 vol->posix_paths = 1;
1260 /* default to using server inode numbers where available */
1261 vol->server_ino = 1;
1263 /* default is to use strict cifs caching semantics */
1264 vol->strict_io = true;
1266 vol->actimeo = CIFS_DEF_ACTIMEO;
1268 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1269 vol->ops = &smb1_operations;
1270 vol->vals = &smb1_values;
1273 goto cifs_parse_mount_err;
1275 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1276 if (!mountdata_copy)
1277 goto cifs_parse_mount_err;
1279 options = mountdata_copy;
1280 end = options + strlen(options);
1282 if (strncmp(options, "sep=", 4) == 0) {
1283 if (options[4] != 0) {
1284 separator[0] = options[4];
1287 cifs_dbg(FYI, "Null separator not allowed\n");
1290 vol->backupuid_specified = false; /* no backup intent for a user */
1291 vol->backupgid_specified = false; /* no backup intent for a group */
1293 switch (cifs_parse_devname(devname, vol)) {
1297 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1298 goto cifs_parse_mount_err;
1300 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1301 goto cifs_parse_mount_err;
1303 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1304 goto cifs_parse_mount_err;
1307 while ((data = strsep(&options, separator)) != NULL) {
1308 substring_t args[MAX_OPT_ARGS];
1309 unsigned long option;
1315 token = match_token(data, cifs_mount_option_tokens, args);
1319 /* Ingnore the following */
1323 /* Boolean values */
1324 case Opt_user_xattr:
1327 case Opt_nouser_xattr:
1333 case Opt_noforceuid:
1339 case Opt_noforcegid:
1342 case Opt_noblocksend:
1343 vol->noblocksnd = 1;
1345 case Opt_noautotune:
1346 vol->noautotune = 1;
1361 vol->sfu_remap = true;
1362 vol->remap = false; /* disable SFM mapping */
1364 case Opt_nomapchars:
1365 vol->sfu_remap = false;
1369 vol->sfu_remap = false; /* disable SFU mapping */
1371 case Opt_nomapposix:
1383 case Opt_posixpaths:
1384 vol->posix_paths = 1;
1386 case Opt_noposixpaths:
1387 vol->posix_paths = 0;
1390 vol->no_linux_ext = 1;
1401 * turn off mandatory locking in mode
1402 * if remote locking is turned off since the
1403 * local vfs will do advisory
1405 if (vol->file_mode ==
1406 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1407 vol->file_mode = S_IALLUGO;
1409 case Opt_forcemandatorylock:
1419 vol->dynperm = true;
1422 vol->dynperm = false;
1436 case Opt_nostrictsync:
1437 vol->nostrictsync = 1;
1439 case Opt_strictsync:
1440 vol->nostrictsync = 0;
1443 vol->server_ino = 1;
1445 case Opt_noserverino:
1446 vol->server_ino = 0;
1448 case Opt_rwpidforward:
1449 vol->rwpidforward = 1;
1458 vol->no_psx_acl = 0;
1461 vol->no_psx_acl = 1;
1463 case Opt_locallease:
1464 vol->local_lease = 1;
1470 /* we do not do the following in secFlags because seal
1471 * is a per tree connection (mount) not a per socket
1472 * or per-smb connection option in the protocol
1473 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1478 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1481 #ifndef CONFIG_CIFS_FSCACHE
1482 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1483 goto cifs_parse_mount_err;
1487 case Opt_mfsymlinks:
1488 vol->mfsymlinks = true;
1491 vol->multiuser = true;
1496 case Opt_nosharesock:
1497 vol->nosharesock = true;
1500 /* Numeric Values */
1502 if (get_option_uid(args, &vol->backupuid)) {
1503 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1505 goto cifs_parse_mount_err;
1507 vol->backupuid_specified = true;
1510 if (get_option_gid(args, &vol->backupgid)) {
1511 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1513 goto cifs_parse_mount_err;
1515 vol->backupgid_specified = true;
1518 if (get_option_uid(args, &vol->linux_uid)) {
1519 cifs_dbg(VFS, "%s: Invalid uid value\n",
1521 goto cifs_parse_mount_err;
1523 uid_specified = true;
1526 if (get_option_uid(args, &vol->cred_uid)) {
1527 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1529 goto cifs_parse_mount_err;
1533 if (get_option_gid(args, &vol->linux_gid)) {
1534 cifs_dbg(VFS, "%s: Invalid gid value\n",
1536 goto cifs_parse_mount_err;
1538 gid_specified = true;
1541 if (get_option_ul(args, &option)) {
1542 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1544 goto cifs_parse_mount_err;
1546 vol->file_mode = option;
1549 if (get_option_ul(args, &option)) {
1550 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1552 goto cifs_parse_mount_err;
1554 vol->dir_mode = option;
1557 if (get_option_ul(args, &option) ||
1558 option > USHRT_MAX) {
1559 cifs_dbg(VFS, "%s: Invalid port value\n",
1561 goto cifs_parse_mount_err;
1563 port = (unsigned short)option;
1566 if (get_option_ul(args, &option)) {
1567 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1569 goto cifs_parse_mount_err;
1571 vol->rsize = option;
1574 if (get_option_ul(args, &option)) {
1575 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1577 goto cifs_parse_mount_err;
1579 vol->wsize = option;
1582 if (get_option_ul(args, &option)) {
1583 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1585 goto cifs_parse_mount_err;
1587 vol->actimeo = HZ * option;
1588 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1589 cifs_dbg(VFS, "attribute cache timeout too large\n");
1590 goto cifs_parse_mount_err;
1594 /* String Arguments */
1596 case Opt_blank_user:
1597 /* null user, ie. anonymous authentication */
1599 vol->username = NULL;
1602 string = match_strdup(args);
1606 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1607 CIFS_MAX_USERNAME_LEN) {
1608 pr_warn("CIFS: username too long\n");
1609 goto cifs_parse_mount_err;
1612 kfree(vol->username);
1613 vol->username = kstrdup(string, GFP_KERNEL);
1615 goto cifs_parse_mount_err;
1617 case Opt_blank_pass:
1618 /* passwords have to be handled differently
1619 * to allow the character used for deliminator
1620 * to be passed within them
1624 * Check if this is a case where the password
1625 * starts with a delimiter
1627 tmp_end = strchr(data, '=');
1629 if (!(tmp_end < end && tmp_end[1] == delim)) {
1630 /* No it is not. Set the password to NULL */
1631 kfree(vol->password);
1632 vol->password = NULL;
1635 /* Yes it is. Drop down to Opt_pass below.*/
1637 /* Obtain the value string */
1638 value = strchr(data, '=');
1641 /* Set tmp_end to end of the string */
1642 tmp_end = (char *) value + strlen(value);
1644 /* Check if following character is the deliminator
1645 * If yes, we have encountered a double deliminator
1646 * reset the NULL character to the deliminator
1648 if (tmp_end < end && tmp_end[1] == delim) {
1651 /* Keep iterating until we get to a single
1652 * deliminator OR the end
1654 while ((tmp_end = strchr(tmp_end, delim))
1655 != NULL && (tmp_end[1] == delim)) {
1656 tmp_end = (char *) &tmp_end[2];
1659 /* Reset var options to point to next element */
1662 options = (char *) &tmp_end[1];
1664 /* Reached the end of the mount option
1669 kfree(vol->password);
1670 /* Now build new password string */
1671 temp_len = strlen(value);
1672 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1673 if (vol->password == NULL) {
1674 pr_warn("CIFS: no memory for password\n");
1675 goto cifs_parse_mount_err;
1678 for (i = 0, j = 0; i < temp_len; i++, j++) {
1679 vol->password[j] = value[i];
1680 if ((value[i] == delim) &&
1681 value[i+1] == delim)
1682 /* skip the second deliminator */
1685 vol->password[j] = '\0';
1688 /* FIXME: should this be an error instead? */
1692 string = match_strdup(args);
1696 if (!cifs_convert_address(dstaddr, string,
1698 pr_err("CIFS: bad ip= option (%s).\n", string);
1699 goto cifs_parse_mount_err;
1704 string = match_strdup(args);
1708 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1709 == CIFS_MAX_DOMAINNAME_LEN) {
1710 pr_warn("CIFS: domain name too long\n");
1711 goto cifs_parse_mount_err;
1714 kfree(vol->domainname);
1715 vol->domainname = kstrdup(string, GFP_KERNEL);
1716 if (!vol->domainname) {
1717 pr_warn("CIFS: no memory for domainname\n");
1718 goto cifs_parse_mount_err;
1720 cifs_dbg(FYI, "Domain name set\n");
1723 string = match_strdup(args);
1727 if (!cifs_convert_address(
1728 (struct sockaddr *)&vol->srcaddr,
1729 string, strlen(string))) {
1730 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1732 goto cifs_parse_mount_err;
1736 string = match_strdup(args);
1740 if (strnlen(string, 1024) >= 65) {
1741 pr_warn("CIFS: iocharset name too long.\n");
1742 goto cifs_parse_mount_err;
1745 if (strncasecmp(string, "default", 7) != 0) {
1746 kfree(vol->iocharset);
1747 vol->iocharset = kstrdup(string,
1749 if (!vol->iocharset) {
1750 pr_warn("CIFS: no memory for charset\n");
1751 goto cifs_parse_mount_err;
1754 /* if iocharset not set then load_nls_default
1757 cifs_dbg(FYI, "iocharset set to %s\n", string);
1759 case Opt_netbiosname:
1760 string = match_strdup(args);
1764 memset(vol->source_rfc1001_name, 0x20,
1767 * FIXME: are there cases in which a comma can
1768 * be valid in workstation netbios name (and
1769 * need special handling)?
1771 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1772 /* don't ucase netbiosname for user */
1775 vol->source_rfc1001_name[i] = string[i];
1777 /* The string has 16th byte zero still from
1778 * set at top of the function
1780 if (i == RFC1001_NAME_LEN && string[i] != 0)
1781 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1784 /* servernetbiosname specified override *SMBSERVER */
1785 string = match_strdup(args);
1789 /* last byte, type, is 0x20 for servr type */
1790 memset(vol->target_rfc1001_name, 0x20,
1791 RFC1001_NAME_LEN_WITH_NULL);
1793 /* BB are there cases in which a comma can be
1794 valid in this workstation netbios name
1795 (and need special handling)? */
1797 /* user or mount helper must uppercase the
1799 for (i = 0; i < 15; i++) {
1802 vol->target_rfc1001_name[i] = string[i];
1804 /* The string has 16th byte zero still from
1805 set at top of the function */
1806 if (i == RFC1001_NAME_LEN && string[i] != 0)
1807 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1810 string = match_strdup(args);
1814 if (strncasecmp(string, "1", 1) == 0) {
1815 /* This is the default */
1818 /* For all other value, error */
1819 pr_warn("CIFS: Invalid version specified\n");
1820 goto cifs_parse_mount_err;
1822 string = match_strdup(args);
1826 if (cifs_parse_smb_version(string, vol) != 0)
1827 goto cifs_parse_mount_err;
1830 string = match_strdup(args);
1834 if (cifs_parse_security_flavors(string, vol) != 0)
1835 goto cifs_parse_mount_err;
1838 string = match_strdup(args);
1842 if (cifs_parse_cache_flavor(string, vol) != 0)
1843 goto cifs_parse_mount_err;
1847 * An option we don't recognize. Save it off for later
1848 * if we haven't already found one
1854 /* Free up any allocated string */
1859 if (!sloppy && invalid) {
1860 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
1861 goto cifs_parse_mount_err;
1865 /* Muliuser mounts require CONFIG_KEYS support */
1866 if (vol->multiuser) {
1867 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1868 goto cifs_parse_mount_err;
1872 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
1873 goto cifs_parse_mount_err;
1876 /* make sure UNC has a share name */
1877 if (!strchr(vol->UNC + 3, '\\')) {
1878 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
1879 goto cifs_parse_mount_err;
1883 /* No ip= option specified? Try to get it from UNC */
1884 if (!cifs_convert_address(dstaddr, &vol->UNC[2],
1885 strlen(&vol->UNC[2]))) {
1886 pr_err("Unable to determine destination address.\n");
1887 goto cifs_parse_mount_err;
1891 /* set the port that we got earlier */
1892 cifs_set_port(dstaddr, port);
1895 vol->override_uid = override_uid;
1896 else if (override_uid == 1)
1897 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
1900 vol->override_gid = override_gid;
1901 else if (override_gid == 1)
1902 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
1904 kfree(mountdata_copy);
1908 pr_warn("Could not allocate temporary buffer\n");
1909 cifs_parse_mount_err:
1911 kfree(mountdata_copy);
1915 /** Returns true if srcaddr isn't specified and rhs isn't
1916 * specified, or if srcaddr is specified and
1917 * matches the IP address of the rhs argument.
1920 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1922 switch (srcaddr->sa_family) {
1924 return (rhs->sa_family == AF_UNSPEC);
1926 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1927 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1928 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1931 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1932 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1933 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1937 return false; /* don't expect to be here */
1942 * If no port is specified in addr structure, we try to match with 445 port
1943 * and if it fails - with 139 ports. It should be called only if address
1944 * families of server and addr are equal.
1947 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1949 __be16 port, *sport;
1951 switch (addr->sa_family) {
1953 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1954 port = ((struct sockaddr_in *) addr)->sin_port;
1957 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1958 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1966 port = htons(CIFS_PORT);
1970 port = htons(RFC1001_PORT);
1973 return port == *sport;
1977 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1978 struct sockaddr *srcaddr)
1980 switch (addr->sa_family) {
1982 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1983 struct sockaddr_in *srv_addr4 =
1984 (struct sockaddr_in *)&server->dstaddr;
1986 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1991 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1992 struct sockaddr_in6 *srv_addr6 =
1993 (struct sockaddr_in6 *)&server->dstaddr;
1995 if (!ipv6_addr_equal(&addr6->sin6_addr,
1996 &srv_addr6->sin6_addr))
1998 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2004 return false; /* don't expect to be here */
2007 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2014 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2017 * The select_sectype function should either return the vol->sectype
2018 * that was specified, or "Unspecified" if that sectype was not
2019 * compatible with the given NEGOTIATE request.
2021 if (select_sectype(server, vol->sectype) == Unspecified)
2025 * Now check if signing mode is acceptable. No need to check
2026 * global_secflags at this point since if MUST_SIGN is set then
2027 * the server->sign had better be too.
2029 if (vol->sign && !server->sign)
2035 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2037 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2039 if (vol->nosharesock)
2042 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2045 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2048 if (!match_address(server, addr,
2049 (struct sockaddr *)&vol->srcaddr))
2052 if (!match_port(server, addr))
2055 if (!match_security(server, vol))
2061 static struct TCP_Server_Info *
2062 cifs_find_tcp_session(struct smb_vol *vol)
2064 struct TCP_Server_Info *server;
2066 spin_lock(&cifs_tcp_ses_lock);
2067 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2068 if (!match_server(server, vol))
2071 ++server->srv_count;
2072 spin_unlock(&cifs_tcp_ses_lock);
2073 cifs_dbg(FYI, "Existing tcp session with server found\n");
2076 spin_unlock(&cifs_tcp_ses_lock);
2081 cifs_put_tcp_session(struct TCP_Server_Info *server)
2083 struct task_struct *task;
2085 spin_lock(&cifs_tcp_ses_lock);
2086 if (--server->srv_count > 0) {
2087 spin_unlock(&cifs_tcp_ses_lock);
2091 put_net(cifs_net_ns(server));
2093 list_del_init(&server->tcp_ses_list);
2094 spin_unlock(&cifs_tcp_ses_lock);
2096 cancel_delayed_work_sync(&server->echo);
2098 spin_lock(&GlobalMid_Lock);
2099 server->tcpStatus = CifsExiting;
2100 spin_unlock(&GlobalMid_Lock);
2102 cifs_crypto_shash_release(server);
2103 cifs_fscache_release_client_cookie(server);
2105 kfree(server->session_key.response);
2106 server->session_key.response = NULL;
2107 server->session_key.len = 0;
2109 task = xchg(&server->tsk, NULL);
2111 force_sig(SIGKILL, task);
2114 static struct TCP_Server_Info *
2115 cifs_get_tcp_session(struct smb_vol *volume_info)
2117 struct TCP_Server_Info *tcp_ses = NULL;
2120 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2122 /* see if we already have a matching tcp_ses */
2123 tcp_ses = cifs_find_tcp_session(volume_info);
2127 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2133 tcp_ses->ops = volume_info->ops;
2134 tcp_ses->vals = volume_info->vals;
2135 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2136 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2137 if (IS_ERR(tcp_ses->hostname)) {
2138 rc = PTR_ERR(tcp_ses->hostname);
2139 goto out_err_crypto_release;
2142 tcp_ses->noblocksnd = volume_info->noblocksnd;
2143 tcp_ses->noautotune = volume_info->noautotune;
2144 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2145 tcp_ses->in_flight = 0;
2146 tcp_ses->credits = 1;
2147 init_waitqueue_head(&tcp_ses->response_q);
2148 init_waitqueue_head(&tcp_ses->request_q);
2149 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2150 mutex_init(&tcp_ses->srv_mutex);
2151 memcpy(tcp_ses->workstation_RFC1001_name,
2152 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2153 memcpy(tcp_ses->server_RFC1001_name,
2154 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2155 tcp_ses->session_estab = false;
2156 tcp_ses->sequence_number = 0;
2157 tcp_ses->lstrp = jiffies;
2158 spin_lock_init(&tcp_ses->req_lock);
2159 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2160 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2161 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2162 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2163 sizeof(tcp_ses->srcaddr));
2164 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2165 sizeof(tcp_ses->dstaddr));
2166 #ifdef CONFIG_CIFS_SMB2
2167 get_random_bytes(tcp_ses->client_guid, SMB2_CLIENT_GUID_SIZE);
2170 * at this point we are the only ones with the pointer
2171 * to the struct since the kernel thread not created yet
2172 * no need to spinlock this init of tcpStatus or srv_count
2174 tcp_ses->tcpStatus = CifsNew;
2175 ++tcp_ses->srv_count;
2177 rc = ip_connect(tcp_ses);
2179 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2180 goto out_err_crypto_release;
2184 * since we're in a cifs function already, we know that
2185 * this will succeed. No need for try_module_get().
2187 __module_get(THIS_MODULE);
2188 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2190 if (IS_ERR(tcp_ses->tsk)) {
2191 rc = PTR_ERR(tcp_ses->tsk);
2192 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2193 module_put(THIS_MODULE);
2194 goto out_err_crypto_release;
2196 tcp_ses->tcpStatus = CifsNeedNegotiate;
2198 /* thread spawned, put it on the list */
2199 spin_lock(&cifs_tcp_ses_lock);
2200 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2201 spin_unlock(&cifs_tcp_ses_lock);
2203 cifs_fscache_get_client_cookie(tcp_ses);
2205 /* queue echo request delayed work */
2206 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2210 out_err_crypto_release:
2211 cifs_crypto_shash_release(tcp_ses);
2213 put_net(cifs_net_ns(tcp_ses));
2217 if (!IS_ERR(tcp_ses->hostname))
2218 kfree(tcp_ses->hostname);
2219 if (tcp_ses->ssocket)
2220 sock_release(tcp_ses->ssocket);
2226 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2228 if (vol->sectype != Unspecified &&
2229 vol->sectype != ses->sectype)
2232 switch (ses->sectype) {
2234 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2238 /* NULL username means anonymous session */
2239 if (ses->user_name == NULL) {
2245 /* anything else takes username/password */
2246 if (strncmp(ses->user_name,
2247 vol->username ? vol->username : "",
2248 CIFS_MAX_USERNAME_LEN))
2250 if ((vol->username && strlen(vol->username) != 0) &&
2251 ses->password != NULL &&
2252 strncmp(ses->password,
2253 vol->password ? vol->password : "",
2254 CIFS_MAX_PASSWORD_LEN))
2260 static struct cifs_ses *
2261 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2263 struct cifs_ses *ses;
2265 spin_lock(&cifs_tcp_ses_lock);
2266 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2267 if (ses->status == CifsExiting)
2269 if (!match_session(ses, vol))
2272 spin_unlock(&cifs_tcp_ses_lock);
2275 spin_unlock(&cifs_tcp_ses_lock);
2280 cifs_put_smb_ses(struct cifs_ses *ses)
2282 unsigned int rc, xid;
2283 struct TCP_Server_Info *server = ses->server;
2285 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2287 spin_lock(&cifs_tcp_ses_lock);
2288 if (ses->status == CifsExiting) {
2289 spin_unlock(&cifs_tcp_ses_lock);
2292 if (--ses->ses_count > 0) {
2293 spin_unlock(&cifs_tcp_ses_lock);
2296 if (ses->status == CifsGood)
2297 ses->status = CifsExiting;
2298 spin_unlock(&cifs_tcp_ses_lock);
2300 if (ses->status == CifsExiting && server->ops->logoff) {
2302 rc = server->ops->logoff(xid, ses);
2304 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2309 spin_lock(&cifs_tcp_ses_lock);
2310 list_del_init(&ses->smb_ses_list);
2311 spin_unlock(&cifs_tcp_ses_lock);
2314 cifs_put_tcp_session(server);
2319 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2320 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2322 /* Populate username and pw fields from keyring if possible */
2324 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2327 char *desc, *delim, *payload;
2330 struct TCP_Server_Info *server = ses->server;
2331 struct sockaddr_in *sa;
2332 struct sockaddr_in6 *sa6;
2333 struct user_key_payload *upayload;
2335 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2339 /* try to find an address key first */
2340 switch (server->dstaddr.ss_family) {
2342 sa = (struct sockaddr_in *)&server->dstaddr;
2343 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2346 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2347 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2350 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2351 server->dstaddr.ss_family);
2356 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2357 key = request_key(&key_type_logon, desc, "");
2359 if (!ses->domainName) {
2360 cifs_dbg(FYI, "domainName is NULL\n");
2365 /* didn't work, try to find a domain key */
2366 sprintf(desc, "cifs:d:%s", ses->domainName);
2367 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2368 key = request_key(&key_type_logon, desc, "");
2375 down_read(&key->sem);
2376 upayload = key->payload.data;
2377 if (IS_ERR_OR_NULL(upayload)) {
2378 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2382 /* find first : in payload */
2383 payload = (char *)upayload->data;
2384 delim = strnchr(payload, upayload->datalen, ':');
2385 cifs_dbg(FYI, "payload=%s\n", payload);
2387 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2393 len = delim - payload;
2394 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2395 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2401 vol->username = kstrndup(payload, len, GFP_KERNEL);
2402 if (!vol->username) {
2403 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2408 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2410 len = key->datalen - (len + 1);
2411 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2412 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2414 kfree(vol->username);
2415 vol->username = NULL;
2420 vol->password = kstrndup(delim, len, GFP_KERNEL);
2421 if (!vol->password) {
2422 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2425 kfree(vol->username);
2426 vol->username = NULL;
2435 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2438 #else /* ! CONFIG_KEYS */
2440 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2441 struct cifs_ses *ses __attribute__((unused)))
2445 #endif /* CONFIG_KEYS */
2447 static struct cifs_ses *
2448 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2452 struct cifs_ses *ses;
2453 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2454 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2458 ses = cifs_find_smb_ses(server, volume_info);
2460 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2463 mutex_lock(&ses->session_mutex);
2464 rc = cifs_negotiate_protocol(xid, ses);
2466 mutex_unlock(&ses->session_mutex);
2467 /* problem -- put our ses reference */
2468 cifs_put_smb_ses(ses);
2472 if (ses->need_reconnect) {
2473 cifs_dbg(FYI, "Session needs reconnect\n");
2474 rc = cifs_setup_session(xid, ses,
2475 volume_info->local_nls);
2477 mutex_unlock(&ses->session_mutex);
2478 /* problem -- put our reference */
2479 cifs_put_smb_ses(ses);
2484 mutex_unlock(&ses->session_mutex);
2486 /* existing SMB ses has a server reference already */
2487 cifs_put_tcp_session(server);
2492 cifs_dbg(FYI, "Existing smb sess not found\n");
2493 ses = sesInfoAlloc();
2497 /* new SMB session uses our server ref */
2498 ses->server = server;
2499 if (server->dstaddr.ss_family == AF_INET6)
2500 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2502 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2504 if (volume_info->username) {
2505 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2506 if (!ses->user_name)
2510 /* volume_info->password freed at unmount */
2511 if (volume_info->password) {
2512 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2516 if (volume_info->domainname) {
2517 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2518 if (!ses->domainName)
2521 ses->cred_uid = volume_info->cred_uid;
2522 ses->linux_uid = volume_info->linux_uid;
2524 ses->sectype = volume_info->sectype;
2525 ses->sign = volume_info->sign;
2527 mutex_lock(&ses->session_mutex);
2528 rc = cifs_negotiate_protocol(xid, ses);
2530 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2531 mutex_unlock(&ses->session_mutex);
2535 /* success, put it on the list */
2536 spin_lock(&cifs_tcp_ses_lock);
2537 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2538 spin_unlock(&cifs_tcp_ses_lock);
2549 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2551 if (tcon->tidStatus == CifsExiting)
2553 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2558 static struct cifs_tcon *
2559 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2561 struct list_head *tmp;
2562 struct cifs_tcon *tcon;
2564 spin_lock(&cifs_tcp_ses_lock);
2565 list_for_each(tmp, &ses->tcon_list) {
2566 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2567 if (!match_tcon(tcon, unc))
2570 spin_unlock(&cifs_tcp_ses_lock);
2573 spin_unlock(&cifs_tcp_ses_lock);
2578 cifs_put_tcon(struct cifs_tcon *tcon)
2581 struct cifs_ses *ses = tcon->ses;
2583 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2584 spin_lock(&cifs_tcp_ses_lock);
2585 if (--tcon->tc_count > 0) {
2586 spin_unlock(&cifs_tcp_ses_lock);
2590 list_del_init(&tcon->tcon_list);
2591 spin_unlock(&cifs_tcp_ses_lock);
2594 if (ses->server->ops->tree_disconnect)
2595 ses->server->ops->tree_disconnect(xid, tcon);
2598 cifs_fscache_release_super_cookie(tcon);
2600 cifs_put_smb_ses(ses);
2603 static struct cifs_tcon *
2604 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2607 struct cifs_tcon *tcon;
2609 tcon = cifs_find_tcon(ses, volume_info->UNC);
2611 cifs_dbg(FYI, "Found match on UNC path\n");
2612 /* existing tcon already has a reference */
2613 cifs_put_smb_ses(ses);
2614 if (tcon->seal != volume_info->seal)
2615 cifs_dbg(VFS, "transport encryption setting conflicts with existing tid\n");
2619 if (!ses->server->ops->tree_connect) {
2624 tcon = tconInfoAlloc();
2631 if (volume_info->password) {
2632 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2633 if (!tcon->password) {
2640 * BB Do we need to wrap session_mutex around this TCon call and Unix
2641 * SetFS as we do on SessSetup and reconnect?
2644 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2645 volume_info->local_nls);
2647 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2651 if (volume_info->nodfs) {
2652 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2653 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
2655 tcon->seal = volume_info->seal;
2657 * We can have only one retry value for a connection to a share so for
2658 * resources mounted more than once to the same server share the last
2659 * value passed in for the retry flag is used.
2661 tcon->retry = volume_info->retry;
2662 tcon->nocase = volume_info->nocase;
2663 tcon->local_lease = volume_info->local_lease;
2664 INIT_LIST_HEAD(&tcon->pending_opens);
2666 spin_lock(&cifs_tcp_ses_lock);
2667 list_add(&tcon->tcon_list, &ses->tcon_list);
2668 spin_unlock(&cifs_tcp_ses_lock);
2670 cifs_fscache_get_super_cookie(tcon);
2680 cifs_put_tlink(struct tcon_link *tlink)
2682 if (!tlink || IS_ERR(tlink))
2685 if (!atomic_dec_and_test(&tlink->tl_count) ||
2686 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2687 tlink->tl_time = jiffies;
2691 if (!IS_ERR(tlink_tcon(tlink)))
2692 cifs_put_tcon(tlink_tcon(tlink));
2697 static inline struct tcon_link *
2698 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2700 return cifs_sb->master_tlink;
2704 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2706 struct cifs_sb_info *old = CIFS_SB(sb);
2707 struct cifs_sb_info *new = mnt_data->cifs_sb;
2709 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2712 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2713 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2717 * We want to share sb only if we don't specify an r/wsize or
2718 * specified r/wsize is greater than or equal to existing one.
2720 if (new->wsize && new->wsize < old->wsize)
2723 if (new->rsize && new->rsize < old->rsize)
2726 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
2729 if (old->mnt_file_mode != new->mnt_file_mode ||
2730 old->mnt_dir_mode != new->mnt_dir_mode)
2733 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2736 if (old->actimeo != new->actimeo)
2743 cifs_match_super(struct super_block *sb, void *data)
2745 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2746 struct smb_vol *volume_info;
2747 struct cifs_sb_info *cifs_sb;
2748 struct TCP_Server_Info *tcp_srv;
2749 struct cifs_ses *ses;
2750 struct cifs_tcon *tcon;
2751 struct tcon_link *tlink;
2754 spin_lock(&cifs_tcp_ses_lock);
2755 cifs_sb = CIFS_SB(sb);
2756 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2757 if (IS_ERR(tlink)) {
2758 spin_unlock(&cifs_tcp_ses_lock);
2761 tcon = tlink_tcon(tlink);
2763 tcp_srv = ses->server;
2765 volume_info = mnt_data->vol;
2767 if (!match_server(tcp_srv, volume_info) ||
2768 !match_session(ses, volume_info) ||
2769 !match_tcon(tcon, volume_info->UNC)) {
2774 rc = compare_mount_options(sb, mnt_data);
2776 spin_unlock(&cifs_tcp_ses_lock);
2777 cifs_put_tlink(tlink);
2782 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2783 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2784 struct dfs_info3_param **referrals, int remap)
2789 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2795 if (ses->ipc_tid == 0) {
2796 temp_unc = kmalloc(2 /* for slashes */ +
2797 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2798 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2799 if (temp_unc == NULL)
2803 strcpy(temp_unc + 2, ses->serverName);
2804 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2805 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
2807 cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
2811 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
2812 referrals, num_referrals,
2813 nls_codepage, remap);
2815 * BB - map targetUNCs to dfs_info3 structures, here or in
2816 * ses->server->ops->get_dfs_refer.
2822 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2823 static struct lock_class_key cifs_key[2];
2824 static struct lock_class_key cifs_slock_key[2];
2827 cifs_reclassify_socket4(struct socket *sock)
2829 struct sock *sk = sock->sk;
2830 BUG_ON(sock_owned_by_user(sk));
2831 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2832 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2836 cifs_reclassify_socket6(struct socket *sock)
2838 struct sock *sk = sock->sk;
2839 BUG_ON(sock_owned_by_user(sk));
2840 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2841 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2845 cifs_reclassify_socket4(struct socket *sock)
2850 cifs_reclassify_socket6(struct socket *sock)
2855 /* See RFC1001 section 14 on representation of Netbios names */
2856 static void rfc1002mangle(char *target, char *source, unsigned int length)
2860 for (i = 0, j = 0; i < (length); i++) {
2861 /* mask a nibble at a time and encode */
2862 target[j] = 'A' + (0x0F & (source[i] >> 4));
2863 target[j+1] = 'A' + (0x0F & source[i]);
2870 bind_socket(struct TCP_Server_Info *server)
2873 if (server->srcaddr.ss_family != AF_UNSPEC) {
2874 /* Bind to the specified local IP address */
2875 struct socket *socket = server->ssocket;
2876 rc = socket->ops->bind(socket,
2877 (struct sockaddr *) &server->srcaddr,
2878 sizeof(server->srcaddr));
2880 struct sockaddr_in *saddr4;
2881 struct sockaddr_in6 *saddr6;
2882 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2883 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2884 if (saddr6->sin6_family == AF_INET6)
2885 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2886 &saddr6->sin6_addr, rc);
2888 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2889 &saddr4->sin_addr.s_addr, rc);
2896 ip_rfc1001_connect(struct TCP_Server_Info *server)
2900 * some servers require RFC1001 sessinit before sending
2901 * negprot - BB check reconnection in case where second
2902 * sessinit is sent but no second negprot
2904 struct rfc1002_session_packet *ses_init_buf;
2905 struct smb_hdr *smb_buf;
2906 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2909 ses_init_buf->trailer.session_req.called_len = 32;
2911 if (server->server_RFC1001_name &&
2912 server->server_RFC1001_name[0] != 0)
2913 rfc1002mangle(ses_init_buf->trailer.
2914 session_req.called_name,
2915 server->server_RFC1001_name,
2916 RFC1001_NAME_LEN_WITH_NULL);
2918 rfc1002mangle(ses_init_buf->trailer.
2919 session_req.called_name,
2920 DEFAULT_CIFS_CALLED_NAME,
2921 RFC1001_NAME_LEN_WITH_NULL);
2923 ses_init_buf->trailer.session_req.calling_len = 32;
2926 * calling name ends in null (byte 16) from old smb
2929 if (server->workstation_RFC1001_name[0] != 0)
2930 rfc1002mangle(ses_init_buf->trailer.
2931 session_req.calling_name,
2932 server->workstation_RFC1001_name,
2933 RFC1001_NAME_LEN_WITH_NULL);
2935 rfc1002mangle(ses_init_buf->trailer.
2936 session_req.calling_name,
2938 RFC1001_NAME_LEN_WITH_NULL);
2940 ses_init_buf->trailer.session_req.scope1 = 0;
2941 ses_init_buf->trailer.session_req.scope2 = 0;
2942 smb_buf = (struct smb_hdr *)ses_init_buf;
2944 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2945 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2946 rc = smb_send(server, smb_buf, 0x44);
2947 kfree(ses_init_buf);
2949 * RFC1001 layer in at least one server
2950 * requires very short break before negprot
2951 * presumably because not expecting negprot
2952 * to follow so fast. This is a simple
2953 * solution that works without
2954 * complicating the code and causes no
2955 * significant slowing down on mount
2958 usleep_range(1000, 2000);
2961 * else the negprot may still work without this
2962 * even though malloc failed
2969 generic_ip_connect(struct TCP_Server_Info *server)
2974 struct socket *socket = server->ssocket;
2975 struct sockaddr *saddr;
2977 saddr = (struct sockaddr *) &server->dstaddr;
2979 if (server->dstaddr.ss_family == AF_INET6) {
2980 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2981 slen = sizeof(struct sockaddr_in6);
2984 sport = ((struct sockaddr_in *) saddr)->sin_port;
2985 slen = sizeof(struct sockaddr_in);
2989 if (socket == NULL) {
2990 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2991 IPPROTO_TCP, &socket, 1);
2993 cifs_dbg(VFS, "Error %d creating socket\n", rc);
2994 server->ssocket = NULL;
2998 /* BB other socket options to set KEEPALIVE, NODELAY? */
2999 cifs_dbg(FYI, "Socket created\n");
3000 server->ssocket = socket;
3001 socket->sk->sk_allocation = GFP_NOFS;
3002 if (sfamily == AF_INET6)
3003 cifs_reclassify_socket6(socket);
3005 cifs_reclassify_socket4(socket);
3008 rc = bind_socket(server);
3013 * Eventually check for other socket options to change from
3014 * the default. sock_setsockopt not used because it expects
3017 socket->sk->sk_rcvtimeo = 7 * HZ;
3018 socket->sk->sk_sndtimeo = 5 * HZ;
3020 /* make the bufsizes depend on wsize/rsize and max requests */
3021 if (server->noautotune) {
3022 if (socket->sk->sk_sndbuf < (200 * 1024))
3023 socket->sk->sk_sndbuf = 200 * 1024;
3024 if (socket->sk->sk_rcvbuf < (140 * 1024))
3025 socket->sk->sk_rcvbuf = 140 * 1024;
3028 if (server->tcp_nodelay) {
3030 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3031 (char *)&val, sizeof(val));
3033 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3037 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3038 socket->sk->sk_sndbuf,
3039 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3041 rc = socket->ops->connect(socket, saddr, slen, 0);
3043 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3044 sock_release(socket);
3045 server->ssocket = NULL;
3049 if (sport == htons(RFC1001_PORT))
3050 rc = ip_rfc1001_connect(server);
3056 ip_connect(struct TCP_Server_Info *server)
3059 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3060 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3062 if (server->dstaddr.ss_family == AF_INET6)
3063 sport = &addr6->sin6_port;
3065 sport = &addr->sin_port;
3070 /* try with 445 port at first */
3071 *sport = htons(CIFS_PORT);
3073 rc = generic_ip_connect(server);
3077 /* if it failed, try with 139 port */
3078 *sport = htons(RFC1001_PORT);
3081 return generic_ip_connect(server);
3084 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3085 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3087 /* if we are reconnecting then should we check to see if
3088 * any requested capabilities changed locally e.g. via
3089 * remount but we can not do much about it here
3090 * if they have (even if we could detect it by the following)
3091 * Perhaps we could add a backpointer to array of sb from tcon
3092 * or if we change to make all sb to same share the same
3093 * sb as NFS - then we only have one backpointer to sb.
3094 * What if we wanted to mount the server share twice once with
3095 * and once without posixacls or posix paths? */
3096 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3098 if (vol_info && vol_info->no_linux_ext) {
3099 tcon->fsUnixInfo.Capability = 0;
3100 tcon->unix_ext = 0; /* Unix Extensions disabled */
3101 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3103 } else if (vol_info)
3104 tcon->unix_ext = 1; /* Unix Extensions supported */
3106 if (tcon->unix_ext == 0) {
3107 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3111 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3112 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3113 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3114 /* check for reconnect case in which we do not
3115 want to change the mount behavior if we can avoid it */
3116 if (vol_info == NULL) {
3117 /* turn off POSIX ACL and PATHNAMES if not set
3118 originally at mount time */
3119 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3120 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3121 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3122 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3123 cifs_dbg(VFS, "POSIXPATH support change\n");
3124 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3125 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3126 cifs_dbg(VFS, "possible reconnect error\n");
3127 cifs_dbg(VFS, "server disabled POSIX path support\n");
3131 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3132 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3134 cap &= CIFS_UNIX_CAP_MASK;
3135 if (vol_info && vol_info->no_psx_acl)
3136 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3137 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3138 cifs_dbg(FYI, "negotiated posix acl support\n");
3140 cifs_sb->mnt_cifs_flags |=
3141 CIFS_MOUNT_POSIXACL;
3144 if (vol_info && vol_info->posix_paths == 0)
3145 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3146 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3147 cifs_dbg(FYI, "negotiate posix pathnames\n");
3149 cifs_sb->mnt_cifs_flags |=
3150 CIFS_MOUNT_POSIX_PATHS;
3153 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3154 #ifdef CONFIG_CIFS_DEBUG2
3155 if (cap & CIFS_UNIX_FCNTL_CAP)
3156 cifs_dbg(FYI, "FCNTL cap\n");
3157 if (cap & CIFS_UNIX_EXTATTR_CAP)
3158 cifs_dbg(FYI, "EXTATTR cap\n");
3159 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3160 cifs_dbg(FYI, "POSIX path cap\n");
3161 if (cap & CIFS_UNIX_XATTR_CAP)
3162 cifs_dbg(FYI, "XATTR cap\n");
3163 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3164 cifs_dbg(FYI, "POSIX ACL cap\n");
3165 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3166 cifs_dbg(FYI, "very large read cap\n");
3167 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3168 cifs_dbg(FYI, "very large write cap\n");
3169 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3170 cifs_dbg(FYI, "transport encryption cap\n");
3171 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3172 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3173 #endif /* CIFS_DEBUG2 */
3174 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3175 if (vol_info == NULL) {
3176 cifs_dbg(FYI, "resetting capabilities failed\n");
3178 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");
3184 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3185 struct cifs_sb_info *cifs_sb)
3187 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3189 spin_lock_init(&cifs_sb->tlink_tree_lock);
3190 cifs_sb->tlink_tree = RB_ROOT;
3193 * Temporarily set r/wsize for matching superblock. If we end up using
3194 * new sb then client will later negotiate it downward if needed.
3196 cifs_sb->rsize = pvolume_info->rsize;
3197 cifs_sb->wsize = pvolume_info->wsize;
3199 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3200 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3201 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3202 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3203 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3204 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3206 cifs_sb->actimeo = pvolume_info->actimeo;
3207 cifs_sb->local_nls = pvolume_info->local_nls;
3209 if (pvolume_info->noperm)
3210 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3211 if (pvolume_info->setuids)
3212 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3213 if (pvolume_info->server_ino)
3214 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3215 if (pvolume_info->remap)
3216 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3217 if (pvolume_info->sfu_remap)
3218 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3219 if (pvolume_info->no_xattr)
3220 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3221 if (pvolume_info->sfu_emul)
3222 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3223 if (pvolume_info->nobrl)
3224 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3225 if (pvolume_info->nostrictsync)
3226 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3227 if (pvolume_info->mand_lock)
3228 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3229 if (pvolume_info->rwpidforward)
3230 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3231 if (pvolume_info->cifs_acl)
3232 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3233 if (pvolume_info->backupuid_specified) {
3234 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3235 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3237 if (pvolume_info->backupgid_specified) {
3238 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3239 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3241 if (pvolume_info->override_uid)
3242 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3243 if (pvolume_info->override_gid)
3244 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3245 if (pvolume_info->dynperm)
3246 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3247 if (pvolume_info->fsc)
3248 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3249 if (pvolume_info->multiuser)
3250 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3251 CIFS_MOUNT_NO_PERM);
3252 if (pvolume_info->strict_io)
3253 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3254 if (pvolume_info->direct_io) {
3255 cifs_dbg(FYI, "mounting share using direct i/o\n");
3256 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3258 if (pvolume_info->mfsymlinks) {
3259 if (pvolume_info->sfu_emul) {
3261 * Our SFU ("Services for Unix" emulation does not allow
3262 * creating symlinks but does allow reading existing SFU
3263 * symlinks (it does allow both creating and reading SFU
3264 * style mknod and FIFOs though). When "mfsymlinks" and
3265 * "sfu" are both enabled at the same time, it allows
3266 * reading both types of symlinks, but will only create
3267 * them with mfsymlinks format. This allows better
3268 * Apple compatibility (probably better for Samba too)
3269 * while still recognizing old Windows style symlinks.
3271 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3273 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3276 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3277 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3281 cleanup_volume_info_contents(struct smb_vol *volume_info)
3283 kfree(volume_info->username);
3284 kzfree(volume_info->password);
3285 kfree(volume_info->UNC);
3286 kfree(volume_info->domainname);
3287 kfree(volume_info->iocharset);
3288 kfree(volume_info->prepath);
3292 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3296 cleanup_volume_info_contents(volume_info);
3301 #ifdef CONFIG_CIFS_DFS_UPCALL
3303 * cifs_build_path_to_root returns full path to root when we do not have an
3304 * exiting connection (tcon)
3307 build_unc_path_to_root(const struct smb_vol *vol,
3308 const struct cifs_sb_info *cifs_sb)
3310 char *full_path, *pos;
3311 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3312 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3314 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3315 if (full_path == NULL)
3316 return ERR_PTR(-ENOMEM);
3318 strncpy(full_path, vol->UNC, unc_len);
3319 pos = full_path + unc_len;
3322 *pos = CIFS_DIR_SEP(cifs_sb);
3323 strncpy(pos + 1, vol->prepath, pplen);
3327 *pos = '\0'; /* add trailing null */
3328 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3329 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3334 * Perform a dfs referral query for a share and (optionally) prefix
3336 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3337 * to a string containing updated options for the submount. Otherwise it
3338 * will be left untouched.
3340 * Returns the rc from get_dfs_path to the caller, which can be used to
3341 * determine whether there were referrals.
3344 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3345 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3349 unsigned int num_referrals = 0;
3350 struct dfs_info3_param *referrals = NULL;
3351 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3353 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3354 if (IS_ERR(full_path))
3355 return PTR_ERR(full_path);
3357 /* For DFS paths, skip the first '\' of the UNC */
3358 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3360 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3361 &num_referrals, &referrals, cifs_remap(cifs_sb));
3363 if (!rc && num_referrals > 0) {
3364 char *fake_devname = NULL;
3366 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3367 full_path + 1, referrals,
3370 free_dfs_info_array(referrals, num_referrals);
3372 if (IS_ERR(mdata)) {
3373 rc = PTR_ERR(mdata);
3376 cleanup_volume_info_contents(volume_info);
3377 rc = cifs_setup_volume_info(volume_info, mdata,
3380 kfree(fake_devname);
3381 kfree(cifs_sb->mountdata);
3382 cifs_sb->mountdata = mdata;
3390 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3391 const char *devname)
3395 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3398 if (volume_info->nullauth) {
3399 cifs_dbg(FYI, "Anonymous login\n");
3400 kfree(volume_info->username);
3401 volume_info->username = NULL;
3402 } else if (volume_info->username) {
3403 /* BB fixme parse for domain name here */
3404 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3406 cifs_dbg(VFS, "No username specified\n");
3407 /* In userspace mount helper we can get user name from alternate
3408 locations such as env variables and files on disk */
3412 /* this is needed for ASCII cp to Unicode converts */
3413 if (volume_info->iocharset == NULL) {
3414 /* load_nls_default cannot return null */
3415 volume_info->local_nls = load_nls_default();
3417 volume_info->local_nls = load_nls(volume_info->iocharset);
3418 if (volume_info->local_nls == NULL) {
3419 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3420 volume_info->iocharset);
3429 cifs_get_volume_info(char *mount_data, const char *devname)
3432 struct smb_vol *volume_info;
3434 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3436 return ERR_PTR(-ENOMEM);
3438 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3440 cifs_cleanup_volume_info(volume_info);
3441 volume_info = ERR_PTR(rc);
3448 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3452 struct cifs_ses *ses;
3453 struct cifs_tcon *tcon;
3454 struct TCP_Server_Info *server;
3456 struct tcon_link *tlink;
3457 #ifdef CONFIG_CIFS_DFS_UPCALL
3458 int referral_walks_count = 0;
3461 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs");
3465 #ifdef CONFIG_CIFS_DFS_UPCALL
3467 /* cleanup activities if we're chasing a referral */
3468 if (referral_walks_count) {
3470 cifs_put_tcon(tcon);
3472 cifs_put_smb_ses(ses);
3486 /* get a reference to a tcp session */
3487 server = cifs_get_tcp_session(volume_info);
3488 if (IS_ERR(server)) {
3489 rc = PTR_ERR(server);
3490 bdi_destroy(&cifs_sb->bdi);
3494 /* get a reference to a SMB session */
3495 ses = cifs_get_smb_ses(server, volume_info);
3499 goto mount_fail_check;
3502 /* search for existing tcon to this server share */
3503 tcon = cifs_get_tcon(ses, volume_info);
3507 goto remote_path_check;
3510 /* tell server which Unix caps we support */
3511 if (cap_unix(tcon->ses)) {
3512 /* reset of caps checks mount to see if unix extensions
3513 disabled for just this mount */
3514 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3515 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3516 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3517 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3519 goto mount_fail_check;
3522 tcon->unix_ext = 0; /* server does not support them */
3524 /* do not care if a following call succeed - informational */
3525 if (!tcon->ipc && server->ops->qfs_tcon)
3526 server->ops->qfs_tcon(xid, tcon);
3528 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3529 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3531 /* tune readahead according to rsize */
3532 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3535 #ifdef CONFIG_CIFS_DFS_UPCALL
3537 * Perform an unconditional check for whether there are DFS
3538 * referrals for this path without prefix, to provide support
3539 * for DFS referrals from w2k8 servers which don't seem to respond
3540 * with PATH_NOT_COVERED to requests that include the prefix.
3541 * Chase the referral if found, otherwise continue normally.
3543 if (referral_walks_count == 0) {
3544 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3547 referral_walks_count++;
3548 goto try_mount_again;
3553 /* check if a whole path is not remote */
3555 if (!server->ops->is_path_accessible) {
3557 goto mount_fail_check;
3560 * cifs_build_path_to_root works only when we have a valid tcon
3562 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3563 if (full_path == NULL) {
3565 goto mount_fail_check;
3567 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3569 if (rc != 0 && rc != -EREMOTE) {
3571 goto mount_fail_check;
3576 /* get referral if needed */
3577 if (rc == -EREMOTE) {
3578 #ifdef CONFIG_CIFS_DFS_UPCALL
3579 if (referral_walks_count > MAX_NESTED_LINKS) {
3581 * BB: when we implement proper loop detection,
3582 * we will remove this check. But now we need it
3583 * to prevent an indefinite loop if 'DFS tree' is
3584 * misconfigured (i.e. has loops).
3587 goto mount_fail_check;
3590 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3593 referral_walks_count++;
3594 goto try_mount_again;
3596 goto mount_fail_check;
3597 #else /* No DFS support, return error on mount */
3603 goto mount_fail_check;
3605 /* now, hang the tcon off of the superblock */
3606 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3607 if (tlink == NULL) {
3609 goto mount_fail_check;
3612 tlink->tl_uid = ses->linux_uid;
3613 tlink->tl_tcon = tcon;
3614 tlink->tl_time = jiffies;
3615 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3616 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3618 cifs_sb->master_tlink = tlink;
3619 spin_lock(&cifs_sb->tlink_tree_lock);
3620 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3621 spin_unlock(&cifs_sb->tlink_tree_lock);
3623 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3627 /* on error free sesinfo and tcon struct if needed */
3629 /* If find_unc succeeded then rc == 0 so we can not end */
3630 /* up accidentally freeing someone elses tcon struct */
3632 cifs_put_tcon(tcon);
3634 cifs_put_smb_ses(ses);
3636 cifs_put_tcp_session(server);
3637 bdi_destroy(&cifs_sb->bdi);
3646 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3647 * pointer may be NULL.
3650 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3651 const char *tree, struct cifs_tcon *tcon,
3652 const struct nls_table *nls_codepage)
3654 struct smb_hdr *smb_buffer;
3655 struct smb_hdr *smb_buffer_response;
3658 unsigned char *bcc_ptr;
3661 __u16 bytes_left, count;
3666 smb_buffer = cifs_buf_get();
3667 if (smb_buffer == NULL)
3670 smb_buffer_response = smb_buffer;
3672 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3673 NULL /*no tid */ , 4 /*wct */ );
3675 smb_buffer->Mid = get_next_mid(ses->server);
3676 smb_buffer->Uid = ses->Suid;
3677 pSMB = (TCONX_REQ *) smb_buffer;
3678 pSMBr = (TCONX_RSP *) smb_buffer_response;
3680 pSMB->AndXCommand = 0xFF;
3681 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3682 bcc_ptr = &pSMB->Password[0];
3683 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3684 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3685 *bcc_ptr = 0; /* password is null byte */
3686 bcc_ptr++; /* skip password */
3687 /* already aligned so no need to do it below */
3689 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3690 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3691 specified as required (when that support is added to
3692 the vfs in the future) as only NTLM or the much
3693 weaker LANMAN (which we do not send by default) is accepted
3694 by Samba (not sure whether other servers allow
3695 NTLMv2 password here) */
3696 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3697 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3698 (ses->sectype == LANMAN))
3699 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3700 ses->server->sec_mode &
3701 SECMODE_PW_ENCRYPT ? true : false,
3704 #endif /* CIFS_WEAK_PW_HASH */
3705 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3706 bcc_ptr, nls_codepage);
3708 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3710 cifs_buf_release(smb_buffer);
3714 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3715 if (ses->capabilities & CAP_UNICODE) {
3716 /* must align unicode strings */
3717 *bcc_ptr = 0; /* null byte password */
3722 if (ses->server->sign)
3723 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3725 if (ses->capabilities & CAP_STATUS32) {
3726 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3728 if (ses->capabilities & CAP_DFS) {
3729 smb_buffer->Flags2 |= SMBFLG2_DFS;
3731 if (ses->capabilities & CAP_UNICODE) {
3732 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3734 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3735 6 /* max utf8 char length in bytes */ *
3736 (/* server len*/ + 256 /* share len */), nls_codepage);
3737 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3738 bcc_ptr += 2; /* skip trailing null */
3739 } else { /* ASCII */
3740 strcpy(bcc_ptr, tree);
3741 bcc_ptr += strlen(tree) + 1;
3743 strcpy(bcc_ptr, "?????");
3744 bcc_ptr += strlen("?????");
3746 count = bcc_ptr - &pSMB->Password[0];
3747 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3748 pSMB->hdr.smb_buf_length) + count);
3749 pSMB->ByteCount = cpu_to_le16(count);
3751 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3754 /* above now done in SendReceive */
3755 if ((rc == 0) && (tcon != NULL)) {
3758 tcon->tidStatus = CifsGood;
3759 tcon->need_reconnect = false;
3760 tcon->tid = smb_buffer_response->Tid;
3761 bcc_ptr = pByteArea(smb_buffer_response);
3762 bytes_left = get_bcc(smb_buffer_response);
3763 length = strnlen(bcc_ptr, bytes_left - 2);
3764 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3770 /* skip service field (NB: this field is always ASCII) */
3772 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3773 (bcc_ptr[2] == 'C')) {
3774 cifs_dbg(FYI, "IPC connection\n");
3777 } else if (length == 2) {
3778 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3779 /* the most common case */
3780 cifs_dbg(FYI, "disk share connection\n");
3783 bcc_ptr += length + 1;
3784 bytes_left -= (length + 1);
3785 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3787 /* mostly informational -- no need to fail on error here */
3788 kfree(tcon->nativeFileSystem);
3789 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3790 bytes_left, is_unicode,
3793 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3795 if ((smb_buffer_response->WordCount == 3) ||
3796 (smb_buffer_response->WordCount == 7))
3797 /* field is in same location */
3798 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3801 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3802 } else if ((rc == 0) && tcon == NULL) {
3803 /* all we need to save for IPC$ connection */
3804 ses->ipc_tid = smb_buffer_response->Tid;
3807 cifs_buf_release(smb_buffer);
3811 static void delayed_free(struct rcu_head *p)
3813 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
3814 unload_nls(sbi->local_nls);
3819 cifs_umount(struct cifs_sb_info *cifs_sb)
3821 struct rb_root *root = &cifs_sb->tlink_tree;
3822 struct rb_node *node;
3823 struct tcon_link *tlink;
3825 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3827 spin_lock(&cifs_sb->tlink_tree_lock);
3828 while ((node = rb_first(root))) {
3829 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3830 cifs_get_tlink(tlink);
3831 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3832 rb_erase(node, root);
3834 spin_unlock(&cifs_sb->tlink_tree_lock);
3835 cifs_put_tlink(tlink);
3836 spin_lock(&cifs_sb->tlink_tree_lock);
3838 spin_unlock(&cifs_sb->tlink_tree_lock);
3840 bdi_destroy(&cifs_sb->bdi);
3841 kfree(cifs_sb->mountdata);
3842 call_rcu(&cifs_sb->rcu, delayed_free);
3846 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3849 struct TCP_Server_Info *server = ses->server;
3851 if (!server->ops->need_neg || !server->ops->negotiate)
3854 /* only send once per connect */
3855 if (!server->ops->need_neg(server))
3858 set_credits(server, 1);
3860 rc = server->ops->negotiate(xid, ses);
3862 spin_lock(&GlobalMid_Lock);
3863 if (server->tcpStatus == CifsNeedNegotiate)
3864 server->tcpStatus = CifsGood;
3867 spin_unlock(&GlobalMid_Lock);
3874 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3875 struct nls_table *nls_info)
3878 struct TCP_Server_Info *server = ses->server;
3880 ses->capabilities = server->capabilities;
3881 if (linuxExtEnabled == 0)
3882 ses->capabilities &= (~server->vals->cap_unix);
3884 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3885 server->sec_mode, server->capabilities, server->timeAdj);
3887 if (server->ops->sess_setup)
3888 rc = server->ops->sess_setup(xid, ses, nls_info);
3891 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3897 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
3899 vol->sectype = ses->sectype;
3901 /* krb5 is special, since we don't need username or pw */
3902 if (vol->sectype == Kerberos)
3905 return cifs_set_cifscreds(vol, ses);
3908 static struct cifs_tcon *
3909 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3912 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3913 struct cifs_ses *ses;
3914 struct cifs_tcon *tcon = NULL;
3915 struct smb_vol *vol_info;
3917 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3918 if (vol_info == NULL)
3919 return ERR_PTR(-ENOMEM);
3921 vol_info->local_nls = cifs_sb->local_nls;
3922 vol_info->linux_uid = fsuid;
3923 vol_info->cred_uid = fsuid;
3924 vol_info->UNC = master_tcon->treeName;
3925 vol_info->retry = master_tcon->retry;
3926 vol_info->nocase = master_tcon->nocase;
3927 vol_info->local_lease = master_tcon->local_lease;
3928 vol_info->no_linux_ext = !master_tcon->unix_ext;
3929 vol_info->sectype = master_tcon->ses->sectype;
3930 vol_info->sign = master_tcon->ses->sign;
3932 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
3938 /* get a reference for the same TCP session */
3939 spin_lock(&cifs_tcp_ses_lock);
3940 ++master_tcon->ses->server->srv_count;
3941 spin_unlock(&cifs_tcp_ses_lock);
3943 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3945 tcon = (struct cifs_tcon *)ses;
3946 cifs_put_tcp_session(master_tcon->ses->server);
3950 tcon = cifs_get_tcon(ses, vol_info);
3952 cifs_put_smb_ses(ses);
3957 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3959 kfree(vol_info->username);
3960 kfree(vol_info->password);
3967 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3969 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3972 /* find and return a tlink with given uid */
3973 static struct tcon_link *
3974 tlink_rb_search(struct rb_root *root, kuid_t uid)
3976 struct rb_node *node = root->rb_node;
3977 struct tcon_link *tlink;
3980 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3982 if (uid_gt(tlink->tl_uid, uid))
3983 node = node->rb_left;
3984 else if (uid_lt(tlink->tl_uid, uid))
3985 node = node->rb_right;
3992 /* insert a tcon_link into the tree */
3994 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3996 struct rb_node **new = &(root->rb_node), *parent = NULL;
3997 struct tcon_link *tlink;
4000 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4003 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4004 new = &((*new)->rb_left);
4006 new = &((*new)->rb_right);
4009 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4010 rb_insert_color(&new_tlink->tl_rbnode, root);
4014 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4017 * If the superblock doesn't refer to a multiuser mount, then just return
4018 * the master tcon for the mount.
4020 * First, search the rbtree for an existing tcon for this fsuid. If one
4021 * exists, then check to see if it's pending construction. If it is then wait
4022 * for construction to complete. Once it's no longer pending, check to see if
4023 * it failed and either return an error or retry construction, depending on
4026 * If one doesn't exist then insert a new tcon_link struct into the tree and
4027 * try to construct a new one.
4030 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4033 kuid_t fsuid = current_fsuid();
4034 struct tcon_link *tlink, *newtlink;
4036 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4037 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4039 spin_lock(&cifs_sb->tlink_tree_lock);
4040 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4042 cifs_get_tlink(tlink);
4043 spin_unlock(&cifs_sb->tlink_tree_lock);
4045 if (tlink == NULL) {
4046 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4047 if (newtlink == NULL)
4048 return ERR_PTR(-ENOMEM);
4049 newtlink->tl_uid = fsuid;
4050 newtlink->tl_tcon = ERR_PTR(-EACCES);
4051 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4052 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4053 cifs_get_tlink(newtlink);
4055 spin_lock(&cifs_sb->tlink_tree_lock);
4056 /* was one inserted after previous search? */
4057 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4059 cifs_get_tlink(tlink);
4060 spin_unlock(&cifs_sb->tlink_tree_lock);
4062 goto wait_for_construction;
4065 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4066 spin_unlock(&cifs_sb->tlink_tree_lock);
4068 wait_for_construction:
4069 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4070 TASK_INTERRUPTIBLE);
4072 cifs_put_tlink(tlink);
4073 return ERR_PTR(-ERESTARTSYS);
4076 /* if it's good, return it */
4077 if (!IS_ERR(tlink->tl_tcon))
4080 /* return error if we tried this already recently */
4081 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4082 cifs_put_tlink(tlink);
4083 return ERR_PTR(-EACCES);
4086 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4087 goto wait_for_construction;
4090 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4091 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4092 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4094 if (IS_ERR(tlink->tl_tcon)) {
4095 cifs_put_tlink(tlink);
4096 return ERR_PTR(-EACCES);
4103 * periodic workqueue job that scans tcon_tree for a superblock and closes
4107 cifs_prune_tlinks(struct work_struct *work)
4109 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4111 struct rb_root *root = &cifs_sb->tlink_tree;
4112 struct rb_node *node = rb_first(root);
4113 struct rb_node *tmp;
4114 struct tcon_link *tlink;
4117 * Because we drop the spinlock in the loop in order to put the tlink
4118 * it's not guarded against removal of links from the tree. The only
4119 * places that remove entries from the tree are this function and
4120 * umounts. Because this function is non-reentrant and is canceled
4121 * before umount can proceed, this is safe.
4123 spin_lock(&cifs_sb->tlink_tree_lock);
4124 node = rb_first(root);
4125 while (node != NULL) {
4127 node = rb_next(tmp);
4128 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4130 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4131 atomic_read(&tlink->tl_count) != 0 ||
4132 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4135 cifs_get_tlink(tlink);
4136 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4137 rb_erase(tmp, root);
4139 spin_unlock(&cifs_sb->tlink_tree_lock);
4140 cifs_put_tlink(tlink);
4141 spin_lock(&cifs_sb->tlink_tree_lock);
4143 spin_unlock(&cifs_sb->tlink_tree_lock);
4145 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,