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_mapchars, Opt_nomapchars, Opt_sfu,
74 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
75 Opt_noposixpaths, Opt_nounix,
78 Opt_forcemandatorylock, Opt_setuids,
79 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
80 Opt_nohard, Opt_nosoft,
82 Opt_nostrictsync, Opt_strictsync,
83 Opt_serverino, Opt_noserverino,
84 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
85 Opt_acl, Opt_noacl, Opt_locallease,
86 Opt_sign, Opt_seal, Opt_noac,
87 Opt_fsc, Opt_mfsymlinks,
88 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
90 /* Mount options which take numeric value */
91 Opt_backupuid, Opt_backupgid, Opt_uid,
92 Opt_cruid, Opt_gid, Opt_file_mode,
93 Opt_dirmode, Opt_port,
94 Opt_rsize, Opt_wsize, Opt_actimeo,
96 /* Mount options which take string value */
97 Opt_user, Opt_pass, Opt_ip,
98 Opt_domain, Opt_srcaddr, Opt_iocharset,
99 Opt_netbiosname, Opt_servern,
100 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
102 /* Mount options to be ignored */
105 /* Options which could be blank */
113 static const match_table_t cifs_mount_option_tokens = {
115 { Opt_user_xattr, "user_xattr" },
116 { Opt_nouser_xattr, "nouser_xattr" },
117 { Opt_forceuid, "forceuid" },
118 { Opt_noforceuid, "noforceuid" },
119 { Opt_forcegid, "forcegid" },
120 { Opt_noforcegid, "noforcegid" },
121 { Opt_noblocksend, "noblocksend" },
122 { Opt_noautotune, "noautotune" },
123 { Opt_hard, "hard" },
124 { Opt_soft, "soft" },
125 { Opt_perm, "perm" },
126 { Opt_noperm, "noperm" },
127 { Opt_mapchars, "mapchars" },
128 { Opt_nomapchars, "nomapchars" },
130 { Opt_nosfu, "nosfu" },
131 { Opt_nodfs, "nodfs" },
132 { Opt_posixpaths, "posixpaths" },
133 { Opt_noposixpaths, "noposixpaths" },
134 { Opt_nounix, "nounix" },
135 { Opt_nounix, "nolinux" },
136 { Opt_nocase, "nocase" },
137 { Opt_nocase, "ignorecase" },
139 { Opt_nobrl, "nobrl" },
140 { Opt_nobrl, "nolock" },
141 { Opt_forcemandatorylock, "forcemandatorylock" },
142 { Opt_forcemandatorylock, "forcemand" },
143 { Opt_setuids, "setuids" },
144 { Opt_nosetuids, "nosetuids" },
145 { Opt_dynperm, "dynperm" },
146 { Opt_nodynperm, "nodynperm" },
147 { Opt_nohard, "nohard" },
148 { Opt_nosoft, "nosoft" },
149 { Opt_nointr, "nointr" },
150 { Opt_intr, "intr" },
151 { Opt_nostrictsync, "nostrictsync" },
152 { Opt_strictsync, "strictsync" },
153 { Opt_serverino, "serverino" },
154 { Opt_noserverino, "noserverino" },
155 { Opt_rwpidforward, "rwpidforward" },
156 { Opt_cifsacl, "cifsacl" },
157 { Opt_nocifsacl, "nocifsacl" },
159 { Opt_noacl, "noacl" },
160 { Opt_locallease, "locallease" },
161 { Opt_sign, "sign" },
162 { Opt_seal, "seal" },
163 { Opt_noac, "noac" },
165 { Opt_mfsymlinks, "mfsymlinks" },
166 { Opt_multiuser, "multiuser" },
167 { Opt_sloppy, "sloppy" },
168 { Opt_nosharesock, "nosharesock" },
170 { Opt_backupuid, "backupuid=%s" },
171 { Opt_backupgid, "backupgid=%s" },
172 { Opt_uid, "uid=%s" },
173 { Opt_cruid, "cruid=%s" },
174 { Opt_gid, "gid=%s" },
175 { Opt_file_mode, "file_mode=%s" },
176 { Opt_dirmode, "dirmode=%s" },
177 { Opt_dirmode, "dir_mode=%s" },
178 { Opt_port, "port=%s" },
179 { Opt_rsize, "rsize=%s" },
180 { Opt_wsize, "wsize=%s" },
181 { Opt_actimeo, "actimeo=%s" },
183 { Opt_blank_user, "user=" },
184 { Opt_blank_user, "username=" },
185 { Opt_user, "user=%s" },
186 { Opt_user, "username=%s" },
187 { Opt_blank_pass, "pass=" },
188 { Opt_blank_pass, "password=" },
189 { Opt_pass, "pass=%s" },
190 { Opt_pass, "password=%s" },
191 { Opt_blank_ip, "ip=" },
192 { Opt_blank_ip, "addr=" },
194 { Opt_ip, "addr=%s" },
195 { Opt_ignore, "unc=%s" },
196 { Opt_ignore, "target=%s" },
197 { Opt_ignore, "path=%s" },
198 { Opt_domain, "dom=%s" },
199 { Opt_domain, "domain=%s" },
200 { Opt_domain, "workgroup=%s" },
201 { Opt_srcaddr, "srcaddr=%s" },
202 { Opt_ignore, "prefixpath=%s" },
203 { Opt_iocharset, "iocharset=%s" },
204 { Opt_netbiosname, "netbiosname=%s" },
205 { Opt_servern, "servern=%s" },
206 { Opt_ver, "ver=%s" },
207 { Opt_vers, "vers=%s" },
208 { Opt_sec, "sec=%s" },
209 { Opt_cache, "cache=%s" },
211 { Opt_ignore, "cred" },
212 { Opt_ignore, "credentials" },
213 { Opt_ignore, "cred=%s" },
214 { Opt_ignore, "credentials=%s" },
215 { Opt_ignore, "guest" },
216 { Opt_ignore, "rw" },
217 { Opt_ignore, "ro" },
218 { Opt_ignore, "suid" },
219 { Opt_ignore, "nosuid" },
220 { Opt_ignore, "exec" },
221 { Opt_ignore, "noexec" },
222 { Opt_ignore, "nodev" },
223 { Opt_ignore, "noauto" },
224 { Opt_ignore, "dev" },
225 { Opt_ignore, "mand" },
226 { Opt_ignore, "nomand" },
227 { Opt_ignore, "_netdev" },
233 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
234 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
235 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
236 Opt_sec_ntlmv2i, Opt_sec_lanman,
242 static const match_table_t cifs_secflavor_tokens = {
243 { Opt_sec_krb5, "krb5" },
244 { Opt_sec_krb5i, "krb5i" },
245 { Opt_sec_krb5p, "krb5p" },
246 { Opt_sec_ntlmsspi, "ntlmsspi" },
247 { Opt_sec_ntlmssp, "ntlmssp" },
248 { Opt_ntlm, "ntlm" },
249 { Opt_sec_ntlmi, "ntlmi" },
250 { Opt_sec_ntlmv2, "nontlm" },
251 { Opt_sec_ntlmv2, "ntlmv2" },
252 { Opt_sec_ntlmv2i, "ntlmv2i" },
253 { Opt_sec_lanman, "lanman" },
254 { Opt_sec_none, "none" },
256 { Opt_sec_err, NULL }
267 static const match_table_t cifs_cacheflavor_tokens = {
268 { Opt_cache_loose, "loose" },
269 { Opt_cache_strict, "strict" },
270 { Opt_cache_none, "none" },
271 { Opt_cache_err, NULL }
274 static const match_table_t cifs_smb_version_tokens = {
275 { Smb_1, SMB1_VERSION_STRING },
276 { Smb_20, SMB20_VERSION_STRING},
277 { Smb_21, SMB21_VERSION_STRING },
278 { Smb_30, SMB30_VERSION_STRING },
281 static int ip_connect(struct TCP_Server_Info *server);
282 static int generic_ip_connect(struct TCP_Server_Info *server);
283 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
284 static void cifs_prune_tlinks(struct work_struct *work);
285 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
286 const char *devname);
289 * cifs tcp session reconnection
291 * mark tcp session as reconnecting so temporarily locked
292 * mark all smb sessions as reconnecting for tcp session
293 * reconnect tcp session
294 * wake up waiters on reconnection? - (not needed currently)
297 cifs_reconnect(struct TCP_Server_Info *server)
300 struct list_head *tmp, *tmp2;
301 struct cifs_ses *ses;
302 struct cifs_tcon *tcon;
303 struct mid_q_entry *mid_entry;
304 struct list_head retry_list;
306 spin_lock(&GlobalMid_Lock);
307 if (server->tcpStatus == CifsExiting) {
308 /* the demux thread will exit normally
309 next time through the loop */
310 spin_unlock(&GlobalMid_Lock);
313 server->tcpStatus = CifsNeedReconnect;
314 spin_unlock(&GlobalMid_Lock);
316 #ifdef CONFIG_CIFS_SMB2
317 server->max_read = 0;
320 cifs_dbg(FYI, "Reconnecting tcp session\n");
322 /* before reconnecting the tcp session, mark the smb session (uid)
323 and the tid bad so they are not used until reconnected */
324 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
326 spin_lock(&cifs_tcp_ses_lock);
327 list_for_each(tmp, &server->smb_ses_list) {
328 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
329 ses->need_reconnect = true;
331 list_for_each(tmp2, &ses->tcon_list) {
332 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
333 tcon->need_reconnect = true;
336 spin_unlock(&cifs_tcp_ses_lock);
338 /* do not want to be sending data on a socket we are freeing */
339 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
340 mutex_lock(&server->srv_mutex);
341 if (server->ssocket) {
342 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
343 server->ssocket->state, server->ssocket->flags);
344 kernel_sock_shutdown(server->ssocket, SHUT_WR);
345 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
346 server->ssocket->state, server->ssocket->flags);
347 sock_release(server->ssocket);
348 server->ssocket = NULL;
350 server->sequence_number = 0;
351 server->session_estab = false;
352 kfree(server->session_key.response);
353 server->session_key.response = NULL;
354 server->session_key.len = 0;
355 server->lstrp = jiffies;
356 mutex_unlock(&server->srv_mutex);
358 /* mark submitted MIDs for retry and issue callback */
359 INIT_LIST_HEAD(&retry_list);
360 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
361 spin_lock(&GlobalMid_Lock);
362 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
363 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
364 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
365 mid_entry->mid_state = MID_RETRY_NEEDED;
366 list_move(&mid_entry->qhead, &retry_list);
368 spin_unlock(&GlobalMid_Lock);
370 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
371 list_for_each_safe(tmp, tmp2, &retry_list) {
372 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
373 list_del_init(&mid_entry->qhead);
374 mid_entry->callback(mid_entry);
380 /* we should try only the port we connected to before */
381 rc = generic_ip_connect(server);
383 cifs_dbg(FYI, "reconnect error %d\n", rc);
386 atomic_inc(&tcpSesReconnectCount);
387 spin_lock(&GlobalMid_Lock);
388 if (server->tcpStatus != CifsExiting)
389 server->tcpStatus = CifsNeedNegotiate;
390 spin_unlock(&GlobalMid_Lock);
392 } while (server->tcpStatus == CifsNeedReconnect);
398 cifs_echo_request(struct work_struct *work)
401 struct TCP_Server_Info *server = container_of(work,
402 struct TCP_Server_Info, echo.work);
405 * We cannot send an echo if it is disabled or until the
406 * NEGOTIATE_PROTOCOL request is done, which is indicated by
407 * server->ops->need_neg() == true. Also, no need to ping if
408 * we got a response recently.
410 if (!server->ops->need_neg || server->ops->need_neg(server) ||
411 (server->ops->can_echo && !server->ops->can_echo(server)) ||
412 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
415 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
417 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
421 queue_delayed_work(cifsiod_wq, &server->echo, SMB_ECHO_INTERVAL);
425 allocate_buffers(struct TCP_Server_Info *server)
427 if (!server->bigbuf) {
428 server->bigbuf = (char *)cifs_buf_get();
429 if (!server->bigbuf) {
430 cifs_dbg(VFS, "No memory for large SMB response\n");
432 /* retry will check if exiting */
435 } else if (server->large_buf) {
436 /* we are reusing a dirty large buf, clear its start */
437 memset(server->bigbuf, 0, HEADER_SIZE(server));
440 if (!server->smallbuf) {
441 server->smallbuf = (char *)cifs_small_buf_get();
442 if (!server->smallbuf) {
443 cifs_dbg(VFS, "No memory for SMB response\n");
445 /* retry will check if exiting */
448 /* beginning of smb buffer is cleared in our buf_get */
450 /* if existing small buf clear beginning */
451 memset(server->smallbuf, 0, HEADER_SIZE(server));
458 server_unresponsive(struct TCP_Server_Info *server)
461 * We need to wait 2 echo intervals to make sure we handle such
463 * 1s client sends a normal SMB request
464 * 2s client gets a response
465 * 30s echo workqueue job pops, and decides we got a response recently
466 * and don't need to send another
468 * 65s kernel_recvmsg times out, and we see that we haven't gotten
469 * a response in >60s.
471 if (server->tcpStatus == CifsGood &&
472 time_after(jiffies, server->lstrp + 2 * SMB_ECHO_INTERVAL)) {
473 cifs_dbg(VFS, "Server %s has not responded in %d seconds. Reconnecting...\n",
474 server->hostname, (2 * SMB_ECHO_INTERVAL) / HZ);
475 cifs_reconnect(server);
476 wake_up(&server->response_q);
484 * kvec_array_init - clone a kvec array, and advance into it
485 * @new: pointer to memory for cloned array
486 * @iov: pointer to original array
487 * @nr_segs: number of members in original array
488 * @bytes: number of bytes to advance into the cloned array
490 * This function will copy the array provided in iov to a section of memory
491 * and advance the specified number of bytes into the new array. It returns
492 * the number of segments in the new array. "new" must be at least as big as
493 * the original iov array.
496 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
501 while (bytes || !iov->iov_len) {
502 int copy = min(bytes, iov->iov_len);
506 if (iov->iov_len == base) {
512 memcpy(new, iov, sizeof(*iov) * nr_segs);
513 new->iov_base += base;
514 new->iov_len -= base;
519 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
521 struct kvec *new_iov;
523 if (server->iov && nr_segs <= server->nr_iov)
526 /* not big enough -- allocate a new one and release the old */
527 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
530 server->iov = new_iov;
531 server->nr_iov = nr_segs;
537 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
538 unsigned int nr_segs, unsigned int to_read)
543 struct msghdr smb_msg;
546 iov = get_server_iovec(server, nr_segs);
550 smb_msg.msg_control = NULL;
551 smb_msg.msg_controllen = 0;
553 for (total_read = 0; to_read; total_read += length, to_read -= length) {
556 if (server_unresponsive(server)) {
557 total_read = -EAGAIN;
561 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
563 length = kernel_recvmsg(server->ssocket, &smb_msg,
564 iov, segs, to_read, 0);
566 if (server->tcpStatus == CifsExiting) {
567 total_read = -ESHUTDOWN;
569 } else if (server->tcpStatus == CifsNeedReconnect) {
570 cifs_reconnect(server);
571 total_read = -EAGAIN;
573 } else if (length == -ERESTARTSYS ||
577 * Minimum sleep to prevent looping, allowing socket
578 * to clear and app threads to set tcpStatus
579 * CifsNeedReconnect if server hung.
581 usleep_range(1000, 2000);
584 } else if (length <= 0) {
585 cifs_dbg(FYI, "Received no data or error: expecting %d\n"
586 "got %d", to_read, length);
587 cifs_reconnect(server);
588 total_read = -EAGAIN;
596 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
597 unsigned int to_read)
602 iov.iov_len = to_read;
604 return cifs_readv_from_socket(server, &iov, 1, to_read);
608 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
611 * The first byte big endian of the length field,
612 * is actually not part of the length but the type
613 * with the most common, zero, as regular data.
616 case RFC1002_SESSION_MESSAGE:
617 /* Regular SMB response */
619 case RFC1002_SESSION_KEEP_ALIVE:
620 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
622 case RFC1002_POSITIVE_SESSION_RESPONSE:
623 cifs_dbg(FYI, "RFC 1002 positive session response\n");
625 case RFC1002_NEGATIVE_SESSION_RESPONSE:
627 * We get this from Windows 98 instead of an error on
628 * SMB negprot response.
630 cifs_dbg(FYI, "RFC 1002 negative session response\n");
631 /* give server a second to clean up */
634 * Always try 445 first on reconnect since we get NACK
635 * on some if we ever connected to port 139 (the NACK
636 * is since we do not begin with RFC1001 session
639 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
640 cifs_reconnect(server);
641 wake_up(&server->response_q);
644 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
645 cifs_reconnect(server);
652 dequeue_mid(struct mid_q_entry *mid, bool malformed)
654 #ifdef CONFIG_CIFS_STATS2
655 mid->when_received = jiffies;
657 spin_lock(&GlobalMid_Lock);
659 mid->mid_state = MID_RESPONSE_RECEIVED;
661 mid->mid_state = MID_RESPONSE_MALFORMED;
662 list_del_init(&mid->qhead);
663 spin_unlock(&GlobalMid_Lock);
667 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
668 char *buf, int malformed)
670 if (server->ops->check_trans2 &&
671 server->ops->check_trans2(mid, server, buf, malformed))
674 mid->large_buf = server->large_buf;
675 /* Was previous buf put in mpx struct for multi-rsp? */
676 if (!mid->multiRsp) {
677 /* smb buffer will be freed by user thread */
678 if (server->large_buf)
679 server->bigbuf = NULL;
681 server->smallbuf = NULL;
683 dequeue_mid(mid, malformed);
686 static void clean_demultiplex_info(struct TCP_Server_Info *server)
690 /* take it off the list, if it's not already */
691 spin_lock(&cifs_tcp_ses_lock);
692 list_del_init(&server->tcp_ses_list);
693 spin_unlock(&cifs_tcp_ses_lock);
695 spin_lock(&GlobalMid_Lock);
696 server->tcpStatus = CifsExiting;
697 spin_unlock(&GlobalMid_Lock);
698 wake_up_all(&server->response_q);
700 /* check if we have blocked requests that need to free */
701 spin_lock(&server->req_lock);
702 if (server->credits <= 0)
704 spin_unlock(&server->req_lock);
706 * Although there should not be any requests blocked on this queue it
707 * can not hurt to be paranoid and try to wake up requests that may
708 * haven been blocked when more than 50 at time were on the wire to the
709 * same server - they now will see the session is in exit state and get
710 * out of SendReceive.
712 wake_up_all(&server->request_q);
713 /* give those requests time to exit */
716 if (server->ssocket) {
717 sock_release(server->ssocket);
718 server->ssocket = NULL;
721 if (!list_empty(&server->pending_mid_q)) {
722 struct list_head dispose_list;
723 struct mid_q_entry *mid_entry;
724 struct list_head *tmp, *tmp2;
726 INIT_LIST_HEAD(&dispose_list);
727 spin_lock(&GlobalMid_Lock);
728 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
729 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
730 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
731 mid_entry->mid_state = MID_SHUTDOWN;
732 list_move(&mid_entry->qhead, &dispose_list);
734 spin_unlock(&GlobalMid_Lock);
736 /* now walk dispose list and issue callbacks */
737 list_for_each_safe(tmp, tmp2, &dispose_list) {
738 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
739 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
740 list_del_init(&mid_entry->qhead);
741 mid_entry->callback(mid_entry);
743 /* 1/8th of sec is more than enough time for them to exit */
747 if (!list_empty(&server->pending_mid_q)) {
749 * mpx threads have not exited yet give them at least the smb
750 * send timeout time for long ops.
752 * Due to delays on oplock break requests, we need to wait at
753 * least 45 seconds before giving up on a request getting a
754 * response and going ahead and killing cifsd.
756 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
759 * If threads still have not exited they are probably never
760 * coming home not much else we can do but free the memory.
764 kfree(server->hostname);
768 length = atomic_dec_return(&tcpSesAllocCount);
770 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
775 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
778 char *buf = server->smallbuf;
779 unsigned int pdu_length = get_rfc1002_length(buf);
781 /* make sure this will fit in a large buffer */
782 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
783 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
784 cifs_reconnect(server);
785 wake_up(&server->response_q);
789 /* switch to large buffer if too big for a small one */
790 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
791 server->large_buf = true;
792 memcpy(server->bigbuf, buf, server->total_read);
793 buf = server->bigbuf;
796 /* now read the rest */
797 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
798 pdu_length - HEADER_SIZE(server) + 1 + 4);
801 server->total_read += length;
803 dump_smb(buf, server->total_read);
806 * We know that we received enough to get to the MID as we
807 * checked the pdu_length earlier. Now check to see
808 * if the rest of the header is OK. We borrow the length
809 * var for the rest of the loop to avoid a new stack var.
811 * 48 bytes is enough to display the header and a little bit
812 * into the payload for debugging purposes.
814 length = server->ops->check_message(buf, server->total_read);
816 cifs_dump_mem("Bad SMB: ", buf,
817 min_t(unsigned int, server->total_read, 48));
819 if (server->ops->is_status_pending &&
820 server->ops->is_status_pending(buf, server, length))
826 handle_mid(mid, server, buf, length);
831 cifs_demultiplex_thread(void *p)
834 struct TCP_Server_Info *server = p;
835 unsigned int pdu_length;
837 struct task_struct *task_to_wake = NULL;
838 struct mid_q_entry *mid_entry;
840 current->flags |= PF_MEMALLOC;
841 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
843 length = atomic_inc_return(&tcpSesAllocCount);
845 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
849 while (server->tcpStatus != CifsExiting) {
853 if (!allocate_buffers(server))
856 server->large_buf = false;
857 buf = server->smallbuf;
858 pdu_length = 4; /* enough to get RFC1001 header */
860 length = cifs_read_from_socket(server, buf, pdu_length);
863 server->total_read = length;
866 * The right amount was read from socket - 4 bytes,
867 * so we can now interpret the length field.
869 pdu_length = get_rfc1002_length(buf);
871 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
872 if (!is_smb_response(server, buf[0]))
875 /* make sure we have enough to get to the MID */
876 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
877 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
879 cifs_reconnect(server);
880 wake_up(&server->response_q);
884 /* read down to the MID */
885 length = cifs_read_from_socket(server, buf + 4,
886 HEADER_SIZE(server) - 1 - 4);
889 server->total_read += length;
891 mid_entry = server->ops->find_mid(server, buf);
893 if (!mid_entry || !mid_entry->receive)
894 length = standard_receive3(server, mid_entry);
896 length = mid_entry->receive(server, mid_entry);
901 if (server->large_buf)
902 buf = server->bigbuf;
904 server->lstrp = jiffies;
905 if (mid_entry != NULL) {
906 if (!mid_entry->multiRsp || mid_entry->multiEnd)
907 mid_entry->callback(mid_entry);
908 } else if (!server->ops->is_oplock_break ||
909 !server->ops->is_oplock_break(buf, server)) {
910 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
911 atomic_read(&midCount));
912 cifs_dump_mem("Received Data is: ", buf,
913 HEADER_SIZE(server));
914 #ifdef CONFIG_CIFS_DEBUG2
915 if (server->ops->dump_detail)
916 server->ops->dump_detail(buf);
917 cifs_dump_mids(server);
918 #endif /* CIFS_DEBUG2 */
921 } /* end while !EXITING */
923 /* buffer usually freed in free_mid - need to free it here on exit */
924 cifs_buf_release(server->bigbuf);
925 if (server->smallbuf) /* no sense logging a debug message if NULL */
926 cifs_small_buf_release(server->smallbuf);
928 task_to_wake = xchg(&server->tsk, NULL);
929 clean_demultiplex_info(server);
931 /* if server->tsk was NULL then wait for a signal before exiting */
933 set_current_state(TASK_INTERRUPTIBLE);
934 while (!signal_pending(current)) {
936 set_current_state(TASK_INTERRUPTIBLE);
938 set_current_state(TASK_RUNNING);
941 module_put_and_exit(0);
944 /* extract the host portion of the UNC string */
946 extract_hostname(const char *unc)
952 /* skip double chars at beginning of string */
953 /* BB: check validity of these bytes? */
956 /* delimiter between hostname and sharename is always '\\' now */
957 delim = strchr(src, '\\');
959 return ERR_PTR(-EINVAL);
962 dst = kmalloc((len + 1), GFP_KERNEL);
964 return ERR_PTR(-ENOMEM);
966 memcpy(dst, src, len);
972 static int get_option_ul(substring_t args[], unsigned long *option)
977 string = match_strdup(args);
980 rc = kstrtoul(string, 0, option);
986 static int get_option_uid(substring_t args[], kuid_t *result)
992 rc = get_option_ul(args, &value);
996 uid = make_kuid(current_user_ns(), value);
1004 static int get_option_gid(substring_t args[], kgid_t *result)
1006 unsigned long value;
1010 rc = get_option_ul(args, &value);
1014 gid = make_kgid(current_user_ns(), value);
1015 if (!gid_valid(gid))
1022 static int cifs_parse_security_flavors(char *value,
1023 struct smb_vol *vol)
1026 substring_t args[MAX_OPT_ARGS];
1029 * With mount options, the last one should win. Reset any existing
1030 * settings back to default.
1032 vol->sectype = Unspecified;
1035 switch (match_token(value, cifs_secflavor_tokens, args)) {
1037 vol->sectype = Kerberos;
1038 vol->secFlg |= CIFSSEC_MAY_KRB5 | CIFSSEC_MAY_SIGN;
1041 vol->sectype = Kerberos;
1043 vol->secFlg |= CIFSSEC_MAY_KRB5 | CIFSSEC_MUST_SIGN;
1046 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1047 cifs_dbg(VFS, "Krb5 cifs privacy not supported\n");
1049 case Opt_sec_ntlmssp:
1050 vol->sectype = RawNTLMSSP;
1051 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1053 case Opt_sec_ntlmsspi:
1054 vol->sectype = RawNTLMSSP;
1056 vol->secFlg |= CIFSSEC_MAY_NTLMSSP | CIFSSEC_MUST_SIGN;
1059 /* ntlm is default so can be turned off too */
1060 vol->sectype = NTLM;
1061 vol->secFlg |= CIFSSEC_MAY_NTLM;
1064 vol->sectype = NTLM;
1066 vol->secFlg |= CIFSSEC_MAY_NTLM | CIFSSEC_MUST_SIGN;
1068 case Opt_sec_ntlmv2:
1069 vol->sectype = NTLMv2;
1070 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1072 case Opt_sec_ntlmv2i:
1073 vol->sectype = NTLMv2;
1075 vol->secFlg |= CIFSSEC_MAY_NTLMV2 | CIFSSEC_MUST_SIGN;
1077 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1078 case Opt_sec_lanman:
1079 vol->sectype = LANMAN;
1080 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1085 vol->secFlg |= CIFSSEC_MAY_NTLM;
1088 cifs_dbg(VFS, "bad security option: %s\n", value);
1096 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1098 substring_t args[MAX_OPT_ARGS];
1100 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1101 case Opt_cache_loose:
1102 vol->direct_io = false;
1103 vol->strict_io = false;
1105 case Opt_cache_strict:
1106 vol->direct_io = false;
1107 vol->strict_io = true;
1109 case Opt_cache_none:
1110 vol->direct_io = true;
1111 vol->strict_io = false;
1114 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1121 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1123 substring_t args[MAX_OPT_ARGS];
1125 switch (match_token(value, cifs_smb_version_tokens, args)) {
1127 vol->ops = &smb1_operations;
1128 vol->vals = &smb1_values;
1130 #ifdef CONFIG_CIFS_SMB2
1132 vol->ops = &smb21_operations; /* currently identical with 2.1 */
1133 vol->vals = &smb20_values;
1136 vol->ops = &smb21_operations;
1137 vol->vals = &smb21_values;
1140 vol->ops = &smb30_operations;
1141 vol->vals = &smb30_values;
1145 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1152 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1153 * fields with the result. Returns 0 on success and an error otherwise.
1156 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1159 const char *delims = "/\\";
1162 /* make sure we have a valid UNC double delimiter prefix */
1163 len = strspn(devname, delims);
1167 /* find delimiter between host and sharename */
1168 pos = strpbrk(devname + 2, delims);
1172 /* skip past delimiter */
1175 /* now go until next delimiter or end of string */
1176 len = strcspn(pos, delims);
1178 /* move "pos" up to delimiter or NULL */
1180 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1184 convert_delimiter(vol->UNC, '\\');
1186 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1187 if (!*pos++ || !*pos)
1190 vol->prepath = kstrdup(pos, GFP_KERNEL);
1198 cifs_parse_mount_options(const char *mountdata, const char *devname,
1199 struct smb_vol *vol)
1202 char *mountdata_copy = NULL, *options;
1203 unsigned int temp_len, i, j;
1205 short int override_uid = -1;
1206 short int override_gid = -1;
1207 bool uid_specified = false;
1208 bool gid_specified = false;
1209 bool sloppy = false;
1210 char *invalid = NULL;
1211 char *nodename = utsname()->nodename;
1212 char *string = NULL;
1213 char *tmp_end, *value;
1215 bool got_ip = false;
1216 unsigned short port = 0;
1217 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1221 delim = separator[0];
1223 /* ensure we always start with zeroed-out smb_vol */
1224 memset(vol, 0, sizeof(*vol));
1227 * does not have to be perfect mapping since field is
1228 * informational, only used for servers that do not support
1229 * port 445 and it can be overridden at mount time
1231 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1232 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1233 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1235 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1236 /* null target name indicates to use *SMBSERVR default called name
1237 if we end up sending RFC1001 session initialize */
1238 vol->target_rfc1001_name[0] = 0;
1239 vol->cred_uid = current_uid();
1240 vol->linux_uid = current_uid();
1241 vol->linux_gid = current_gid();
1243 /* default to only allowing write access to owner of the mount */
1244 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1246 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1247 /* default is always to request posix paths. */
1248 vol->posix_paths = 1;
1249 /* default to using server inode numbers where available */
1250 vol->server_ino = 1;
1252 /* default is to use strict cifs caching semantics */
1253 vol->strict_io = true;
1255 vol->actimeo = CIFS_DEF_ACTIMEO;
1257 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1258 vol->ops = &smb1_operations;
1259 vol->vals = &smb1_values;
1262 goto cifs_parse_mount_err;
1264 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1265 if (!mountdata_copy)
1266 goto cifs_parse_mount_err;
1268 options = mountdata_copy;
1269 end = options + strlen(options);
1271 if (strncmp(options, "sep=", 4) == 0) {
1272 if (options[4] != 0) {
1273 separator[0] = options[4];
1276 cifs_dbg(FYI, "Null separator not allowed\n");
1279 vol->backupuid_specified = false; /* no backup intent for a user */
1280 vol->backupgid_specified = false; /* no backup intent for a group */
1282 switch (cifs_parse_devname(devname, vol)) {
1286 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1287 goto cifs_parse_mount_err;
1289 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1290 goto cifs_parse_mount_err;
1292 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1293 goto cifs_parse_mount_err;
1296 while ((data = strsep(&options, separator)) != NULL) {
1297 substring_t args[MAX_OPT_ARGS];
1298 unsigned long option;
1304 token = match_token(data, cifs_mount_option_tokens, args);
1308 /* Ingnore the following */
1312 /* Boolean values */
1313 case Opt_user_xattr:
1316 case Opt_nouser_xattr:
1322 case Opt_noforceuid:
1328 case Opt_noforcegid:
1331 case Opt_noblocksend:
1332 vol->noblocksnd = 1;
1334 case Opt_noautotune:
1335 vol->noautotune = 1;
1352 case Opt_nomapchars:
1364 case Opt_posixpaths:
1365 vol->posix_paths = 1;
1367 case Opt_noposixpaths:
1368 vol->posix_paths = 0;
1371 vol->no_linux_ext = 1;
1382 * turn off mandatory locking in mode
1383 * if remote locking is turned off since the
1384 * local vfs will do advisory
1386 if (vol->file_mode ==
1387 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1388 vol->file_mode = S_IALLUGO;
1390 case Opt_forcemandatorylock:
1400 vol->dynperm = true;
1403 vol->dynperm = false;
1417 case Opt_nostrictsync:
1418 vol->nostrictsync = 1;
1420 case Opt_strictsync:
1421 vol->nostrictsync = 0;
1424 vol->server_ino = 1;
1426 case Opt_noserverino:
1427 vol->server_ino = 0;
1429 case Opt_rwpidforward:
1430 vol->rwpidforward = 1;
1439 vol->no_psx_acl = 0;
1442 vol->no_psx_acl = 1;
1444 case Opt_locallease:
1445 vol->local_lease = 1;
1448 vol->secFlg |= CIFSSEC_MUST_SIGN;
1452 /* we do not do the following in secFlags because seal
1453 * is a per tree connection (mount) not a per socket
1454 * or per-smb connection option in the protocol
1455 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1460 printk(KERN_WARNING "CIFS: Mount option noac not "
1461 "supported. Instead set "
1462 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1465 #ifndef CONFIG_CIFS_FSCACHE
1466 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1467 goto cifs_parse_mount_err;
1471 case Opt_mfsymlinks:
1472 vol->mfsymlinks = true;
1475 vol->multiuser = true;
1480 case Opt_nosharesock:
1481 vol->nosharesock = true;
1484 /* Numeric Values */
1486 if (get_option_uid(args, &vol->backupuid)) {
1487 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1489 goto cifs_parse_mount_err;
1491 vol->backupuid_specified = true;
1494 if (get_option_gid(args, &vol->backupgid)) {
1495 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1497 goto cifs_parse_mount_err;
1499 vol->backupgid_specified = true;
1502 if (get_option_uid(args, &vol->linux_uid)) {
1503 cifs_dbg(VFS, "%s: Invalid uid value\n",
1505 goto cifs_parse_mount_err;
1507 uid_specified = true;
1510 if (get_option_uid(args, &vol->cred_uid)) {
1511 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1513 goto cifs_parse_mount_err;
1517 if (get_option_gid(args, &vol->linux_gid)) {
1518 cifs_dbg(VFS, "%s: Invalid gid value\n",
1520 goto cifs_parse_mount_err;
1522 gid_specified = true;
1525 if (get_option_ul(args, &option)) {
1526 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1528 goto cifs_parse_mount_err;
1530 vol->file_mode = option;
1533 if (get_option_ul(args, &option)) {
1534 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1536 goto cifs_parse_mount_err;
1538 vol->dir_mode = option;
1541 if (get_option_ul(args, &option) ||
1542 option > USHRT_MAX) {
1543 cifs_dbg(VFS, "%s: Invalid port value\n",
1545 goto cifs_parse_mount_err;
1547 port = (unsigned short)option;
1550 if (get_option_ul(args, &option)) {
1551 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1553 goto cifs_parse_mount_err;
1555 vol->rsize = option;
1558 if (get_option_ul(args, &option)) {
1559 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1561 goto cifs_parse_mount_err;
1563 vol->wsize = option;
1566 if (get_option_ul(args, &option)) {
1567 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1569 goto cifs_parse_mount_err;
1571 vol->actimeo = HZ * option;
1572 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1573 cifs_dbg(VFS, "attribute cache timeout too large\n");
1574 goto cifs_parse_mount_err;
1578 /* String Arguments */
1580 case Opt_blank_user:
1581 /* null user, ie. anonymous authentication */
1583 vol->username = NULL;
1586 string = match_strdup(args);
1590 if (strnlen(string, MAX_USERNAME_SIZE) >
1591 MAX_USERNAME_SIZE) {
1592 printk(KERN_WARNING "CIFS: username too long\n");
1593 goto cifs_parse_mount_err;
1595 vol->username = kstrdup(string, GFP_KERNEL);
1597 goto cifs_parse_mount_err;
1599 case Opt_blank_pass:
1600 /* passwords have to be handled differently
1601 * to allow the character used for deliminator
1602 * to be passed within them
1606 * Check if this is a case where the password
1607 * starts with a delimiter
1609 tmp_end = strchr(data, '=');
1611 if (!(tmp_end < end && tmp_end[1] == delim)) {
1612 /* No it is not. Set the password to NULL */
1613 vol->password = NULL;
1616 /* Yes it is. Drop down to Opt_pass below.*/
1618 /* Obtain the value string */
1619 value = strchr(data, '=');
1622 /* Set tmp_end to end of the string */
1623 tmp_end = (char *) value + strlen(value);
1625 /* Check if following character is the deliminator
1626 * If yes, we have encountered a double deliminator
1627 * reset the NULL character to the deliminator
1629 if (tmp_end < end && tmp_end[1] == delim) {
1632 /* Keep iterating until we get to a single
1633 * deliminator OR the end
1635 while ((tmp_end = strchr(tmp_end, delim))
1636 != NULL && (tmp_end[1] == delim)) {
1637 tmp_end = (char *) &tmp_end[2];
1640 /* Reset var options to point to next element */
1643 options = (char *) &tmp_end[1];
1645 /* Reached the end of the mount option
1650 /* Now build new password string */
1651 temp_len = strlen(value);
1652 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1653 if (vol->password == NULL) {
1654 printk(KERN_WARNING "CIFS: no memory "
1656 goto cifs_parse_mount_err;
1659 for (i = 0, j = 0; i < temp_len; i++, j++) {
1660 vol->password[j] = value[i];
1661 if ((value[i] == delim) &&
1662 value[i+1] == delim)
1663 /* skip the second deliminator */
1666 vol->password[j] = '\0';
1669 /* FIXME: should this be an error instead? */
1673 string = match_strdup(args);
1677 if (!cifs_convert_address(dstaddr, string,
1679 printk(KERN_ERR "CIFS: bad ip= option (%s).\n",
1681 goto cifs_parse_mount_err;
1686 string = match_strdup(args);
1690 if (strnlen(string, 256) == 256) {
1691 printk(KERN_WARNING "CIFS: domain name too"
1693 goto cifs_parse_mount_err;
1696 vol->domainname = kstrdup(string, GFP_KERNEL);
1697 if (!vol->domainname) {
1698 printk(KERN_WARNING "CIFS: no memory "
1699 "for domainname\n");
1700 goto cifs_parse_mount_err;
1702 cifs_dbg(FYI, "Domain name set\n");
1705 string = match_strdup(args);
1709 if (!cifs_convert_address(
1710 (struct sockaddr *)&vol->srcaddr,
1711 string, strlen(string))) {
1712 printk(KERN_WARNING "CIFS: Could not parse"
1713 " srcaddr: %s\n", string);
1714 goto cifs_parse_mount_err;
1718 string = match_strdup(args);
1722 if (strnlen(string, 1024) >= 65) {
1723 printk(KERN_WARNING "CIFS: iocharset name "
1725 goto cifs_parse_mount_err;
1728 if (strnicmp(string, "default", 7) != 0) {
1729 vol->iocharset = kstrdup(string,
1731 if (!vol->iocharset) {
1732 printk(KERN_WARNING "CIFS: no memory"
1734 goto cifs_parse_mount_err;
1737 /* if iocharset not set then load_nls_default
1740 cifs_dbg(FYI, "iocharset set to %s\n", string);
1742 case Opt_netbiosname:
1743 string = match_strdup(args);
1747 memset(vol->source_rfc1001_name, 0x20,
1750 * FIXME: are there cases in which a comma can
1751 * be valid in workstation netbios name (and
1752 * need special handling)?
1754 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1755 /* don't ucase netbiosname for user */
1758 vol->source_rfc1001_name[i] = string[i];
1760 /* The string has 16th byte zero still from
1761 * set at top of the function
1763 if (i == RFC1001_NAME_LEN && string[i] != 0)
1764 printk(KERN_WARNING "CIFS: netbiosname"
1765 " longer than 15 truncated.\n");
1769 /* servernetbiosname specified override *SMBSERVER */
1770 string = match_strdup(args);
1774 /* last byte, type, is 0x20 for servr type */
1775 memset(vol->target_rfc1001_name, 0x20,
1776 RFC1001_NAME_LEN_WITH_NULL);
1778 /* BB are there cases in which a comma can be
1779 valid in this workstation netbios name
1780 (and need special handling)? */
1782 /* user or mount helper must uppercase the
1784 for (i = 0; i < 15; i++) {
1787 vol->target_rfc1001_name[i] = string[i];
1789 /* The string has 16th byte zero still from
1790 set at top of the function */
1791 if (i == RFC1001_NAME_LEN && string[i] != 0)
1792 printk(KERN_WARNING "CIFS: server net"
1793 "biosname longer than 15 truncated.\n");
1796 string = match_strdup(args);
1800 if (strnicmp(string, "1", 1) == 0) {
1801 /* This is the default */
1804 /* For all other value, error */
1805 printk(KERN_WARNING "CIFS: Invalid version"
1807 goto cifs_parse_mount_err;
1809 string = match_strdup(args);
1813 if (cifs_parse_smb_version(string, vol) != 0)
1814 goto cifs_parse_mount_err;
1817 string = match_strdup(args);
1821 if (cifs_parse_security_flavors(string, vol) != 0)
1822 goto cifs_parse_mount_err;
1825 string = match_strdup(args);
1829 if (cifs_parse_cache_flavor(string, vol) != 0)
1830 goto cifs_parse_mount_err;
1834 * An option we don't recognize. Save it off for later
1835 * if we haven't already found one
1841 /* Free up any allocated string */
1846 if (!sloppy && invalid) {
1847 printk(KERN_ERR "CIFS: Unknown mount option \"%s\"\n", invalid);
1848 goto cifs_parse_mount_err;
1852 /* Muliuser mounts require CONFIG_KEYS support */
1853 if (vol->multiuser) {
1854 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1855 goto cifs_parse_mount_err;
1859 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
1860 goto cifs_parse_mount_err;
1863 /* make sure UNC has a share name */
1864 if (!strchr(vol->UNC + 3, '\\')) {
1865 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
1866 goto cifs_parse_mount_err;
1870 /* No ip= option specified? Try to get it from UNC */
1871 if (!cifs_convert_address(dstaddr, &vol->UNC[2],
1872 strlen(&vol->UNC[2]))) {
1873 printk(KERN_ERR "Unable to determine destination "
1875 goto cifs_parse_mount_err;
1879 /* set the port that we got earlier */
1880 cifs_set_port(dstaddr, port);
1883 vol->override_uid = override_uid;
1884 else if (override_uid == 1)
1885 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1886 "specified with no uid= option.\n");
1889 vol->override_gid = override_gid;
1890 else if (override_gid == 1)
1891 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1892 "specified with no gid= option.\n");
1894 kfree(mountdata_copy);
1898 printk(KERN_WARNING "Could not allocate temporary buffer\n");
1899 cifs_parse_mount_err:
1901 kfree(mountdata_copy);
1905 /** Returns true if srcaddr isn't specified and rhs isn't
1906 * specified, or if srcaddr is specified and
1907 * matches the IP address of the rhs argument.
1910 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1912 switch (srcaddr->sa_family) {
1914 return (rhs->sa_family == AF_UNSPEC);
1916 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1917 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1918 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1921 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1922 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1923 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1927 return false; /* don't expect to be here */
1932 * If no port is specified in addr structure, we try to match with 445 port
1933 * and if it fails - with 139 ports. It should be called only if address
1934 * families of server and addr are equal.
1937 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1939 __be16 port, *sport;
1941 switch (addr->sa_family) {
1943 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1944 port = ((struct sockaddr_in *) addr)->sin_port;
1947 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1948 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1956 port = htons(CIFS_PORT);
1960 port = htons(RFC1001_PORT);
1963 return port == *sport;
1967 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1968 struct sockaddr *srcaddr)
1970 switch (addr->sa_family) {
1972 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1973 struct sockaddr_in *srv_addr4 =
1974 (struct sockaddr_in *)&server->dstaddr;
1976 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1981 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1982 struct sockaddr_in6 *srv_addr6 =
1983 (struct sockaddr_in6 *)&server->dstaddr;
1985 if (!ipv6_addr_equal(&addr6->sin6_addr,
1986 &srv_addr6->sin6_addr))
1988 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1994 return false; /* don't expect to be here */
1997 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2004 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2006 unsigned int secFlags;
2008 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
2009 secFlags = vol->secFlg;
2011 secFlags = global_secflags | vol->secFlg;
2013 switch (server->secType) {
2015 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
2019 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
2023 if (!(secFlags & CIFSSEC_MAY_NTLM))
2027 if (!(secFlags & CIFSSEC_MAY_KRB5))
2031 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
2035 /* shouldn't happen */
2039 /* now check if signing mode is acceptable */
2040 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
2041 (server->sec_mode & SECMODE_SIGN_REQUIRED))
2043 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
2045 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
2051 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2053 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2055 if (vol->nosharesock)
2058 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2061 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2064 if (!match_address(server, addr,
2065 (struct sockaddr *)&vol->srcaddr))
2068 if (!match_port(server, addr))
2071 if (!match_security(server, vol))
2077 static struct TCP_Server_Info *
2078 cifs_find_tcp_session(struct smb_vol *vol)
2080 struct TCP_Server_Info *server;
2082 spin_lock(&cifs_tcp_ses_lock);
2083 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2084 if (!match_server(server, vol))
2087 ++server->srv_count;
2088 spin_unlock(&cifs_tcp_ses_lock);
2089 cifs_dbg(FYI, "Existing tcp session with server found\n");
2092 spin_unlock(&cifs_tcp_ses_lock);
2097 cifs_put_tcp_session(struct TCP_Server_Info *server)
2099 struct task_struct *task;
2101 spin_lock(&cifs_tcp_ses_lock);
2102 if (--server->srv_count > 0) {
2103 spin_unlock(&cifs_tcp_ses_lock);
2107 put_net(cifs_net_ns(server));
2109 list_del_init(&server->tcp_ses_list);
2110 spin_unlock(&cifs_tcp_ses_lock);
2112 cancel_delayed_work_sync(&server->echo);
2114 spin_lock(&GlobalMid_Lock);
2115 server->tcpStatus = CifsExiting;
2116 spin_unlock(&GlobalMid_Lock);
2118 cifs_crypto_shash_release(server);
2119 cifs_fscache_release_client_cookie(server);
2121 kfree(server->session_key.response);
2122 server->session_key.response = NULL;
2123 server->session_key.len = 0;
2125 task = xchg(&server->tsk, NULL);
2127 force_sig(SIGKILL, task);
2130 static struct TCP_Server_Info *
2131 cifs_get_tcp_session(struct smb_vol *volume_info)
2133 struct TCP_Server_Info *tcp_ses = NULL;
2136 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2138 /* see if we already have a matching tcp_ses */
2139 tcp_ses = cifs_find_tcp_session(volume_info);
2143 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2149 rc = cifs_crypto_shash_allocate(tcp_ses);
2151 cifs_dbg(VFS, "could not setup hash structures rc %d\n", rc);
2155 tcp_ses->ops = volume_info->ops;
2156 tcp_ses->vals = volume_info->vals;
2157 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2158 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2159 if (IS_ERR(tcp_ses->hostname)) {
2160 rc = PTR_ERR(tcp_ses->hostname);
2161 goto out_err_crypto_release;
2164 tcp_ses->noblocksnd = volume_info->noblocksnd;
2165 tcp_ses->noautotune = volume_info->noautotune;
2166 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2167 tcp_ses->in_flight = 0;
2168 tcp_ses->credits = 1;
2169 init_waitqueue_head(&tcp_ses->response_q);
2170 init_waitqueue_head(&tcp_ses->request_q);
2171 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2172 mutex_init(&tcp_ses->srv_mutex);
2173 memcpy(tcp_ses->workstation_RFC1001_name,
2174 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2175 memcpy(tcp_ses->server_RFC1001_name,
2176 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2177 tcp_ses->session_estab = false;
2178 tcp_ses->sequence_number = 0;
2179 tcp_ses->lstrp = jiffies;
2180 spin_lock_init(&tcp_ses->req_lock);
2181 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2182 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2183 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2184 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2185 sizeof(tcp_ses->srcaddr));
2186 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2187 sizeof(tcp_ses->dstaddr));
2189 * at this point we are the only ones with the pointer
2190 * to the struct since the kernel thread not created yet
2191 * no need to spinlock this init of tcpStatus or srv_count
2193 tcp_ses->tcpStatus = CifsNew;
2194 ++tcp_ses->srv_count;
2196 rc = ip_connect(tcp_ses);
2198 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2199 goto out_err_crypto_release;
2203 * since we're in a cifs function already, we know that
2204 * this will succeed. No need for try_module_get().
2206 __module_get(THIS_MODULE);
2207 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2209 if (IS_ERR(tcp_ses->tsk)) {
2210 rc = PTR_ERR(tcp_ses->tsk);
2211 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2212 module_put(THIS_MODULE);
2213 goto out_err_crypto_release;
2215 tcp_ses->tcpStatus = CifsNeedNegotiate;
2217 /* thread spawned, put it on the list */
2218 spin_lock(&cifs_tcp_ses_lock);
2219 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2220 spin_unlock(&cifs_tcp_ses_lock);
2222 cifs_fscache_get_client_cookie(tcp_ses);
2224 /* queue echo request delayed work */
2225 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2229 out_err_crypto_release:
2230 cifs_crypto_shash_release(tcp_ses);
2232 put_net(cifs_net_ns(tcp_ses));
2236 if (!IS_ERR(tcp_ses->hostname))
2237 kfree(tcp_ses->hostname);
2238 if (tcp_ses->ssocket)
2239 sock_release(tcp_ses->ssocket);
2245 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2247 switch (ses->server->secType) {
2249 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2253 /* NULL username means anonymous session */
2254 if (ses->user_name == NULL) {
2260 /* anything else takes username/password */
2261 if (strncmp(ses->user_name,
2262 vol->username ? vol->username : "",
2265 if (strlen(vol->username) != 0 &&
2266 ses->password != NULL &&
2267 strncmp(ses->password,
2268 vol->password ? vol->password : "",
2275 static struct cifs_ses *
2276 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2278 struct cifs_ses *ses;
2280 spin_lock(&cifs_tcp_ses_lock);
2281 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2282 if (!match_session(ses, vol))
2285 spin_unlock(&cifs_tcp_ses_lock);
2288 spin_unlock(&cifs_tcp_ses_lock);
2293 cifs_put_smb_ses(struct cifs_ses *ses)
2296 struct TCP_Server_Info *server = ses->server;
2298 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2299 spin_lock(&cifs_tcp_ses_lock);
2300 if (--ses->ses_count > 0) {
2301 spin_unlock(&cifs_tcp_ses_lock);
2305 list_del_init(&ses->smb_ses_list);
2306 spin_unlock(&cifs_tcp_ses_lock);
2308 if (ses->status == CifsGood && server->ops->logoff) {
2310 server->ops->logoff(xid, ses);
2314 cifs_put_tcp_session(server);
2319 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2320 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 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 > MAX_USERNAME_SIZE || 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 > MAX_PASSWORD_SIZE || 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->overrideSecFlg = volume_info->secFlg;
2525 ses->sectype = volume_info->sectype;
2526 ses->sign = volume_info->sign;
2528 mutex_lock(&ses->session_mutex);
2529 rc = cifs_negotiate_protocol(xid, ses);
2531 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2532 mutex_unlock(&ses->session_mutex);
2536 /* success, put it on the list */
2537 spin_lock(&cifs_tcp_ses_lock);
2538 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2539 spin_unlock(&cifs_tcp_ses_lock);
2550 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2552 if (tcon->tidStatus == CifsExiting)
2554 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2559 static struct cifs_tcon *
2560 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2562 struct list_head *tmp;
2563 struct cifs_tcon *tcon;
2565 spin_lock(&cifs_tcp_ses_lock);
2566 list_for_each(tmp, &ses->tcon_list) {
2567 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2568 if (!match_tcon(tcon, unc))
2571 spin_unlock(&cifs_tcp_ses_lock);
2574 spin_unlock(&cifs_tcp_ses_lock);
2579 cifs_put_tcon(struct cifs_tcon *tcon)
2582 struct cifs_ses *ses = tcon->ses;
2584 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2585 spin_lock(&cifs_tcp_ses_lock);
2586 if (--tcon->tc_count > 0) {
2587 spin_unlock(&cifs_tcp_ses_lock);
2591 list_del_init(&tcon->tcon_list);
2592 spin_unlock(&cifs_tcp_ses_lock);
2595 if (ses->server->ops->tree_disconnect)
2596 ses->server->ops->tree_disconnect(xid, tcon);
2599 cifs_fscache_release_super_cookie(tcon);
2601 cifs_put_smb_ses(ses);
2604 static struct cifs_tcon *
2605 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2608 struct cifs_tcon *tcon;
2610 tcon = cifs_find_tcon(ses, volume_info->UNC);
2612 cifs_dbg(FYI, "Found match on UNC path\n");
2613 /* existing tcon already has a reference */
2614 cifs_put_smb_ses(ses);
2615 if (tcon->seal != volume_info->seal)
2616 cifs_dbg(VFS, "transport encryption setting conflicts with existing tid\n");
2620 if (!ses->server->ops->tree_connect) {
2625 tcon = tconInfoAlloc();
2632 if (volume_info->password) {
2633 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2634 if (!tcon->password) {
2641 * BB Do we need to wrap session_mutex around this TCon call and Unix
2642 * SetFS as we do on SessSetup and reconnect?
2645 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2646 volume_info->local_nls);
2648 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2652 if (volume_info->nodfs) {
2653 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2654 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
2656 tcon->seal = volume_info->seal;
2658 * We can have only one retry value for a connection to a share so for
2659 * resources mounted more than once to the same server share the last
2660 * value passed in for the retry flag is used.
2662 tcon->retry = volume_info->retry;
2663 tcon->nocase = volume_info->nocase;
2664 tcon->local_lease = volume_info->local_lease;
2665 INIT_LIST_HEAD(&tcon->pending_opens);
2667 spin_lock(&cifs_tcp_ses_lock);
2668 list_add(&tcon->tcon_list, &ses->tcon_list);
2669 spin_unlock(&cifs_tcp_ses_lock);
2671 cifs_fscache_get_super_cookie(tcon);
2681 cifs_put_tlink(struct tcon_link *tlink)
2683 if (!tlink || IS_ERR(tlink))
2686 if (!atomic_dec_and_test(&tlink->tl_count) ||
2687 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2688 tlink->tl_time = jiffies;
2692 if (!IS_ERR(tlink_tcon(tlink)))
2693 cifs_put_tcon(tlink_tcon(tlink));
2698 static inline struct tcon_link *
2699 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2701 return cifs_sb->master_tlink;
2705 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2707 struct cifs_sb_info *old = CIFS_SB(sb);
2708 struct cifs_sb_info *new = mnt_data->cifs_sb;
2710 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2713 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2714 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2718 * We want to share sb only if we don't specify an r/wsize or
2719 * specified r/wsize is greater than or equal to existing one.
2721 if (new->wsize && new->wsize < old->wsize)
2724 if (new->rsize && new->rsize < old->rsize)
2727 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
2730 if (old->mnt_file_mode != new->mnt_file_mode ||
2731 old->mnt_dir_mode != new->mnt_dir_mode)
2734 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2737 if (old->actimeo != new->actimeo)
2744 cifs_match_super(struct super_block *sb, void *data)
2746 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2747 struct smb_vol *volume_info;
2748 struct cifs_sb_info *cifs_sb;
2749 struct TCP_Server_Info *tcp_srv;
2750 struct cifs_ses *ses;
2751 struct cifs_tcon *tcon;
2752 struct tcon_link *tlink;
2755 spin_lock(&cifs_tcp_ses_lock);
2756 cifs_sb = CIFS_SB(sb);
2757 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2758 if (IS_ERR(tlink)) {
2759 spin_unlock(&cifs_tcp_ses_lock);
2762 tcon = tlink_tcon(tlink);
2764 tcp_srv = ses->server;
2766 volume_info = mnt_data->vol;
2768 if (!match_server(tcp_srv, volume_info) ||
2769 !match_session(ses, volume_info) ||
2770 !match_tcon(tcon, volume_info->UNC)) {
2775 rc = compare_mount_options(sb, mnt_data);
2777 spin_unlock(&cifs_tcp_ses_lock);
2778 cifs_put_tlink(tlink);
2783 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2784 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2785 struct dfs_info3_param **referrals, int remap)
2790 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2796 if (ses->ipc_tid == 0) {
2797 temp_unc = kmalloc(2 /* for slashes */ +
2798 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2799 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2800 if (temp_unc == NULL)
2804 strcpy(temp_unc + 2, ses->serverName);
2805 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2806 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
2808 cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
2812 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
2813 referrals, num_referrals,
2814 nls_codepage, remap);
2816 * BB - map targetUNCs to dfs_info3 structures, here or in
2817 * ses->server->ops->get_dfs_refer.
2823 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2824 static struct lock_class_key cifs_key[2];
2825 static struct lock_class_key cifs_slock_key[2];
2828 cifs_reclassify_socket4(struct socket *sock)
2830 struct sock *sk = sock->sk;
2831 BUG_ON(sock_owned_by_user(sk));
2832 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2833 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2837 cifs_reclassify_socket6(struct socket *sock)
2839 struct sock *sk = sock->sk;
2840 BUG_ON(sock_owned_by_user(sk));
2841 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2842 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2846 cifs_reclassify_socket4(struct socket *sock)
2851 cifs_reclassify_socket6(struct socket *sock)
2856 /* See RFC1001 section 14 on representation of Netbios names */
2857 static void rfc1002mangle(char *target, char *source, unsigned int length)
2861 for (i = 0, j = 0; i < (length); i++) {
2862 /* mask a nibble at a time and encode */
2863 target[j] = 'A' + (0x0F & (source[i] >> 4));
2864 target[j+1] = 'A' + (0x0F & source[i]);
2871 bind_socket(struct TCP_Server_Info *server)
2874 if (server->srcaddr.ss_family != AF_UNSPEC) {
2875 /* Bind to the specified local IP address */
2876 struct socket *socket = server->ssocket;
2877 rc = socket->ops->bind(socket,
2878 (struct sockaddr *) &server->srcaddr,
2879 sizeof(server->srcaddr));
2881 struct sockaddr_in *saddr4;
2882 struct sockaddr_in6 *saddr6;
2883 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2884 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2885 if (saddr6->sin6_family == AF_INET6)
2886 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2887 &saddr6->sin6_addr, rc);
2889 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2890 &saddr4->sin_addr.s_addr, rc);
2897 ip_rfc1001_connect(struct TCP_Server_Info *server)
2901 * some servers require RFC1001 sessinit before sending
2902 * negprot - BB check reconnection in case where second
2903 * sessinit is sent but no second negprot
2905 struct rfc1002_session_packet *ses_init_buf;
2906 struct smb_hdr *smb_buf;
2907 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2910 ses_init_buf->trailer.session_req.called_len = 32;
2912 if (server->server_RFC1001_name &&
2913 server->server_RFC1001_name[0] != 0)
2914 rfc1002mangle(ses_init_buf->trailer.
2915 session_req.called_name,
2916 server->server_RFC1001_name,
2917 RFC1001_NAME_LEN_WITH_NULL);
2919 rfc1002mangle(ses_init_buf->trailer.
2920 session_req.called_name,
2921 DEFAULT_CIFS_CALLED_NAME,
2922 RFC1001_NAME_LEN_WITH_NULL);
2924 ses_init_buf->trailer.session_req.calling_len = 32;
2927 * calling name ends in null (byte 16) from old smb
2930 if (server->workstation_RFC1001_name &&
2931 server->workstation_RFC1001_name[0] != 0)
2932 rfc1002mangle(ses_init_buf->trailer.
2933 session_req.calling_name,
2934 server->workstation_RFC1001_name,
2935 RFC1001_NAME_LEN_WITH_NULL);
2937 rfc1002mangle(ses_init_buf->trailer.
2938 session_req.calling_name,
2940 RFC1001_NAME_LEN_WITH_NULL);
2942 ses_init_buf->trailer.session_req.scope1 = 0;
2943 ses_init_buf->trailer.session_req.scope2 = 0;
2944 smb_buf = (struct smb_hdr *)ses_init_buf;
2946 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2947 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2948 rc = smb_send(server, smb_buf, 0x44);
2949 kfree(ses_init_buf);
2951 * RFC1001 layer in at least one server
2952 * requires very short break before negprot
2953 * presumably because not expecting negprot
2954 * to follow so fast. This is a simple
2955 * solution that works without
2956 * complicating the code and causes no
2957 * significant slowing down on mount
2960 usleep_range(1000, 2000);
2963 * else the negprot may still work without this
2964 * even though malloc failed
2971 generic_ip_connect(struct TCP_Server_Info *server)
2976 struct socket *socket = server->ssocket;
2977 struct sockaddr *saddr;
2979 saddr = (struct sockaddr *) &server->dstaddr;
2981 if (server->dstaddr.ss_family == AF_INET6) {
2982 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2983 slen = sizeof(struct sockaddr_in6);
2986 sport = ((struct sockaddr_in *) saddr)->sin_port;
2987 slen = sizeof(struct sockaddr_in);
2991 if (socket == NULL) {
2992 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2993 IPPROTO_TCP, &socket, 1);
2995 cifs_dbg(VFS, "Error %d creating socket\n", rc);
2996 server->ssocket = NULL;
3000 /* BB other socket options to set KEEPALIVE, NODELAY? */
3001 cifs_dbg(FYI, "Socket created\n");
3002 server->ssocket = socket;
3003 socket->sk->sk_allocation = GFP_NOFS;
3004 if (sfamily == AF_INET6)
3005 cifs_reclassify_socket6(socket);
3007 cifs_reclassify_socket4(socket);
3010 rc = bind_socket(server);
3015 * Eventually check for other socket options to change from
3016 * the default. sock_setsockopt not used because it expects
3019 socket->sk->sk_rcvtimeo = 7 * HZ;
3020 socket->sk->sk_sndtimeo = 5 * HZ;
3022 /* make the bufsizes depend on wsize/rsize and max requests */
3023 if (server->noautotune) {
3024 if (socket->sk->sk_sndbuf < (200 * 1024))
3025 socket->sk->sk_sndbuf = 200 * 1024;
3026 if (socket->sk->sk_rcvbuf < (140 * 1024))
3027 socket->sk->sk_rcvbuf = 140 * 1024;
3030 if (server->tcp_nodelay) {
3032 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3033 (char *)&val, sizeof(val));
3035 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3039 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3040 socket->sk->sk_sndbuf,
3041 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3043 rc = socket->ops->connect(socket, saddr, slen, 0);
3045 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3046 sock_release(socket);
3047 server->ssocket = NULL;
3051 if (sport == htons(RFC1001_PORT))
3052 rc = ip_rfc1001_connect(server);
3058 ip_connect(struct TCP_Server_Info *server)
3061 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3062 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3064 if (server->dstaddr.ss_family == AF_INET6)
3065 sport = &addr6->sin6_port;
3067 sport = &addr->sin_port;
3072 /* try with 445 port at first */
3073 *sport = htons(CIFS_PORT);
3075 rc = generic_ip_connect(server);
3079 /* if it failed, try with 139 port */
3080 *sport = htons(RFC1001_PORT);
3083 return generic_ip_connect(server);
3086 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3087 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3089 /* if we are reconnecting then should we check to see if
3090 * any requested capabilities changed locally e.g. via
3091 * remount but we can not do much about it here
3092 * if they have (even if we could detect it by the following)
3093 * Perhaps we could add a backpointer to array of sb from tcon
3094 * or if we change to make all sb to same share the same
3095 * sb as NFS - then we only have one backpointer to sb.
3096 * What if we wanted to mount the server share twice once with
3097 * and once without posixacls or posix paths? */
3098 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3100 if (vol_info && vol_info->no_linux_ext) {
3101 tcon->fsUnixInfo.Capability = 0;
3102 tcon->unix_ext = 0; /* Unix Extensions disabled */
3103 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3105 } else if (vol_info)
3106 tcon->unix_ext = 1; /* Unix Extensions supported */
3108 if (tcon->unix_ext == 0) {
3109 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3113 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3114 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3115 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3116 /* check for reconnect case in which we do not
3117 want to change the mount behavior if we can avoid it */
3118 if (vol_info == NULL) {
3119 /* turn off POSIX ACL and PATHNAMES if not set
3120 originally at mount time */
3121 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3122 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3123 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3124 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3125 cifs_dbg(VFS, "POSIXPATH support change\n");
3126 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3127 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3128 cifs_dbg(VFS, "possible reconnect error\n");
3129 cifs_dbg(VFS, "server disabled POSIX path support\n");
3133 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3134 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3136 cap &= CIFS_UNIX_CAP_MASK;
3137 if (vol_info && vol_info->no_psx_acl)
3138 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3139 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3140 cifs_dbg(FYI, "negotiated posix acl support\n");
3142 cifs_sb->mnt_cifs_flags |=
3143 CIFS_MOUNT_POSIXACL;
3146 if (vol_info && vol_info->posix_paths == 0)
3147 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3148 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3149 cifs_dbg(FYI, "negotiate posix pathnames\n");
3151 cifs_sb->mnt_cifs_flags |=
3152 CIFS_MOUNT_POSIX_PATHS;
3155 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3156 #ifdef CONFIG_CIFS_DEBUG2
3157 if (cap & CIFS_UNIX_FCNTL_CAP)
3158 cifs_dbg(FYI, "FCNTL cap\n");
3159 if (cap & CIFS_UNIX_EXTATTR_CAP)
3160 cifs_dbg(FYI, "EXTATTR cap\n");
3161 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3162 cifs_dbg(FYI, "POSIX path cap\n");
3163 if (cap & CIFS_UNIX_XATTR_CAP)
3164 cifs_dbg(FYI, "XATTR cap\n");
3165 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3166 cifs_dbg(FYI, "POSIX ACL cap\n");
3167 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3168 cifs_dbg(FYI, "very large read cap\n");
3169 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3170 cifs_dbg(FYI, "very large write cap\n");
3171 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3172 cifs_dbg(FYI, "transport encryption cap\n");
3173 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3174 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3175 #endif /* CIFS_DEBUG2 */
3176 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3177 if (vol_info == NULL) {
3178 cifs_dbg(FYI, "resetting capabilities failed\n");
3180 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");
3186 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3187 struct cifs_sb_info *cifs_sb)
3189 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3191 spin_lock_init(&cifs_sb->tlink_tree_lock);
3192 cifs_sb->tlink_tree = RB_ROOT;
3195 * Temporarily set r/wsize for matching superblock. If we end up using
3196 * new sb then client will later negotiate it downward if needed.
3198 cifs_sb->rsize = pvolume_info->rsize;
3199 cifs_sb->wsize = pvolume_info->wsize;
3201 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3202 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3203 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3204 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3205 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3206 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3208 cifs_sb->actimeo = pvolume_info->actimeo;
3209 cifs_sb->local_nls = pvolume_info->local_nls;
3211 if (pvolume_info->noperm)
3212 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3213 if (pvolume_info->setuids)
3214 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3215 if (pvolume_info->server_ino)
3216 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3217 if (pvolume_info->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) {
3260 cifs_dbg(VFS, "mount option mfsymlinks ignored if sfu mount option is used\n");
3262 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3266 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3267 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3271 cleanup_volume_info_contents(struct smb_vol *volume_info)
3273 kfree(volume_info->username);
3274 kzfree(volume_info->password);
3275 kfree(volume_info->UNC);
3276 kfree(volume_info->domainname);
3277 kfree(volume_info->iocharset);
3278 kfree(volume_info->prepath);
3282 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3286 cleanup_volume_info_contents(volume_info);
3291 #ifdef CONFIG_CIFS_DFS_UPCALL
3293 * cifs_build_path_to_root returns full path to root when we do not have an
3294 * exiting connection (tcon)
3297 build_unc_path_to_root(const struct smb_vol *vol,
3298 const struct cifs_sb_info *cifs_sb)
3300 char *full_path, *pos;
3301 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3302 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3304 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3305 if (full_path == NULL)
3306 return ERR_PTR(-ENOMEM);
3308 strncpy(full_path, vol->UNC, unc_len);
3309 pos = full_path + unc_len;
3312 *pos = CIFS_DIR_SEP(cifs_sb);
3313 strncpy(pos + 1, vol->prepath, pplen);
3317 *pos = '\0'; /* add trailing null */
3318 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3319 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3324 * Perform a dfs referral query for a share and (optionally) prefix
3326 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3327 * to a string containing updated options for the submount. Otherwise it
3328 * will be left untouched.
3330 * Returns the rc from get_dfs_path to the caller, which can be used to
3331 * determine whether there were referrals.
3334 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3335 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3339 unsigned int num_referrals = 0;
3340 struct dfs_info3_param *referrals = NULL;
3341 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3343 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3344 if (IS_ERR(full_path))
3345 return PTR_ERR(full_path);
3347 /* For DFS paths, skip the first '\' of the UNC */
3348 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3350 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3351 &num_referrals, &referrals,
3352 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3354 if (!rc && num_referrals > 0) {
3355 char *fake_devname = NULL;
3357 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3358 full_path + 1, referrals,
3361 free_dfs_info_array(referrals, num_referrals);
3363 if (IS_ERR(mdata)) {
3364 rc = PTR_ERR(mdata);
3367 cleanup_volume_info_contents(volume_info);
3368 rc = cifs_setup_volume_info(volume_info, mdata,
3371 kfree(fake_devname);
3372 kfree(cifs_sb->mountdata);
3373 cifs_sb->mountdata = mdata;
3381 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3382 const char *devname)
3386 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3389 if (volume_info->nullauth) {
3390 cifs_dbg(FYI, "Anonymous login\n");
3391 kfree(volume_info->username);
3392 volume_info->username = NULL;
3393 } else if (volume_info->username) {
3394 /* BB fixme parse for domain name here */
3395 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3397 cifs_dbg(VFS, "No username specified\n");
3398 /* In userspace mount helper we can get user name from alternate
3399 locations such as env variables and files on disk */
3403 /* this is needed for ASCII cp to Unicode converts */
3404 if (volume_info->iocharset == NULL) {
3405 /* load_nls_default cannot return null */
3406 volume_info->local_nls = load_nls_default();
3408 volume_info->local_nls = load_nls(volume_info->iocharset);
3409 if (volume_info->local_nls == NULL) {
3410 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3411 volume_info->iocharset);
3420 cifs_get_volume_info(char *mount_data, const char *devname)
3423 struct smb_vol *volume_info;
3425 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3427 return ERR_PTR(-ENOMEM);
3429 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3431 cifs_cleanup_volume_info(volume_info);
3432 volume_info = ERR_PTR(rc);
3439 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3443 struct cifs_ses *ses;
3444 struct cifs_tcon *tcon;
3445 struct TCP_Server_Info *server;
3447 struct tcon_link *tlink;
3448 #ifdef CONFIG_CIFS_DFS_UPCALL
3449 int referral_walks_count = 0;
3452 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3456 #ifdef CONFIG_CIFS_DFS_UPCALL
3458 /* cleanup activities if we're chasing a referral */
3459 if (referral_walks_count) {
3461 cifs_put_tcon(tcon);
3463 cifs_put_smb_ses(ses);
3477 /* get a reference to a tcp session */
3478 server = cifs_get_tcp_session(volume_info);
3479 if (IS_ERR(server)) {
3480 rc = PTR_ERR(server);
3481 bdi_destroy(&cifs_sb->bdi);
3485 /* get a reference to a SMB session */
3486 ses = cifs_get_smb_ses(server, volume_info);
3490 goto mount_fail_check;
3493 /* search for existing tcon to this server share */
3494 tcon = cifs_get_tcon(ses, volume_info);
3498 goto remote_path_check;
3501 /* tell server which Unix caps we support */
3502 if (cap_unix(tcon->ses)) {
3503 /* reset of caps checks mount to see if unix extensions
3504 disabled for just this mount */
3505 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3506 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3507 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3508 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3510 goto mount_fail_check;
3513 tcon->unix_ext = 0; /* server does not support them */
3515 /* do not care if a following call succeed - informational */
3516 if (!tcon->ipc && server->ops->qfs_tcon)
3517 server->ops->qfs_tcon(xid, tcon);
3519 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3520 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3522 /* tune readahead according to rsize */
3523 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3526 #ifdef CONFIG_CIFS_DFS_UPCALL
3528 * Perform an unconditional check for whether there are DFS
3529 * referrals for this path without prefix, to provide support
3530 * for DFS referrals from w2k8 servers which don't seem to respond
3531 * with PATH_NOT_COVERED to requests that include the prefix.
3532 * Chase the referral if found, otherwise continue normally.
3534 if (referral_walks_count == 0) {
3535 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3538 referral_walks_count++;
3539 goto try_mount_again;
3544 /* check if a whole path is not remote */
3546 if (!server->ops->is_path_accessible) {
3548 goto mount_fail_check;
3551 * cifs_build_path_to_root works only when we have a valid tcon
3553 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3554 if (full_path == NULL) {
3556 goto mount_fail_check;
3558 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3560 if (rc != 0 && rc != -EREMOTE) {
3562 goto mount_fail_check;
3567 /* get referral if needed */
3568 if (rc == -EREMOTE) {
3569 #ifdef CONFIG_CIFS_DFS_UPCALL
3570 if (referral_walks_count > MAX_NESTED_LINKS) {
3572 * BB: when we implement proper loop detection,
3573 * we will remove this check. But now we need it
3574 * to prevent an indefinite loop if 'DFS tree' is
3575 * misconfigured (i.e. has loops).
3578 goto mount_fail_check;
3581 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3584 referral_walks_count++;
3585 goto try_mount_again;
3587 goto mount_fail_check;
3588 #else /* No DFS support, return error on mount */
3594 goto mount_fail_check;
3596 /* now, hang the tcon off of the superblock */
3597 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3598 if (tlink == NULL) {
3600 goto mount_fail_check;
3603 tlink->tl_uid = ses->linux_uid;
3604 tlink->tl_tcon = tcon;
3605 tlink->tl_time = jiffies;
3606 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3607 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3609 cifs_sb->master_tlink = tlink;
3610 spin_lock(&cifs_sb->tlink_tree_lock);
3611 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3612 spin_unlock(&cifs_sb->tlink_tree_lock);
3614 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3618 /* on error free sesinfo and tcon struct if needed */
3620 /* If find_unc succeeded then rc == 0 so we can not end */
3621 /* up accidentally freeing someone elses tcon struct */
3623 cifs_put_tcon(tcon);
3625 cifs_put_smb_ses(ses);
3627 cifs_put_tcp_session(server);
3628 bdi_destroy(&cifs_sb->bdi);
3637 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3638 * pointer may be NULL.
3641 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3642 const char *tree, struct cifs_tcon *tcon,
3643 const struct nls_table *nls_codepage)
3645 struct smb_hdr *smb_buffer;
3646 struct smb_hdr *smb_buffer_response;
3649 unsigned char *bcc_ptr;
3652 __u16 bytes_left, count;
3657 smb_buffer = cifs_buf_get();
3658 if (smb_buffer == NULL)
3661 smb_buffer_response = smb_buffer;
3663 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3664 NULL /*no tid */ , 4 /*wct */ );
3666 smb_buffer->Mid = get_next_mid(ses->server);
3667 smb_buffer->Uid = ses->Suid;
3668 pSMB = (TCONX_REQ *) smb_buffer;
3669 pSMBr = (TCONX_RSP *) smb_buffer_response;
3671 pSMB->AndXCommand = 0xFF;
3672 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3673 bcc_ptr = &pSMB->Password[0];
3674 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3675 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3676 *bcc_ptr = 0; /* password is null byte */
3677 bcc_ptr++; /* skip password */
3678 /* already aligned so no need to do it below */
3680 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3681 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3682 specified as required (when that support is added to
3683 the vfs in the future) as only NTLM or the much
3684 weaker LANMAN (which we do not send by default) is accepted
3685 by Samba (not sure whether other servers allow
3686 NTLMv2 password here) */
3687 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3688 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3689 (ses->server->secType == LANMAN))
3690 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3691 ses->server->sec_mode &
3692 SECMODE_PW_ENCRYPT ? true : false,
3695 #endif /* CIFS_WEAK_PW_HASH */
3696 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3697 bcc_ptr, nls_codepage);
3699 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3700 if (ses->capabilities & CAP_UNICODE) {
3701 /* must align unicode strings */
3702 *bcc_ptr = 0; /* null byte password */
3707 if (ses->server->sec_mode &
3708 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3709 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3711 if (ses->capabilities & CAP_STATUS32) {
3712 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3714 if (ses->capabilities & CAP_DFS) {
3715 smb_buffer->Flags2 |= SMBFLG2_DFS;
3717 if (ses->capabilities & CAP_UNICODE) {
3718 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3720 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3721 6 /* max utf8 char length in bytes */ *
3722 (/* server len*/ + 256 /* share len */), nls_codepage);
3723 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3724 bcc_ptr += 2; /* skip trailing null */
3725 } else { /* ASCII */
3726 strcpy(bcc_ptr, tree);
3727 bcc_ptr += strlen(tree) + 1;
3729 strcpy(bcc_ptr, "?????");
3730 bcc_ptr += strlen("?????");
3732 count = bcc_ptr - &pSMB->Password[0];
3733 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3734 pSMB->hdr.smb_buf_length) + count);
3735 pSMB->ByteCount = cpu_to_le16(count);
3737 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3740 /* above now done in SendReceive */
3741 if ((rc == 0) && (tcon != NULL)) {
3744 tcon->tidStatus = CifsGood;
3745 tcon->need_reconnect = false;
3746 tcon->tid = smb_buffer_response->Tid;
3747 bcc_ptr = pByteArea(smb_buffer_response);
3748 bytes_left = get_bcc(smb_buffer_response);
3749 length = strnlen(bcc_ptr, bytes_left - 2);
3750 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3756 /* skip service field (NB: this field is always ASCII) */
3758 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3759 (bcc_ptr[2] == 'C')) {
3760 cifs_dbg(FYI, "IPC connection\n");
3763 } else if (length == 2) {
3764 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3765 /* the most common case */
3766 cifs_dbg(FYI, "disk share connection\n");
3769 bcc_ptr += length + 1;
3770 bytes_left -= (length + 1);
3771 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3773 /* mostly informational -- no need to fail on error here */
3774 kfree(tcon->nativeFileSystem);
3775 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3776 bytes_left, is_unicode,
3779 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3781 if ((smb_buffer_response->WordCount == 3) ||
3782 (smb_buffer_response->WordCount == 7))
3783 /* field is in same location */
3784 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3787 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3788 } else if ((rc == 0) && tcon == NULL) {
3789 /* all we need to save for IPC$ connection */
3790 ses->ipc_tid = smb_buffer_response->Tid;
3793 cifs_buf_release(smb_buffer);
3798 cifs_umount(struct cifs_sb_info *cifs_sb)
3800 struct rb_root *root = &cifs_sb->tlink_tree;
3801 struct rb_node *node;
3802 struct tcon_link *tlink;
3804 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3806 spin_lock(&cifs_sb->tlink_tree_lock);
3807 while ((node = rb_first(root))) {
3808 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3809 cifs_get_tlink(tlink);
3810 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3811 rb_erase(node, root);
3813 spin_unlock(&cifs_sb->tlink_tree_lock);
3814 cifs_put_tlink(tlink);
3815 spin_lock(&cifs_sb->tlink_tree_lock);
3817 spin_unlock(&cifs_sb->tlink_tree_lock);
3819 bdi_destroy(&cifs_sb->bdi);
3820 kfree(cifs_sb->mountdata);
3821 unload_nls(cifs_sb->local_nls);
3826 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3829 struct TCP_Server_Info *server = ses->server;
3831 if (!server->ops->need_neg || !server->ops->negotiate)
3834 /* only send once per connect */
3835 if (!server->ops->need_neg(server))
3838 set_credits(server, 1);
3840 rc = server->ops->negotiate(xid, ses);
3842 spin_lock(&GlobalMid_Lock);
3843 if (server->tcpStatus == CifsNeedNegotiate)
3844 server->tcpStatus = CifsGood;
3847 spin_unlock(&GlobalMid_Lock);
3854 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3855 struct nls_table *nls_info)
3858 struct TCP_Server_Info *server = ses->server;
3860 ses->capabilities = server->capabilities;
3861 if (linuxExtEnabled == 0)
3862 ses->capabilities &= (~server->vals->cap_unix);
3864 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3865 server->sec_mode, server->capabilities, server->timeAdj);
3867 if (server->ops->sess_setup)
3868 rc = server->ops->sess_setup(xid, ses, nls_info);
3871 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3873 mutex_lock(&server->srv_mutex);
3874 if (!server->session_estab) {
3875 server->session_key.response = ses->auth_key.response;
3876 server->session_key.len = ses->auth_key.len;
3877 server->sequence_number = 0x2;
3878 server->session_estab = true;
3879 ses->auth_key.response = NULL;
3881 mutex_unlock(&server->srv_mutex);
3883 cifs_dbg(FYI, "CIFS Session Established successfully\n");
3884 spin_lock(&GlobalMid_Lock);
3885 ses->status = CifsGood;
3886 ses->need_reconnect = false;
3887 spin_unlock(&GlobalMid_Lock);
3890 kfree(ses->auth_key.response);
3891 ses->auth_key.response = NULL;
3892 ses->auth_key.len = 0;
3893 kfree(ses->ntlmssp);
3894 ses->ntlmssp = NULL;
3900 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
3902 switch (ses->server->secType) {
3904 vol->secFlg = CIFSSEC_MUST_KRB5;
3907 vol->secFlg = CIFSSEC_MUST_NTLMV2;
3910 vol->secFlg = CIFSSEC_MUST_NTLM;
3913 vol->secFlg = CIFSSEC_MUST_NTLMSSP;
3916 vol->secFlg = CIFSSEC_MUST_LANMAN;
3919 /* should never happen */
3924 return cifs_set_cifscreds(vol, ses);
3927 static struct cifs_tcon *
3928 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3931 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3932 struct cifs_ses *ses;
3933 struct cifs_tcon *tcon = NULL;
3934 struct smb_vol *vol_info;
3936 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3937 if (vol_info == NULL)
3938 return ERR_PTR(-ENOMEM);
3940 vol_info->local_nls = cifs_sb->local_nls;
3941 vol_info->linux_uid = fsuid;
3942 vol_info->cred_uid = fsuid;
3943 vol_info->UNC = master_tcon->treeName;
3944 vol_info->retry = master_tcon->retry;
3945 vol_info->nocase = master_tcon->nocase;
3946 vol_info->local_lease = master_tcon->local_lease;
3947 vol_info->no_linux_ext = !master_tcon->unix_ext;
3948 vol_info->sectype = master_tcon->ses->sectype;
3949 vol_info->sign = master_tcon->ses->sign;
3951 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
3957 /* get a reference for the same TCP session */
3958 spin_lock(&cifs_tcp_ses_lock);
3959 ++master_tcon->ses->server->srv_count;
3960 spin_unlock(&cifs_tcp_ses_lock);
3962 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3964 tcon = (struct cifs_tcon *)ses;
3965 cifs_put_tcp_session(master_tcon->ses->server);
3969 tcon = cifs_get_tcon(ses, vol_info);
3971 cifs_put_smb_ses(ses);
3976 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3978 kfree(vol_info->username);
3979 kfree(vol_info->password);
3986 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3988 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3992 cifs_sb_tcon_pending_wait(void *unused)
3995 return signal_pending(current) ? -ERESTARTSYS : 0;
3998 /* find and return a tlink with given uid */
3999 static struct tcon_link *
4000 tlink_rb_search(struct rb_root *root, kuid_t uid)
4002 struct rb_node *node = root->rb_node;
4003 struct tcon_link *tlink;
4006 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4008 if (uid_gt(tlink->tl_uid, uid))
4009 node = node->rb_left;
4010 else if (uid_lt(tlink->tl_uid, uid))
4011 node = node->rb_right;
4018 /* insert a tcon_link into the tree */
4020 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4022 struct rb_node **new = &(root->rb_node), *parent = NULL;
4023 struct tcon_link *tlink;
4026 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4029 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4030 new = &((*new)->rb_left);
4032 new = &((*new)->rb_right);
4035 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4036 rb_insert_color(&new_tlink->tl_rbnode, root);
4040 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4043 * If the superblock doesn't refer to a multiuser mount, then just return
4044 * the master tcon for the mount.
4046 * First, search the rbtree for an existing tcon for this fsuid. If one
4047 * exists, then check to see if it's pending construction. If it is then wait
4048 * for construction to complete. Once it's no longer pending, check to see if
4049 * it failed and either return an error or retry construction, depending on
4052 * If one doesn't exist then insert a new tcon_link struct into the tree and
4053 * try to construct a new one.
4056 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4059 kuid_t fsuid = current_fsuid();
4060 struct tcon_link *tlink, *newtlink;
4062 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4063 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4065 spin_lock(&cifs_sb->tlink_tree_lock);
4066 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4068 cifs_get_tlink(tlink);
4069 spin_unlock(&cifs_sb->tlink_tree_lock);
4071 if (tlink == NULL) {
4072 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4073 if (newtlink == NULL)
4074 return ERR_PTR(-ENOMEM);
4075 newtlink->tl_uid = fsuid;
4076 newtlink->tl_tcon = ERR_PTR(-EACCES);
4077 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4078 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4079 cifs_get_tlink(newtlink);
4081 spin_lock(&cifs_sb->tlink_tree_lock);
4082 /* was one inserted after previous search? */
4083 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4085 cifs_get_tlink(tlink);
4086 spin_unlock(&cifs_sb->tlink_tree_lock);
4088 goto wait_for_construction;
4091 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4092 spin_unlock(&cifs_sb->tlink_tree_lock);
4094 wait_for_construction:
4095 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4096 cifs_sb_tcon_pending_wait,
4097 TASK_INTERRUPTIBLE);
4099 cifs_put_tlink(tlink);
4100 return ERR_PTR(ret);
4103 /* if it's good, return it */
4104 if (!IS_ERR(tlink->tl_tcon))
4107 /* return error if we tried this already recently */
4108 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4109 cifs_put_tlink(tlink);
4110 return ERR_PTR(-EACCES);
4113 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4114 goto wait_for_construction;
4117 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4118 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4119 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4121 if (IS_ERR(tlink->tl_tcon)) {
4122 cifs_put_tlink(tlink);
4123 return ERR_PTR(-EACCES);
4130 * periodic workqueue job that scans tcon_tree for a superblock and closes
4134 cifs_prune_tlinks(struct work_struct *work)
4136 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4138 struct rb_root *root = &cifs_sb->tlink_tree;
4139 struct rb_node *node = rb_first(root);
4140 struct rb_node *tmp;
4141 struct tcon_link *tlink;
4144 * Because we drop the spinlock in the loop in order to put the tlink
4145 * it's not guarded against removal of links from the tree. The only
4146 * places that remove entries from the tree are this function and
4147 * umounts. Because this function is non-reentrant and is canceled
4148 * before umount can proceed, this is safe.
4150 spin_lock(&cifs_sb->tlink_tree_lock);
4151 node = rb_first(root);
4152 while (node != NULL) {
4154 node = rb_next(tmp);
4155 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4157 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4158 atomic_read(&tlink->tl_count) != 0 ||
4159 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4162 cifs_get_tlink(tlink);
4163 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4164 rb_erase(tmp, root);
4166 spin_unlock(&cifs_sb->tlink_tree_lock);
4167 cifs_put_tlink(tlink);
4168 spin_lock(&cifs_sb->tlink_tree_lock);
4170 spin_unlock(&cifs_sb->tlink_tree_lock);
4172 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,