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_noblocksend, Opt_noautotune,
71 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
72 Opt_mapchars, Opt_nomapchars, Opt_sfu,
73 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
74 Opt_noposixpaths, Opt_nounix,
77 Opt_forcemandatorylock, Opt_setuids,
78 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
79 Opt_nohard, Opt_nosoft,
81 Opt_nostrictsync, Opt_strictsync,
82 Opt_serverino, Opt_noserverino,
83 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
84 Opt_acl, Opt_noacl, Opt_locallease,
85 Opt_sign, Opt_seal, Opt_direct,
86 Opt_strictcache, Opt_noac,
87 Opt_fsc, Opt_mfsymlinks,
88 Opt_multiuser, Opt_sloppy,
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,
99 Opt_srcaddr, Opt_prefixpath,
100 Opt_iocharset, Opt_sockopt,
101 Opt_netbiosname, Opt_servern,
102 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
104 /* Mount options to be ignored */
107 /* Options which could be blank */
115 static const match_table_t cifs_mount_option_tokens = {
117 { Opt_user_xattr, "user_xattr" },
118 { Opt_nouser_xattr, "nouser_xattr" },
119 { Opt_forceuid, "forceuid" },
120 { Opt_noforceuid, "noforceuid" },
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_direct, "direct" },
164 { Opt_direct, "directio" },
165 { Opt_direct, "forcedirectio" },
166 { Opt_strictcache, "strictcache" },
167 { Opt_noac, "noac" },
169 { Opt_mfsymlinks, "mfsymlinks" },
170 { Opt_multiuser, "multiuser" },
171 { Opt_sloppy, "sloppy" },
173 { Opt_backupuid, "backupuid=%s" },
174 { Opt_backupgid, "backupgid=%s" },
175 { Opt_uid, "uid=%s" },
176 { Opt_cruid, "cruid=%s" },
177 { Opt_gid, "gid=%s" },
178 { Opt_file_mode, "file_mode=%s" },
179 { Opt_dirmode, "dirmode=%s" },
180 { Opt_dirmode, "dir_mode=%s" },
181 { Opt_port, "port=%s" },
182 { Opt_rsize, "rsize=%s" },
183 { Opt_wsize, "wsize=%s" },
184 { Opt_actimeo, "actimeo=%s" },
186 { Opt_blank_user, "user=" },
187 { Opt_blank_user, "username=" },
188 { Opt_user, "user=%s" },
189 { Opt_user, "username=%s" },
190 { Opt_blank_pass, "pass=" },
191 { Opt_pass, "pass=%s" },
192 { Opt_pass, "password=%s" },
193 { Opt_blank_ip, "ip=" },
194 { Opt_blank_ip, "addr=" },
196 { Opt_ip, "addr=%s" },
197 { Opt_unc, "unc=%s" },
198 { Opt_unc, "target=%s" },
199 { Opt_unc, "path=%s" },
200 { Opt_domain, "dom=%s" },
201 { Opt_domain, "domain=%s" },
202 { Opt_domain, "workgroup=%s" },
203 { Opt_srcaddr, "srcaddr=%s" },
204 { Opt_prefixpath, "prefixpath=%s" },
205 { Opt_iocharset, "iocharset=%s" },
206 { Opt_sockopt, "sockopt=%s" },
207 { Opt_netbiosname, "netbiosname=%s" },
208 { Opt_servern, "servern=%s" },
209 { Opt_ver, "ver=%s" },
210 { Opt_vers, "vers=%s" },
211 { Opt_sec, "sec=%s" },
212 { Opt_cache, "cache=%s" },
214 { Opt_ignore, "cred" },
215 { Opt_ignore, "credentials" },
216 { Opt_ignore, "cred=%s" },
217 { Opt_ignore, "credentials=%s" },
218 { Opt_ignore, "guest" },
219 { Opt_ignore, "rw" },
220 { Opt_ignore, "ro" },
221 { Opt_ignore, "suid" },
222 { Opt_ignore, "nosuid" },
223 { Opt_ignore, "exec" },
224 { Opt_ignore, "noexec" },
225 { Opt_ignore, "nodev" },
226 { Opt_ignore, "noauto" },
227 { Opt_ignore, "dev" },
228 { Opt_ignore, "mand" },
229 { Opt_ignore, "nomand" },
230 { Opt_ignore, "_netdev" },
236 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
237 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
238 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
239 Opt_sec_ntlmv2i, Opt_sec_lanman,
245 static const match_table_t cifs_secflavor_tokens = {
246 { Opt_sec_krb5, "krb5" },
247 { Opt_sec_krb5i, "krb5i" },
248 { Opt_sec_krb5p, "krb5p" },
249 { Opt_sec_ntlmsspi, "ntlmsspi" },
250 { Opt_sec_ntlmssp, "ntlmssp" },
251 { Opt_ntlm, "ntlm" },
252 { Opt_sec_ntlmi, "ntlmi" },
253 { Opt_sec_ntlmv2, "nontlm" },
254 { Opt_sec_ntlmv2, "ntlmv2" },
255 { Opt_sec_ntlmv2i, "ntlmv2i" },
256 { Opt_sec_lanman, "lanman" },
257 { Opt_sec_none, "none" },
259 { Opt_sec_err, NULL }
270 static const match_table_t cifs_cacheflavor_tokens = {
271 { Opt_cache_loose, "loose" },
272 { Opt_cache_strict, "strict" },
273 { Opt_cache_none, "none" },
274 { Opt_cache_err, NULL }
277 static const match_table_t cifs_smb_version_tokens = {
278 { Smb_1, SMB1_VERSION_STRING },
279 { Smb_21, SMB21_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 cFYI(1, "Reconnecting tcp session");
323 /* before reconnecting the tcp session, mark the smb session (uid)
324 and the tid bad so they are not used until reconnected */
325 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
326 spin_lock(&cifs_tcp_ses_lock);
327 list_for_each(tmp, &server->smb_ses_list) {
328 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
329 ses->need_reconnect = true;
331 list_for_each(tmp2, &ses->tcon_list) {
332 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
333 tcon->need_reconnect = true;
336 spin_unlock(&cifs_tcp_ses_lock);
338 /* do not want to be sending data on a socket we are freeing */
339 cFYI(1, "%s: tearing down socket", __func__);
340 mutex_lock(&server->srv_mutex);
341 if (server->ssocket) {
342 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
343 server->ssocket->flags);
344 kernel_sock_shutdown(server->ssocket, SHUT_WR);
345 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
346 server->ssocket->state,
347 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 cFYI(1, "%s: moving mids to private list", __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 cFYI(1, "%s: issuing mid callbacks", __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 cFYI(1, "reconnect error %d", 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 cFYI(1, "Unable to send echo request to server: %s",
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 cERROR(1, "No memory for large SMB response");
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 cERROR(1, "No memory for SMB response");
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 cERROR(1, "Server %s has not responded in %d seconds. "
475 "Reconnecting...", server->hostname,
476 (2 * SMB_ECHO_INTERVAL) / HZ);
477 cifs_reconnect(server);
478 wake_up(&server->response_q);
486 * kvec_array_init - clone a kvec array, and advance into it
487 * @new: pointer to memory for cloned array
488 * @iov: pointer to original array
489 * @nr_segs: number of members in original array
490 * @bytes: number of bytes to advance into the cloned array
492 * This function will copy the array provided in iov to a section of memory
493 * and advance the specified number of bytes into the new array. It returns
494 * the number of segments in the new array. "new" must be at least as big as
495 * the original iov array.
498 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
503 while (bytes || !iov->iov_len) {
504 int copy = min(bytes, iov->iov_len);
508 if (iov->iov_len == base) {
514 memcpy(new, iov, sizeof(*iov) * nr_segs);
515 new->iov_base += base;
516 new->iov_len -= base;
521 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
523 struct kvec *new_iov;
525 if (server->iov && nr_segs <= server->nr_iov)
528 /* not big enough -- allocate a new one and release the old */
529 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
532 server->iov = new_iov;
533 server->nr_iov = nr_segs;
539 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
540 unsigned int nr_segs, unsigned int to_read)
545 struct msghdr smb_msg;
548 iov = get_server_iovec(server, nr_segs);
552 smb_msg.msg_control = NULL;
553 smb_msg.msg_controllen = 0;
555 for (total_read = 0; to_read; total_read += length, to_read -= length) {
558 if (server_unresponsive(server)) {
559 total_read = -EAGAIN;
563 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
565 length = kernel_recvmsg(server->ssocket, &smb_msg,
566 iov, segs, to_read, 0);
568 if (server->tcpStatus == CifsExiting) {
569 total_read = -ESHUTDOWN;
571 } else if (server->tcpStatus == CifsNeedReconnect) {
572 cifs_reconnect(server);
573 total_read = -EAGAIN;
575 } else if (length == -ERESTARTSYS ||
579 * Minimum sleep to prevent looping, allowing socket
580 * to clear and app threads to set tcpStatus
581 * CifsNeedReconnect if server hung.
583 usleep_range(1000, 2000);
586 } else if (length <= 0) {
587 cFYI(1, "Received no data or error: expecting %d "
588 "got %d", to_read, length);
589 cifs_reconnect(server);
590 total_read = -EAGAIN;
598 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
599 unsigned int to_read)
604 iov.iov_len = to_read;
606 return cifs_readv_from_socket(server, &iov, 1, to_read);
610 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
613 * The first byte big endian of the length field,
614 * is actually not part of the length but the type
615 * with the most common, zero, as regular data.
618 case RFC1002_SESSION_MESSAGE:
619 /* Regular SMB response */
621 case RFC1002_SESSION_KEEP_ALIVE:
622 cFYI(1, "RFC 1002 session keep alive");
624 case RFC1002_POSITIVE_SESSION_RESPONSE:
625 cFYI(1, "RFC 1002 positive session response");
627 case RFC1002_NEGATIVE_SESSION_RESPONSE:
629 * We get this from Windows 98 instead of an error on
630 * SMB negprot response.
632 cFYI(1, "RFC 1002 negative session response");
633 /* give server a second to clean up */
636 * Always try 445 first on reconnect since we get NACK
637 * on some if we ever connected to port 139 (the NACK
638 * is since we do not begin with RFC1001 session
641 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
642 cifs_reconnect(server);
643 wake_up(&server->response_q);
646 cERROR(1, "RFC 1002 unknown response type 0x%x", type);
647 cifs_reconnect(server);
654 dequeue_mid(struct mid_q_entry *mid, bool malformed)
656 #ifdef CONFIG_CIFS_STATS2
657 mid->when_received = jiffies;
659 spin_lock(&GlobalMid_Lock);
661 mid->mid_state = MID_RESPONSE_RECEIVED;
663 mid->mid_state = MID_RESPONSE_MALFORMED;
664 list_del_init(&mid->qhead);
665 spin_unlock(&GlobalMid_Lock);
669 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
670 char *buf, int malformed)
672 if (server->ops->check_trans2 &&
673 server->ops->check_trans2(mid, server, buf, malformed))
676 mid->large_buf = server->large_buf;
677 /* Was previous buf put in mpx struct for multi-rsp? */
678 if (!mid->multiRsp) {
679 /* smb buffer will be freed by user thread */
680 if (server->large_buf)
681 server->bigbuf = NULL;
683 server->smallbuf = NULL;
685 dequeue_mid(mid, malformed);
688 static void clean_demultiplex_info(struct TCP_Server_Info *server)
692 /* take it off the list, if it's not already */
693 spin_lock(&cifs_tcp_ses_lock);
694 list_del_init(&server->tcp_ses_list);
695 spin_unlock(&cifs_tcp_ses_lock);
697 spin_lock(&GlobalMid_Lock);
698 server->tcpStatus = CifsExiting;
699 spin_unlock(&GlobalMid_Lock);
700 wake_up_all(&server->response_q);
702 /* check if we have blocked requests that need to free */
703 spin_lock(&server->req_lock);
704 if (server->credits <= 0)
706 spin_unlock(&server->req_lock);
708 * Although there should not be any requests blocked on this queue it
709 * can not hurt to be paranoid and try to wake up requests that may
710 * haven been blocked when more than 50 at time were on the wire to the
711 * same server - they now will see the session is in exit state and get
712 * out of SendReceive.
714 wake_up_all(&server->request_q);
715 /* give those requests time to exit */
718 if (server->ssocket) {
719 sock_release(server->ssocket);
720 server->ssocket = NULL;
723 if (!list_empty(&server->pending_mid_q)) {
724 struct list_head dispose_list;
725 struct mid_q_entry *mid_entry;
726 struct list_head *tmp, *tmp2;
728 INIT_LIST_HEAD(&dispose_list);
729 spin_lock(&GlobalMid_Lock);
730 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
731 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
732 cFYI(1, "Clearing mid 0x%llx", mid_entry->mid);
733 mid_entry->mid_state = MID_SHUTDOWN;
734 list_move(&mid_entry->qhead, &dispose_list);
736 spin_unlock(&GlobalMid_Lock);
738 /* now walk dispose list and issue callbacks */
739 list_for_each_safe(tmp, tmp2, &dispose_list) {
740 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
741 cFYI(1, "Callback mid 0x%llx", mid_entry->mid);
742 list_del_init(&mid_entry->qhead);
743 mid_entry->callback(mid_entry);
745 /* 1/8th of sec is more than enough time for them to exit */
749 if (!list_empty(&server->pending_mid_q)) {
751 * mpx threads have not exited yet give them at least the smb
752 * send timeout time for long ops.
754 * Due to delays on oplock break requests, we need to wait at
755 * least 45 seconds before giving up on a request getting a
756 * response and going ahead and killing cifsd.
758 cFYI(1, "Wait for exit from demultiplex thread");
761 * If threads still have not exited they are probably never
762 * coming home not much else we can do but free the memory.
766 kfree(server->hostname);
770 length = atomic_dec_return(&tcpSesAllocCount);
772 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
777 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
780 char *buf = server->smallbuf;
781 unsigned int pdu_length = get_rfc1002_length(buf);
783 /* make sure this will fit in a large buffer */
784 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
785 cERROR(1, "SMB response too long (%u bytes)",
787 cifs_reconnect(server);
788 wake_up(&server->response_q);
792 /* switch to large buffer if too big for a small one */
793 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
794 server->large_buf = true;
795 memcpy(server->bigbuf, buf, server->total_read);
796 buf = server->bigbuf;
799 /* now read the rest */
800 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
801 pdu_length - HEADER_SIZE(server) + 1 + 4);
804 server->total_read += length;
806 dump_smb(buf, server->total_read);
809 * We know that we received enough to get to the MID as we
810 * checked the pdu_length earlier. Now check to see
811 * if the rest of the header is OK. We borrow the length
812 * var for the rest of the loop to avoid a new stack var.
814 * 48 bytes is enough to display the header and a little bit
815 * into the payload for debugging purposes.
817 length = server->ops->check_message(buf, server->total_read);
819 cifs_dump_mem("Bad SMB: ", buf,
820 min_t(unsigned int, server->total_read, 48));
825 handle_mid(mid, server, buf, length);
830 cifs_demultiplex_thread(void *p)
833 struct TCP_Server_Info *server = p;
834 unsigned int pdu_length;
836 struct task_struct *task_to_wake = NULL;
837 struct mid_q_entry *mid_entry;
839 current->flags |= PF_MEMALLOC;
840 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
842 length = atomic_inc_return(&tcpSesAllocCount);
844 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
848 while (server->tcpStatus != CifsExiting) {
852 if (!allocate_buffers(server))
855 server->large_buf = false;
856 buf = server->smallbuf;
857 pdu_length = 4; /* enough to get RFC1001 header */
859 length = cifs_read_from_socket(server, buf, pdu_length);
862 server->total_read = length;
865 * The right amount was read from socket - 4 bytes,
866 * so we can now interpret the length field.
868 pdu_length = get_rfc1002_length(buf);
870 cFYI(1, "RFC1002 header 0x%x", pdu_length);
871 if (!is_smb_response(server, buf[0]))
874 /* make sure we have enough to get to the MID */
875 if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
876 cERROR(1, "SMB response too short (%u bytes)",
878 cifs_reconnect(server);
879 wake_up(&server->response_q);
883 /* read down to the MID */
884 length = cifs_read_from_socket(server, buf + 4,
885 HEADER_SIZE(server) - 1 - 4);
888 server->total_read += length;
890 mid_entry = server->ops->find_mid(server, buf);
892 if (!mid_entry || !mid_entry->receive)
893 length = standard_receive3(server, mid_entry);
895 length = mid_entry->receive(server, mid_entry);
900 if (server->large_buf)
901 buf = server->bigbuf;
903 server->lstrp = jiffies;
904 if (mid_entry != NULL) {
905 if (!mid_entry->multiRsp || mid_entry->multiEnd)
906 mid_entry->callback(mid_entry);
907 } else if (!server->ops->is_oplock_break ||
908 !server->ops->is_oplock_break(buf, server)) {
909 cERROR(1, "No task to wake, unknown frame received! "
910 "NumMids %d", atomic_read(&midCount));
911 cifs_dump_mem("Received Data is: ", buf,
912 HEADER_SIZE(server));
913 #ifdef CONFIG_CIFS_DEBUG2
914 if (server->ops->dump_detail)
915 server->ops->dump_detail(buf);
916 cifs_dump_mids(server);
917 #endif /* CIFS_DEBUG2 */
920 } /* end while !EXITING */
922 /* buffer usually freed in free_mid - need to free it here on exit */
923 cifs_buf_release(server->bigbuf);
924 if (server->smallbuf) /* no sense logging a debug message if NULL */
925 cifs_small_buf_release(server->smallbuf);
927 task_to_wake = xchg(&server->tsk, NULL);
928 clean_demultiplex_info(server);
930 /* if server->tsk was NULL then wait for a signal before exiting */
932 set_current_state(TASK_INTERRUPTIBLE);
933 while (!signal_pending(current)) {
935 set_current_state(TASK_INTERRUPTIBLE);
937 set_current_state(TASK_RUNNING);
940 module_put_and_exit(0);
943 /* extract the host portion of the UNC string */
945 extract_hostname(const char *unc)
951 /* skip double chars at beginning of string */
952 /* BB: check validity of these bytes? */
955 /* delimiter between hostname and sharename is always '\\' now */
956 delim = strchr(src, '\\');
958 return ERR_PTR(-EINVAL);
961 dst = kmalloc((len + 1), GFP_KERNEL);
963 return ERR_PTR(-ENOMEM);
965 memcpy(dst, src, len);
971 static int get_option_ul(substring_t args[], unsigned long *option)
976 string = match_strdup(args);
979 rc = kstrtoul(string, 0, option);
986 static int cifs_parse_security_flavors(char *value,
990 substring_t args[MAX_OPT_ARGS];
992 switch (match_token(value, cifs_secflavor_tokens, args)) {
994 vol->secFlg |= CIFSSEC_MAY_KRB5;
997 vol->secFlg |= CIFSSEC_MAY_KRB5 | CIFSSEC_MUST_SIGN;
1000 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1001 cERROR(1, "Krb5 cifs privacy not supported");
1003 case Opt_sec_ntlmssp:
1004 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1006 case Opt_sec_ntlmsspi:
1007 vol->secFlg |= CIFSSEC_MAY_NTLMSSP | CIFSSEC_MUST_SIGN;
1010 /* ntlm is default so can be turned off too */
1011 vol->secFlg |= CIFSSEC_MAY_NTLM;
1014 vol->secFlg |= CIFSSEC_MAY_NTLM | CIFSSEC_MUST_SIGN;
1016 case Opt_sec_ntlmv2:
1017 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1019 case Opt_sec_ntlmv2i:
1020 vol->secFlg |= CIFSSEC_MAY_NTLMV2 | CIFSSEC_MUST_SIGN;
1022 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1023 case Opt_sec_lanman:
1024 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1031 cERROR(1, "bad security option: %s", value);
1039 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1041 substring_t args[MAX_OPT_ARGS];
1043 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1044 case Opt_cache_loose:
1045 vol->direct_io = false;
1046 vol->strict_io = false;
1048 case Opt_cache_strict:
1049 vol->direct_io = false;
1050 vol->strict_io = true;
1052 case Opt_cache_none:
1053 vol->direct_io = true;
1054 vol->strict_io = false;
1057 cERROR(1, "bad cache= option: %s", value);
1064 cifs_parse_smb_version(char *value, struct smb_vol *vol)
1066 substring_t args[MAX_OPT_ARGS];
1068 switch (match_token(value, cifs_smb_version_tokens, args)) {
1070 vol->ops = &smb1_operations;
1071 vol->vals = &smb1_values;
1073 #ifdef CONFIG_CIFS_SMB2
1075 vol->ops = &smb21_operations;
1076 vol->vals = &smb21_values;
1080 cERROR(1, "Unknown vers= option specified: %s", value);
1087 cifs_parse_mount_options(const char *mountdata, const char *devname,
1088 struct smb_vol *vol)
1091 char *mountdata_copy = NULL, *options;
1092 unsigned int temp_len, i, j;
1094 short int override_uid = -1;
1095 short int override_gid = -1;
1096 bool uid_specified = false;
1097 bool gid_specified = false;
1098 bool sloppy = false;
1099 char *invalid = NULL;
1100 char *nodename = utsname()->nodename;
1101 char *string = NULL;
1102 char *tmp_end, *value;
1104 bool cache_specified = false;
1105 static bool cache_warned = false;
1109 delim = separator[0];
1112 * does not have to be perfect mapping since field is
1113 * informational, only used for servers that do not support
1114 * port 445 and it can be overridden at mount time
1116 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1117 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1118 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1120 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1121 /* null target name indicates to use *SMBSERVR default called name
1122 if we end up sending RFC1001 session initialize */
1123 vol->target_rfc1001_name[0] = 0;
1124 vol->cred_uid = current_uid();
1125 vol->linux_uid = current_uid();
1126 vol->linux_gid = current_gid();
1128 /* default to only allowing write access to owner of the mount */
1129 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1131 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1132 /* default is always to request posix paths. */
1133 vol->posix_paths = 1;
1134 /* default to using server inode numbers where available */
1135 vol->server_ino = 1;
1137 vol->actimeo = CIFS_DEF_ACTIMEO;
1139 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1140 vol->ops = &smb1_operations;
1141 vol->vals = &smb1_values;
1144 goto cifs_parse_mount_err;
1146 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1147 if (!mountdata_copy)
1148 goto cifs_parse_mount_err;
1150 options = mountdata_copy;
1151 end = options + strlen(options);
1153 if (strncmp(options, "sep=", 4) == 0) {
1154 if (options[4] != 0) {
1155 separator[0] = options[4];
1158 cFYI(1, "Null separator not allowed");
1161 vol->backupuid_specified = false; /* no backup intent for a user */
1162 vol->backupgid_specified = false; /* no backup intent for a group */
1164 while ((data = strsep(&options, separator)) != NULL) {
1165 substring_t args[MAX_OPT_ARGS];
1166 unsigned long option;
1172 token = match_token(data, cifs_mount_option_tokens, args);
1176 /* Ingnore the following */
1180 /* Boolean values */
1181 case Opt_user_xattr:
1184 case Opt_nouser_xattr:
1190 case Opt_noforceuid:
1193 case Opt_noblocksend:
1194 vol->noblocksnd = 1;
1196 case Opt_noautotune:
1197 vol->noautotune = 1;
1214 case Opt_nomapchars:
1226 case Opt_posixpaths:
1227 vol->posix_paths = 1;
1229 case Opt_noposixpaths:
1230 vol->posix_paths = 0;
1233 vol->no_linux_ext = 1;
1244 * turn off mandatory locking in mode
1245 * if remote locking is turned off since the
1246 * local vfs will do advisory
1248 if (vol->file_mode ==
1249 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1250 vol->file_mode = S_IALLUGO;
1252 case Opt_forcemandatorylock:
1262 vol->dynperm = true;
1265 vol->dynperm = false;
1279 case Opt_nostrictsync:
1280 vol->nostrictsync = 1;
1282 case Opt_strictsync:
1283 vol->nostrictsync = 0;
1286 vol->server_ino = 1;
1288 case Opt_noserverino:
1289 vol->server_ino = 0;
1291 case Opt_rwpidforward:
1292 vol->rwpidforward = 1;
1301 vol->no_psx_acl = 0;
1304 vol->no_psx_acl = 1;
1306 case Opt_locallease:
1307 vol->local_lease = 1;
1310 vol->secFlg |= CIFSSEC_MUST_SIGN;
1313 /* we do not do the following in secFlags because seal
1314 * is a per tree connection (mount) not a per socket
1315 * or per-smb connection option in the protocol
1316 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1321 cache_specified = true;
1322 vol->direct_io = true;
1323 vol->strict_io = false;
1324 cERROR(1, "The \"directio\" option will be removed in "
1325 "3.7. Please switch to the \"cache=none\" "
1328 case Opt_strictcache:
1329 cache_specified = true;
1330 vol->direct_io = false;
1331 vol->strict_io = true;
1332 cERROR(1, "The \"strictcache\" option will be removed "
1333 "in 3.7. Please switch to the \"cache=strict\" "
1337 printk(KERN_WARNING "CIFS: Mount option noac not "
1338 "supported. Instead set "
1339 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1342 #ifndef CONFIG_CIFS_FSCACHE
1343 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1344 "kernel config option set");
1345 goto cifs_parse_mount_err;
1349 case Opt_mfsymlinks:
1350 vol->mfsymlinks = true;
1353 vol->multiuser = true;
1359 /* Numeric Values */
1361 if (get_option_ul(args, &option)) {
1362 cERROR(1, "%s: Invalid backupuid value",
1364 goto cifs_parse_mount_err;
1366 vol->backupuid = option;
1367 vol->backupuid_specified = true;
1370 if (get_option_ul(args, &option)) {
1371 cERROR(1, "%s: Invalid backupgid value",
1373 goto cifs_parse_mount_err;
1375 vol->backupgid = option;
1376 vol->backupgid_specified = true;
1379 if (get_option_ul(args, &option)) {
1380 cERROR(1, "%s: Invalid uid value",
1382 goto cifs_parse_mount_err;
1384 vol->linux_uid = option;
1385 uid_specified = true;
1388 if (get_option_ul(args, &option)) {
1389 cERROR(1, "%s: Invalid cruid value",
1391 goto cifs_parse_mount_err;
1393 vol->cred_uid = option;
1396 if (get_option_ul(args, &option)) {
1397 cERROR(1, "%s: Invalid gid value",
1399 goto cifs_parse_mount_err;
1401 vol->linux_gid = option;
1402 gid_specified = true;
1405 if (get_option_ul(args, &option)) {
1406 cERROR(1, "%s: Invalid file_mode value",
1408 goto cifs_parse_mount_err;
1410 vol->file_mode = option;
1413 if (get_option_ul(args, &option)) {
1414 cERROR(1, "%s: Invalid dir_mode value",
1416 goto cifs_parse_mount_err;
1418 vol->dir_mode = option;
1421 if (get_option_ul(args, &option)) {
1422 cERROR(1, "%s: Invalid port value",
1424 goto cifs_parse_mount_err;
1429 if (get_option_ul(args, &option)) {
1430 cERROR(1, "%s: Invalid rsize value",
1432 goto cifs_parse_mount_err;
1434 vol->rsize = option;
1437 if (get_option_ul(args, &option)) {
1438 cERROR(1, "%s: Invalid wsize value",
1440 goto cifs_parse_mount_err;
1442 vol->wsize = option;
1445 if (get_option_ul(args, &option)) {
1446 cERROR(1, "%s: Invalid actimeo value",
1448 goto cifs_parse_mount_err;
1450 vol->actimeo = HZ * option;
1451 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1452 cERROR(1, "CIFS: attribute cache"
1453 "timeout too large");
1454 goto cifs_parse_mount_err;
1458 /* String Arguments */
1460 case Opt_blank_user:
1461 /* null user, ie. anonymous authentication */
1463 vol->username = NULL;
1466 string = match_strdup(args);
1470 if (strnlen(string, MAX_USERNAME_SIZE) >
1471 MAX_USERNAME_SIZE) {
1472 printk(KERN_WARNING "CIFS: username too long\n");
1473 goto cifs_parse_mount_err;
1475 vol->username = kstrdup(string, GFP_KERNEL);
1476 if (!vol->username) {
1477 printk(KERN_WARNING "CIFS: no memory "
1479 goto cifs_parse_mount_err;
1482 case Opt_blank_pass:
1483 vol->password = NULL;
1486 /* passwords have to be handled differently
1487 * to allow the character used for deliminator
1488 * to be passed within them
1491 /* Obtain the value string */
1492 value = strchr(data, '=');
1495 /* Set tmp_end to end of the string */
1496 tmp_end = (char *) value + strlen(value);
1498 /* Check if following character is the deliminator
1499 * If yes, we have encountered a double deliminator
1500 * reset the NULL character to the deliminator
1502 if (tmp_end < end && tmp_end[1] == delim) {
1505 /* Keep iterating until we get to a single
1506 * deliminator OR the end
1508 while ((tmp_end = strchr(tmp_end, delim))
1509 != NULL && (tmp_end[1] == delim)) {
1510 tmp_end = (char *) &tmp_end[2];
1513 /* Reset var options to point to next element */
1516 options = (char *) &tmp_end[1];
1518 /* Reached the end of the mount option
1523 /* Now build new password string */
1524 temp_len = strlen(value);
1525 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1526 if (vol->password == NULL) {
1527 printk(KERN_WARNING "CIFS: no memory "
1529 goto cifs_parse_mount_err;
1532 for (i = 0, j = 0; i < temp_len; i++, j++) {
1533 vol->password[j] = value[i];
1534 if ((value[i] == delim) &&
1535 value[i+1] == delim)
1536 /* skip the second deliminator */
1539 vol->password[j] = '\0';
1545 string = match_strdup(args);
1549 if (strnlen(string, INET6_ADDRSTRLEN) >
1551 printk(KERN_WARNING "CIFS: ip address "
1553 goto cifs_parse_mount_err;
1555 vol->UNCip = kstrdup(string, GFP_KERNEL);
1557 printk(KERN_WARNING "CIFS: no memory "
1559 goto cifs_parse_mount_err;
1563 string = match_strdup(args);
1567 temp_len = strnlen(string, 300);
1568 if (temp_len == 300) {
1569 printk(KERN_WARNING "CIFS: UNC name too long\n");
1570 goto cifs_parse_mount_err;
1573 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1574 if (vol->UNC == NULL) {
1575 printk(KERN_WARNING "CIFS: no memory for UNC\n");
1576 goto cifs_parse_mount_err;
1578 strcpy(vol->UNC, string);
1580 if (strncmp(string, "//", 2) == 0) {
1583 } else if (strncmp(string, "\\\\", 2) != 0) {
1584 printk(KERN_WARNING "CIFS: UNC Path does not "
1585 "begin with // or \\\\\n");
1586 goto cifs_parse_mount_err;
1591 string = match_strdup(args);
1595 if (strnlen(string, 256) == 256) {
1596 printk(KERN_WARNING "CIFS: domain name too"
1598 goto cifs_parse_mount_err;
1601 vol->domainname = kstrdup(string, GFP_KERNEL);
1602 if (!vol->domainname) {
1603 printk(KERN_WARNING "CIFS: no memory "
1604 "for domainname\n");
1605 goto cifs_parse_mount_err;
1607 cFYI(1, "Domain name set");
1610 string = match_strdup(args);
1614 if (!cifs_convert_address(
1615 (struct sockaddr *)&vol->srcaddr,
1616 string, strlen(string))) {
1617 printk(KERN_WARNING "CIFS: Could not parse"
1618 " srcaddr: %s\n", string);
1619 goto cifs_parse_mount_err;
1622 case Opt_prefixpath:
1623 string = match_strdup(args);
1627 temp_len = strnlen(string, 1024);
1628 if (string[0] != '/')
1629 temp_len++; /* missing leading slash */
1630 if (temp_len > 1024) {
1631 printk(KERN_WARNING "CIFS: prefix too long\n");
1632 goto cifs_parse_mount_err;
1635 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1636 if (vol->prepath == NULL) {
1637 printk(KERN_WARNING "CIFS: no memory "
1638 "for path prefix\n");
1639 goto cifs_parse_mount_err;
1642 if (string[0] != '/') {
1643 vol->prepath[0] = '/';
1644 strcpy(vol->prepath+1, string);
1646 strcpy(vol->prepath, string);
1650 string = match_strdup(args);
1654 if (strnlen(string, 1024) >= 65) {
1655 printk(KERN_WARNING "CIFS: iocharset name "
1657 goto cifs_parse_mount_err;
1660 if (strnicmp(string, "default", 7) != 0) {
1661 vol->iocharset = kstrdup(string,
1663 if (!vol->iocharset) {
1664 printk(KERN_WARNING "CIFS: no memory"
1666 goto cifs_parse_mount_err;
1669 /* if iocharset not set then load_nls_default
1672 cFYI(1, "iocharset set to %s", string);
1675 string = match_strdup(args);
1679 if (strnicmp(string, "TCP_NODELAY", 11) == 0)
1680 vol->sockopt_tcp_nodelay = 1;
1682 case Opt_netbiosname:
1683 string = match_strdup(args);
1687 memset(vol->source_rfc1001_name, 0x20,
1690 * FIXME: are there cases in which a comma can
1691 * be valid in workstation netbios name (and
1692 * need special handling)?
1694 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1695 /* don't ucase netbiosname for user */
1698 vol->source_rfc1001_name[i] = string[i];
1700 /* The string has 16th byte zero still from
1701 * set at top of the function
1703 if (i == RFC1001_NAME_LEN && string[i] != 0)
1704 printk(KERN_WARNING "CIFS: netbiosname"
1705 " longer than 15 truncated.\n");
1709 /* servernetbiosname specified override *SMBSERVER */
1710 string = match_strdup(args);
1714 /* last byte, type, is 0x20 for servr type */
1715 memset(vol->target_rfc1001_name, 0x20,
1716 RFC1001_NAME_LEN_WITH_NULL);
1718 /* BB are there cases in which a comma can be
1719 valid in this workstation netbios name
1720 (and need special handling)? */
1722 /* user or mount helper must uppercase the
1724 for (i = 0; i < 15; i++) {
1727 vol->target_rfc1001_name[i] = string[i];
1729 /* The string has 16th byte zero still from
1730 set at top of the function */
1731 if (i == RFC1001_NAME_LEN && string[i] != 0)
1732 printk(KERN_WARNING "CIFS: server net"
1733 "biosname longer than 15 truncated.\n");
1736 string = match_strdup(args);
1740 if (strnicmp(string, "1", 1) == 0) {
1741 /* This is the default */
1744 /* For all other value, error */
1745 printk(KERN_WARNING "CIFS: Invalid version"
1747 goto cifs_parse_mount_err;
1749 string = match_strdup(args);
1753 if (cifs_parse_smb_version(string, vol) != 0)
1754 goto cifs_parse_mount_err;
1757 string = match_strdup(args);
1761 if (cifs_parse_security_flavors(string, vol) != 0)
1762 goto cifs_parse_mount_err;
1765 cache_specified = true;
1766 string = match_strdup(args);
1770 if (cifs_parse_cache_flavor(string, vol) != 0)
1771 goto cifs_parse_mount_err;
1775 * An option we don't recognize. Save it off for later
1776 * if we haven't already found one
1782 /* Free up any allocated string */
1787 if (!sloppy && invalid) {
1788 printk(KERN_ERR "CIFS: Unknown mount option \"%s\"\n", invalid);
1789 goto cifs_parse_mount_err;
1793 /* Muliuser mounts require CONFIG_KEYS support */
1794 if (vol->multiuser) {
1795 cERROR(1, "Multiuser mounts require kernels with "
1796 "CONFIG_KEYS enabled.");
1797 goto cifs_parse_mount_err;
1801 if (vol->UNCip == NULL)
1802 vol->UNCip = &vol->UNC[2];
1805 vol->override_uid = override_uid;
1806 else if (override_uid == 1)
1807 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1808 "specified with no uid= option.\n");
1811 vol->override_gid = override_gid;
1812 else if (override_gid == 1)
1813 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1814 "specified with no gid= option.\n");
1816 /* FIXME: remove this block in 3.7 */
1817 if (!cache_specified && !cache_warned) {
1818 cache_warned = true;
1819 printk(KERN_NOTICE "CIFS: no cache= option specified, using "
1820 "\"cache=loose\". This default will change "
1821 "to \"cache=strict\" in 3.7.\n");
1824 kfree(mountdata_copy);
1828 printk(KERN_WARNING "Could not allocate temporary buffer\n");
1829 cifs_parse_mount_err:
1831 kfree(mountdata_copy);
1835 /** Returns true if srcaddr isn't specified and rhs isn't
1836 * specified, or if srcaddr is specified and
1837 * matches the IP address of the rhs argument.
1840 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1842 switch (srcaddr->sa_family) {
1844 return (rhs->sa_family == AF_UNSPEC);
1846 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1847 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1848 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1851 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1852 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1853 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1857 return false; /* don't expect to be here */
1862 * If no port is specified in addr structure, we try to match with 445 port
1863 * and if it fails - with 139 ports. It should be called only if address
1864 * families of server and addr are equal.
1867 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1869 __be16 port, *sport;
1871 switch (addr->sa_family) {
1873 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1874 port = ((struct sockaddr_in *) addr)->sin_port;
1877 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1878 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1886 port = htons(CIFS_PORT);
1890 port = htons(RFC1001_PORT);
1893 return port == *sport;
1897 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1898 struct sockaddr *srcaddr)
1900 switch (addr->sa_family) {
1902 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1903 struct sockaddr_in *srv_addr4 =
1904 (struct sockaddr_in *)&server->dstaddr;
1906 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1911 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1912 struct sockaddr_in6 *srv_addr6 =
1913 (struct sockaddr_in6 *)&server->dstaddr;
1915 if (!ipv6_addr_equal(&addr6->sin6_addr,
1916 &srv_addr6->sin6_addr))
1918 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1924 return false; /* don't expect to be here */
1927 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1934 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1936 unsigned int secFlags;
1938 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1939 secFlags = vol->secFlg;
1941 secFlags = global_secflags | vol->secFlg;
1943 switch (server->secType) {
1945 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1949 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1953 if (!(secFlags & CIFSSEC_MAY_NTLM))
1957 if (!(secFlags & CIFSSEC_MAY_KRB5))
1961 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1965 /* shouldn't happen */
1969 /* now check if signing mode is acceptable */
1970 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1971 (server->sec_mode & SECMODE_SIGN_REQUIRED))
1973 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1975 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1981 static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
1982 struct smb_vol *vol)
1984 if ((server->vals != vol->vals) || (server->ops != vol->ops))
1987 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1990 if (!match_address(server, addr,
1991 (struct sockaddr *)&vol->srcaddr))
1994 if (!match_port(server, addr))
1997 if (!match_security(server, vol))
2003 static struct TCP_Server_Info *
2004 cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
2006 struct TCP_Server_Info *server;
2008 spin_lock(&cifs_tcp_ses_lock);
2009 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2010 if (!match_server(server, addr, vol))
2013 ++server->srv_count;
2014 spin_unlock(&cifs_tcp_ses_lock);
2015 cFYI(1, "Existing tcp session with server found");
2018 spin_unlock(&cifs_tcp_ses_lock);
2023 cifs_put_tcp_session(struct TCP_Server_Info *server)
2025 struct task_struct *task;
2027 spin_lock(&cifs_tcp_ses_lock);
2028 if (--server->srv_count > 0) {
2029 spin_unlock(&cifs_tcp_ses_lock);
2033 put_net(cifs_net_ns(server));
2035 list_del_init(&server->tcp_ses_list);
2036 spin_unlock(&cifs_tcp_ses_lock);
2038 cancel_delayed_work_sync(&server->echo);
2040 spin_lock(&GlobalMid_Lock);
2041 server->tcpStatus = CifsExiting;
2042 spin_unlock(&GlobalMid_Lock);
2044 cifs_crypto_shash_release(server);
2045 cifs_fscache_release_client_cookie(server);
2047 kfree(server->session_key.response);
2048 server->session_key.response = NULL;
2049 server->session_key.len = 0;
2051 task = xchg(&server->tsk, NULL);
2053 force_sig(SIGKILL, task);
2056 static struct TCP_Server_Info *
2057 cifs_get_tcp_session(struct smb_vol *volume_info)
2059 struct TCP_Server_Info *tcp_ses = NULL;
2060 struct sockaddr_storage addr;
2061 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
2062 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
2065 memset(&addr, 0, sizeof(struct sockaddr_storage));
2067 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
2069 if (volume_info->UNCip && volume_info->UNC) {
2070 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2072 strlen(volume_info->UNCip),
2075 /* we failed translating address */
2079 } else if (volume_info->UNCip) {
2080 /* BB using ip addr as tcp_ses name to connect to the
2082 cERROR(1, "Connecting to DFS root not implemented yet");
2085 } else /* which tcp_sess DFS root would we conect to */ {
2086 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
2087 "unc=//192.168.1.100/public) specified");
2092 /* see if we already have a matching tcp_ses */
2093 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
2097 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2103 rc = cifs_crypto_shash_allocate(tcp_ses);
2105 cERROR(1, "could not setup hash structures rc %d", rc);
2109 tcp_ses->ops = volume_info->ops;
2110 tcp_ses->vals = volume_info->vals;
2111 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2112 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2113 if (IS_ERR(tcp_ses->hostname)) {
2114 rc = PTR_ERR(tcp_ses->hostname);
2115 goto out_err_crypto_release;
2118 tcp_ses->noblocksnd = volume_info->noblocksnd;
2119 tcp_ses->noautotune = volume_info->noautotune;
2120 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2121 tcp_ses->in_flight = 0;
2122 tcp_ses->credits = 1;
2123 init_waitqueue_head(&tcp_ses->response_q);
2124 init_waitqueue_head(&tcp_ses->request_q);
2125 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2126 mutex_init(&tcp_ses->srv_mutex);
2127 memcpy(tcp_ses->workstation_RFC1001_name,
2128 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2129 memcpy(tcp_ses->server_RFC1001_name,
2130 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2131 tcp_ses->session_estab = false;
2132 tcp_ses->sequence_number = 0;
2133 tcp_ses->lstrp = jiffies;
2134 spin_lock_init(&tcp_ses->req_lock);
2135 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2136 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2137 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2140 * at this point we are the only ones with the pointer
2141 * to the struct since the kernel thread not created yet
2142 * no need to spinlock this init of tcpStatus or srv_count
2144 tcp_ses->tcpStatus = CifsNew;
2145 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2146 sizeof(tcp_ses->srcaddr));
2147 ++tcp_ses->srv_count;
2149 if (addr.ss_family == AF_INET6) {
2150 cFYI(1, "attempting ipv6 connect");
2151 /* BB should we allow ipv6 on port 139? */
2152 /* other OS never observed in Wild doing 139 with v6 */
2153 memcpy(&tcp_ses->dstaddr, sin_server6,
2154 sizeof(struct sockaddr_in6));
2156 memcpy(&tcp_ses->dstaddr, sin_server,
2157 sizeof(struct sockaddr_in));
2159 rc = ip_connect(tcp_ses);
2161 cERROR(1, "Error connecting to socket. Aborting operation");
2162 goto out_err_crypto_release;
2166 * since we're in a cifs function already, we know that
2167 * this will succeed. No need for try_module_get().
2169 __module_get(THIS_MODULE);
2170 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2172 if (IS_ERR(tcp_ses->tsk)) {
2173 rc = PTR_ERR(tcp_ses->tsk);
2174 cERROR(1, "error %d create cifsd thread", rc);
2175 module_put(THIS_MODULE);
2176 goto out_err_crypto_release;
2178 tcp_ses->tcpStatus = CifsNeedNegotiate;
2180 /* thread spawned, put it on the list */
2181 spin_lock(&cifs_tcp_ses_lock);
2182 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2183 spin_unlock(&cifs_tcp_ses_lock);
2185 cifs_fscache_get_client_cookie(tcp_ses);
2187 /* queue echo request delayed work */
2188 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2192 out_err_crypto_release:
2193 cifs_crypto_shash_release(tcp_ses);
2195 put_net(cifs_net_ns(tcp_ses));
2199 if (!IS_ERR(tcp_ses->hostname))
2200 kfree(tcp_ses->hostname);
2201 if (tcp_ses->ssocket)
2202 sock_release(tcp_ses->ssocket);
2208 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2210 switch (ses->server->secType) {
2212 if (vol->cred_uid != ses->cred_uid)
2216 /* NULL username means anonymous session */
2217 if (ses->user_name == NULL) {
2223 /* anything else takes username/password */
2224 if (strncmp(ses->user_name,
2225 vol->username ? vol->username : "",
2228 if (strlen(vol->username) != 0 &&
2229 ses->password != NULL &&
2230 strncmp(ses->password,
2231 vol->password ? vol->password : "",
2238 static struct cifs_ses *
2239 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2241 struct cifs_ses *ses;
2243 spin_lock(&cifs_tcp_ses_lock);
2244 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2245 if (!match_session(ses, vol))
2248 spin_unlock(&cifs_tcp_ses_lock);
2251 spin_unlock(&cifs_tcp_ses_lock);
2256 cifs_put_smb_ses(struct cifs_ses *ses)
2259 struct TCP_Server_Info *server = ses->server;
2261 cFYI(1, "%s: ses_count=%d", __func__, ses->ses_count);
2262 spin_lock(&cifs_tcp_ses_lock);
2263 if (--ses->ses_count > 0) {
2264 spin_unlock(&cifs_tcp_ses_lock);
2268 list_del_init(&ses->smb_ses_list);
2269 spin_unlock(&cifs_tcp_ses_lock);
2271 if (ses->status == CifsGood && server->ops->logoff) {
2273 server->ops->logoff(xid, ses);
2277 cifs_put_tcp_session(server);
2282 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2283 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2285 /* Populate username and pw fields from keyring if possible */
2287 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2290 char *desc, *delim, *payload;
2293 struct TCP_Server_Info *server = ses->server;
2294 struct sockaddr_in *sa;
2295 struct sockaddr_in6 *sa6;
2296 struct user_key_payload *upayload;
2298 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2302 /* try to find an address key first */
2303 switch (server->dstaddr.ss_family) {
2305 sa = (struct sockaddr_in *)&server->dstaddr;
2306 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2309 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2310 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2313 cFYI(1, "Bad ss_family (%hu)", server->dstaddr.ss_family);
2318 cFYI(1, "%s: desc=%s", __func__, desc);
2319 key = request_key(&key_type_logon, desc, "");
2321 if (!ses->domainName) {
2322 cFYI(1, "domainName is NULL");
2327 /* didn't work, try to find a domain key */
2328 sprintf(desc, "cifs:d:%s", ses->domainName);
2329 cFYI(1, "%s: desc=%s", __func__, desc);
2330 key = request_key(&key_type_logon, desc, "");
2337 down_read(&key->sem);
2338 upayload = key->payload.data;
2339 if (IS_ERR_OR_NULL(upayload)) {
2340 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2344 /* find first : in payload */
2345 payload = (char *)upayload->data;
2346 delim = strnchr(payload, upayload->datalen, ':');
2347 cFYI(1, "payload=%s", payload);
2349 cFYI(1, "Unable to find ':' in payload (datalen=%d)",
2355 len = delim - payload;
2356 if (len > MAX_USERNAME_SIZE || len <= 0) {
2357 cFYI(1, "Bad value from username search (len=%zd)", len);
2362 vol->username = kstrndup(payload, len, GFP_KERNEL);
2363 if (!vol->username) {
2364 cFYI(1, "Unable to allocate %zd bytes for username", len);
2368 cFYI(1, "%s: username=%s", __func__, vol->username);
2370 len = key->datalen - (len + 1);
2371 if (len > MAX_PASSWORD_SIZE || len <= 0) {
2372 cFYI(1, "Bad len for password search (len=%zd)", len);
2374 kfree(vol->username);
2375 vol->username = NULL;
2380 vol->password = kstrndup(delim, len, GFP_KERNEL);
2381 if (!vol->password) {
2382 cFYI(1, "Unable to allocate %zd bytes for password", len);
2384 kfree(vol->username);
2385 vol->username = NULL;
2394 cFYI(1, "%s: returning %d", __func__, rc);
2397 #else /* ! CONFIG_KEYS */
2399 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2400 struct cifs_ses *ses __attribute__((unused)))
2404 #endif /* CONFIG_KEYS */
2406 static bool warned_on_ntlm; /* globals init to false automatically */
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 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2423 mutex_lock(&ses->session_mutex);
2424 rc = cifs_negotiate_protocol(xid, ses);
2426 mutex_unlock(&ses->session_mutex);
2427 /* problem -- put our ses reference */
2428 cifs_put_smb_ses(ses);
2432 if (ses->need_reconnect) {
2433 cFYI(1, "Session needs reconnect");
2434 rc = cifs_setup_session(xid, ses,
2435 volume_info->local_nls);
2437 mutex_unlock(&ses->session_mutex);
2438 /* problem -- put our reference */
2439 cifs_put_smb_ses(ses);
2444 mutex_unlock(&ses->session_mutex);
2446 /* existing SMB ses has a server reference already */
2447 cifs_put_tcp_session(server);
2452 cFYI(1, "Existing smb sess not found");
2453 ses = sesInfoAlloc();
2457 /* new SMB session uses our server ref */
2458 ses->server = server;
2459 if (server->dstaddr.ss_family == AF_INET6)
2460 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2462 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2464 if (volume_info->username) {
2465 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2466 if (!ses->user_name)
2470 /* volume_info->password freed at unmount */
2471 if (volume_info->password) {
2472 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2476 if (volume_info->domainname) {
2477 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2478 if (!ses->domainName)
2481 ses->cred_uid = volume_info->cred_uid;
2482 ses->linux_uid = volume_info->linux_uid;
2484 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2485 supported for many years, time to update default security mechanism */
2486 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2487 warned_on_ntlm = true;
2488 cERROR(1, "default security mechanism requested. The default "
2489 "security mechanism will be upgraded from ntlm to "
2490 "ntlmv2 in kernel release 3.3");
2492 ses->overrideSecFlg = volume_info->secFlg;
2494 mutex_lock(&ses->session_mutex);
2495 rc = cifs_negotiate_protocol(xid, ses);
2497 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2498 mutex_unlock(&ses->session_mutex);
2502 /* success, put it on the list */
2503 spin_lock(&cifs_tcp_ses_lock);
2504 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2505 spin_unlock(&cifs_tcp_ses_lock);
2516 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2518 if (tcon->tidStatus == CifsExiting)
2520 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2525 static struct cifs_tcon *
2526 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2528 struct list_head *tmp;
2529 struct cifs_tcon *tcon;
2531 spin_lock(&cifs_tcp_ses_lock);
2532 list_for_each(tmp, &ses->tcon_list) {
2533 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2534 if (!match_tcon(tcon, unc))
2537 spin_unlock(&cifs_tcp_ses_lock);
2540 spin_unlock(&cifs_tcp_ses_lock);
2545 cifs_put_tcon(struct cifs_tcon *tcon)
2548 struct cifs_ses *ses = tcon->ses;
2550 cFYI(1, "%s: tc_count=%d", __func__, tcon->tc_count);
2551 spin_lock(&cifs_tcp_ses_lock);
2552 if (--tcon->tc_count > 0) {
2553 spin_unlock(&cifs_tcp_ses_lock);
2557 list_del_init(&tcon->tcon_list);
2558 spin_unlock(&cifs_tcp_ses_lock);
2561 if (ses->server->ops->tree_disconnect)
2562 ses->server->ops->tree_disconnect(xid, tcon);
2565 cifs_fscache_release_super_cookie(tcon);
2567 cifs_put_smb_ses(ses);
2570 static struct cifs_tcon *
2571 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2574 struct cifs_tcon *tcon;
2576 tcon = cifs_find_tcon(ses, volume_info->UNC);
2578 cFYI(1, "Found match on UNC path");
2579 /* existing tcon already has a reference */
2580 cifs_put_smb_ses(ses);
2581 if (tcon->seal != volume_info->seal)
2582 cERROR(1, "transport encryption setting "
2583 "conflicts with existing tid");
2587 if (!ses->server->ops->tree_connect) {
2592 tcon = tconInfoAlloc();
2599 if (volume_info->password) {
2600 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2601 if (!tcon->password) {
2607 if (strchr(volume_info->UNC + 3, '\\') == NULL
2608 && strchr(volume_info->UNC + 3, '/') == NULL) {
2609 cERROR(1, "Missing share name");
2615 * BB Do we need to wrap session_mutex around this TCon call and Unix
2616 * SetFS as we do on SessSetup and reconnect?
2619 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2620 volume_info->local_nls);
2622 cFYI(1, "Tcon rc = %d", rc);
2626 if (volume_info->nodfs) {
2627 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2628 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2630 tcon->seal = volume_info->seal;
2632 * We can have only one retry value for a connection to a share so for
2633 * resources mounted more than once to the same server share the last
2634 * value passed in for the retry flag is used.
2636 tcon->retry = volume_info->retry;
2637 tcon->nocase = volume_info->nocase;
2638 tcon->local_lease = volume_info->local_lease;
2640 spin_lock(&cifs_tcp_ses_lock);
2641 list_add(&tcon->tcon_list, &ses->tcon_list);
2642 spin_unlock(&cifs_tcp_ses_lock);
2644 cifs_fscache_get_super_cookie(tcon);
2654 cifs_put_tlink(struct tcon_link *tlink)
2656 if (!tlink || IS_ERR(tlink))
2659 if (!atomic_dec_and_test(&tlink->tl_count) ||
2660 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2661 tlink->tl_time = jiffies;
2665 if (!IS_ERR(tlink_tcon(tlink)))
2666 cifs_put_tcon(tlink_tcon(tlink));
2671 static inline struct tcon_link *
2672 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2674 return cifs_sb->master_tlink;
2678 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2680 struct cifs_sb_info *old = CIFS_SB(sb);
2681 struct cifs_sb_info *new = mnt_data->cifs_sb;
2683 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2686 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2687 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2691 * We want to share sb only if we don't specify an r/wsize or
2692 * specified r/wsize is greater than or equal to existing one.
2694 if (new->wsize && new->wsize < old->wsize)
2697 if (new->rsize && new->rsize < old->rsize)
2700 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2703 if (old->mnt_file_mode != new->mnt_file_mode ||
2704 old->mnt_dir_mode != new->mnt_dir_mode)
2707 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2710 if (old->actimeo != new->actimeo)
2717 cifs_match_super(struct super_block *sb, void *data)
2719 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2720 struct smb_vol *volume_info;
2721 struct cifs_sb_info *cifs_sb;
2722 struct TCP_Server_Info *tcp_srv;
2723 struct cifs_ses *ses;
2724 struct cifs_tcon *tcon;
2725 struct tcon_link *tlink;
2726 struct sockaddr_storage addr;
2729 memset(&addr, 0, sizeof(struct sockaddr_storage));
2731 spin_lock(&cifs_tcp_ses_lock);
2732 cifs_sb = CIFS_SB(sb);
2733 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2734 if (IS_ERR(tlink)) {
2735 spin_unlock(&cifs_tcp_ses_lock);
2738 tcon = tlink_tcon(tlink);
2740 tcp_srv = ses->server;
2742 volume_info = mnt_data->vol;
2744 if (!volume_info->UNCip || !volume_info->UNC)
2747 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2749 strlen(volume_info->UNCip),
2754 if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2755 !match_session(ses, volume_info) ||
2756 !match_tcon(tcon, volume_info->UNC)) {
2761 rc = compare_mount_options(sb, mnt_data);
2763 spin_unlock(&cifs_tcp_ses_lock);
2764 cifs_put_tlink(tlink);
2769 get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2770 const struct nls_table *nls_codepage, unsigned int *num_referrals,
2771 struct dfs_info3_param **referrals, int remap)
2776 if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2782 if (ses->ipc_tid == 0) {
2783 temp_unc = kmalloc(2 /* for slashes */ +
2784 strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2785 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2786 if (temp_unc == NULL)
2790 strcpy(temp_unc + 2, ses->serverName);
2791 strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2792 rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
2794 cFYI(1, "Tcon rc = %d ipc_tid = %d", rc, ses->ipc_tid);
2798 rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
2799 referrals, num_referrals,
2800 nls_codepage, remap);
2802 * BB - map targetUNCs to dfs_info3 structures, here or in
2803 * ses->server->ops->get_dfs_refer.
2809 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2810 static struct lock_class_key cifs_key[2];
2811 static struct lock_class_key cifs_slock_key[2];
2814 cifs_reclassify_socket4(struct socket *sock)
2816 struct sock *sk = sock->sk;
2817 BUG_ON(sock_owned_by_user(sk));
2818 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2819 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2823 cifs_reclassify_socket6(struct socket *sock)
2825 struct sock *sk = sock->sk;
2826 BUG_ON(sock_owned_by_user(sk));
2827 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2828 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2832 cifs_reclassify_socket4(struct socket *sock)
2837 cifs_reclassify_socket6(struct socket *sock)
2842 /* See RFC1001 section 14 on representation of Netbios names */
2843 static void rfc1002mangle(char *target, char *source, unsigned int length)
2847 for (i = 0, j = 0; i < (length); i++) {
2848 /* mask a nibble at a time and encode */
2849 target[j] = 'A' + (0x0F & (source[i] >> 4));
2850 target[j+1] = 'A' + (0x0F & source[i]);
2857 bind_socket(struct TCP_Server_Info *server)
2860 if (server->srcaddr.ss_family != AF_UNSPEC) {
2861 /* Bind to the specified local IP address */
2862 struct socket *socket = server->ssocket;
2863 rc = socket->ops->bind(socket,
2864 (struct sockaddr *) &server->srcaddr,
2865 sizeof(server->srcaddr));
2867 struct sockaddr_in *saddr4;
2868 struct sockaddr_in6 *saddr6;
2869 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2870 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2871 if (saddr6->sin6_family == AF_INET6)
2873 "Failed to bind to: %pI6c, error: %d",
2874 &saddr6->sin6_addr, rc);
2877 "Failed to bind to: %pI4, error: %d",
2878 &saddr4->sin_addr.s_addr, rc);
2885 ip_rfc1001_connect(struct TCP_Server_Info *server)
2889 * some servers require RFC1001 sessinit before sending
2890 * negprot - BB check reconnection in case where second
2891 * sessinit is sent but no second negprot
2893 struct rfc1002_session_packet *ses_init_buf;
2894 struct smb_hdr *smb_buf;
2895 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2898 ses_init_buf->trailer.session_req.called_len = 32;
2900 if (server->server_RFC1001_name &&
2901 server->server_RFC1001_name[0] != 0)
2902 rfc1002mangle(ses_init_buf->trailer.
2903 session_req.called_name,
2904 server->server_RFC1001_name,
2905 RFC1001_NAME_LEN_WITH_NULL);
2907 rfc1002mangle(ses_init_buf->trailer.
2908 session_req.called_name,
2909 DEFAULT_CIFS_CALLED_NAME,
2910 RFC1001_NAME_LEN_WITH_NULL);
2912 ses_init_buf->trailer.session_req.calling_len = 32;
2915 * calling name ends in null (byte 16) from old smb
2918 if (server->workstation_RFC1001_name &&
2919 server->workstation_RFC1001_name[0] != 0)
2920 rfc1002mangle(ses_init_buf->trailer.
2921 session_req.calling_name,
2922 server->workstation_RFC1001_name,
2923 RFC1001_NAME_LEN_WITH_NULL);
2925 rfc1002mangle(ses_init_buf->trailer.
2926 session_req.calling_name,
2928 RFC1001_NAME_LEN_WITH_NULL);
2930 ses_init_buf->trailer.session_req.scope1 = 0;
2931 ses_init_buf->trailer.session_req.scope2 = 0;
2932 smb_buf = (struct smb_hdr *)ses_init_buf;
2934 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2935 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2936 rc = smb_send(server, smb_buf, 0x44);
2937 kfree(ses_init_buf);
2939 * RFC1001 layer in at least one server
2940 * requires very short break before negprot
2941 * presumably because not expecting negprot
2942 * to follow so fast. This is a simple
2943 * solution that works without
2944 * complicating the code and causes no
2945 * significant slowing down on mount
2948 usleep_range(1000, 2000);
2951 * else the negprot may still work without this
2952 * even though malloc failed
2959 generic_ip_connect(struct TCP_Server_Info *server)
2964 struct socket *socket = server->ssocket;
2965 struct sockaddr *saddr;
2967 saddr = (struct sockaddr *) &server->dstaddr;
2969 if (server->dstaddr.ss_family == AF_INET6) {
2970 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2971 slen = sizeof(struct sockaddr_in6);
2974 sport = ((struct sockaddr_in *) saddr)->sin_port;
2975 slen = sizeof(struct sockaddr_in);
2979 if (socket == NULL) {
2980 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2981 IPPROTO_TCP, &socket, 1);
2983 cERROR(1, "Error %d creating socket", rc);
2984 server->ssocket = NULL;
2988 /* BB other socket options to set KEEPALIVE, NODELAY? */
2989 cFYI(1, "Socket created");
2990 server->ssocket = socket;
2991 socket->sk->sk_allocation = GFP_NOFS;
2992 if (sfamily == AF_INET6)
2993 cifs_reclassify_socket6(socket);
2995 cifs_reclassify_socket4(socket);
2998 rc = bind_socket(server);
3003 * Eventually check for other socket options to change from
3004 * the default. sock_setsockopt not used because it expects
3007 socket->sk->sk_rcvtimeo = 7 * HZ;
3008 socket->sk->sk_sndtimeo = 5 * HZ;
3010 /* make the bufsizes depend on wsize/rsize and max requests */
3011 if (server->noautotune) {
3012 if (socket->sk->sk_sndbuf < (200 * 1024))
3013 socket->sk->sk_sndbuf = 200 * 1024;
3014 if (socket->sk->sk_rcvbuf < (140 * 1024))
3015 socket->sk->sk_rcvbuf = 140 * 1024;
3018 if (server->tcp_nodelay) {
3020 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3021 (char *)&val, sizeof(val));
3023 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
3026 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
3027 socket->sk->sk_sndbuf,
3028 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3030 rc = socket->ops->connect(socket, saddr, slen, 0);
3032 cFYI(1, "Error %d connecting to server", rc);
3033 sock_release(socket);
3034 server->ssocket = NULL;
3038 if (sport == htons(RFC1001_PORT))
3039 rc = ip_rfc1001_connect(server);
3045 ip_connect(struct TCP_Server_Info *server)
3048 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3049 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3051 if (server->dstaddr.ss_family == AF_INET6)
3052 sport = &addr6->sin6_port;
3054 sport = &addr->sin_port;
3059 /* try with 445 port at first */
3060 *sport = htons(CIFS_PORT);
3062 rc = generic_ip_connect(server);
3066 /* if it failed, try with 139 port */
3067 *sport = htons(RFC1001_PORT);
3070 return generic_ip_connect(server);
3073 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3074 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3076 /* if we are reconnecting then should we check to see if
3077 * any requested capabilities changed locally e.g. via
3078 * remount but we can not do much about it here
3079 * if they have (even if we could detect it by the following)
3080 * Perhaps we could add a backpointer to array of sb from tcon
3081 * or if we change to make all sb to same share the same
3082 * sb as NFS - then we only have one backpointer to sb.
3083 * What if we wanted to mount the server share twice once with
3084 * and once without posixacls or posix paths? */
3085 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3087 if (vol_info && vol_info->no_linux_ext) {
3088 tcon->fsUnixInfo.Capability = 0;
3089 tcon->unix_ext = 0; /* Unix Extensions disabled */
3090 cFYI(1, "Linux protocol extensions disabled");
3092 } else if (vol_info)
3093 tcon->unix_ext = 1; /* Unix Extensions supported */
3095 if (tcon->unix_ext == 0) {
3096 cFYI(1, "Unix extensions disabled so not set on reconnect");
3100 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3101 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3102 cFYI(1, "unix caps which server supports %lld", cap);
3103 /* check for reconnect case in which we do not
3104 want to change the mount behavior if we can avoid it */
3105 if (vol_info == NULL) {
3106 /* turn off POSIX ACL and PATHNAMES if not set
3107 originally at mount time */
3108 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3109 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3110 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3111 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3112 cERROR(1, "POSIXPATH support change");
3113 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3114 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3115 cERROR(1, "possible reconnect error");
3116 cERROR(1, "server disabled POSIX path support");
3120 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3121 cERROR(1, "per-share encryption not supported yet");
3123 cap &= CIFS_UNIX_CAP_MASK;
3124 if (vol_info && vol_info->no_psx_acl)
3125 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3126 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3127 cFYI(1, "negotiated posix acl support");
3129 cifs_sb->mnt_cifs_flags |=
3130 CIFS_MOUNT_POSIXACL;
3133 if (vol_info && vol_info->posix_paths == 0)
3134 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3135 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3136 cFYI(1, "negotiate posix pathnames");
3138 cifs_sb->mnt_cifs_flags |=
3139 CIFS_MOUNT_POSIX_PATHS;
3142 cFYI(1, "Negotiate caps 0x%x", (int)cap);
3143 #ifdef CONFIG_CIFS_DEBUG2
3144 if (cap & CIFS_UNIX_FCNTL_CAP)
3145 cFYI(1, "FCNTL cap");
3146 if (cap & CIFS_UNIX_EXTATTR_CAP)
3147 cFYI(1, "EXTATTR cap");
3148 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3149 cFYI(1, "POSIX path cap");
3150 if (cap & CIFS_UNIX_XATTR_CAP)
3151 cFYI(1, "XATTR cap");
3152 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3153 cFYI(1, "POSIX ACL cap");
3154 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3155 cFYI(1, "very large read cap");
3156 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3157 cFYI(1, "very large write cap");
3158 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3159 cFYI(1, "transport encryption cap");
3160 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3161 cFYI(1, "mandatory transport encryption cap");
3162 #endif /* CIFS_DEBUG2 */
3163 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3164 if (vol_info == NULL) {
3165 cFYI(1, "resetting capabilities failed");
3167 cERROR(1, "Negotiating Unix capabilities "
3168 "with the server failed. Consider "
3169 "mounting with the Unix Extensions "
3170 "disabled if problems are found "
3171 "by specifying the nounix mount "
3178 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3179 struct cifs_sb_info *cifs_sb)
3181 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3183 spin_lock_init(&cifs_sb->tlink_tree_lock);
3184 cifs_sb->tlink_tree = RB_ROOT;
3187 * Temporarily set r/wsize for matching superblock. If we end up using
3188 * new sb then client will later negotiate it downward if needed.
3190 cifs_sb->rsize = pvolume_info->rsize;
3191 cifs_sb->wsize = pvolume_info->wsize;
3193 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3194 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3195 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3196 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3197 cFYI(1, "file mode: 0x%hx dir mode: 0x%hx",
3198 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3200 cifs_sb->actimeo = pvolume_info->actimeo;
3201 cifs_sb->local_nls = pvolume_info->local_nls;
3203 if (pvolume_info->noperm)
3204 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3205 if (pvolume_info->setuids)
3206 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3207 if (pvolume_info->server_ino)
3208 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3209 if (pvolume_info->remap)
3210 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3211 if (pvolume_info->no_xattr)
3212 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3213 if (pvolume_info->sfu_emul)
3214 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3215 if (pvolume_info->nobrl)
3216 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3217 if (pvolume_info->nostrictsync)
3218 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3219 if (pvolume_info->mand_lock)
3220 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3221 if (pvolume_info->rwpidforward)
3222 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3223 if (pvolume_info->cifs_acl)
3224 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3225 if (pvolume_info->backupuid_specified) {
3226 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3227 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3229 if (pvolume_info->backupgid_specified) {
3230 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3231 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3233 if (pvolume_info->override_uid)
3234 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3235 if (pvolume_info->override_gid)
3236 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3237 if (pvolume_info->dynperm)
3238 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3239 if (pvolume_info->fsc)
3240 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3241 if (pvolume_info->multiuser)
3242 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3243 CIFS_MOUNT_NO_PERM);
3244 if (pvolume_info->strict_io)
3245 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3246 if (pvolume_info->direct_io) {
3247 cFYI(1, "mounting share using direct i/o");
3248 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3250 if (pvolume_info->mfsymlinks) {
3251 if (pvolume_info->sfu_emul) {
3252 cERROR(1, "mount option mfsymlinks ignored if sfu "
3253 "mount option is used");
3255 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3259 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3260 cERROR(1, "mount option dynperm ignored if cifsacl "
3261 "mount option supported");
3265 * When the server supports very large reads and writes via POSIX extensions,
3266 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
3267 * including the RFC1001 length.
3269 * Note that this might make for "interesting" allocation problems during
3270 * writeback however as we have to allocate an array of pointers for the
3271 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
3273 * For reads, there is a similar problem as we need to allocate an array
3274 * of kvecs to handle the receive, though that should only need to be done
3277 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
3278 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
3281 * When the server doesn't allow large posix writes, only allow a rsize/wsize
3282 * of 2^17-1 minus the size of the call header. That allows for a read or
3283 * write up to the maximum size described by RFC1002.
3285 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
3286 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
3289 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
3290 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
3291 * a single wsize request with a single call.
3293 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
3296 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
3297 * those values when posix extensions aren't in force. In actuality here, we
3298 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
3299 * to be ok with the extra byte even though Windows doesn't send writes that
3304 * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
3306 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
3307 #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
3310 * On hosts with high memory, we can't currently support wsize/rsize that are
3311 * larger than we can kmap at once. Cap the rsize/wsize at
3312 * LAST_PKMAP * PAGE_SIZE. We'll never be able to fill a read or write request
3313 * larger than that anyway.
3315 #ifdef CONFIG_HIGHMEM
3316 #define CIFS_KMAP_SIZE_LIMIT (LAST_PKMAP * PAGE_CACHE_SIZE)
3317 #else /* CONFIG_HIGHMEM */
3318 #define CIFS_KMAP_SIZE_LIMIT (1<<24)
3319 #endif /* CONFIG_HIGHMEM */
3322 cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
3324 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3325 struct TCP_Server_Info *server = tcon->ses->server;
3328 /* start with specified wsize, or default */
3329 if (pvolume_info->wsize)
3330 wsize = pvolume_info->wsize;
3331 else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
3332 wsize = CIFS_DEFAULT_IOSIZE;
3334 wsize = CIFS_DEFAULT_NON_POSIX_WSIZE;
3336 /* can server support 24-bit write sizes? (via UNIX extensions) */
3337 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
3338 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
3341 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
3342 * Limit it to max buffer offered by the server, minus the size of the
3343 * WRITEX header, not including the 4 byte RFC1001 length.
3345 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
3346 (!(server->capabilities & CAP_UNIX) &&
3347 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
3348 wsize = min_t(unsigned int, wsize,
3349 server->maxBuf - sizeof(WRITE_REQ) + 4);
3351 /* limit to the amount that we can kmap at once */
3352 wsize = min_t(unsigned int, wsize, CIFS_KMAP_SIZE_LIMIT);
3354 /* hard limit of CIFS_MAX_WSIZE */
3355 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
3361 cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
3363 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3364 struct TCP_Server_Info *server = tcon->ses->server;
3365 unsigned int rsize, defsize;
3368 * Set default value...
3370 * HACK alert! Ancient servers have very small buffers. Even though
3371 * MS-CIFS indicates that servers are only limited by the client's
3372 * bufsize for reads, testing against win98se shows that it throws
3373 * INVALID_PARAMETER errors if you try to request too large a read.
3374 * OS/2 just sends back short reads.
3376 * If the server doesn't advertise CAP_LARGE_READ_X, then assume that
3377 * it can't handle a read request larger than its MaxBufferSize either.
3379 if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP))
3380 defsize = CIFS_DEFAULT_IOSIZE;
3381 else if (server->capabilities & CAP_LARGE_READ_X)
3382 defsize = CIFS_DEFAULT_NON_POSIX_RSIZE;
3384 defsize = server->maxBuf - sizeof(READ_RSP);
3386 rsize = pvolume_info->rsize ? pvolume_info->rsize : defsize;
3389 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
3390 * the client's MaxBufferSize.
3392 if (!(server->capabilities & CAP_LARGE_READ_X))
3393 rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
3395 /* limit to the amount that we can kmap at once */
3396 rsize = min_t(unsigned int, rsize, CIFS_KMAP_SIZE_LIMIT);
3398 /* hard limit of CIFS_MAX_RSIZE */
3399 rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
3405 cleanup_volume_info_contents(struct smb_vol *volume_info)
3407 kfree(volume_info->username);
3408 kzfree(volume_info->password);
3409 if (volume_info->UNCip != volume_info->UNC + 2)
3410 kfree(volume_info->UNCip);
3411 kfree(volume_info->UNC);
3412 kfree(volume_info->domainname);
3413 kfree(volume_info->iocharset);
3414 kfree(volume_info->prepath);
3418 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3422 cleanup_volume_info_contents(volume_info);
3427 #ifdef CONFIG_CIFS_DFS_UPCALL
3428 /* build_path_to_root returns full path to root when
3429 * we do not have an exiting connection (tcon) */
3431 build_unc_path_to_root(const struct smb_vol *vol,
3432 const struct cifs_sb_info *cifs_sb)
3434 char *full_path, *pos;
3435 unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
3436 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3438 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3439 if (full_path == NULL)
3440 return ERR_PTR(-ENOMEM);
3442 strncpy(full_path, vol->UNC, unc_len);
3443 pos = full_path + unc_len;
3446 strncpy(pos, vol->prepath, pplen);
3450 *pos = '\0'; /* add trailing null */
3451 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3452 cFYI(1, "%s: full_path=%s", __func__, full_path);
3457 * Perform a dfs referral query for a share and (optionally) prefix
3459 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3460 * to a string containing updated options for the submount. Otherwise it
3461 * will be left untouched.
3463 * Returns the rc from get_dfs_path to the caller, which can be used to
3464 * determine whether there were referrals.
3467 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3468 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3472 unsigned int num_referrals = 0;
3473 struct dfs_info3_param *referrals = NULL;
3474 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3476 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3477 if (IS_ERR(full_path))
3478 return PTR_ERR(full_path);
3480 /* For DFS paths, skip the first '\' of the UNC */
3481 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3483 rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3484 &num_referrals, &referrals,
3485 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3487 if (!rc && num_referrals > 0) {
3488 char *fake_devname = NULL;
3490 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3491 full_path + 1, referrals,
3494 free_dfs_info_array(referrals, num_referrals);
3496 if (IS_ERR(mdata)) {
3497 rc = PTR_ERR(mdata);
3500 cleanup_volume_info_contents(volume_info);
3501 memset(volume_info, '\0', sizeof(*volume_info));
3502 rc = cifs_setup_volume_info(volume_info, mdata,
3505 kfree(fake_devname);
3506 kfree(cifs_sb->mountdata);
3507 cifs_sb->mountdata = mdata;
3515 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3516 const char *devname)
3520 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3524 if (volume_info->nullauth) {
3525 cFYI(1, "Anonymous login");
3526 kfree(volume_info->username);
3527 volume_info->username = NULL;
3528 } else if (volume_info->username) {
3529 /* BB fixme parse for domain name here */
3530 cFYI(1, "Username: %s", volume_info->username);
3532 cifserror("No username specified");
3533 /* In userspace mount helper we can get user name from alternate
3534 locations such as env variables and files on disk */
3538 /* this is needed for ASCII cp to Unicode converts */
3539 if (volume_info->iocharset == NULL) {
3540 /* load_nls_default cannot return null */
3541 volume_info->local_nls = load_nls_default();
3543 volume_info->local_nls = load_nls(volume_info->iocharset);
3544 if (volume_info->local_nls == NULL) {
3545 cERROR(1, "CIFS mount error: iocharset %s not found",
3546 volume_info->iocharset);
3555 cifs_get_volume_info(char *mount_data, const char *devname)
3558 struct smb_vol *volume_info;
3560 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3562 return ERR_PTR(-ENOMEM);
3564 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3566 cifs_cleanup_volume_info(volume_info);
3567 volume_info = ERR_PTR(rc);
3574 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3578 struct cifs_ses *ses;
3579 struct cifs_tcon *tcon;
3580 struct TCP_Server_Info *server;
3582 struct tcon_link *tlink;
3583 #ifdef CONFIG_CIFS_DFS_UPCALL
3584 int referral_walks_count = 0;
3587 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3591 #ifdef CONFIG_CIFS_DFS_UPCALL
3593 /* cleanup activities if we're chasing a referral */
3594 if (referral_walks_count) {
3596 cifs_put_tcon(tcon);
3598 cifs_put_smb_ses(ses);
3612 /* get a reference to a tcp session */
3613 server = cifs_get_tcp_session(volume_info);
3614 if (IS_ERR(server)) {
3615 rc = PTR_ERR(server);
3616 bdi_destroy(&cifs_sb->bdi);
3620 /* get a reference to a SMB session */
3621 ses = cifs_get_smb_ses(server, volume_info);
3625 goto mount_fail_check;
3628 /* search for existing tcon to this server share */
3629 tcon = cifs_get_tcon(ses, volume_info);
3633 goto remote_path_check;
3636 /* tell server which Unix caps we support */
3637 if (cap_unix(tcon->ses)) {
3638 /* reset of caps checks mount to see if unix extensions
3639 disabled for just this mount */
3640 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3641 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3642 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3643 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3645 goto mount_fail_check;
3648 tcon->unix_ext = 0; /* server does not support them */
3650 /* do not care if a following call succeed - informational */
3651 if (!tcon->ipc && server->ops->qfs_tcon)
3652 server->ops->qfs_tcon(xid, tcon);
3654 cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3655 cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info);
3657 /* tune readahead according to rsize */
3658 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3661 #ifdef CONFIG_CIFS_DFS_UPCALL
3663 * Perform an unconditional check for whether there are DFS
3664 * referrals for this path without prefix, to provide support
3665 * for DFS referrals from w2k8 servers which don't seem to respond
3666 * with PATH_NOT_COVERED to requests that include the prefix.
3667 * Chase the referral if found, otherwise continue normally.
3669 if (referral_walks_count == 0) {
3670 int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3673 referral_walks_count++;
3674 goto try_mount_again;
3679 /* check if a whole path is not remote */
3681 if (!server->ops->is_path_accessible) {
3683 goto mount_fail_check;
3685 /* build_path_to_root works only when we have a valid tcon */
3686 full_path = build_path_to_root(volume_info, cifs_sb, tcon);
3687 if (full_path == NULL) {
3689 goto mount_fail_check;
3691 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3693 if (rc != 0 && rc != -EREMOTE) {
3695 goto mount_fail_check;
3700 /* get referral if needed */
3701 if (rc == -EREMOTE) {
3702 #ifdef CONFIG_CIFS_DFS_UPCALL
3703 if (referral_walks_count > MAX_NESTED_LINKS) {
3705 * BB: when we implement proper loop detection,
3706 * we will remove this check. But now we need it
3707 * to prevent an indefinite loop if 'DFS tree' is
3708 * misconfigured (i.e. has loops).
3711 goto mount_fail_check;
3714 rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3717 referral_walks_count++;
3718 goto try_mount_again;
3720 goto mount_fail_check;
3721 #else /* No DFS support, return error on mount */
3727 goto mount_fail_check;
3729 /* now, hang the tcon off of the superblock */
3730 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3731 if (tlink == NULL) {
3733 goto mount_fail_check;
3736 tlink->tl_uid = ses->linux_uid;
3737 tlink->tl_tcon = tcon;
3738 tlink->tl_time = jiffies;
3739 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3740 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3742 cifs_sb->master_tlink = tlink;
3743 spin_lock(&cifs_sb->tlink_tree_lock);
3744 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3745 spin_unlock(&cifs_sb->tlink_tree_lock);
3747 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3751 /* on error free sesinfo and tcon struct if needed */
3753 /* If find_unc succeeded then rc == 0 so we can not end */
3754 /* up accidentally freeing someone elses tcon struct */
3756 cifs_put_tcon(tcon);
3758 cifs_put_smb_ses(ses);
3760 cifs_put_tcp_session(server);
3761 bdi_destroy(&cifs_sb->bdi);
3770 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3771 * pointer may be NULL.
3774 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3775 const char *tree, struct cifs_tcon *tcon,
3776 const struct nls_table *nls_codepage)
3778 struct smb_hdr *smb_buffer;
3779 struct smb_hdr *smb_buffer_response;
3782 unsigned char *bcc_ptr;
3785 __u16 bytes_left, count;
3790 smb_buffer = cifs_buf_get();
3791 if (smb_buffer == NULL)
3794 smb_buffer_response = smb_buffer;
3796 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3797 NULL /*no tid */ , 4 /*wct */ );
3799 smb_buffer->Mid = get_next_mid(ses->server);
3800 smb_buffer->Uid = ses->Suid;
3801 pSMB = (TCONX_REQ *) smb_buffer;
3802 pSMBr = (TCONX_RSP *) smb_buffer_response;
3804 pSMB->AndXCommand = 0xFF;
3805 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3806 bcc_ptr = &pSMB->Password[0];
3807 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3808 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3809 *bcc_ptr = 0; /* password is null byte */
3810 bcc_ptr++; /* skip password */
3811 /* already aligned so no need to do it below */
3813 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3814 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3815 specified as required (when that support is added to
3816 the vfs in the future) as only NTLM or the much
3817 weaker LANMAN (which we do not send by default) is accepted
3818 by Samba (not sure whether other servers allow
3819 NTLMv2 password here) */
3820 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3821 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3822 (ses->server->secType == LANMAN))
3823 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3824 ses->server->sec_mode &
3825 SECMODE_PW_ENCRYPT ? true : false,
3828 #endif /* CIFS_WEAK_PW_HASH */
3829 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3830 bcc_ptr, nls_codepage);
3832 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3833 if (ses->capabilities & CAP_UNICODE) {
3834 /* must align unicode strings */
3835 *bcc_ptr = 0; /* null byte password */
3840 if (ses->server->sec_mode &
3841 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3842 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3844 if (ses->capabilities & CAP_STATUS32) {
3845 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3847 if (ses->capabilities & CAP_DFS) {
3848 smb_buffer->Flags2 |= SMBFLG2_DFS;
3850 if (ses->capabilities & CAP_UNICODE) {
3851 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3853 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3854 6 /* max utf8 char length in bytes */ *
3855 (/* server len*/ + 256 /* share len */), nls_codepage);
3856 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3857 bcc_ptr += 2; /* skip trailing null */
3858 } else { /* ASCII */
3859 strcpy(bcc_ptr, tree);
3860 bcc_ptr += strlen(tree) + 1;
3862 strcpy(bcc_ptr, "?????");
3863 bcc_ptr += strlen("?????");
3865 count = bcc_ptr - &pSMB->Password[0];
3866 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3867 pSMB->hdr.smb_buf_length) + count);
3868 pSMB->ByteCount = cpu_to_le16(count);
3870 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3873 /* above now done in SendReceive */
3874 if ((rc == 0) && (tcon != NULL)) {
3877 tcon->tidStatus = CifsGood;
3878 tcon->need_reconnect = false;
3879 tcon->tid = smb_buffer_response->Tid;
3880 bcc_ptr = pByteArea(smb_buffer_response);
3881 bytes_left = get_bcc(smb_buffer_response);
3882 length = strnlen(bcc_ptr, bytes_left - 2);
3883 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3889 /* skip service field (NB: this field is always ASCII) */
3891 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3892 (bcc_ptr[2] == 'C')) {
3893 cFYI(1, "IPC connection");
3896 } else if (length == 2) {
3897 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3898 /* the most common case */
3899 cFYI(1, "disk share connection");
3902 bcc_ptr += length + 1;
3903 bytes_left -= (length + 1);
3904 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3906 /* mostly informational -- no need to fail on error here */
3907 kfree(tcon->nativeFileSystem);
3908 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3909 bytes_left, is_unicode,
3912 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3914 if ((smb_buffer_response->WordCount == 3) ||
3915 (smb_buffer_response->WordCount == 7))
3916 /* field is in same location */
3917 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3920 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3921 } else if ((rc == 0) && tcon == NULL) {
3922 /* all we need to save for IPC$ connection */
3923 ses->ipc_tid = smb_buffer_response->Tid;
3926 cifs_buf_release(smb_buffer);
3931 cifs_umount(struct cifs_sb_info *cifs_sb)
3933 struct rb_root *root = &cifs_sb->tlink_tree;
3934 struct rb_node *node;
3935 struct tcon_link *tlink;
3937 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3939 spin_lock(&cifs_sb->tlink_tree_lock);
3940 while ((node = rb_first(root))) {
3941 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3942 cifs_get_tlink(tlink);
3943 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3944 rb_erase(node, root);
3946 spin_unlock(&cifs_sb->tlink_tree_lock);
3947 cifs_put_tlink(tlink);
3948 spin_lock(&cifs_sb->tlink_tree_lock);
3950 spin_unlock(&cifs_sb->tlink_tree_lock);
3952 bdi_destroy(&cifs_sb->bdi);
3953 kfree(cifs_sb->mountdata);
3954 unload_nls(cifs_sb->local_nls);
3959 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3962 struct TCP_Server_Info *server = ses->server;
3964 if (!server->ops->need_neg || !server->ops->negotiate)
3967 /* only send once per connect */
3968 if (!server->ops->need_neg(server))
3971 set_credits(server, 1);
3973 rc = server->ops->negotiate(xid, ses);
3975 spin_lock(&GlobalMid_Lock);
3976 if (server->tcpStatus == CifsNeedNegotiate)
3977 server->tcpStatus = CifsGood;
3980 spin_unlock(&GlobalMid_Lock);
3987 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3988 struct nls_table *nls_info)
3991 struct TCP_Server_Info *server = ses->server;
3994 ses->capabilities = server->capabilities;
3995 if (linuxExtEnabled == 0)
3996 ses->capabilities &= (~server->vals->cap_unix);
3998 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3999 server->sec_mode, server->capabilities, server->timeAdj);
4001 if (server->ops->sess_setup)
4002 rc = server->ops->sess_setup(xid, ses, nls_info);
4005 cERROR(1, "Send error in SessSetup = %d", rc);
4007 mutex_lock(&ses->server->srv_mutex);
4008 if (!server->session_estab) {
4009 server->session_key.response = ses->auth_key.response;
4010 server->session_key.len = ses->auth_key.len;
4011 server->sequence_number = 0x2;
4012 server->session_estab = true;
4013 ses->auth_key.response = NULL;
4015 mutex_unlock(&server->srv_mutex);
4017 cFYI(1, "CIFS Session Established successfully");
4018 spin_lock(&GlobalMid_Lock);
4019 ses->status = CifsGood;
4020 ses->need_reconnect = false;
4021 spin_unlock(&GlobalMid_Lock);
4024 kfree(ses->auth_key.response);
4025 ses->auth_key.response = NULL;
4026 ses->auth_key.len = 0;
4027 kfree(ses->ntlmssp);
4028 ses->ntlmssp = NULL;
4034 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4036 switch (ses->server->secType) {
4038 vol->secFlg = CIFSSEC_MUST_KRB5;
4041 vol->secFlg = CIFSSEC_MUST_NTLMV2;
4044 vol->secFlg = CIFSSEC_MUST_NTLM;
4047 vol->secFlg = CIFSSEC_MUST_NTLMSSP;
4050 vol->secFlg = CIFSSEC_MUST_LANMAN;
4054 return cifs_set_cifscreds(vol, ses);
4057 static struct cifs_tcon *
4058 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
4061 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4062 struct cifs_ses *ses;
4063 struct cifs_tcon *tcon = NULL;
4064 struct smb_vol *vol_info;
4066 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4067 if (vol_info == NULL)
4068 return ERR_PTR(-ENOMEM);
4070 vol_info->local_nls = cifs_sb->local_nls;
4071 vol_info->linux_uid = fsuid;
4072 vol_info->cred_uid = fsuid;
4073 vol_info->UNC = master_tcon->treeName;
4074 vol_info->retry = master_tcon->retry;
4075 vol_info->nocase = master_tcon->nocase;
4076 vol_info->local_lease = master_tcon->local_lease;
4077 vol_info->no_linux_ext = !master_tcon->unix_ext;
4079 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4085 /* get a reference for the same TCP session */
4086 spin_lock(&cifs_tcp_ses_lock);
4087 ++master_tcon->ses->server->srv_count;
4088 spin_unlock(&cifs_tcp_ses_lock);
4090 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4092 tcon = (struct cifs_tcon *)ses;
4093 cifs_put_tcp_session(master_tcon->ses->server);
4097 tcon = cifs_get_tcon(ses, vol_info);
4099 cifs_put_smb_ses(ses);
4104 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4106 kfree(vol_info->username);
4107 kfree(vol_info->password);
4114 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4116 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4120 cifs_sb_tcon_pending_wait(void *unused)
4123 return signal_pending(current) ? -ERESTARTSYS : 0;
4126 /* find and return a tlink with given uid */
4127 static struct tcon_link *
4128 tlink_rb_search(struct rb_root *root, uid_t uid)
4130 struct rb_node *node = root->rb_node;
4131 struct tcon_link *tlink;
4134 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4136 if (tlink->tl_uid > uid)
4137 node = node->rb_left;
4138 else if (tlink->tl_uid < uid)
4139 node = node->rb_right;
4146 /* insert a tcon_link into the tree */
4148 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4150 struct rb_node **new = &(root->rb_node), *parent = NULL;
4151 struct tcon_link *tlink;
4154 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4157 if (tlink->tl_uid > new_tlink->tl_uid)
4158 new = &((*new)->rb_left);
4160 new = &((*new)->rb_right);
4163 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4164 rb_insert_color(&new_tlink->tl_rbnode, root);
4168 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4171 * If the superblock doesn't refer to a multiuser mount, then just return
4172 * the master tcon for the mount.
4174 * First, search the rbtree for an existing tcon for this fsuid. If one
4175 * exists, then check to see if it's pending construction. If it is then wait
4176 * for construction to complete. Once it's no longer pending, check to see if
4177 * it failed and either return an error or retry construction, depending on
4180 * If one doesn't exist then insert a new tcon_link struct into the tree and
4181 * try to construct a new one.
4184 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4187 uid_t fsuid = current_fsuid();
4188 struct tcon_link *tlink, *newtlink;
4190 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4191 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4193 spin_lock(&cifs_sb->tlink_tree_lock);
4194 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4196 cifs_get_tlink(tlink);
4197 spin_unlock(&cifs_sb->tlink_tree_lock);
4199 if (tlink == NULL) {
4200 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4201 if (newtlink == NULL)
4202 return ERR_PTR(-ENOMEM);
4203 newtlink->tl_uid = fsuid;
4204 newtlink->tl_tcon = ERR_PTR(-EACCES);
4205 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4206 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4207 cifs_get_tlink(newtlink);
4209 spin_lock(&cifs_sb->tlink_tree_lock);
4210 /* was one inserted after previous search? */
4211 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4213 cifs_get_tlink(tlink);
4214 spin_unlock(&cifs_sb->tlink_tree_lock);
4216 goto wait_for_construction;
4219 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4220 spin_unlock(&cifs_sb->tlink_tree_lock);
4222 wait_for_construction:
4223 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4224 cifs_sb_tcon_pending_wait,
4225 TASK_INTERRUPTIBLE);
4227 cifs_put_tlink(tlink);
4228 return ERR_PTR(ret);
4231 /* if it's good, return it */
4232 if (!IS_ERR(tlink->tl_tcon))
4235 /* return error if we tried this already recently */
4236 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4237 cifs_put_tlink(tlink);
4238 return ERR_PTR(-EACCES);
4241 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4242 goto wait_for_construction;
4245 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4246 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4247 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4249 if (IS_ERR(tlink->tl_tcon)) {
4250 cifs_put_tlink(tlink);
4251 return ERR_PTR(-EACCES);
4258 * periodic workqueue job that scans tcon_tree for a superblock and closes
4262 cifs_prune_tlinks(struct work_struct *work)
4264 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4266 struct rb_root *root = &cifs_sb->tlink_tree;
4267 struct rb_node *node = rb_first(root);
4268 struct rb_node *tmp;
4269 struct tcon_link *tlink;
4272 * Because we drop the spinlock in the loop in order to put the tlink
4273 * it's not guarded against removal of links from the tree. The only
4274 * places that remove entries from the tree are this function and
4275 * umounts. Because this function is non-reentrant and is canceled
4276 * before umount can proceed, this is safe.
4278 spin_lock(&cifs_sb->tlink_tree_lock);
4279 node = rb_first(root);
4280 while (node != NULL) {
4282 node = rb_next(tmp);
4283 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4285 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4286 atomic_read(&tlink->tl_count) != 0 ||
4287 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4290 cifs_get_tlink(tlink);
4291 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4292 rb_erase(tmp, root);
4294 spin_unlock(&cifs_sb->tlink_tree_lock);
4295 cifs_put_tlink(tlink);
4296 spin_lock(&cifs_sb->tlink_tree_lock);
4298 spin_unlock(&cifs_sb->tlink_tree_lock);
4300 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,