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 },
279 { Smb_302, SMB302_VERSION_STRING },
282 static int ip_connect(struct TCP_Server_Info *server);
283 static int generic_ip_connect(struct TCP_Server_Info *server);
284 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
285 static void cifs_prune_tlinks(struct work_struct *work);
286 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
287 const char *devname);
290 * cifs tcp session reconnection
292 * mark tcp session as reconnecting so temporarily locked
293 * mark all smb sessions as reconnecting for tcp session
294 * reconnect tcp session
295 * wake up waiters on reconnection? - (not needed currently)
298 cifs_reconnect(struct TCP_Server_Info *server)
301 struct list_head *tmp, *tmp2;
302 struct cifs_ses *ses;
303 struct cifs_tcon *tcon;
304 struct mid_q_entry *mid_entry;
305 struct list_head retry_list;
307 spin_lock(&GlobalMid_Lock);
308 if (server->tcpStatus == CifsExiting) {
309 /* the demux thread will exit normally
310 next time through the loop */
311 spin_unlock(&GlobalMid_Lock);
314 server->tcpStatus = CifsNeedReconnect;
315 spin_unlock(&GlobalMid_Lock);
317 #ifdef CONFIG_CIFS_SMB2
318 server->max_read = 0;
321 cifs_dbg(FYI, "Reconnecting tcp session\n");
323 /* before reconnecting the tcp session, mark the smb session (uid)
324 and the tid bad so they are not used until reconnected */
325 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
327 spin_lock(&cifs_tcp_ses_lock);
328 list_for_each(tmp, &server->smb_ses_list) {
329 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
330 ses->need_reconnect = true;
332 list_for_each(tmp2, &ses->tcon_list) {
333 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
334 tcon->need_reconnect = true;
337 spin_unlock(&cifs_tcp_ses_lock);
339 /* do not want to be sending data on a socket we are freeing */
340 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
341 mutex_lock(&server->srv_mutex);
342 if (server->ssocket) {
343 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
344 server->ssocket->state, server->ssocket->flags);
345 kernel_sock_shutdown(server->ssocket, SHUT_WR);
346 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
347 server->ssocket->state, server->ssocket->flags);
348 sock_release(server->ssocket);
349 server->ssocket = NULL;
351 server->sequence_number = 0;
352 server->session_estab = false;
353 kfree(server->session_key.response);
354 server->session_key.response = NULL;
355 server->session_key.len = 0;
356 server->lstrp = jiffies;
357 mutex_unlock(&server->srv_mutex);
359 /* mark submitted MIDs for retry and issue callback */
360 INIT_LIST_HEAD(&retry_list);
361 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
362 spin_lock(&GlobalMid_Lock);
363 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
364 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
365 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
366 mid_entry->mid_state = MID_RETRY_NEEDED;
367 list_move(&mid_entry->qhead, &retry_list);
369 spin_unlock(&GlobalMid_Lock);
371 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
372 list_for_each_safe(tmp, tmp2, &retry_list) {
373 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
374 list_del_init(&mid_entry->qhead);
375 mid_entry->callback(mid_entry);
381 /* we should try only the port we connected to before */
382 rc = generic_ip_connect(server);
384 cifs_dbg(FYI, "reconnect error %d\n", rc);
387 atomic_inc(&tcpSesReconnectCount);
388 spin_lock(&GlobalMid_Lock);
389 if (server->tcpStatus != CifsExiting)
390 server->tcpStatus = CifsNeedNegotiate;
391 spin_unlock(&GlobalMid_Lock);
393 } while (server->tcpStatus == CifsNeedReconnect);
399 cifs_echo_request(struct work_struct *work)
402 struct TCP_Server_Info *server = container_of(work,
403 struct TCP_Server_Info, echo.work);
406 * We cannot send an echo if it is disabled or until the
407 * NEGOTIATE_PROTOCOL request is done, which is indicated by
408 * server->ops->need_neg() == true. Also, no need to ping if
409 * we got a response recently.
411 if (!server->ops->need_neg || server->ops->need_neg(server) ||
412 (server->ops->can_echo && !server->ops->can_echo(server)) ||
413 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
416 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
418 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
422 queue_delayed_work(cifsiod_wq, &server->echo, SMB_ECHO_INTERVAL);
426 allocate_buffers(struct TCP_Server_Info *server)
428 if (!server->bigbuf) {
429 server->bigbuf = (char *)cifs_buf_get();
430 if (!server->bigbuf) {
431 cifs_dbg(VFS, "No memory for large SMB response\n");
433 /* retry will check if exiting */
436 } else if (server->large_buf) {
437 /* we are reusing a dirty large buf, clear its start */
438 memset(server->bigbuf, 0, HEADER_SIZE(server));
441 if (!server->smallbuf) {
442 server->smallbuf = (char *)cifs_small_buf_get();
443 if (!server->smallbuf) {
444 cifs_dbg(VFS, "No memory for SMB response\n");
446 /* retry will check if exiting */
449 /* beginning of smb buffer is cleared in our buf_get */
451 /* if existing small buf clear beginning */
452 memset(server->smallbuf, 0, HEADER_SIZE(server));
459 server_unresponsive(struct TCP_Server_Info *server)
462 * We need to wait 2 echo intervals to make sure we handle such
464 * 1s client sends a normal SMB request
465 * 2s client gets a response
466 * 30s echo workqueue job pops, and decides we got a response recently
467 * and don't need to send another
469 * 65s kernel_recvmsg times out, and we see that we haven't gotten
470 * a response in >60s.
472 if (server->tcpStatus == CifsGood &&
473 time_after(jiffies, server->lstrp + 2 * SMB_ECHO_INTERVAL)) {
474 cifs_dbg(VFS, "Server %s has not responded in %d seconds. Reconnecting...\n",
475 server->hostname, (2 * SMB_ECHO_INTERVAL) / HZ);
476 cifs_reconnect(server);
477 wake_up(&server->response_q);
485 * kvec_array_init - clone a kvec array, and advance into it
486 * @new: pointer to memory for cloned array
487 * @iov: pointer to original array
488 * @nr_segs: number of members in original array
489 * @bytes: number of bytes to advance into the cloned array
491 * This function will copy the array provided in iov to a section of memory
492 * and advance the specified number of bytes into the new array. It returns
493 * the number of segments in the new array. "new" must be at least as big as
494 * the original iov array.
497 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
502 while (bytes || !iov->iov_len) {
503 int copy = min(bytes, iov->iov_len);
507 if (iov->iov_len == base) {
513 memcpy(new, iov, sizeof(*iov) * nr_segs);
514 new->iov_base += base;
515 new->iov_len -= base;
520 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
522 struct kvec *new_iov;
524 if (server->iov && nr_segs <= server->nr_iov)
527 /* not big enough -- allocate a new one and release the old */
528 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
531 server->iov = new_iov;
532 server->nr_iov = nr_segs;
538 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
539 unsigned int nr_segs, unsigned int to_read)
544 struct msghdr smb_msg;
547 iov = get_server_iovec(server, nr_segs);
551 smb_msg.msg_control = NULL;
552 smb_msg.msg_controllen = 0;
554 for (total_read = 0; to_read; total_read += length, to_read -= length) {
557 if (server_unresponsive(server)) {
558 total_read = -EAGAIN;
562 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
564 length = kernel_recvmsg(server->ssocket, &smb_msg,
565 iov, segs, to_read, 0);
567 if (server->tcpStatus == CifsExiting) {
568 total_read = -ESHUTDOWN;
570 } else if (server->tcpStatus == CifsNeedReconnect) {
571 cifs_reconnect(server);
572 total_read = -EAGAIN;
574 } else if (length == -ERESTARTSYS ||
578 * Minimum sleep to prevent looping, allowing socket
579 * to clear and app threads to set tcpStatus
580 * CifsNeedReconnect if server hung.
582 usleep_range(1000, 2000);
585 } else if (length <= 0) {
586 cifs_dbg(FYI, "Received no data or error: expecting %d\n"
587 "got %d", to_read, length);
588 cifs_reconnect(server);
589 total_read = -EAGAIN;
597 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
598 unsigned int to_read)
603 iov.iov_len = to_read;
605 return cifs_readv_from_socket(server, &iov, 1, to_read);
609 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
612 * The first byte big endian of the length field,
613 * is actually not part of the length but the type
614 * with the most common, zero, as regular data.
617 case RFC1002_SESSION_MESSAGE:
618 /* Regular SMB response */
620 case RFC1002_SESSION_KEEP_ALIVE:
621 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
623 case RFC1002_POSITIVE_SESSION_RESPONSE:
624 cifs_dbg(FYI, "RFC 1002 positive session response\n");
626 case RFC1002_NEGATIVE_SESSION_RESPONSE:
628 * We get this from Windows 98 instead of an error on
629 * SMB negprot response.
631 cifs_dbg(FYI, "RFC 1002 negative session response\n");
632 /* give server a second to clean up */
635 * Always try 445 first on reconnect since we get NACK
636 * on some if we ever connected to port 139 (the NACK
637 * is since we do not begin with RFC1001 session
640 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
641 cifs_reconnect(server);
642 wake_up(&server->response_q);
645 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
646 cifs_reconnect(server);
653 dequeue_mid(struct mid_q_entry *mid, bool malformed)
655 #ifdef CONFIG_CIFS_STATS2
656 mid->when_received = jiffies;
658 spin_lock(&GlobalMid_Lock);
660 mid->mid_state = MID_RESPONSE_RECEIVED;
662 mid->mid_state = MID_RESPONSE_MALFORMED;
663 list_del_init(&mid->qhead);
664 spin_unlock(&GlobalMid_Lock);
668 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
669 char *buf, int malformed)
671 if (server->ops->check_trans2 &&
672 server->ops->check_trans2(mid, server, buf, malformed))
675 mid->large_buf = server->large_buf;
676 /* Was previous buf put in mpx struct for multi-rsp? */
677 if (!mid->multiRsp) {
678 /* smb buffer will be freed by user thread */
679 if (server->large_buf)
680 server->bigbuf = NULL;
682 server->smallbuf = NULL;
684 dequeue_mid(mid, malformed);
687 static void clean_demultiplex_info(struct TCP_Server_Info *server)
691 /* take it off the list, if it's not already */
692 spin_lock(&cifs_tcp_ses_lock);
693 list_del_init(&server->tcp_ses_list);
694 spin_unlock(&cifs_tcp_ses_lock);
696 spin_lock(&GlobalMid_Lock);
697 server->tcpStatus = CifsExiting;
698 spin_unlock(&GlobalMid_Lock);
699 wake_up_all(&server->response_q);
701 /* check if we have blocked requests that need to free */
702 spin_lock(&server->req_lock);
703 if (server->credits <= 0)
705 spin_unlock(&server->req_lock);
707 * Although there should not be any requests blocked on this queue it
708 * can not hurt to be paranoid and try to wake up requests that may
709 * haven been blocked when more than 50 at time were on the wire to the
710 * same server - they now will see the session is in exit state and get
711 * out of SendReceive.
713 wake_up_all(&server->request_q);
714 /* give those requests time to exit */
717 if (server->ssocket) {
718 sock_release(server->ssocket);
719 server->ssocket = NULL;
722 if (!list_empty(&server->pending_mid_q)) {
723 struct list_head dispose_list;
724 struct mid_q_entry *mid_entry;
725 struct list_head *tmp, *tmp2;
727 INIT_LIST_HEAD(&dispose_list);
728 spin_lock(&GlobalMid_Lock);
729 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
730 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
731 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
732 mid_entry->mid_state = MID_SHUTDOWN;
733 list_move(&mid_entry->qhead, &dispose_list);
735 spin_unlock(&GlobalMid_Lock);
737 /* now walk dispose list and issue callbacks */
738 list_for_each_safe(tmp, tmp2, &dispose_list) {
739 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
740 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
741 list_del_init(&mid_entry->qhead);
742 mid_entry->callback(mid_entry);
744 /* 1/8th of sec is more than enough time for them to exit */
748 if (!list_empty(&server->pending_mid_q)) {
750 * mpx threads have not exited yet give them at least the smb
751 * send timeout time for long ops.
753 * Due to delays on oplock break requests, we need to wait at
754 * least 45 seconds before giving up on a request getting a
755 * response and going ahead and killing cifsd.
757 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
760 * If threads still have not exited they are probably never
761 * coming home not much else we can do but free the memory.
765 kfree(server->hostname);
769 length = atomic_dec_return(&tcpSesAllocCount);
771 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
776 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
779 char *buf = server->smallbuf;
780 unsigned int pdu_length = get_rfc1002_length(buf);
782 /* make sure this will fit in a large buffer */
783 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
784 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
785 cifs_reconnect(server);
786 wake_up(&server->response_q);
790 /* switch to large buffer if too big for a small one */
791 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
792 server->large_buf = true;
793 memcpy(server->bigbuf, buf, server->total_read);
794 buf = server->bigbuf;
797 /* now read the rest */
798 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
799 pdu_length - HEADER_SIZE(server) + 1 + 4);
802 server->total_read += length;
804 dump_smb(buf, server->total_read);
807 * We know that we received enough to get to the MID as we
808 * checked the pdu_length earlier. Now check to see
809 * if the rest of the header is OK. We borrow the length
810 * var for the rest of the loop to avoid a new stack var.
812 * 48 bytes is enough to display the header and a little bit
813 * into the payload for debugging purposes.
815 length = server->ops->check_message(buf, server->total_read);
817 cifs_dump_mem("Bad SMB: ", buf,
818 min_t(unsigned int, server->total_read, 48));
820 if (server->ops->is_status_pending &&
821 server->ops->is_status_pending(buf, server, length))
827 handle_mid(mid, server, buf, length);
832 cifs_demultiplex_thread(void *p)
835 struct TCP_Server_Info *server = p;
836 unsigned int pdu_length;
838 struct task_struct *task_to_wake = NULL;
839 struct mid_q_entry *mid_entry;
841 current->flags |= PF_MEMALLOC;
842 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
844 length = atomic_inc_return(&tcpSesAllocCount);
846 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
850 while (server->tcpStatus != CifsExiting) {
854 if (!allocate_buffers(server))
857 server->large_buf = false;
858 buf = server->smallbuf;
859 pdu_length = 4; /* enough to get RFC1001 header */
861 length = cifs_read_from_socket(server, buf, pdu_length);
864 server->total_read = length;
867 * The right amount was read from socket - 4 bytes,
868 * so we can now interpret the length field.
870 pdu_length = get_rfc1002_length(buf);
872 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
873 if (!is_smb_response(server, buf[0]))
876 /* make sure we have enough to get to the MID */
877 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
878 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
880 cifs_reconnect(server);
881 wake_up(&server->response_q);
885 /* read down to the MID */
886 length = cifs_read_from_socket(server, buf + 4,
887 HEADER_SIZE(server) - 1 - 4);
890 server->total_read += length;
892 mid_entry = server->ops->find_mid(server, buf);
894 if (!mid_entry || !mid_entry->receive)
895 length = standard_receive3(server, mid_entry);
897 length = mid_entry->receive(server, mid_entry);
902 if (server->large_buf)
903 buf = server->bigbuf;
905 server->lstrp = jiffies;
906 if (mid_entry != NULL) {
907 if (!mid_entry->multiRsp || mid_entry->multiEnd)
908 mid_entry->callback(mid_entry);
909 } else if (!server->ops->is_oplock_break ||
910 !server->ops->is_oplock_break(buf, server)) {
911 cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
912 atomic_read(&midCount));
913 cifs_dump_mem("Received Data is: ", buf,
914 HEADER_SIZE(server));
915 #ifdef CONFIG_CIFS_DEBUG2
916 if (server->ops->dump_detail)
917 server->ops->dump_detail(buf);
918 cifs_dump_mids(server);
919 #endif /* CIFS_DEBUG2 */
922 } /* end while !EXITING */
924 /* buffer usually freed in free_mid - need to free it here on exit */
925 cifs_buf_release(server->bigbuf);
926 if (server->smallbuf) /* no sense logging a debug message if NULL */
927 cifs_small_buf_release(server->smallbuf);
929 task_to_wake = xchg(&server->tsk, NULL);
930 clean_demultiplex_info(server);
932 /* if server->tsk was NULL then wait for a signal before exiting */
934 set_current_state(TASK_INTERRUPTIBLE);
935 while (!signal_pending(current)) {
937 set_current_state(TASK_INTERRUPTIBLE);
939 set_current_state(TASK_RUNNING);
942 module_put_and_exit(0);
945 /* extract the host portion of the UNC string */
947 extract_hostname(const char *unc)
953 /* skip double chars at beginning of string */
954 /* BB: check validity of these bytes? */
957 /* delimiter between hostname and sharename is always '\\' now */
958 delim = strchr(src, '\\');
960 return ERR_PTR(-EINVAL);
963 dst = kmalloc((len + 1), GFP_KERNEL);
965 return ERR_PTR(-ENOMEM);
967 memcpy(dst, src, len);
973 static int get_option_ul(substring_t args[], unsigned long *option)
978 string = match_strdup(args);
981 rc = kstrtoul(string, 0, option);
987 static int get_option_uid(substring_t args[], kuid_t *result)
993 rc = get_option_ul(args, &value);
997 uid = make_kuid(current_user_ns(), value);
1005 static int get_option_gid(substring_t args[], kgid_t *result)
1007 unsigned long value;
1011 rc = get_option_ul(args, &value);
1015 gid = make_kgid(current_user_ns(), value);
1016 if (!gid_valid(gid))
1023 static int cifs_parse_security_flavors(char *value,
1024 struct smb_vol *vol)
1027 substring_t args[MAX_OPT_ARGS];
1030 * With mount options, the last one should win. Reset any existing
1031 * settings back to default.
1033 vol->sectype = Unspecified;
1036 switch (match_token(value, cifs_secflavor_tokens, args)) {
1038 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1044 vol->sectype = Kerberos;
1046 case Opt_sec_ntlmsspi:
1049 case Opt_sec_ntlmssp:
1050 vol->sectype = RawNTLMSSP;
1056 vol->sectype = NTLM;
1058 case Opt_sec_ntlmv2i:
1061 case Opt_sec_ntlmv2:
1062 vol->sectype = NTLMv2;
1064 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1065 case Opt_sec_lanman:
1066 vol->sectype = LANMAN;
1073 cifs_dbg(VFS, "bad security option: %s\n", value);
1081 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1083 substring_t args[MAX_OPT_ARGS];
1085 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1086 case Opt_cache_loose:
1087 vol->direct_io = false;
1088 vol->strict_io = false;
1090 case Opt_cache_strict:
1091 vol->direct_io = false;
1092 vol->strict_io = true;
1094 case Opt_cache_none:
1095 vol->direct_io = true;
1096 vol->strict_io = false;
1099 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1106 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1108 substring_t args[MAX_OPT_ARGS];
1110 switch (match_token(value, cifs_smb_version_tokens, args)) {
1112 vol->ops = &smb1_operations;
1113 vol->vals = &smb1_values;
1115 #ifdef CONFIG_CIFS_SMB2
1117 vol->ops = &smb21_operations; /* currently identical with 2.1 */
1118 vol->vals = &smb20_values;
1121 vol->ops = &smb21_operations;
1122 vol->vals = &smb21_values;
1125 vol->ops = &smb30_operations;
1126 vol->vals = &smb30_values;
1129 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1130 vol->vals = &smb302_values;
1134 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1141 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1142 * fields with the result. Returns 0 on success and an error otherwise.
1145 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1148 const char *delims = "/\\";
1151 /* make sure we have a valid UNC double delimiter prefix */
1152 len = strspn(devname, delims);
1156 /* find delimiter between host and sharename */
1157 pos = strpbrk(devname + 2, delims);
1161 /* skip past delimiter */
1164 /* now go until next delimiter or end of string */
1165 len = strcspn(pos, delims);
1167 /* move "pos" up to delimiter or NULL */
1169 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1173 convert_delimiter(vol->UNC, '\\');
1175 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1176 if (!*pos++ || !*pos)
1179 vol->prepath = kstrdup(pos, GFP_KERNEL);
1187 cifs_parse_mount_options(const char *mountdata, const char *devname,
1188 struct smb_vol *vol)
1191 char *mountdata_copy = NULL, *options;
1192 unsigned int temp_len, i, j;
1194 short int override_uid = -1;
1195 short int override_gid = -1;
1196 bool uid_specified = false;
1197 bool gid_specified = false;
1198 bool sloppy = false;
1199 char *invalid = NULL;
1200 char *nodename = utsname()->nodename;
1201 char *string = NULL;
1202 char *tmp_end, *value;
1204 bool got_ip = false;
1205 unsigned short port = 0;
1206 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1210 delim = separator[0];
1212 /* ensure we always start with zeroed-out smb_vol */
1213 memset(vol, 0, sizeof(*vol));
1216 * does not have to be perfect mapping since field is
1217 * informational, only used for servers that do not support
1218 * port 445 and it can be overridden at mount time
1220 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1221 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1222 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1224 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1225 /* null target name indicates to use *SMBSERVR default called name
1226 if we end up sending RFC1001 session initialize */
1227 vol->target_rfc1001_name[0] = 0;
1228 vol->cred_uid = current_uid();
1229 vol->linux_uid = current_uid();
1230 vol->linux_gid = current_gid();
1232 /* default to only allowing write access to owner of the mount */
1233 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1235 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1236 /* default is always to request posix paths. */
1237 vol->posix_paths = 1;
1238 /* default to using server inode numbers where available */
1239 vol->server_ino = 1;
1241 /* default is to use strict cifs caching semantics */
1242 vol->strict_io = true;
1244 vol->actimeo = CIFS_DEF_ACTIMEO;
1246 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1247 vol->ops = &smb1_operations;
1248 vol->vals = &smb1_values;
1251 goto cifs_parse_mount_err;
1253 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1254 if (!mountdata_copy)
1255 goto cifs_parse_mount_err;
1257 options = mountdata_copy;
1258 end = options + strlen(options);
1260 if (strncmp(options, "sep=", 4) == 0) {
1261 if (options[4] != 0) {
1262 separator[0] = options[4];
1265 cifs_dbg(FYI, "Null separator not allowed\n");
1268 vol->backupuid_specified = false; /* no backup intent for a user */
1269 vol->backupgid_specified = false; /* no backup intent for a group */
1271 switch (cifs_parse_devname(devname, vol)) {
1275 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1276 goto cifs_parse_mount_err;
1278 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1279 goto cifs_parse_mount_err;
1281 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1282 goto cifs_parse_mount_err;
1285 while ((data = strsep(&options, separator)) != NULL) {
1286 substring_t args[MAX_OPT_ARGS];
1287 unsigned long option;
1293 token = match_token(data, cifs_mount_option_tokens, args);
1297 /* Ingnore the following */
1301 /* Boolean values */
1302 case Opt_user_xattr:
1305 case Opt_nouser_xattr:
1311 case Opt_noforceuid:
1317 case Opt_noforcegid:
1320 case Opt_noblocksend:
1321 vol->noblocksnd = 1;
1323 case Opt_noautotune:
1324 vol->noautotune = 1;
1341 case Opt_nomapchars:
1353 case Opt_posixpaths:
1354 vol->posix_paths = 1;
1356 case Opt_noposixpaths:
1357 vol->posix_paths = 0;
1360 vol->no_linux_ext = 1;
1371 * turn off mandatory locking in mode
1372 * if remote locking is turned off since the
1373 * local vfs will do advisory
1375 if (vol->file_mode ==
1376 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1377 vol->file_mode = S_IALLUGO;
1379 case Opt_forcemandatorylock:
1389 vol->dynperm = true;
1392 vol->dynperm = false;
1406 case Opt_nostrictsync:
1407 vol->nostrictsync = 1;
1409 case Opt_strictsync:
1410 vol->nostrictsync = 0;
1413 vol->server_ino = 1;
1415 case Opt_noserverino:
1416 vol->server_ino = 0;
1418 case Opt_rwpidforward:
1419 vol->rwpidforward = 1;
1428 vol->no_psx_acl = 0;
1431 vol->no_psx_acl = 1;
1433 case Opt_locallease:
1434 vol->local_lease = 1;
1440 /* we do not do the following in secFlags because seal
1441 * is a per tree connection (mount) not a per socket
1442 * or per-smb connection option in the protocol
1443 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1448 printk(KERN_WARNING "CIFS: Mount option noac not "
1449 "supported. Instead set "
1450 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1453 #ifndef CONFIG_CIFS_FSCACHE
1454 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1455 goto cifs_parse_mount_err;
1459 case Opt_mfsymlinks:
1460 vol->mfsymlinks = true;
1463 vol->multiuser = true;
1468 case Opt_nosharesock:
1469 vol->nosharesock = true;
1472 /* Numeric Values */
1474 if (get_option_uid(args, &vol->backupuid)) {
1475 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1477 goto cifs_parse_mount_err;
1479 vol->backupuid_specified = true;
1482 if (get_option_gid(args, &vol->backupgid)) {
1483 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1485 goto cifs_parse_mount_err;
1487 vol->backupgid_specified = true;
1490 if (get_option_uid(args, &vol->linux_uid)) {
1491 cifs_dbg(VFS, "%s: Invalid uid value\n",
1493 goto cifs_parse_mount_err;
1495 uid_specified = true;
1498 if (get_option_uid(args, &vol->cred_uid)) {
1499 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1501 goto cifs_parse_mount_err;
1505 if (get_option_gid(args, &vol->linux_gid)) {
1506 cifs_dbg(VFS, "%s: Invalid gid value\n",
1508 goto cifs_parse_mount_err;
1510 gid_specified = true;
1513 if (get_option_ul(args, &option)) {
1514 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1516 goto cifs_parse_mount_err;
1518 vol->file_mode = option;
1521 if (get_option_ul(args, &option)) {
1522 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1524 goto cifs_parse_mount_err;
1526 vol->dir_mode = option;
1529 if (get_option_ul(args, &option) ||
1530 option > USHRT_MAX) {
1531 cifs_dbg(VFS, "%s: Invalid port value\n",
1533 goto cifs_parse_mount_err;
1535 port = (unsigned short)option;
1538 if (get_option_ul(args, &option)) {
1539 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1541 goto cifs_parse_mount_err;
1543 vol->rsize = option;
1546 if (get_option_ul(args, &option)) {
1547 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1549 goto cifs_parse_mount_err;
1551 vol->wsize = option;
1554 if (get_option_ul(args, &option)) {
1555 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1557 goto cifs_parse_mount_err;
1559 vol->actimeo = HZ * option;
1560 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1561 cifs_dbg(VFS, "attribute cache timeout too large\n");
1562 goto cifs_parse_mount_err;
1566 /* String Arguments */
1568 case Opt_blank_user:
1569 /* null user, ie. anonymous authentication */
1571 vol->username = NULL;
1574 string = match_strdup(args);
1578 if (strnlen(string, MAX_USERNAME_SIZE) >
1579 MAX_USERNAME_SIZE) {
1580 printk(KERN_WARNING "CIFS: username too long\n");
1581 goto cifs_parse_mount_err;
1583 vol->username = kstrdup(string, GFP_KERNEL);
1585 goto cifs_parse_mount_err;
1587 case Opt_blank_pass:
1588 /* passwords have to be handled differently
1589 * to allow the character used for deliminator
1590 * to be passed within them
1594 * Check if this is a case where the password
1595 * starts with a delimiter
1597 tmp_end = strchr(data, '=');
1599 if (!(tmp_end < end && tmp_end[1] == delim)) {
1600 /* No it is not. Set the password to NULL */
1601 vol->password = NULL;
1604 /* Yes it is. Drop down to Opt_pass below.*/
1606 /* Obtain the value string */
1607 value = strchr(data, '=');
1610 /* Set tmp_end to end of the string */
1611 tmp_end = (char *) value + strlen(value);
1613 /* Check if following character is the deliminator
1614 * If yes, we have encountered a double deliminator
1615 * reset the NULL character to the deliminator
1617 if (tmp_end < end && tmp_end[1] == delim) {
1620 /* Keep iterating until we get to a single
1621 * deliminator OR the end
1623 while ((tmp_end = strchr(tmp_end, delim))
1624 != NULL && (tmp_end[1] == delim)) {
1625 tmp_end = (char *) &tmp_end[2];
1628 /* Reset var options to point to next element */
1631 options = (char *) &tmp_end[1];
1633 /* Reached the end of the mount option
1638 /* Now build new password string */
1639 temp_len = strlen(value);
1640 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1641 if (vol->password == NULL) {
1642 printk(KERN_WARNING "CIFS: no memory "
1644 goto cifs_parse_mount_err;
1647 for (i = 0, j = 0; i < temp_len; i++, j++) {
1648 vol->password[j] = value[i];
1649 if ((value[i] == delim) &&
1650 value[i+1] == delim)
1651 /* skip the second deliminator */
1654 vol->password[j] = '\0';
1657 /* FIXME: should this be an error instead? */
1661 string = match_strdup(args);
1665 if (!cifs_convert_address(dstaddr, string,
1667 printk(KERN_ERR "CIFS: bad ip= option (%s).\n",
1669 goto cifs_parse_mount_err;
1674 string = match_strdup(args);
1678 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1679 == CIFS_MAX_DOMAINNAME_LEN) {
1680 printk(KERN_WARNING "CIFS: domain name too"
1682 goto cifs_parse_mount_err;
1685 vol->domainname = kstrdup(string, GFP_KERNEL);
1686 if (!vol->domainname) {
1687 printk(KERN_WARNING "CIFS: no memory "
1688 "for domainname\n");
1689 goto cifs_parse_mount_err;
1691 cifs_dbg(FYI, "Domain name set\n");
1694 string = match_strdup(args);
1698 if (!cifs_convert_address(
1699 (struct sockaddr *)&vol->srcaddr,
1700 string, strlen(string))) {
1701 printk(KERN_WARNING "CIFS: Could not parse"
1702 " srcaddr: %s\n", string);
1703 goto cifs_parse_mount_err;
1707 string = match_strdup(args);
1711 if (strnlen(string, 1024) >= 65) {
1712 printk(KERN_WARNING "CIFS: iocharset name "
1714 goto cifs_parse_mount_err;
1717 if (strnicmp(string, "default", 7) != 0) {
1718 vol->iocharset = kstrdup(string,
1720 if (!vol->iocharset) {
1721 printk(KERN_WARNING "CIFS: no memory"
1723 goto cifs_parse_mount_err;
1726 /* if iocharset not set then load_nls_default
1729 cifs_dbg(FYI, "iocharset set to %s\n", string);
1731 case Opt_netbiosname:
1732 string = match_strdup(args);
1736 memset(vol->source_rfc1001_name, 0x20,
1739 * FIXME: are there cases in which a comma can
1740 * be valid in workstation netbios name (and
1741 * need special handling)?
1743 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1744 /* don't ucase netbiosname for user */
1747 vol->source_rfc1001_name[i] = string[i];
1749 /* The string has 16th byte zero still from
1750 * set at top of the function
1752 if (i == RFC1001_NAME_LEN && string[i] != 0)
1753 printk(KERN_WARNING "CIFS: netbiosname"
1754 " longer than 15 truncated.\n");
1758 /* servernetbiosname specified override *SMBSERVER */
1759 string = match_strdup(args);
1763 /* last byte, type, is 0x20 for servr type */
1764 memset(vol->target_rfc1001_name, 0x20,
1765 RFC1001_NAME_LEN_WITH_NULL);
1767 /* BB are there cases in which a comma can be
1768 valid in this workstation netbios name
1769 (and need special handling)? */
1771 /* user or mount helper must uppercase the
1773 for (i = 0; i < 15; i++) {
1776 vol->target_rfc1001_name[i] = string[i];
1778 /* The string has 16th byte zero still from
1779 set at top of the function */
1780 if (i == RFC1001_NAME_LEN && string[i] != 0)
1781 printk(KERN_WARNING "CIFS: server net"
1782 "biosname longer than 15 truncated.\n");
1785 string = match_strdup(args);
1789 if (strnicmp(string, "1", 1) == 0) {
1790 /* This is the default */
1793 /* For all other value, error */
1794 printk(KERN_WARNING "CIFS: Invalid version"
1796 goto cifs_parse_mount_err;
1798 string = match_strdup(args);
1802 if (cifs_parse_smb_version(string, vol) != 0)
1803 goto cifs_parse_mount_err;
1806 string = match_strdup(args);
1810 if (cifs_parse_security_flavors(string, vol) != 0)
1811 goto cifs_parse_mount_err;
1814 string = match_strdup(args);
1818 if (cifs_parse_cache_flavor(string, vol) != 0)
1819 goto cifs_parse_mount_err;
1823 * An option we don't recognize. Save it off for later
1824 * if we haven't already found one
1830 /* Free up any allocated string */
1835 if (!sloppy && invalid) {
1836 printk(KERN_ERR "CIFS: Unknown mount option \"%s\"\n", invalid);
1837 goto cifs_parse_mount_err;
1841 /* Muliuser mounts require CONFIG_KEYS support */
1842 if (vol->multiuser) {
1843 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1844 goto cifs_parse_mount_err;
1848 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
1849 goto cifs_parse_mount_err;
1852 /* make sure UNC has a share name */
1853 if (!strchr(vol->UNC + 3, '\\')) {
1854 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
1855 goto cifs_parse_mount_err;
1859 /* No ip= option specified? Try to get it from UNC */
1860 if (!cifs_convert_address(dstaddr, &vol->UNC[2],
1861 strlen(&vol->UNC[2]))) {
1862 printk(KERN_ERR "Unable to determine destination "
1864 goto cifs_parse_mount_err;
1868 /* set the port that we got earlier */
1869 cifs_set_port(dstaddr, port);
1872 vol->override_uid = override_uid;
1873 else if (override_uid == 1)
1874 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1875 "specified with no uid= option.\n");
1878 vol->override_gid = override_gid;
1879 else if (override_gid == 1)
1880 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1881 "specified with no gid= option.\n");
1883 kfree(mountdata_copy);
1887 printk(KERN_WARNING "Could not allocate temporary buffer\n");
1888 cifs_parse_mount_err:
1890 kfree(mountdata_copy);
1894 /** Returns true if srcaddr isn't specified and rhs isn't
1895 * specified, or if srcaddr is specified and
1896 * matches the IP address of the rhs argument.
1899 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1901 switch (srcaddr->sa_family) {
1903 return (rhs->sa_family == AF_UNSPEC);
1905 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1906 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1907 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1910 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1911 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1912 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1916 return false; /* don't expect to be here */
1921 * If no port is specified in addr structure, we try to match with 445 port
1922 * and if it fails - with 139 ports. It should be called only if address
1923 * families of server and addr are equal.
1926 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1928 __be16 port, *sport;
1930 switch (addr->sa_family) {
1932 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1933 port = ((struct sockaddr_in *) addr)->sin_port;
1936 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1937 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1945 port = htons(CIFS_PORT);
1949 port = htons(RFC1001_PORT);
1952 return port == *sport;
1956 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1957 struct sockaddr *srcaddr)
1959 switch (addr->sa_family) {
1961 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1962 struct sockaddr_in *srv_addr4 =
1963 (struct sockaddr_in *)&server->dstaddr;
1965 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1970 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1971 struct sockaddr_in6 *srv_addr6 =
1972 (struct sockaddr_in6 *)&server->dstaddr;
1974 if (!ipv6_addr_equal(&addr6->sin6_addr,
1975 &srv_addr6->sin6_addr))
1977 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1983 return false; /* don't expect to be here */
1986 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1993 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1996 * The select_sectype function should either return the vol->sectype
1997 * that was specified, or "Unspecified" if that sectype was not
1998 * compatible with the given NEGOTIATE request.
2000 if (select_sectype(server, vol->sectype) == Unspecified)
2004 * Now check if signing mode is acceptable. No need to check
2005 * global_secflags at this point since if MUST_SIGN is set then
2006 * the server->sign had better be too.
2008 if (vol->sign && !server->sign)
2014 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2016 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2018 if (vol->nosharesock)
2021 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2024 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2027 if (!match_address(server, addr,
2028 (struct sockaddr *)&vol->srcaddr))
2031 if (!match_port(server, addr))
2034 if (!match_security(server, vol))
2040 static struct TCP_Server_Info *
2041 cifs_find_tcp_session(struct smb_vol *vol)
2043 struct TCP_Server_Info *server;
2045 spin_lock(&cifs_tcp_ses_lock);
2046 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2047 if (!match_server(server, vol))
2050 ++server->srv_count;
2051 spin_unlock(&cifs_tcp_ses_lock);
2052 cifs_dbg(FYI, "Existing tcp session with server found\n");
2055 spin_unlock(&cifs_tcp_ses_lock);
2060 cifs_put_tcp_session(struct TCP_Server_Info *server)
2062 struct task_struct *task;
2064 spin_lock(&cifs_tcp_ses_lock);
2065 if (--server->srv_count > 0) {
2066 spin_unlock(&cifs_tcp_ses_lock);
2070 put_net(cifs_net_ns(server));
2072 list_del_init(&server->tcp_ses_list);
2073 spin_unlock(&cifs_tcp_ses_lock);
2075 cancel_delayed_work_sync(&server->echo);
2077 spin_lock(&GlobalMid_Lock);
2078 server->tcpStatus = CifsExiting;
2079 spin_unlock(&GlobalMid_Lock);
2081 cifs_crypto_shash_release(server);
2082 cifs_fscache_release_client_cookie(server);
2084 kfree(server->session_key.response);
2085 server->session_key.response = NULL;
2086 server->session_key.len = 0;
2088 task = xchg(&server->tsk, NULL);
2090 force_sig(SIGKILL, task);
2093 static struct TCP_Server_Info *
2094 cifs_get_tcp_session(struct smb_vol *volume_info)
2096 struct TCP_Server_Info *tcp_ses = NULL;
2099 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2101 /* see if we already have a matching tcp_ses */
2102 tcp_ses = cifs_find_tcp_session(volume_info);
2106 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2112 tcp_ses->ops = volume_info->ops;
2113 tcp_ses->vals = volume_info->vals;
2114 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2115 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2116 if (IS_ERR(tcp_ses->hostname)) {
2117 rc = PTR_ERR(tcp_ses->hostname);
2118 goto out_err_crypto_release;
2121 tcp_ses->noblocksnd = volume_info->noblocksnd;
2122 tcp_ses->noautotune = volume_info->noautotune;
2123 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2124 tcp_ses->in_flight = 0;
2125 tcp_ses->credits = 1;
2126 init_waitqueue_head(&tcp_ses->response_q);
2127 init_waitqueue_head(&tcp_ses->request_q);
2128 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2129 mutex_init(&tcp_ses->srv_mutex);
2130 memcpy(tcp_ses->workstation_RFC1001_name,
2131 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2132 memcpy(tcp_ses->server_RFC1001_name,
2133 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2134 tcp_ses->session_estab = false;
2135 tcp_ses->sequence_number = 0;
2136 tcp_ses->lstrp = jiffies;
2137 spin_lock_init(&tcp_ses->req_lock);
2138 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2139 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2140 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2141 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2142 sizeof(tcp_ses->srcaddr));
2143 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2144 sizeof(tcp_ses->dstaddr));
2146 * at this point we are the only ones with the pointer
2147 * to the struct since the kernel thread not created yet
2148 * no need to spinlock this init of tcpStatus or srv_count
2150 tcp_ses->tcpStatus = CifsNew;
2151 ++tcp_ses->srv_count;
2153 rc = ip_connect(tcp_ses);
2155 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2156 goto out_err_crypto_release;
2160 * since we're in a cifs function already, we know that
2161 * this will succeed. No need for try_module_get().
2163 __module_get(THIS_MODULE);
2164 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2166 if (IS_ERR(tcp_ses->tsk)) {
2167 rc = PTR_ERR(tcp_ses->tsk);
2168 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2169 module_put(THIS_MODULE);
2170 goto out_err_crypto_release;
2172 tcp_ses->tcpStatus = CifsNeedNegotiate;
2174 /* thread spawned, put it on the list */
2175 spin_lock(&cifs_tcp_ses_lock);
2176 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2177 spin_unlock(&cifs_tcp_ses_lock);
2179 cifs_fscache_get_client_cookie(tcp_ses);
2181 /* queue echo request delayed work */
2182 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2186 out_err_crypto_release:
2187 cifs_crypto_shash_release(tcp_ses);
2189 put_net(cifs_net_ns(tcp_ses));
2193 if (!IS_ERR(tcp_ses->hostname))
2194 kfree(tcp_ses->hostname);
2195 if (tcp_ses->ssocket)
2196 sock_release(tcp_ses->ssocket);
2202 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2204 if (vol->sectype != Unspecified &&
2205 vol->sectype != ses->sectype)
2208 switch (ses->sectype) {
2210 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2214 /* NULL username means anonymous session */
2215 if (ses->user_name == NULL) {
2221 /* anything else takes username/password */
2222 if (strncmp(ses->user_name,
2223 vol->username ? vol->username : "",
2226 if (strlen(vol->username) != 0 &&
2227 ses->password != NULL &&
2228 strncmp(ses->password,
2229 vol->password ? vol->password : "",
2236 static struct cifs_ses *
2237 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2239 struct cifs_ses *ses;
2241 spin_lock(&cifs_tcp_ses_lock);
2242 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2243 if (!match_session(ses, vol))
2246 spin_unlock(&cifs_tcp_ses_lock);
2249 spin_unlock(&cifs_tcp_ses_lock);
2254 cifs_put_smb_ses(struct cifs_ses *ses)
2257 struct TCP_Server_Info *server = ses->server;
2259 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2260 spin_lock(&cifs_tcp_ses_lock);
2261 if (--ses->ses_count > 0) {
2262 spin_unlock(&cifs_tcp_ses_lock);
2266 list_del_init(&ses->smb_ses_list);
2267 spin_unlock(&cifs_tcp_ses_lock);
2269 if (ses->status == CifsGood && server->ops->logoff) {
2271 server->ops->logoff(xid, ses);
2275 cifs_put_tcp_session(server);
2280 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2281 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2283 /* Populate username and pw fields from keyring if possible */
2285 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2288 char *desc, *delim, *payload;
2291 struct TCP_Server_Info *server = ses->server;
2292 struct sockaddr_in *sa;
2293 struct sockaddr_in6 *sa6;
2294 struct user_key_payload *upayload;
2296 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2300 /* try to find an address key first */
2301 switch (server->dstaddr.ss_family) {
2303 sa = (struct sockaddr_in *)&server->dstaddr;
2304 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2307 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2308 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2311 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2312 server->dstaddr.ss_family);
2317 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2318 key = request_key(&key_type_logon, desc, "");
2320 if (!ses->domainName) {
2321 cifs_dbg(FYI, "domainName is NULL\n");
2326 /* didn't work, try to find a domain key */
2327 sprintf(desc, "cifs:d:%s", ses->domainName);
2328 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2329 key = request_key(&key_type_logon, desc, "");
2336 down_read(&key->sem);
2337 upayload = key->payload.data;
2338 if (IS_ERR_OR_NULL(upayload)) {
2339 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2343 /* find first : in payload */
2344 payload = (char *)upayload->data;
2345 delim = strnchr(payload, upayload->datalen, ':');
2346 cifs_dbg(FYI, "payload=%s\n", payload);
2348 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2354 len = delim - payload;
2355 if (len > MAX_USERNAME_SIZE || len <= 0) {
2356 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2362 vol->username = kstrndup(payload, len, GFP_KERNEL);
2363 if (!vol->username) {
2364 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2369 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2371 len = key->datalen - (len + 1);
2372 if (len > MAX_PASSWORD_SIZE || len <= 0) {
2373 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2375 kfree(vol->username);
2376 vol->username = NULL;
2381 vol->password = kstrndup(delim, len, GFP_KERNEL);
2382 if (!vol->password) {
2383 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2386 kfree(vol->username);
2387 vol->username = NULL;
2396 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2399 #else /* ! CONFIG_KEYS */
2401 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2402 struct cifs_ses *ses __attribute__((unused)))
2406 #endif /* CONFIG_KEYS */
2408 static struct cifs_ses *
2409 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2413 struct cifs_ses *ses;
2414 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2415 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2419 ses = cifs_find_smb_ses(server, volume_info);
2421 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2424 mutex_lock(&ses->session_mutex);
2425 rc = cifs_negotiate_protocol(xid, ses);
2427 mutex_unlock(&ses->session_mutex);
2428 /* problem -- put our ses reference */
2429 cifs_put_smb_ses(ses);
2433 if (ses->need_reconnect) {
2434 cifs_dbg(FYI, "Session needs reconnect\n");
2435 rc = cifs_setup_session(xid, ses,
2436 volume_info->local_nls);
2438 mutex_unlock(&ses->session_mutex);
2439 /* problem -- put our reference */
2440 cifs_put_smb_ses(ses);
2445 mutex_unlock(&ses->session_mutex);
2447 /* existing SMB ses has a server reference already */
2448 cifs_put_tcp_session(server);
2453 cifs_dbg(FYI, "Existing smb sess not found\n");
2454 ses = sesInfoAlloc();
2458 /* new SMB session uses our server ref */
2459 ses->server = server;
2460 if (server->dstaddr.ss_family == AF_INET6)
2461 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2463 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2465 if (volume_info->username) {
2466 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2467 if (!ses->user_name)
2471 /* volume_info->password freed at unmount */
2472 if (volume_info->password) {
2473 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2477 if (volume_info->domainname) {
2478 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2479 if (!ses->domainName)
2482 ses->cred_uid = volume_info->cred_uid;
2483 ses->linux_uid = volume_info->linux_uid;
2485 ses->sectype = volume_info->sectype;
2486 ses->sign = volume_info->sign;
2488 mutex_lock(&ses->session_mutex);
2489 rc = cifs_negotiate_protocol(xid, ses);
2491 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2492 mutex_unlock(&ses->session_mutex);
2496 /* success, put it on the list */
2497 spin_lock(&cifs_tcp_ses_lock);
2498 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2499 spin_unlock(&cifs_tcp_ses_lock);
2510 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2512 if (tcon->tidStatus == CifsExiting)
2514 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2519 static struct cifs_tcon *
2520 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2522 struct list_head *tmp;
2523 struct cifs_tcon *tcon;
2525 spin_lock(&cifs_tcp_ses_lock);
2526 list_for_each(tmp, &ses->tcon_list) {
2527 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2528 if (!match_tcon(tcon, unc))
2531 spin_unlock(&cifs_tcp_ses_lock);
2534 spin_unlock(&cifs_tcp_ses_lock);
2539 cifs_put_tcon(struct cifs_tcon *tcon)
2542 struct cifs_ses *ses = tcon->ses;
2544 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2545 spin_lock(&cifs_tcp_ses_lock);
2546 if (--tcon->tc_count > 0) {
2547 spin_unlock(&cifs_tcp_ses_lock);
2551 list_del_init(&tcon->tcon_list);
2552 spin_unlock(&cifs_tcp_ses_lock);
2555 if (ses->server->ops->tree_disconnect)
2556 ses->server->ops->tree_disconnect(xid, tcon);
2559 cifs_fscache_release_super_cookie(tcon);
2561 cifs_put_smb_ses(ses);
2564 static struct cifs_tcon *
2565 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2568 struct cifs_tcon *tcon;
2570 tcon = cifs_find_tcon(ses, volume_info->UNC);
2572 cifs_dbg(FYI, "Found match on UNC path\n");
2573 /* existing tcon already has a reference */
2574 cifs_put_smb_ses(ses);
2575 if (tcon->seal != volume_info->seal)
2576 cifs_dbg(VFS, "transport encryption setting conflicts with existing tid\n");
2580 if (!ses->server->ops->tree_connect) {
2585 tcon = tconInfoAlloc();
2592 if (volume_info->password) {
2593 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2594 if (!tcon->password) {
2601 * BB Do we need to wrap session_mutex around this TCon call and Unix
2602 * SetFS as we do on SessSetup and reconnect?
2605 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2606 volume_info->local_nls);
2608 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2612 if (volume_info->nodfs) {
2613 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2614 cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
2616 tcon->seal = volume_info->seal;
2618 * We can have only one retry value for a connection to a share so for
2619 * resources mounted more than once to the same server share the last
2620 * value passed in for the retry flag is used.
2622 tcon->retry = volume_info->retry;
2623 tcon->nocase = volume_info->nocase;
2624 tcon->local_lease = volume_info->local_lease;
2625 INIT_LIST_HEAD(&tcon->pending_opens);
2627 spin_lock(&cifs_tcp_ses_lock);
2628 list_add(&tcon->tcon_list, &ses->tcon_list);
2629 spin_unlock(&cifs_tcp_ses_lock);
2631 cifs_fscache_get_super_cookie(tcon);
2641 cifs_put_tlink(struct tcon_link *tlink)
2643 if (!tlink || IS_ERR(tlink))
2646 if (!atomic_dec_and_test(&tlink->tl_count) ||
2647 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2648 tlink->tl_time = jiffies;
2652 if (!IS_ERR(tlink_tcon(tlink)))
2653 cifs_put_tcon(tlink_tcon(tlink));
2658 static inline struct tcon_link *
2659 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2661 return cifs_sb->master_tlink;
2665 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2667 struct cifs_sb_info *old = CIFS_SB(sb);
2668 struct cifs_sb_info *new = mnt_data->cifs_sb;
2670 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2673 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2674 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2678 * We want to share sb only if we don't specify an r/wsize or
2679 * specified r/wsize is greater than or equal to existing one.
2681 if (new->wsize && new->wsize < old->wsize)
2684 if (new->rsize && new->rsize < old->rsize)
2687 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
2690 if (old->mnt_file_mode != new->mnt_file_mode ||
2691 old->mnt_dir_mode != new->mnt_dir_mode)
2694 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2697 if (old->actimeo != new->actimeo)
2704 cifs_match_super(struct super_block *sb, void *data)
2706 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2707 struct smb_vol *volume_info;
2708 struct cifs_sb_info *cifs_sb;
2709 struct TCP_Server_Info *tcp_srv;
2710 struct cifs_ses *ses;
2711 struct cifs_tcon *tcon;
2712 struct tcon_link *tlink;
2715 spin_lock(&cifs_tcp_ses_lock);
2716 cifs_sb = CIFS_SB(sb);
2717 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2718 if (IS_ERR(tlink)) {
2719 spin_unlock(&cifs_tcp_ses_lock);
2722 tcon = tlink_tcon(tlink);
2724 tcp_srv = ses->server;
2726 volume_info = mnt_data->vol;
2728 if (!match_server(tcp_srv, volume_info) ||
2729 !match_session(ses, volume_info) ||
2730 !match_tcon(tcon, volume_info->UNC)) {
2735 rc = compare_mount_options(sb, mnt_data);
2737 spin_unlock(&cifs_tcp_ses_lock);
2738 cifs_put_tlink(tlink);
2743 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2744 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2745 struct dfs_info3_param **referrals, int remap)
2750 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2756 if (ses->ipc_tid == 0) {
2757 temp_unc = kmalloc(2 /* for slashes */ +
2758 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2759 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2760 if (temp_unc == NULL)
2764 strcpy(temp_unc + 2, ses->serverName);
2765 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2766 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
2768 cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
2772 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
2773 referrals, num_referrals,
2774 nls_codepage, remap);
2776 * BB - map targetUNCs to dfs_info3 structures, here or in
2777 * ses->server->ops->get_dfs_refer.
2783 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2784 static struct lock_class_key cifs_key[2];
2785 static struct lock_class_key cifs_slock_key[2];
2788 cifs_reclassify_socket4(struct socket *sock)
2790 struct sock *sk = sock->sk;
2791 BUG_ON(sock_owned_by_user(sk));
2792 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2793 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2797 cifs_reclassify_socket6(struct socket *sock)
2799 struct sock *sk = sock->sk;
2800 BUG_ON(sock_owned_by_user(sk));
2801 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2802 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2806 cifs_reclassify_socket4(struct socket *sock)
2811 cifs_reclassify_socket6(struct socket *sock)
2816 /* See RFC1001 section 14 on representation of Netbios names */
2817 static void rfc1002mangle(char *target, char *source, unsigned int length)
2821 for (i = 0, j = 0; i < (length); i++) {
2822 /* mask a nibble at a time and encode */
2823 target[j] = 'A' + (0x0F & (source[i] >> 4));
2824 target[j+1] = 'A' + (0x0F & source[i]);
2831 bind_socket(struct TCP_Server_Info *server)
2834 if (server->srcaddr.ss_family != AF_UNSPEC) {
2835 /* Bind to the specified local IP address */
2836 struct socket *socket = server->ssocket;
2837 rc = socket->ops->bind(socket,
2838 (struct sockaddr *) &server->srcaddr,
2839 sizeof(server->srcaddr));
2841 struct sockaddr_in *saddr4;
2842 struct sockaddr_in6 *saddr6;
2843 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2844 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2845 if (saddr6->sin6_family == AF_INET6)
2846 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2847 &saddr6->sin6_addr, rc);
2849 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2850 &saddr4->sin_addr.s_addr, rc);
2857 ip_rfc1001_connect(struct TCP_Server_Info *server)
2861 * some servers require RFC1001 sessinit before sending
2862 * negprot - BB check reconnection in case where second
2863 * sessinit is sent but no second negprot
2865 struct rfc1002_session_packet *ses_init_buf;
2866 struct smb_hdr *smb_buf;
2867 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2870 ses_init_buf->trailer.session_req.called_len = 32;
2872 if (server->server_RFC1001_name &&
2873 server->server_RFC1001_name[0] != 0)
2874 rfc1002mangle(ses_init_buf->trailer.
2875 session_req.called_name,
2876 server->server_RFC1001_name,
2877 RFC1001_NAME_LEN_WITH_NULL);
2879 rfc1002mangle(ses_init_buf->trailer.
2880 session_req.called_name,
2881 DEFAULT_CIFS_CALLED_NAME,
2882 RFC1001_NAME_LEN_WITH_NULL);
2884 ses_init_buf->trailer.session_req.calling_len = 32;
2887 * calling name ends in null (byte 16) from old smb
2890 if (server->workstation_RFC1001_name &&
2891 server->workstation_RFC1001_name[0] != 0)
2892 rfc1002mangle(ses_init_buf->trailer.
2893 session_req.calling_name,
2894 server->workstation_RFC1001_name,
2895 RFC1001_NAME_LEN_WITH_NULL);
2897 rfc1002mangle(ses_init_buf->trailer.
2898 session_req.calling_name,
2900 RFC1001_NAME_LEN_WITH_NULL);
2902 ses_init_buf->trailer.session_req.scope1 = 0;
2903 ses_init_buf->trailer.session_req.scope2 = 0;
2904 smb_buf = (struct smb_hdr *)ses_init_buf;
2906 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2907 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2908 rc = smb_send(server, smb_buf, 0x44);
2909 kfree(ses_init_buf);
2911 * RFC1001 layer in at least one server
2912 * requires very short break before negprot
2913 * presumably because not expecting negprot
2914 * to follow so fast. This is a simple
2915 * solution that works without
2916 * complicating the code and causes no
2917 * significant slowing down on mount
2920 usleep_range(1000, 2000);
2923 * else the negprot may still work without this
2924 * even though malloc failed
2931 generic_ip_connect(struct TCP_Server_Info *server)
2936 struct socket *socket = server->ssocket;
2937 struct sockaddr *saddr;
2939 saddr = (struct sockaddr *) &server->dstaddr;
2941 if (server->dstaddr.ss_family == AF_INET6) {
2942 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2943 slen = sizeof(struct sockaddr_in6);
2946 sport = ((struct sockaddr_in *) saddr)->sin_port;
2947 slen = sizeof(struct sockaddr_in);
2951 if (socket == NULL) {
2952 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2953 IPPROTO_TCP, &socket, 1);
2955 cifs_dbg(VFS, "Error %d creating socket\n", rc);
2956 server->ssocket = NULL;
2960 /* BB other socket options to set KEEPALIVE, NODELAY? */
2961 cifs_dbg(FYI, "Socket created\n");
2962 server->ssocket = socket;
2963 socket->sk->sk_allocation = GFP_NOFS;
2964 if (sfamily == AF_INET6)
2965 cifs_reclassify_socket6(socket);
2967 cifs_reclassify_socket4(socket);
2970 rc = bind_socket(server);
2975 * Eventually check for other socket options to change from
2976 * the default. sock_setsockopt not used because it expects
2979 socket->sk->sk_rcvtimeo = 7 * HZ;
2980 socket->sk->sk_sndtimeo = 5 * HZ;
2982 /* make the bufsizes depend on wsize/rsize and max requests */
2983 if (server->noautotune) {
2984 if (socket->sk->sk_sndbuf < (200 * 1024))
2985 socket->sk->sk_sndbuf = 200 * 1024;
2986 if (socket->sk->sk_rcvbuf < (140 * 1024))
2987 socket->sk->sk_rcvbuf = 140 * 1024;
2990 if (server->tcp_nodelay) {
2992 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2993 (char *)&val, sizeof(val));
2995 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
2999 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3000 socket->sk->sk_sndbuf,
3001 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3003 rc = socket->ops->connect(socket, saddr, slen, 0);
3005 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3006 sock_release(socket);
3007 server->ssocket = NULL;
3011 if (sport == htons(RFC1001_PORT))
3012 rc = ip_rfc1001_connect(server);
3018 ip_connect(struct TCP_Server_Info *server)
3021 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3022 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3024 if (server->dstaddr.ss_family == AF_INET6)
3025 sport = &addr6->sin6_port;
3027 sport = &addr->sin_port;
3032 /* try with 445 port at first */
3033 *sport = htons(CIFS_PORT);
3035 rc = generic_ip_connect(server);
3039 /* if it failed, try with 139 port */
3040 *sport = htons(RFC1001_PORT);
3043 return generic_ip_connect(server);
3046 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3047 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3049 /* if we are reconnecting then should we check to see if
3050 * any requested capabilities changed locally e.g. via
3051 * remount but we can not do much about it here
3052 * if they have (even if we could detect it by the following)
3053 * Perhaps we could add a backpointer to array of sb from tcon
3054 * or if we change to make all sb to same share the same
3055 * sb as NFS - then we only have one backpointer to sb.
3056 * What if we wanted to mount the server share twice once with
3057 * and once without posixacls or posix paths? */
3058 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3060 if (vol_info && vol_info->no_linux_ext) {
3061 tcon->fsUnixInfo.Capability = 0;
3062 tcon->unix_ext = 0; /* Unix Extensions disabled */
3063 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3065 } else if (vol_info)
3066 tcon->unix_ext = 1; /* Unix Extensions supported */
3068 if (tcon->unix_ext == 0) {
3069 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3073 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3074 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3075 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3076 /* check for reconnect case in which we do not
3077 want to change the mount behavior if we can avoid it */
3078 if (vol_info == NULL) {
3079 /* turn off POSIX ACL and PATHNAMES if not set
3080 originally at mount time */
3081 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3082 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3083 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3084 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3085 cifs_dbg(VFS, "POSIXPATH support change\n");
3086 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3087 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3088 cifs_dbg(VFS, "possible reconnect error\n");
3089 cifs_dbg(VFS, "server disabled POSIX path support\n");
3093 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3094 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3096 cap &= CIFS_UNIX_CAP_MASK;
3097 if (vol_info && vol_info->no_psx_acl)
3098 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3099 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3100 cifs_dbg(FYI, "negotiated posix acl support\n");
3102 cifs_sb->mnt_cifs_flags |=
3103 CIFS_MOUNT_POSIXACL;
3106 if (vol_info && vol_info->posix_paths == 0)
3107 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3108 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3109 cifs_dbg(FYI, "negotiate posix pathnames\n");
3111 cifs_sb->mnt_cifs_flags |=
3112 CIFS_MOUNT_POSIX_PATHS;
3115 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3116 #ifdef CONFIG_CIFS_DEBUG2
3117 if (cap & CIFS_UNIX_FCNTL_CAP)
3118 cifs_dbg(FYI, "FCNTL cap\n");
3119 if (cap & CIFS_UNIX_EXTATTR_CAP)
3120 cifs_dbg(FYI, "EXTATTR cap\n");
3121 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3122 cifs_dbg(FYI, "POSIX path cap\n");
3123 if (cap & CIFS_UNIX_XATTR_CAP)
3124 cifs_dbg(FYI, "XATTR cap\n");
3125 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3126 cifs_dbg(FYI, "POSIX ACL cap\n");
3127 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3128 cifs_dbg(FYI, "very large read cap\n");
3129 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3130 cifs_dbg(FYI, "very large write cap\n");
3131 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3132 cifs_dbg(FYI, "transport encryption cap\n");
3133 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3134 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3135 #endif /* CIFS_DEBUG2 */
3136 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3137 if (vol_info == NULL) {
3138 cifs_dbg(FYI, "resetting capabilities failed\n");
3140 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");
3146 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3147 struct cifs_sb_info *cifs_sb)
3149 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3151 spin_lock_init(&cifs_sb->tlink_tree_lock);
3152 cifs_sb->tlink_tree = RB_ROOT;
3155 * Temporarily set r/wsize for matching superblock. If we end up using
3156 * new sb then client will later negotiate it downward if needed.
3158 cifs_sb->rsize = pvolume_info->rsize;
3159 cifs_sb->wsize = pvolume_info->wsize;
3161 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3162 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3163 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3164 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3165 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3166 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3168 cifs_sb->actimeo = pvolume_info->actimeo;
3169 cifs_sb->local_nls = pvolume_info->local_nls;
3171 if (pvolume_info->noperm)
3172 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3173 if (pvolume_info->setuids)
3174 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3175 if (pvolume_info->server_ino)
3176 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3177 if (pvolume_info->remap)
3178 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3179 if (pvolume_info->no_xattr)
3180 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3181 if (pvolume_info->sfu_emul)
3182 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3183 if (pvolume_info->nobrl)
3184 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3185 if (pvolume_info->nostrictsync)
3186 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3187 if (pvolume_info->mand_lock)
3188 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3189 if (pvolume_info->rwpidforward)
3190 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3191 if (pvolume_info->cifs_acl)
3192 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3193 if (pvolume_info->backupuid_specified) {
3194 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3195 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3197 if (pvolume_info->backupgid_specified) {
3198 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3199 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3201 if (pvolume_info->override_uid)
3202 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3203 if (pvolume_info->override_gid)
3204 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3205 if (pvolume_info->dynperm)
3206 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3207 if (pvolume_info->fsc)
3208 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3209 if (pvolume_info->multiuser)
3210 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3211 CIFS_MOUNT_NO_PERM);
3212 if (pvolume_info->strict_io)
3213 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3214 if (pvolume_info->direct_io) {
3215 cifs_dbg(FYI, "mounting share using direct i/o\n");
3216 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3218 if (pvolume_info->mfsymlinks) {
3219 if (pvolume_info->sfu_emul) {
3220 cifs_dbg(VFS, "mount option mfsymlinks ignored if sfu mount option is used\n");
3222 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3226 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3227 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3231 cleanup_volume_info_contents(struct smb_vol *volume_info)
3233 kfree(volume_info->username);
3234 kzfree(volume_info->password);
3235 kfree(volume_info->UNC);
3236 kfree(volume_info->domainname);
3237 kfree(volume_info->iocharset);
3238 kfree(volume_info->prepath);
3242 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3246 cleanup_volume_info_contents(volume_info);
3251 #ifdef CONFIG_CIFS_DFS_UPCALL
3253 * cifs_build_path_to_root returns full path to root when we do not have an
3254 * exiting connection (tcon)
3257 build_unc_path_to_root(const struct smb_vol *vol,
3258 const struct cifs_sb_info *cifs_sb)
3260 char *full_path, *pos;
3261 unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3262 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3264 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3265 if (full_path == NULL)
3266 return ERR_PTR(-ENOMEM);
3268 strncpy(full_path, vol->UNC, unc_len);
3269 pos = full_path + unc_len;
3272 *pos = CIFS_DIR_SEP(cifs_sb);
3273 strncpy(pos + 1, vol->prepath, pplen);
3277 *pos = '\0'; /* add trailing null */
3278 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3279 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3284 * Perform a dfs referral query for a share and (optionally) prefix
3286 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3287 * to a string containing updated options for the submount. Otherwise it
3288 * will be left untouched.
3290 * Returns the rc from get_dfs_path to the caller, which can be used to
3291 * determine whether there were referrals.
3294 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3295 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3299 unsigned int num_referrals = 0;
3300 struct dfs_info3_param *referrals = NULL;
3301 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3303 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3304 if (IS_ERR(full_path))
3305 return PTR_ERR(full_path);
3307 /* For DFS paths, skip the first '\' of the UNC */
3308 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3310 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3311 &num_referrals, &referrals,
3312 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3314 if (!rc && num_referrals > 0) {
3315 char *fake_devname = NULL;
3317 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3318 full_path + 1, referrals,
3321 free_dfs_info_array(referrals, num_referrals);
3323 if (IS_ERR(mdata)) {
3324 rc = PTR_ERR(mdata);
3327 cleanup_volume_info_contents(volume_info);
3328 rc = cifs_setup_volume_info(volume_info, mdata,
3331 kfree(fake_devname);
3332 kfree(cifs_sb->mountdata);
3333 cifs_sb->mountdata = mdata;
3341 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3342 const char *devname)
3346 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3349 if (volume_info->nullauth) {
3350 cifs_dbg(FYI, "Anonymous login\n");
3351 kfree(volume_info->username);
3352 volume_info->username = NULL;
3353 } else if (volume_info->username) {
3354 /* BB fixme parse for domain name here */
3355 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3357 cifs_dbg(VFS, "No username specified\n");
3358 /* In userspace mount helper we can get user name from alternate
3359 locations such as env variables and files on disk */
3363 /* this is needed for ASCII cp to Unicode converts */
3364 if (volume_info->iocharset == NULL) {
3365 /* load_nls_default cannot return null */
3366 volume_info->local_nls = load_nls_default();
3368 volume_info->local_nls = load_nls(volume_info->iocharset);
3369 if (volume_info->local_nls == NULL) {
3370 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3371 volume_info->iocharset);
3380 cifs_get_volume_info(char *mount_data, const char *devname)
3383 struct smb_vol *volume_info;
3385 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3387 return ERR_PTR(-ENOMEM);
3389 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3391 cifs_cleanup_volume_info(volume_info);
3392 volume_info = ERR_PTR(rc);
3399 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3403 struct cifs_ses *ses;
3404 struct cifs_tcon *tcon;
3405 struct TCP_Server_Info *server;
3407 struct tcon_link *tlink;
3408 #ifdef CONFIG_CIFS_DFS_UPCALL
3409 int referral_walks_count = 0;
3412 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3416 #ifdef CONFIG_CIFS_DFS_UPCALL
3418 /* cleanup activities if we're chasing a referral */
3419 if (referral_walks_count) {
3421 cifs_put_tcon(tcon);
3423 cifs_put_smb_ses(ses);
3437 /* get a reference to a tcp session */
3438 server = cifs_get_tcp_session(volume_info);
3439 if (IS_ERR(server)) {
3440 rc = PTR_ERR(server);
3441 bdi_destroy(&cifs_sb->bdi);
3445 /* get a reference to a SMB session */
3446 ses = cifs_get_smb_ses(server, volume_info);
3450 goto mount_fail_check;
3453 /* search for existing tcon to this server share */
3454 tcon = cifs_get_tcon(ses, volume_info);
3458 goto remote_path_check;
3461 /* tell server which Unix caps we support */
3462 if (cap_unix(tcon->ses)) {
3463 /* reset of caps checks mount to see if unix extensions
3464 disabled for just this mount */
3465 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3466 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3467 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3468 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3470 goto mount_fail_check;
3473 tcon->unix_ext = 0; /* server does not support them */
3475 /* do not care if a following call succeed - informational */
3476 if (!tcon->ipc && server->ops->qfs_tcon)
3477 server->ops->qfs_tcon(xid, tcon);
3479 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3480 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3482 /* tune readahead according to rsize */
3483 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3486 #ifdef CONFIG_CIFS_DFS_UPCALL
3488 * Perform an unconditional check for whether there are DFS
3489 * referrals for this path without prefix, to provide support
3490 * for DFS referrals from w2k8 servers which don't seem to respond
3491 * with PATH_NOT_COVERED to requests that include the prefix.
3492 * Chase the referral if found, otherwise continue normally.
3494 if (referral_walks_count == 0) {
3495 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3498 referral_walks_count++;
3499 goto try_mount_again;
3504 /* check if a whole path is not remote */
3506 if (!server->ops->is_path_accessible) {
3508 goto mount_fail_check;
3511 * cifs_build_path_to_root works only when we have a valid tcon
3513 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3514 if (full_path == NULL) {
3516 goto mount_fail_check;
3518 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3520 if (rc != 0 && rc != -EREMOTE) {
3522 goto mount_fail_check;
3527 /* get referral if needed */
3528 if (rc == -EREMOTE) {
3529 #ifdef CONFIG_CIFS_DFS_UPCALL
3530 if (referral_walks_count > MAX_NESTED_LINKS) {
3532 * BB: when we implement proper loop detection,
3533 * we will remove this check. But now we need it
3534 * to prevent an indefinite loop if 'DFS tree' is
3535 * misconfigured (i.e. has loops).
3538 goto mount_fail_check;
3541 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3544 referral_walks_count++;
3545 goto try_mount_again;
3547 goto mount_fail_check;
3548 #else /* No DFS support, return error on mount */
3554 goto mount_fail_check;
3556 /* now, hang the tcon off of the superblock */
3557 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3558 if (tlink == NULL) {
3560 goto mount_fail_check;
3563 tlink->tl_uid = ses->linux_uid;
3564 tlink->tl_tcon = tcon;
3565 tlink->tl_time = jiffies;
3566 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3567 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3569 cifs_sb->master_tlink = tlink;
3570 spin_lock(&cifs_sb->tlink_tree_lock);
3571 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3572 spin_unlock(&cifs_sb->tlink_tree_lock);
3574 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3578 /* on error free sesinfo and tcon struct if needed */
3580 /* If find_unc succeeded then rc == 0 so we can not end */
3581 /* up accidentally freeing someone elses tcon struct */
3583 cifs_put_tcon(tcon);
3585 cifs_put_smb_ses(ses);
3587 cifs_put_tcp_session(server);
3588 bdi_destroy(&cifs_sb->bdi);
3597 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3598 * pointer may be NULL.
3601 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3602 const char *tree, struct cifs_tcon *tcon,
3603 const struct nls_table *nls_codepage)
3605 struct smb_hdr *smb_buffer;
3606 struct smb_hdr *smb_buffer_response;
3609 unsigned char *bcc_ptr;
3612 __u16 bytes_left, count;
3617 smb_buffer = cifs_buf_get();
3618 if (smb_buffer == NULL)
3621 smb_buffer_response = smb_buffer;
3623 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3624 NULL /*no tid */ , 4 /*wct */ );
3626 smb_buffer->Mid = get_next_mid(ses->server);
3627 smb_buffer->Uid = ses->Suid;
3628 pSMB = (TCONX_REQ *) smb_buffer;
3629 pSMBr = (TCONX_RSP *) smb_buffer_response;
3631 pSMB->AndXCommand = 0xFF;
3632 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3633 bcc_ptr = &pSMB->Password[0];
3634 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3635 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3636 *bcc_ptr = 0; /* password is null byte */
3637 bcc_ptr++; /* skip password */
3638 /* already aligned so no need to do it below */
3640 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3641 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3642 specified as required (when that support is added to
3643 the vfs in the future) as only NTLM or the much
3644 weaker LANMAN (which we do not send by default) is accepted
3645 by Samba (not sure whether other servers allow
3646 NTLMv2 password here) */
3647 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3648 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3649 (ses->sectype == LANMAN))
3650 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3651 ses->server->sec_mode &
3652 SECMODE_PW_ENCRYPT ? true : false,
3655 #endif /* CIFS_WEAK_PW_HASH */
3656 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3657 bcc_ptr, nls_codepage);
3659 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3660 if (ses->capabilities & CAP_UNICODE) {
3661 /* must align unicode strings */
3662 *bcc_ptr = 0; /* null byte password */
3667 if (ses->server->sign)
3668 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3670 if (ses->capabilities & CAP_STATUS32) {
3671 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3673 if (ses->capabilities & CAP_DFS) {
3674 smb_buffer->Flags2 |= SMBFLG2_DFS;
3676 if (ses->capabilities & CAP_UNICODE) {
3677 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3679 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3680 6 /* max utf8 char length in bytes */ *
3681 (/* server len*/ + 256 /* share len */), nls_codepage);
3682 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3683 bcc_ptr += 2; /* skip trailing null */
3684 } else { /* ASCII */
3685 strcpy(bcc_ptr, tree);
3686 bcc_ptr += strlen(tree) + 1;
3688 strcpy(bcc_ptr, "?????");
3689 bcc_ptr += strlen("?????");
3691 count = bcc_ptr - &pSMB->Password[0];
3692 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3693 pSMB->hdr.smb_buf_length) + count);
3694 pSMB->ByteCount = cpu_to_le16(count);
3696 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3699 /* above now done in SendReceive */
3700 if ((rc == 0) && (tcon != NULL)) {
3703 tcon->tidStatus = CifsGood;
3704 tcon->need_reconnect = false;
3705 tcon->tid = smb_buffer_response->Tid;
3706 bcc_ptr = pByteArea(smb_buffer_response);
3707 bytes_left = get_bcc(smb_buffer_response);
3708 length = strnlen(bcc_ptr, bytes_left - 2);
3709 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3715 /* skip service field (NB: this field is always ASCII) */
3717 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3718 (bcc_ptr[2] == 'C')) {
3719 cifs_dbg(FYI, "IPC connection\n");
3722 } else if (length == 2) {
3723 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3724 /* the most common case */
3725 cifs_dbg(FYI, "disk share connection\n");
3728 bcc_ptr += length + 1;
3729 bytes_left -= (length + 1);
3730 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3732 /* mostly informational -- no need to fail on error here */
3733 kfree(tcon->nativeFileSystem);
3734 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3735 bytes_left, is_unicode,
3738 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3740 if ((smb_buffer_response->WordCount == 3) ||
3741 (smb_buffer_response->WordCount == 7))
3742 /* field is in same location */
3743 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3746 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3747 } else if ((rc == 0) && tcon == NULL) {
3748 /* all we need to save for IPC$ connection */
3749 ses->ipc_tid = smb_buffer_response->Tid;
3752 cifs_buf_release(smb_buffer);
3757 cifs_umount(struct cifs_sb_info *cifs_sb)
3759 struct rb_root *root = &cifs_sb->tlink_tree;
3760 struct rb_node *node;
3761 struct tcon_link *tlink;
3763 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3765 spin_lock(&cifs_sb->tlink_tree_lock);
3766 while ((node = rb_first(root))) {
3767 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3768 cifs_get_tlink(tlink);
3769 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3770 rb_erase(node, root);
3772 spin_unlock(&cifs_sb->tlink_tree_lock);
3773 cifs_put_tlink(tlink);
3774 spin_lock(&cifs_sb->tlink_tree_lock);
3776 spin_unlock(&cifs_sb->tlink_tree_lock);
3778 bdi_destroy(&cifs_sb->bdi);
3779 kfree(cifs_sb->mountdata);
3780 unload_nls(cifs_sb->local_nls);
3785 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3788 struct TCP_Server_Info *server = ses->server;
3790 if (!server->ops->need_neg || !server->ops->negotiate)
3793 /* only send once per connect */
3794 if (!server->ops->need_neg(server))
3797 set_credits(server, 1);
3799 rc = server->ops->negotiate(xid, ses);
3801 spin_lock(&GlobalMid_Lock);
3802 if (server->tcpStatus == CifsNeedNegotiate)
3803 server->tcpStatus = CifsGood;
3806 spin_unlock(&GlobalMid_Lock);
3813 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3814 struct nls_table *nls_info)
3817 struct TCP_Server_Info *server = ses->server;
3819 ses->capabilities = server->capabilities;
3820 if (linuxExtEnabled == 0)
3821 ses->capabilities &= (~server->vals->cap_unix);
3823 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3824 server->sec_mode, server->capabilities, server->timeAdj);
3826 if (server->ops->sess_setup)
3827 rc = server->ops->sess_setup(xid, ses, nls_info);
3830 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3832 mutex_lock(&server->srv_mutex);
3833 if (!server->session_estab) {
3834 server->session_key.response = ses->auth_key.response;
3835 server->session_key.len = ses->auth_key.len;
3836 server->sequence_number = 0x2;
3837 server->session_estab = true;
3838 ses->auth_key.response = NULL;
3839 if (server->ops->generate_signingkey)
3840 server->ops->generate_signingkey(server);
3842 mutex_unlock(&server->srv_mutex);
3844 cifs_dbg(FYI, "CIFS Session Established successfully\n");
3845 spin_lock(&GlobalMid_Lock);
3846 ses->status = CifsGood;
3847 ses->need_reconnect = false;
3848 spin_unlock(&GlobalMid_Lock);
3851 kfree(ses->auth_key.response);
3852 ses->auth_key.response = NULL;
3853 ses->auth_key.len = 0;
3854 kfree(ses->ntlmssp);
3855 ses->ntlmssp = NULL;
3861 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
3863 vol->sectype = ses->sectype;
3865 /* krb5 is special, since we don't need username or pw */
3866 if (vol->sectype == Kerberos)
3869 return cifs_set_cifscreds(vol, ses);
3872 static struct cifs_tcon *
3873 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3876 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3877 struct cifs_ses *ses;
3878 struct cifs_tcon *tcon = NULL;
3879 struct smb_vol *vol_info;
3881 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3882 if (vol_info == NULL)
3883 return ERR_PTR(-ENOMEM);
3885 vol_info->local_nls = cifs_sb->local_nls;
3886 vol_info->linux_uid = fsuid;
3887 vol_info->cred_uid = fsuid;
3888 vol_info->UNC = master_tcon->treeName;
3889 vol_info->retry = master_tcon->retry;
3890 vol_info->nocase = master_tcon->nocase;
3891 vol_info->local_lease = master_tcon->local_lease;
3892 vol_info->no_linux_ext = !master_tcon->unix_ext;
3893 vol_info->sectype = master_tcon->ses->sectype;
3894 vol_info->sign = master_tcon->ses->sign;
3896 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
3902 /* get a reference for the same TCP session */
3903 spin_lock(&cifs_tcp_ses_lock);
3904 ++master_tcon->ses->server->srv_count;
3905 spin_unlock(&cifs_tcp_ses_lock);
3907 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3909 tcon = (struct cifs_tcon *)ses;
3910 cifs_put_tcp_session(master_tcon->ses->server);
3914 tcon = cifs_get_tcon(ses, vol_info);
3916 cifs_put_smb_ses(ses);
3921 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3923 kfree(vol_info->username);
3924 kfree(vol_info->password);
3931 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3933 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3937 cifs_sb_tcon_pending_wait(void *unused)
3940 return signal_pending(current) ? -ERESTARTSYS : 0;
3943 /* find and return a tlink with given uid */
3944 static struct tcon_link *
3945 tlink_rb_search(struct rb_root *root, kuid_t uid)
3947 struct rb_node *node = root->rb_node;
3948 struct tcon_link *tlink;
3951 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3953 if (uid_gt(tlink->tl_uid, uid))
3954 node = node->rb_left;
3955 else if (uid_lt(tlink->tl_uid, uid))
3956 node = node->rb_right;
3963 /* insert a tcon_link into the tree */
3965 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3967 struct rb_node **new = &(root->rb_node), *parent = NULL;
3968 struct tcon_link *tlink;
3971 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3974 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
3975 new = &((*new)->rb_left);
3977 new = &((*new)->rb_right);
3980 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3981 rb_insert_color(&new_tlink->tl_rbnode, root);
3985 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3988 * If the superblock doesn't refer to a multiuser mount, then just return
3989 * the master tcon for the mount.
3991 * First, search the rbtree for an existing tcon for this fsuid. If one
3992 * exists, then check to see if it's pending construction. If it is then wait
3993 * for construction to complete. Once it's no longer pending, check to see if
3994 * it failed and either return an error or retry construction, depending on
3997 * If one doesn't exist then insert a new tcon_link struct into the tree and
3998 * try to construct a new one.
4001 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4004 kuid_t fsuid = current_fsuid();
4005 struct tcon_link *tlink, *newtlink;
4007 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4008 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4010 spin_lock(&cifs_sb->tlink_tree_lock);
4011 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4013 cifs_get_tlink(tlink);
4014 spin_unlock(&cifs_sb->tlink_tree_lock);
4016 if (tlink == NULL) {
4017 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4018 if (newtlink == NULL)
4019 return ERR_PTR(-ENOMEM);
4020 newtlink->tl_uid = fsuid;
4021 newtlink->tl_tcon = ERR_PTR(-EACCES);
4022 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4023 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4024 cifs_get_tlink(newtlink);
4026 spin_lock(&cifs_sb->tlink_tree_lock);
4027 /* was one inserted after previous search? */
4028 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4030 cifs_get_tlink(tlink);
4031 spin_unlock(&cifs_sb->tlink_tree_lock);
4033 goto wait_for_construction;
4036 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4037 spin_unlock(&cifs_sb->tlink_tree_lock);
4039 wait_for_construction:
4040 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4041 cifs_sb_tcon_pending_wait,
4042 TASK_INTERRUPTIBLE);
4044 cifs_put_tlink(tlink);
4045 return ERR_PTR(ret);
4048 /* if it's good, return it */
4049 if (!IS_ERR(tlink->tl_tcon))
4052 /* return error if we tried this already recently */
4053 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4054 cifs_put_tlink(tlink);
4055 return ERR_PTR(-EACCES);
4058 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4059 goto wait_for_construction;
4062 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4063 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4064 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4066 if (IS_ERR(tlink->tl_tcon)) {
4067 cifs_put_tlink(tlink);
4068 return ERR_PTR(-EACCES);
4075 * periodic workqueue job that scans tcon_tree for a superblock and closes
4079 cifs_prune_tlinks(struct work_struct *work)
4081 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4083 struct rb_root *root = &cifs_sb->tlink_tree;
4084 struct rb_node *node = rb_first(root);
4085 struct rb_node *tmp;
4086 struct tcon_link *tlink;
4089 * Because we drop the spinlock in the loop in order to put the tlink
4090 * it's not guarded against removal of links from the tree. The only
4091 * places that remove entries from the tree are this function and
4092 * umounts. Because this function is non-reentrant and is canceled
4093 * before umount can proceed, this is safe.
4095 spin_lock(&cifs_sb->tlink_tree_lock);
4096 node = rb_first(root);
4097 while (node != NULL) {
4099 node = rb_next(tmp);
4100 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4102 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4103 atomic_read(&tlink->tl_count) != 0 ||
4104 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4107 cifs_get_tlink(tlink);
4108 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4109 rb_erase(tmp, root);
4111 spin_unlock(&cifs_sb->tlink_tree_lock);
4112 cifs_put_tlink(tlink);
4113 spin_lock(&cifs_sb->tlink_tree_lock);
4115 spin_unlock(&cifs_sb->tlink_tree_lock);
4117 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,