4 * Copyright (C) International Business Machines Corp., 2002,2009
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 /* SMB echo "timeout" -- FIXME: tunable? */
60 #define SMB_ECHO_INTERVAL (60 * HZ)
62 extern mempool_t *cifs_req_poolp;
64 /* FIXME: should these be tunable? */
65 #define TLINK_ERROR_EXPIRE (1 * HZ)
66 #define TLINK_IDLE_EXPIRE (600 * HZ)
70 /* Mount options that take no arguments */
71 Opt_user_xattr, Opt_nouser_xattr,
72 Opt_forceuid, Opt_noforceuid,
73 Opt_noblocksend, Opt_noautotune,
74 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
75 Opt_mapchars, Opt_nomapchars, Opt_sfu,
76 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
77 Opt_noposixpaths, Opt_nounix,
80 Opt_forcemandatorylock, Opt_setuids,
81 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
82 Opt_nohard, Opt_nosoft,
84 Opt_nostrictsync, Opt_strictsync,
85 Opt_serverino, Opt_noserverino,
86 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
87 Opt_acl, Opt_noacl, Opt_locallease,
88 Opt_sign, Opt_seal, Opt_direct,
89 Opt_strictcache, Opt_noac,
90 Opt_fsc, Opt_mfsymlinks,
91 Opt_multiuser, Opt_sloppy,
93 /* Mount options which take numeric value */
94 Opt_backupuid, Opt_backupgid, Opt_uid,
95 Opt_cruid, Opt_gid, Opt_file_mode,
96 Opt_dirmode, Opt_port,
97 Opt_rsize, Opt_wsize, Opt_actimeo,
99 /* Mount options which take string value */
100 Opt_user, Opt_pass, Opt_ip,
102 Opt_srcaddr, Opt_prefixpath,
103 Opt_iocharset, Opt_sockopt,
104 Opt_netbiosname, Opt_servern,
107 /* Mount options to be ignored */
110 /* Options which could be blank */
118 static const match_table_t cifs_mount_option_tokens = {
120 { Opt_user_xattr, "user_xattr" },
121 { Opt_nouser_xattr, "nouser_xattr" },
122 { Opt_forceuid, "forceuid" },
123 { Opt_noforceuid, "noforceuid" },
124 { Opt_noblocksend, "noblocksend" },
125 { Opt_noautotune, "noautotune" },
126 { Opt_hard, "hard" },
127 { Opt_soft, "soft" },
128 { Opt_perm, "perm" },
129 { Opt_noperm, "noperm" },
130 { Opt_mapchars, "mapchars" },
131 { Opt_nomapchars, "nomapchars" },
133 { Opt_nosfu, "nosfu" },
134 { Opt_nodfs, "nodfs" },
135 { Opt_posixpaths, "posixpaths" },
136 { Opt_noposixpaths, "noposixpaths" },
137 { Opt_nounix, "nounix" },
138 { Opt_nounix, "nolinux" },
139 { Opt_nocase, "nocase" },
140 { Opt_nocase, "ignorecase" },
142 { Opt_nobrl, "nobrl" },
143 { Opt_nobrl, "nolock" },
144 { Opt_forcemandatorylock, "forcemandatorylock" },
145 { Opt_forcemandatorylock, "forcemand" },
146 { Opt_setuids, "setuids" },
147 { Opt_nosetuids, "nosetuids" },
148 { Opt_dynperm, "dynperm" },
149 { Opt_nodynperm, "nodynperm" },
150 { Opt_nohard, "nohard" },
151 { Opt_nosoft, "nosoft" },
152 { Opt_nointr, "nointr" },
153 { Opt_intr, "intr" },
154 { Opt_nostrictsync, "nostrictsync" },
155 { Opt_strictsync, "strictsync" },
156 { Opt_serverino, "serverino" },
157 { Opt_noserverino, "noserverino" },
158 { Opt_rwpidforward, "rwpidforward" },
159 { Opt_cifsacl, "cifsacl" },
160 { Opt_nocifsacl, "nocifsacl" },
162 { Opt_noacl, "noacl" },
163 { Opt_locallease, "locallease" },
164 { Opt_sign, "sign" },
165 { Opt_seal, "seal" },
166 { Opt_direct, "direct" },
167 { Opt_direct, "forceddirectio" },
168 { Opt_strictcache, "strictcache" },
169 { Opt_noac, "noac" },
171 { Opt_mfsymlinks, "mfsymlinks" },
172 { Opt_multiuser, "multiuser" },
173 { Opt_sloppy, "sloppy" },
175 { Opt_backupuid, "backupuid=%s" },
176 { Opt_backupgid, "backupgid=%s" },
177 { Opt_uid, "uid=%s" },
178 { Opt_cruid, "cruid=%s" },
179 { Opt_gid, "gid=%s" },
180 { Opt_file_mode, "file_mode=%s" },
181 { Opt_dirmode, "dirmode=%s" },
182 { Opt_dirmode, "dir_mode=%s" },
183 { Opt_port, "port=%s" },
184 { Opt_rsize, "rsize=%s" },
185 { Opt_wsize, "wsize=%s" },
186 { Opt_actimeo, "actimeo=%s" },
188 { Opt_blank_user, "user=" },
189 { Opt_blank_user, "username=" },
190 { Opt_user, "user=%s" },
191 { Opt_user, "username=%s" },
192 { Opt_blank_pass, "pass=" },
193 { Opt_pass, "pass=%s" },
194 { Opt_pass, "password=%s" },
195 { Opt_blank_ip, "ip=" },
196 { Opt_blank_ip, "addr=" },
198 { Opt_ip, "addr=%s" },
199 { Opt_unc, "unc=%s" },
200 { Opt_unc, "target=%s" },
201 { Opt_unc, "path=%s" },
202 { Opt_domain, "dom=%s" },
203 { Opt_domain, "domain=%s" },
204 { Opt_domain, "workgroup=%s" },
205 { Opt_srcaddr, "srcaddr=%s" },
206 { Opt_prefixpath, "prefixpath=%s" },
207 { Opt_iocharset, "iocharset=%s" },
208 { Opt_sockopt, "sockopt=%s" },
209 { Opt_netbiosname, "netbiosname=%s" },
210 { Opt_servern, "servern=%s" },
211 { Opt_ver, "ver=%s" },
212 { Opt_ver, "vers=%s" },
213 { Opt_ver, "version=%s" },
214 { Opt_sec, "sec=%s" },
216 { Opt_ignore, "cred" },
217 { Opt_ignore, "credentials" },
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_ntlmv2i,
239 Opt_sec_nontlm, 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_ntlmv2i, "ntlmv2i" },
254 { Opt_sec_nontlm, "nontlm" },
255 { Opt_sec_lanman, "lanman" },
256 { Opt_sec_none, "none" },
258 { Opt_sec_err, NULL }
261 static int ip_connect(struct TCP_Server_Info *server);
262 static int generic_ip_connect(struct TCP_Server_Info *server);
263 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
264 static void cifs_prune_tlinks(struct work_struct *work);
265 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
266 const char *devname);
269 * cifs tcp session reconnection
271 * mark tcp session as reconnecting so temporarily locked
272 * mark all smb sessions as reconnecting for tcp session
273 * reconnect tcp session
274 * wake up waiters on reconnection? - (not needed currently)
277 cifs_reconnect(struct TCP_Server_Info *server)
280 struct list_head *tmp, *tmp2;
281 struct cifs_ses *ses;
282 struct cifs_tcon *tcon;
283 struct mid_q_entry *mid_entry;
284 struct list_head retry_list;
286 spin_lock(&GlobalMid_Lock);
287 if (server->tcpStatus == CifsExiting) {
288 /* the demux thread will exit normally
289 next time through the loop */
290 spin_unlock(&GlobalMid_Lock);
293 server->tcpStatus = CifsNeedReconnect;
294 spin_unlock(&GlobalMid_Lock);
297 cFYI(1, "Reconnecting tcp session");
299 /* before reconnecting the tcp session, mark the smb session (uid)
300 and the tid bad so they are not used until reconnected */
301 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
302 spin_lock(&cifs_tcp_ses_lock);
303 list_for_each(tmp, &server->smb_ses_list) {
304 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
305 ses->need_reconnect = true;
307 list_for_each(tmp2, &ses->tcon_list) {
308 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
309 tcon->need_reconnect = true;
312 spin_unlock(&cifs_tcp_ses_lock);
314 /* do not want to be sending data on a socket we are freeing */
315 cFYI(1, "%s: tearing down socket", __func__);
316 mutex_lock(&server->srv_mutex);
317 if (server->ssocket) {
318 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
319 server->ssocket->flags);
320 kernel_sock_shutdown(server->ssocket, SHUT_WR);
321 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
322 server->ssocket->state,
323 server->ssocket->flags);
324 sock_release(server->ssocket);
325 server->ssocket = NULL;
327 server->sequence_number = 0;
328 server->session_estab = false;
329 kfree(server->session_key.response);
330 server->session_key.response = NULL;
331 server->session_key.len = 0;
332 server->lstrp = jiffies;
333 mutex_unlock(&server->srv_mutex);
335 /* mark submitted MIDs for retry and issue callback */
336 INIT_LIST_HEAD(&retry_list);
337 cFYI(1, "%s: moving mids to private list", __func__);
338 spin_lock(&GlobalMid_Lock);
339 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
340 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
341 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
342 mid_entry->mid_state = MID_RETRY_NEEDED;
343 list_move(&mid_entry->qhead, &retry_list);
345 spin_unlock(&GlobalMid_Lock);
347 cFYI(1, "%s: issuing mid callbacks", __func__);
348 list_for_each_safe(tmp, tmp2, &retry_list) {
349 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
350 list_del_init(&mid_entry->qhead);
351 mid_entry->callback(mid_entry);
357 /* we should try only the port we connected to before */
358 rc = generic_ip_connect(server);
360 cFYI(1, "reconnect error %d", rc);
363 atomic_inc(&tcpSesReconnectCount);
364 spin_lock(&GlobalMid_Lock);
365 if (server->tcpStatus != CifsExiting)
366 server->tcpStatus = CifsNeedNegotiate;
367 spin_unlock(&GlobalMid_Lock);
369 } while (server->tcpStatus == CifsNeedReconnect);
376 0 not a transact2, or all data present
377 >0 transact2 with that much data missing
378 -EINVAL = invalid transact2
381 static int check2ndT2(char *buf)
383 struct smb_hdr *pSMB = (struct smb_hdr *)buf;
384 struct smb_t2_rsp *pSMBt;
386 __u16 total_data_size, data_in_this_rsp;
388 if (pSMB->Command != SMB_COM_TRANSACTION2)
391 /* check for plausible wct, bcc and t2 data and parm sizes */
392 /* check for parm and data offset going beyond end of smb */
393 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
394 cFYI(1, "invalid transact2 word count");
398 pSMBt = (struct smb_t2_rsp *)pSMB;
400 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
401 data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
403 if (total_data_size == data_in_this_rsp)
405 else if (total_data_size < data_in_this_rsp) {
406 cFYI(1, "total data %d smaller than data in frame %d",
407 total_data_size, data_in_this_rsp);
411 remaining = total_data_size - data_in_this_rsp;
413 cFYI(1, "missing %d bytes from transact2, check next response",
415 if (total_data_size > CIFSMaxBufSize) {
416 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
417 total_data_size, CIFSMaxBufSize);
423 static int coalesce_t2(char *second_buf, struct smb_hdr *target_hdr)
425 struct smb_t2_rsp *pSMBs = (struct smb_t2_rsp *)second_buf;
426 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)target_hdr;
427 char *data_area_of_tgt;
428 char *data_area_of_src;
430 unsigned int byte_count, total_in_tgt;
431 __u16 tgt_total_cnt, src_total_cnt, total_in_src;
433 src_total_cnt = get_unaligned_le16(&pSMBs->t2_rsp.TotalDataCount);
434 tgt_total_cnt = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
436 if (tgt_total_cnt != src_total_cnt)
437 cFYI(1, "total data count of primary and secondary t2 differ "
438 "source=%hu target=%hu", src_total_cnt, tgt_total_cnt);
440 total_in_tgt = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
442 remaining = tgt_total_cnt - total_in_tgt;
445 cFYI(1, "Server sent too much data. tgt_total_cnt=%hu "
446 "total_in_tgt=%hu", tgt_total_cnt, total_in_tgt);
450 if (remaining == 0) {
451 /* nothing to do, ignore */
452 cFYI(1, "no more data remains");
456 total_in_src = get_unaligned_le16(&pSMBs->t2_rsp.DataCount);
457 if (remaining < total_in_src)
458 cFYI(1, "transact2 2nd response contains too much data");
460 /* find end of first SMB data area */
461 data_area_of_tgt = (char *)&pSMBt->hdr.Protocol +
462 get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
464 /* validate target area */
465 data_area_of_src = (char *)&pSMBs->hdr.Protocol +
466 get_unaligned_le16(&pSMBs->t2_rsp.DataOffset);
468 data_area_of_tgt += total_in_tgt;
470 total_in_tgt += total_in_src;
471 /* is the result too big for the field? */
472 if (total_in_tgt > USHRT_MAX) {
473 cFYI(1, "coalesced DataCount too large (%u)", total_in_tgt);
476 put_unaligned_le16(total_in_tgt, &pSMBt->t2_rsp.DataCount);
479 byte_count = get_bcc(target_hdr);
480 byte_count += total_in_src;
481 /* is the result too big for the field? */
482 if (byte_count > USHRT_MAX) {
483 cFYI(1, "coalesced BCC too large (%u)", byte_count);
486 put_bcc(byte_count, target_hdr);
488 byte_count = be32_to_cpu(target_hdr->smb_buf_length);
489 byte_count += total_in_src;
490 /* don't allow buffer to overflow */
491 if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
492 cFYI(1, "coalesced BCC exceeds buffer size (%u)", byte_count);
495 target_hdr->smb_buf_length = cpu_to_be32(byte_count);
497 /* copy second buffer into end of first buffer */
498 memcpy(data_area_of_tgt, data_area_of_src, total_in_src);
500 if (remaining != total_in_src) {
501 /* more responses to go */
502 cFYI(1, "waiting for more secondary responses");
507 cFYI(1, "found the last secondary response");
512 cifs_echo_request(struct work_struct *work)
515 struct TCP_Server_Info *server = container_of(work,
516 struct TCP_Server_Info, echo.work);
519 * We cannot send an echo until the NEGOTIATE_PROTOCOL request is
520 * done, which is indicated by maxBuf != 0. Also, no need to ping if
521 * we got a response recently
523 if (server->maxBuf == 0 ||
524 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
527 rc = CIFSSMBEcho(server);
529 cFYI(1, "Unable to send echo request to server: %s",
533 queue_delayed_work(cifsiod_wq, &server->echo, SMB_ECHO_INTERVAL);
537 allocate_buffers(struct TCP_Server_Info *server)
539 if (!server->bigbuf) {
540 server->bigbuf = (char *)cifs_buf_get();
541 if (!server->bigbuf) {
542 cERROR(1, "No memory for large SMB response");
544 /* retry will check if exiting */
547 } else if (server->large_buf) {
548 /* we are reusing a dirty large buf, clear its start */
549 memset(server->bigbuf, 0, header_size());
552 if (!server->smallbuf) {
553 server->smallbuf = (char *)cifs_small_buf_get();
554 if (!server->smallbuf) {
555 cERROR(1, "No memory for SMB response");
557 /* retry will check if exiting */
560 /* beginning of smb buffer is cleared in our buf_get */
562 /* if existing small buf clear beginning */
563 memset(server->smallbuf, 0, header_size());
570 server_unresponsive(struct TCP_Server_Info *server)
573 * We need to wait 2 echo intervals to make sure we handle such
575 * 1s client sends a normal SMB request
576 * 2s client gets a response
577 * 30s echo workqueue job pops, and decides we got a response recently
578 * and don't need to send another
580 * 65s kernel_recvmsg times out, and we see that we haven't gotten
581 * a response in >60s.
583 if (server->tcpStatus == CifsGood &&
584 time_after(jiffies, server->lstrp + 2 * SMB_ECHO_INTERVAL)) {
585 cERROR(1, "Server %s has not responded in %d seconds. "
586 "Reconnecting...", server->hostname,
587 (2 * SMB_ECHO_INTERVAL) / HZ);
588 cifs_reconnect(server);
589 wake_up(&server->response_q);
597 * kvec_array_init - clone a kvec array, and advance into it
598 * @new: pointer to memory for cloned array
599 * @iov: pointer to original array
600 * @nr_segs: number of members in original array
601 * @bytes: number of bytes to advance into the cloned array
603 * This function will copy the array provided in iov to a section of memory
604 * and advance the specified number of bytes into the new array. It returns
605 * the number of segments in the new array. "new" must be at least as big as
606 * the original iov array.
609 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
614 while (bytes || !iov->iov_len) {
615 int copy = min(bytes, iov->iov_len);
619 if (iov->iov_len == base) {
625 memcpy(new, iov, sizeof(*iov) * nr_segs);
626 new->iov_base += base;
627 new->iov_len -= base;
632 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
634 struct kvec *new_iov;
636 if (server->iov && nr_segs <= server->nr_iov)
639 /* not big enough -- allocate a new one and release the old */
640 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
643 server->iov = new_iov;
644 server->nr_iov = nr_segs;
650 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
651 unsigned int nr_segs, unsigned int to_read)
656 struct msghdr smb_msg;
659 iov = get_server_iovec(server, nr_segs);
663 smb_msg.msg_control = NULL;
664 smb_msg.msg_controllen = 0;
666 for (total_read = 0; to_read; total_read += length, to_read -= length) {
669 if (server_unresponsive(server)) {
670 total_read = -EAGAIN;
674 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
676 length = kernel_recvmsg(server->ssocket, &smb_msg,
677 iov, segs, to_read, 0);
679 if (server->tcpStatus == CifsExiting) {
680 total_read = -ESHUTDOWN;
682 } else if (server->tcpStatus == CifsNeedReconnect) {
683 cifs_reconnect(server);
684 total_read = -EAGAIN;
686 } else if (length == -ERESTARTSYS ||
690 * Minimum sleep to prevent looping, allowing socket
691 * to clear and app threads to set tcpStatus
692 * CifsNeedReconnect if server hung.
694 usleep_range(1000, 2000);
697 } else if (length <= 0) {
698 cFYI(1, "Received no data or error: expecting %d "
699 "got %d", to_read, length);
700 cifs_reconnect(server);
701 total_read = -EAGAIN;
709 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
710 unsigned int to_read)
715 iov.iov_len = to_read;
717 return cifs_readv_from_socket(server, &iov, 1, to_read);
721 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
724 * The first byte big endian of the length field,
725 * is actually not part of the length but the type
726 * with the most common, zero, as regular data.
729 case RFC1002_SESSION_MESSAGE:
730 /* Regular SMB response */
732 case RFC1002_SESSION_KEEP_ALIVE:
733 cFYI(1, "RFC 1002 session keep alive");
735 case RFC1002_POSITIVE_SESSION_RESPONSE:
736 cFYI(1, "RFC 1002 positive session response");
738 case RFC1002_NEGATIVE_SESSION_RESPONSE:
740 * We get this from Windows 98 instead of an error on
741 * SMB negprot response.
743 cFYI(1, "RFC 1002 negative session response");
744 /* give server a second to clean up */
747 * Always try 445 first on reconnect since we get NACK
748 * on some if we ever connected to port 139 (the NACK
749 * is since we do not begin with RFC1001 session
752 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
753 cifs_reconnect(server);
754 wake_up(&server->response_q);
757 cERROR(1, "RFC 1002 unknown response type 0x%x", type);
758 cifs_reconnect(server);
764 static struct mid_q_entry *
765 find_mid(struct TCP_Server_Info *server, char *buffer)
767 struct smb_hdr *buf = (struct smb_hdr *)buffer;
768 struct mid_q_entry *mid;
770 spin_lock(&GlobalMid_Lock);
771 list_for_each_entry(mid, &server->pending_mid_q, qhead) {
772 if (mid->mid == buf->Mid &&
773 mid->mid_state == MID_REQUEST_SUBMITTED &&
774 le16_to_cpu(mid->command) == buf->Command) {
775 spin_unlock(&GlobalMid_Lock);
779 spin_unlock(&GlobalMid_Lock);
784 dequeue_mid(struct mid_q_entry *mid, bool malformed)
786 #ifdef CONFIG_CIFS_STATS2
787 mid->when_received = jiffies;
789 spin_lock(&GlobalMid_Lock);
791 mid->mid_state = MID_RESPONSE_RECEIVED;
793 mid->mid_state = MID_RESPONSE_MALFORMED;
794 list_del_init(&mid->qhead);
795 spin_unlock(&GlobalMid_Lock);
799 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
800 char *buf, int malformed)
802 if (malformed == 0 && check2ndT2(buf) > 0) {
803 mid->multiRsp = true;
805 /* merge response - fix up 1st*/
806 malformed = coalesce_t2(buf, mid->resp_buf);
810 /* All parts received or packet is malformed. */
811 mid->multiEnd = true;
812 return dequeue_mid(mid, malformed);
814 if (!server->large_buf) {
815 /*FIXME: switch to already allocated largebuf?*/
816 cERROR(1, "1st trans2 resp needs bigbuf");
818 /* Have first buffer */
820 mid->large_buf = true;
821 server->bigbuf = NULL;
826 mid->large_buf = server->large_buf;
827 /* Was previous buf put in mpx struct for multi-rsp? */
828 if (!mid->multiRsp) {
829 /* smb buffer will be freed by user thread */
830 if (server->large_buf)
831 server->bigbuf = NULL;
833 server->smallbuf = NULL;
835 dequeue_mid(mid, malformed);
838 static void clean_demultiplex_info(struct TCP_Server_Info *server)
842 /* take it off the list, if it's not already */
843 spin_lock(&cifs_tcp_ses_lock);
844 list_del_init(&server->tcp_ses_list);
845 spin_unlock(&cifs_tcp_ses_lock);
847 spin_lock(&GlobalMid_Lock);
848 server->tcpStatus = CifsExiting;
849 spin_unlock(&GlobalMid_Lock);
850 wake_up_all(&server->response_q);
852 /* check if we have blocked requests that need to free */
853 spin_lock(&server->req_lock);
854 if (server->credits <= 0)
856 spin_unlock(&server->req_lock);
858 * Although there should not be any requests blocked on this queue it
859 * can not hurt to be paranoid and try to wake up requests that may
860 * haven been blocked when more than 50 at time were on the wire to the
861 * same server - they now will see the session is in exit state and get
862 * out of SendReceive.
864 wake_up_all(&server->request_q);
865 /* give those requests time to exit */
868 if (server->ssocket) {
869 sock_release(server->ssocket);
870 server->ssocket = NULL;
873 if (!list_empty(&server->pending_mid_q)) {
874 struct list_head dispose_list;
875 struct mid_q_entry *mid_entry;
876 struct list_head *tmp, *tmp2;
878 INIT_LIST_HEAD(&dispose_list);
879 spin_lock(&GlobalMid_Lock);
880 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
881 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
882 cFYI(1, "Clearing mid 0x%llx", mid_entry->mid);
883 mid_entry->mid_state = MID_SHUTDOWN;
884 list_move(&mid_entry->qhead, &dispose_list);
886 spin_unlock(&GlobalMid_Lock);
888 /* now walk dispose list and issue callbacks */
889 list_for_each_safe(tmp, tmp2, &dispose_list) {
890 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
891 cFYI(1, "Callback mid 0x%llx", mid_entry->mid);
892 list_del_init(&mid_entry->qhead);
893 mid_entry->callback(mid_entry);
895 /* 1/8th of sec is more than enough time for them to exit */
899 if (!list_empty(&server->pending_mid_q)) {
901 * mpx threads have not exited yet give them at least the smb
902 * send timeout time for long ops.
904 * Due to delays on oplock break requests, we need to wait at
905 * least 45 seconds before giving up on a request getting a
906 * response and going ahead and killing cifsd.
908 cFYI(1, "Wait for exit from demultiplex thread");
911 * If threads still have not exited they are probably never
912 * coming home not much else we can do but free the memory.
916 kfree(server->hostname);
920 length = atomic_dec_return(&tcpSesAllocCount);
922 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
927 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
930 char *buf = server->smallbuf;
931 unsigned int pdu_length = get_rfc1002_length(buf);
933 /* make sure this will fit in a large buffer */
934 if (pdu_length > CIFSMaxBufSize + max_header_size() - 4) {
935 cERROR(1, "SMB response too long (%u bytes)",
937 cifs_reconnect(server);
938 wake_up(&server->response_q);
942 /* switch to large buffer if too big for a small one */
943 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
944 server->large_buf = true;
945 memcpy(server->bigbuf, buf, server->total_read);
946 buf = server->bigbuf;
949 /* now read the rest */
950 length = cifs_read_from_socket(server, buf + header_size() - 1,
951 pdu_length - header_size() + 1 + 4);
954 server->total_read += length;
956 dump_smb(buf, server->total_read);
959 * We know that we received enough to get to the MID as we
960 * checked the pdu_length earlier. Now check to see
961 * if the rest of the header is OK. We borrow the length
962 * var for the rest of the loop to avoid a new stack var.
964 * 48 bytes is enough to display the header and a little bit
965 * into the payload for debugging purposes.
967 length = checkSMB(buf, server->total_read);
969 cifs_dump_mem("Bad SMB: ", buf,
970 min_t(unsigned int, server->total_read, 48));
975 handle_mid(mid, server, buf, length);
980 cifs_demultiplex_thread(void *p)
983 struct TCP_Server_Info *server = p;
984 unsigned int pdu_length;
986 struct task_struct *task_to_wake = NULL;
987 struct mid_q_entry *mid_entry;
989 current->flags |= PF_MEMALLOC;
990 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
992 length = atomic_inc_return(&tcpSesAllocCount);
994 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
998 while (server->tcpStatus != CifsExiting) {
1002 if (!allocate_buffers(server))
1005 server->large_buf = false;
1006 buf = server->smallbuf;
1007 pdu_length = 4; /* enough to get RFC1001 header */
1009 length = cifs_read_from_socket(server, buf, pdu_length);
1012 server->total_read = length;
1015 * The right amount was read from socket - 4 bytes,
1016 * so we can now interpret the length field.
1018 pdu_length = get_rfc1002_length(buf);
1020 cFYI(1, "RFC1002 header 0x%x", pdu_length);
1021 if (!is_smb_response(server, buf[0]))
1024 /* make sure we have enough to get to the MID */
1025 if (pdu_length < header_size() - 1 - 4) {
1026 cERROR(1, "SMB response too short (%u bytes)",
1028 cifs_reconnect(server);
1029 wake_up(&server->response_q);
1033 /* read down to the MID */
1034 length = cifs_read_from_socket(server, buf + 4,
1035 header_size() - 1 - 4);
1038 server->total_read += length;
1040 mid_entry = find_mid(server, buf);
1042 if (!mid_entry || !mid_entry->receive)
1043 length = standard_receive3(server, mid_entry);
1045 length = mid_entry->receive(server, mid_entry);
1050 if (server->large_buf)
1051 buf = server->bigbuf;
1053 server->lstrp = jiffies;
1054 if (mid_entry != NULL) {
1055 if (!mid_entry->multiRsp || mid_entry->multiEnd)
1056 mid_entry->callback(mid_entry);
1057 } else if (!is_valid_oplock_break(buf, server)) {
1058 cERROR(1, "No task to wake, unknown frame received! "
1059 "NumMids %d", atomic_read(&midCount));
1060 cifs_dump_mem("Received Data is: ", buf, header_size());
1061 #ifdef CONFIG_CIFS_DEBUG2
1062 cifs_dump_detail(buf);
1063 cifs_dump_mids(server);
1064 #endif /* CIFS_DEBUG2 */
1067 } /* end while !EXITING */
1069 /* buffer usually freed in free_mid - need to free it here on exit */
1070 cifs_buf_release(server->bigbuf);
1071 if (server->smallbuf) /* no sense logging a debug message if NULL */
1072 cifs_small_buf_release(server->smallbuf);
1074 task_to_wake = xchg(&server->tsk, NULL);
1075 clean_demultiplex_info(server);
1077 /* if server->tsk was NULL then wait for a signal before exiting */
1078 if (!task_to_wake) {
1079 set_current_state(TASK_INTERRUPTIBLE);
1080 while (!signal_pending(current)) {
1082 set_current_state(TASK_INTERRUPTIBLE);
1084 set_current_state(TASK_RUNNING);
1087 module_put_and_exit(0);
1090 /* extract the host portion of the UNC string */
1092 extract_hostname(const char *unc)
1098 /* skip double chars at beginning of string */
1099 /* BB: check validity of these bytes? */
1102 /* delimiter between hostname and sharename is always '\\' now */
1103 delim = strchr(src, '\\');
1105 return ERR_PTR(-EINVAL);
1108 dst = kmalloc((len + 1), GFP_KERNEL);
1110 return ERR_PTR(-ENOMEM);
1112 memcpy(dst, src, len);
1118 static int get_option_ul(substring_t args[], unsigned long *option)
1123 string = match_strdup(args);
1126 rc = kstrtoul(string, 0, option);
1133 static int cifs_parse_security_flavors(char *value,
1134 struct smb_vol *vol)
1137 substring_t args[MAX_OPT_ARGS];
1139 switch (match_token(value, cifs_secflavor_tokens, args)) {
1141 vol->secFlg |= CIFSSEC_MAY_KRB5;
1144 vol->secFlg |= CIFSSEC_MAY_KRB5 | CIFSSEC_MUST_SIGN;
1147 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1148 cERROR(1, "Krb5 cifs privacy not supported");
1150 case Opt_sec_ntlmssp:
1151 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1153 case Opt_sec_ntlmsspi:
1154 vol->secFlg |= CIFSSEC_MAY_NTLMSSP | CIFSSEC_MUST_SIGN;
1157 /* ntlm is default so can be turned off too */
1158 vol->secFlg |= CIFSSEC_MAY_NTLM;
1161 vol->secFlg |= CIFSSEC_MAY_NTLM | CIFSSEC_MUST_SIGN;
1163 case Opt_sec_nontlm:
1164 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1166 case Opt_sec_ntlmv2i:
1167 vol->secFlg |= CIFSSEC_MAY_NTLMV2 | CIFSSEC_MUST_SIGN;
1169 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1170 case Opt_sec_lanman:
1171 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1178 cERROR(1, "bad security option: %s", value);
1186 cifs_parse_mount_options(const char *mountdata, const char *devname,
1187 struct smb_vol *vol)
1190 char *mountdata_copy = NULL, *options;
1191 unsigned int temp_len, i, j;
1193 short int override_uid = -1;
1194 short int override_gid = -1;
1195 bool uid_specified = false;
1196 bool gid_specified = false;
1197 bool sloppy = false;
1198 char *invalid = NULL;
1199 char *nodename = utsname()->nodename;
1200 char *string = NULL;
1201 char *tmp_end, *value;
1206 delim = separator[0];
1209 * does not have to be perfect mapping since field is
1210 * informational, only used for servers that do not support
1211 * port 445 and it can be overridden at mount time
1213 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1214 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1215 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1217 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1218 /* null target name indicates to use *SMBSERVR default called name
1219 if we end up sending RFC1001 session initialize */
1220 vol->target_rfc1001_name[0] = 0;
1221 vol->cred_uid = current_uid();
1222 vol->linux_uid = current_uid();
1223 vol->linux_gid = current_gid();
1225 /* default to only allowing write access to owner of the mount */
1226 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1228 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1229 /* default is always to request posix paths. */
1230 vol->posix_paths = 1;
1231 /* default to using server inode numbers where available */
1232 vol->server_ino = 1;
1234 vol->actimeo = CIFS_DEF_ACTIMEO;
1237 goto cifs_parse_mount_err;
1239 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1240 if (!mountdata_copy)
1241 goto cifs_parse_mount_err;
1243 options = mountdata_copy;
1244 end = options + strlen(options);
1246 if (strncmp(options, "sep=", 4) == 0) {
1247 if (options[4] != 0) {
1248 separator[0] = options[4];
1251 cFYI(1, "Null separator not allowed");
1254 vol->backupuid_specified = false; /* no backup intent for a user */
1255 vol->backupgid_specified = false; /* no backup intent for a group */
1257 while ((data = strsep(&options, separator)) != NULL) {
1258 substring_t args[MAX_OPT_ARGS];
1259 unsigned long option;
1265 token = match_token(data, cifs_mount_option_tokens, args);
1269 /* Ingnore the following */
1273 /* Boolean values */
1274 case Opt_user_xattr:
1277 case Opt_nouser_xattr:
1283 case Opt_noforceuid:
1286 case Opt_noblocksend:
1287 vol->noblocksnd = 1;
1289 case Opt_noautotune:
1290 vol->noautotune = 1;
1307 case Opt_nomapchars:
1319 case Opt_posixpaths:
1320 vol->posix_paths = 1;
1322 case Opt_noposixpaths:
1323 vol->posix_paths = 0;
1326 vol->no_linux_ext = 1;
1337 * turn off mandatory locking in mode
1338 * if remote locking is turned off since the
1339 * local vfs will do advisory
1341 if (vol->file_mode ==
1342 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1343 vol->file_mode = S_IALLUGO;
1345 case Opt_forcemandatorylock:
1355 vol->dynperm = true;
1358 vol->dynperm = false;
1372 case Opt_nostrictsync:
1373 vol->nostrictsync = 1;
1375 case Opt_strictsync:
1376 vol->nostrictsync = 0;
1379 vol->server_ino = 1;
1381 case Opt_noserverino:
1382 vol->server_ino = 0;
1384 case Opt_rwpidforward:
1385 vol->rwpidforward = 1;
1394 vol->no_psx_acl = 0;
1397 vol->no_psx_acl = 1;
1399 case Opt_locallease:
1400 vol->local_lease = 1;
1403 vol->secFlg |= CIFSSEC_MUST_SIGN;
1406 /* we do not do the following in secFlags because seal
1407 * is a per tree connection (mount) not a per socket
1408 * or per-smb connection option in the protocol
1409 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1416 case Opt_strictcache:
1420 printk(KERN_WARNING "CIFS: Mount option noac not "
1421 "supported. Instead set "
1422 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1425 #ifndef CONFIG_CIFS_FSCACHE
1426 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1427 "kernel config option set");
1428 goto cifs_parse_mount_err;
1432 case Opt_mfsymlinks:
1433 vol->mfsymlinks = true;
1436 vol->multiuser = true;
1442 /* Numeric Values */
1444 if (get_option_ul(args, &option)) {
1445 cERROR(1, "%s: Invalid backupuid value",
1447 goto cifs_parse_mount_err;
1449 vol->backupuid = option;
1450 vol->backupuid_specified = true;
1453 if (get_option_ul(args, &option)) {
1454 cERROR(1, "%s: Invalid backupgid value",
1456 goto cifs_parse_mount_err;
1458 vol->backupgid = option;
1459 vol->backupgid_specified = true;
1462 if (get_option_ul(args, &option)) {
1463 cERROR(1, "%s: Invalid uid value",
1465 goto cifs_parse_mount_err;
1467 vol->linux_uid = option;
1468 uid_specified = true;
1471 if (get_option_ul(args, &option)) {
1472 cERROR(1, "%s: Invalid cruid value",
1474 goto cifs_parse_mount_err;
1476 vol->cred_uid = option;
1479 if (get_option_ul(args, &option)) {
1480 cERROR(1, "%s: Invalid gid value",
1482 goto cifs_parse_mount_err;
1484 vol->linux_gid = option;
1485 gid_specified = true;
1488 if (get_option_ul(args, &option)) {
1489 cERROR(1, "%s: Invalid file_mode value",
1491 goto cifs_parse_mount_err;
1493 vol->file_mode = option;
1496 if (get_option_ul(args, &option)) {
1497 cERROR(1, "%s: Invalid dir_mode value",
1499 goto cifs_parse_mount_err;
1501 vol->dir_mode = option;
1504 if (get_option_ul(args, &option)) {
1505 cERROR(1, "%s: Invalid port value",
1507 goto cifs_parse_mount_err;
1512 if (get_option_ul(args, &option)) {
1513 cERROR(1, "%s: Invalid rsize value",
1515 goto cifs_parse_mount_err;
1517 vol->rsize = option;
1520 if (get_option_ul(args, &option)) {
1521 cERROR(1, "%s: Invalid wsize value",
1523 goto cifs_parse_mount_err;
1525 vol->wsize = option;
1528 if (get_option_ul(args, &option)) {
1529 cERROR(1, "%s: Invalid actimeo value",
1531 goto cifs_parse_mount_err;
1533 vol->actimeo = HZ * option;
1534 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1535 cERROR(1, "CIFS: attribute cache"
1536 "timeout too large");
1537 goto cifs_parse_mount_err;
1541 /* String Arguments */
1543 case Opt_blank_user:
1544 /* null user, ie. anonymous authentication */
1546 vol->username = NULL;
1549 string = match_strdup(args);
1553 if (strnlen(string, MAX_USERNAME_SIZE) >
1554 MAX_USERNAME_SIZE) {
1555 printk(KERN_WARNING "CIFS: username too long\n");
1556 goto cifs_parse_mount_err;
1558 vol->username = kstrdup(string, GFP_KERNEL);
1559 if (!vol->username) {
1560 printk(KERN_WARNING "CIFS: no memory "
1562 goto cifs_parse_mount_err;
1565 case Opt_blank_pass:
1566 vol->password = NULL;
1569 /* passwords have to be handled differently
1570 * to allow the character used for deliminator
1571 * to be passed within them
1574 /* Obtain the value string */
1575 value = strchr(data, '=');
1578 /* Set tmp_end to end of the string */
1579 tmp_end = (char *) value + strlen(value);
1581 /* Check if following character is the deliminator
1582 * If yes, we have encountered a double deliminator
1583 * reset the NULL character to the deliminator
1585 if (tmp_end < end && tmp_end[1] == delim)
1588 /* Keep iterating until we get to a single deliminator
1591 while ((tmp_end = strchr(tmp_end, delim)) != NULL &&
1592 (tmp_end[1] == delim)) {
1593 tmp_end = (char *) &tmp_end[2];
1596 /* Reset var options to point to next element */
1599 options = (char *) &tmp_end[1];
1601 /* Reached the end of the mount option string */
1604 /* Now build new password string */
1605 temp_len = strlen(value);
1606 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1607 if (vol->password == NULL) {
1608 printk(KERN_WARNING "CIFS: no memory "
1610 goto cifs_parse_mount_err;
1613 for (i = 0, j = 0; i < temp_len; i++, j++) {
1614 vol->password[j] = value[i];
1615 if ((value[i] == delim) &&
1616 value[i+1] == delim)
1617 /* skip the second deliminator */
1620 vol->password[j] = '\0';
1626 string = match_strdup(args);
1630 if (strnlen(string, INET6_ADDRSTRLEN) >
1632 printk(KERN_WARNING "CIFS: ip address "
1634 goto cifs_parse_mount_err;
1636 vol->UNCip = kstrdup(string, GFP_KERNEL);
1638 printk(KERN_WARNING "CIFS: no memory "
1640 goto cifs_parse_mount_err;
1644 string = match_strdup(args);
1648 temp_len = strnlen(string, 300);
1649 if (temp_len == 300) {
1650 printk(KERN_WARNING "CIFS: UNC name too long\n");
1651 goto cifs_parse_mount_err;
1654 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1655 if (vol->UNC == NULL) {
1656 printk(KERN_WARNING "CIFS: no memory for UNC\n");
1657 goto cifs_parse_mount_err;
1659 strcpy(vol->UNC, string);
1661 if (strncmp(string, "//", 2) == 0) {
1664 } else if (strncmp(string, "\\\\", 2) != 0) {
1665 printk(KERN_WARNING "CIFS: UNC Path does not "
1666 "begin with // or \\\\\n");
1667 goto cifs_parse_mount_err;
1672 string = match_strdup(args);
1676 if (strnlen(string, 256) == 256) {
1677 printk(KERN_WARNING "CIFS: domain name too"
1679 goto cifs_parse_mount_err;
1682 vol->domainname = kstrdup(string, GFP_KERNEL);
1683 if (!vol->domainname) {
1684 printk(KERN_WARNING "CIFS: no memory "
1685 "for domainname\n");
1686 goto cifs_parse_mount_err;
1688 cFYI(1, "Domain name set");
1691 string = match_strdup(args);
1695 if (!cifs_convert_address(
1696 (struct sockaddr *)&vol->srcaddr,
1697 string, strlen(string))) {
1698 printk(KERN_WARNING "CIFS: Could not parse"
1699 " srcaddr: %s\n", string);
1700 goto cifs_parse_mount_err;
1703 case Opt_prefixpath:
1704 string = match_strdup(args);
1708 temp_len = strnlen(string, 1024);
1709 if (string[0] != '/')
1710 temp_len++; /* missing leading slash */
1711 if (temp_len > 1024) {
1712 printk(KERN_WARNING "CIFS: prefix too long\n");
1713 goto cifs_parse_mount_err;
1716 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1717 if (vol->prepath == NULL) {
1718 printk(KERN_WARNING "CIFS: no memory "
1719 "for path prefix\n");
1720 goto cifs_parse_mount_err;
1723 if (string[0] != '/') {
1724 vol->prepath[0] = '/';
1725 strcpy(vol->prepath+1, string);
1727 strcpy(vol->prepath, string);
1731 string = match_strdup(args);
1735 if (strnlen(string, 1024) >= 65) {
1736 printk(KERN_WARNING "CIFS: iocharset name "
1738 goto cifs_parse_mount_err;
1741 if (strnicmp(string, "default", 7) != 0) {
1742 vol->iocharset = kstrdup(string,
1744 if (!vol->iocharset) {
1745 printk(KERN_WARNING "CIFS: no memory"
1747 goto cifs_parse_mount_err;
1750 /* if iocharset not set then load_nls_default
1753 cFYI(1, "iocharset set to %s", string);
1756 string = match_strdup(args);
1760 if (strnicmp(string, "TCP_NODELAY", 11) == 0)
1761 vol->sockopt_tcp_nodelay = 1;
1763 case Opt_netbiosname:
1764 string = match_strdup(args);
1768 memset(vol->source_rfc1001_name, 0x20,
1771 * FIXME: are there cases in which a comma can
1772 * be valid in workstation netbios name (and
1773 * need special handling)?
1775 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1776 /* don't ucase netbiosname for user */
1779 vol->source_rfc1001_name[i] = string[i];
1781 /* The string has 16th byte zero still from
1782 * set at top of the function
1784 if (i == RFC1001_NAME_LEN && string[i] != 0)
1785 printk(KERN_WARNING "CIFS: netbiosname"
1786 " longer than 15 truncated.\n");
1790 /* servernetbiosname specified override *SMBSERVER */
1791 string = match_strdup(args);
1795 /* last byte, type, is 0x20 for servr type */
1796 memset(vol->target_rfc1001_name, 0x20,
1797 RFC1001_NAME_LEN_WITH_NULL);
1799 /* BB are there cases in which a comma can be
1800 valid in this workstation netbios name
1801 (and need special handling)? */
1803 /* user or mount helper must uppercase the
1805 for (i = 0; i < 15; i++) {
1808 vol->target_rfc1001_name[i] = string[i];
1810 /* The string has 16th byte zero still from
1811 set at top of the function */
1812 if (i == RFC1001_NAME_LEN && string[i] != 0)
1813 printk(KERN_WARNING "CIFS: server net"
1814 "biosname longer than 15 truncated.\n");
1817 string = match_strdup(args);
1821 if (strnicmp(string, "cifs", 4) == 0 ||
1822 strnicmp(string, "1", 1) == 0) {
1823 /* This is the default */
1826 /* For all other value, error */
1827 printk(KERN_WARNING "CIFS: Invalid version"
1829 goto cifs_parse_mount_err;
1831 string = match_strdup(args);
1835 if (cifs_parse_security_flavors(string, vol) != 0)
1836 goto cifs_parse_mount_err;
1840 * An option we don't recognize. Save it off for later
1841 * if we haven't already found one
1847 /* Free up any allocated string */
1852 if (!sloppy && invalid) {
1853 printk(KERN_ERR "CIFS: Unknown mount option \"%s\"\n", invalid);
1854 goto cifs_parse_mount_err;
1858 /* Muliuser mounts require CONFIG_KEYS support */
1859 if (vol->multiuser) {
1860 cERROR(1, "Multiuser mounts require kernels with "
1861 "CONFIG_KEYS enabled.");
1862 goto cifs_parse_mount_err;
1866 if (vol->UNCip == NULL)
1867 vol->UNCip = &vol->UNC[2];
1870 vol->override_uid = override_uid;
1871 else if (override_uid == 1)
1872 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1873 "specified with no uid= option.\n");
1876 vol->override_gid = override_gid;
1877 else if (override_gid == 1)
1878 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1879 "specified with no gid= option.\n");
1881 kfree(mountdata_copy);
1885 printk(KERN_WARNING "Could not allocate temporary buffer\n");
1886 cifs_parse_mount_err:
1888 kfree(mountdata_copy);
1892 /** Returns true if srcaddr isn't specified and rhs isn't
1893 * specified, or if srcaddr is specified and
1894 * matches the IP address of the rhs argument.
1897 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1899 switch (srcaddr->sa_family) {
1901 return (rhs->sa_family == AF_UNSPEC);
1903 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1904 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1905 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1908 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1909 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1910 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1914 return false; /* don't expect to be here */
1919 * If no port is specified in addr structure, we try to match with 445 port
1920 * and if it fails - with 139 ports. It should be called only if address
1921 * families of server and addr are equal.
1924 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1926 __be16 port, *sport;
1928 switch (addr->sa_family) {
1930 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1931 port = ((struct sockaddr_in *) addr)->sin_port;
1934 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1935 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1943 port = htons(CIFS_PORT);
1947 port = htons(RFC1001_PORT);
1950 return port == *sport;
1954 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1955 struct sockaddr *srcaddr)
1957 switch (addr->sa_family) {
1959 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1960 struct sockaddr_in *srv_addr4 =
1961 (struct sockaddr_in *)&server->dstaddr;
1963 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1968 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1969 struct sockaddr_in6 *srv_addr6 =
1970 (struct sockaddr_in6 *)&server->dstaddr;
1972 if (!ipv6_addr_equal(&addr6->sin6_addr,
1973 &srv_addr6->sin6_addr))
1975 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1981 return false; /* don't expect to be here */
1984 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1991 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1993 unsigned int secFlags;
1995 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1996 secFlags = vol->secFlg;
1998 secFlags = global_secflags | vol->secFlg;
2000 switch (server->secType) {
2002 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
2006 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
2010 if (!(secFlags & CIFSSEC_MAY_NTLM))
2014 if (!(secFlags & CIFSSEC_MAY_KRB5))
2018 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
2022 /* shouldn't happen */
2026 /* now check if signing mode is acceptable */
2027 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
2028 (server->sec_mode & SECMODE_SIGN_REQUIRED))
2030 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
2032 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
2038 static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
2039 struct smb_vol *vol)
2041 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2044 if (!match_address(server, addr,
2045 (struct sockaddr *)&vol->srcaddr))
2048 if (!match_port(server, addr))
2051 if (!match_security(server, vol))
2057 static struct TCP_Server_Info *
2058 cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
2060 struct TCP_Server_Info *server;
2062 spin_lock(&cifs_tcp_ses_lock);
2063 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2064 if (!match_server(server, addr, vol))
2067 ++server->srv_count;
2068 spin_unlock(&cifs_tcp_ses_lock);
2069 cFYI(1, "Existing tcp session with server found");
2072 spin_unlock(&cifs_tcp_ses_lock);
2077 cifs_put_tcp_session(struct TCP_Server_Info *server)
2079 struct task_struct *task;
2081 spin_lock(&cifs_tcp_ses_lock);
2082 if (--server->srv_count > 0) {
2083 spin_unlock(&cifs_tcp_ses_lock);
2087 put_net(cifs_net_ns(server));
2089 list_del_init(&server->tcp_ses_list);
2090 spin_unlock(&cifs_tcp_ses_lock);
2092 cancel_delayed_work_sync(&server->echo);
2094 spin_lock(&GlobalMid_Lock);
2095 server->tcpStatus = CifsExiting;
2096 spin_unlock(&GlobalMid_Lock);
2098 cifs_crypto_shash_release(server);
2099 cifs_fscache_release_client_cookie(server);
2101 kfree(server->session_key.response);
2102 server->session_key.response = NULL;
2103 server->session_key.len = 0;
2105 task = xchg(&server->tsk, NULL);
2107 force_sig(SIGKILL, task);
2110 static struct TCP_Server_Info *
2111 cifs_get_tcp_session(struct smb_vol *volume_info)
2113 struct TCP_Server_Info *tcp_ses = NULL;
2114 struct sockaddr_storage addr;
2115 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
2116 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
2119 memset(&addr, 0, sizeof(struct sockaddr_storage));
2121 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
2123 if (volume_info->UNCip && volume_info->UNC) {
2124 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2126 strlen(volume_info->UNCip),
2129 /* we failed translating address */
2133 } else if (volume_info->UNCip) {
2134 /* BB using ip addr as tcp_ses name to connect to the
2136 cERROR(1, "Connecting to DFS root not implemented yet");
2139 } else /* which tcp_sess DFS root would we conect to */ {
2140 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
2141 "unc=//192.168.1.100/public) specified");
2146 /* see if we already have a matching tcp_ses */
2147 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
2151 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2157 rc = cifs_crypto_shash_allocate(tcp_ses);
2159 cERROR(1, "could not setup hash structures rc %d", rc);
2163 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2164 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2165 if (IS_ERR(tcp_ses->hostname)) {
2166 rc = PTR_ERR(tcp_ses->hostname);
2167 goto out_err_crypto_release;
2170 tcp_ses->noblocksnd = volume_info->noblocksnd;
2171 tcp_ses->noautotune = volume_info->noautotune;
2172 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2173 tcp_ses->in_flight = 0;
2174 tcp_ses->credits = 1;
2175 init_waitqueue_head(&tcp_ses->response_q);
2176 init_waitqueue_head(&tcp_ses->request_q);
2177 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2178 mutex_init(&tcp_ses->srv_mutex);
2179 memcpy(tcp_ses->workstation_RFC1001_name,
2180 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2181 memcpy(tcp_ses->server_RFC1001_name,
2182 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2183 tcp_ses->session_estab = false;
2184 tcp_ses->sequence_number = 0;
2185 tcp_ses->lstrp = jiffies;
2186 spin_lock_init(&tcp_ses->req_lock);
2187 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2188 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2189 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2192 * at this point we are the only ones with the pointer
2193 * to the struct since the kernel thread not created yet
2194 * no need to spinlock this init of tcpStatus or srv_count
2196 tcp_ses->tcpStatus = CifsNew;
2197 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2198 sizeof(tcp_ses->srcaddr));
2199 ++tcp_ses->srv_count;
2201 if (addr.ss_family == AF_INET6) {
2202 cFYI(1, "attempting ipv6 connect");
2203 /* BB should we allow ipv6 on port 139? */
2204 /* other OS never observed in Wild doing 139 with v6 */
2205 memcpy(&tcp_ses->dstaddr, sin_server6,
2206 sizeof(struct sockaddr_in6));
2208 memcpy(&tcp_ses->dstaddr, sin_server,
2209 sizeof(struct sockaddr_in));
2211 rc = ip_connect(tcp_ses);
2213 cERROR(1, "Error connecting to socket. Aborting operation");
2214 goto out_err_crypto_release;
2218 * since we're in a cifs function already, we know that
2219 * this will succeed. No need for try_module_get().
2221 __module_get(THIS_MODULE);
2222 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2224 if (IS_ERR(tcp_ses->tsk)) {
2225 rc = PTR_ERR(tcp_ses->tsk);
2226 cERROR(1, "error %d create cifsd thread", rc);
2227 module_put(THIS_MODULE);
2228 goto out_err_crypto_release;
2230 tcp_ses->tcpStatus = CifsNeedNegotiate;
2232 /* thread spawned, put it on the list */
2233 spin_lock(&cifs_tcp_ses_lock);
2234 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2235 spin_unlock(&cifs_tcp_ses_lock);
2237 cifs_fscache_get_client_cookie(tcp_ses);
2239 /* queue echo request delayed work */
2240 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2244 out_err_crypto_release:
2245 cifs_crypto_shash_release(tcp_ses);
2247 put_net(cifs_net_ns(tcp_ses));
2251 if (!IS_ERR(tcp_ses->hostname))
2252 kfree(tcp_ses->hostname);
2253 if (tcp_ses->ssocket)
2254 sock_release(tcp_ses->ssocket);
2260 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2262 switch (ses->server->secType) {
2264 if (vol->cred_uid != ses->cred_uid)
2268 /* NULL username means anonymous session */
2269 if (ses->user_name == NULL) {
2275 /* anything else takes username/password */
2276 if (strncmp(ses->user_name,
2277 vol->username ? vol->username : "",
2280 if (strlen(vol->username) != 0 &&
2281 ses->password != NULL &&
2282 strncmp(ses->password,
2283 vol->password ? vol->password : "",
2290 static struct cifs_ses *
2291 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2293 struct cifs_ses *ses;
2295 spin_lock(&cifs_tcp_ses_lock);
2296 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2297 if (!match_session(ses, vol))
2300 spin_unlock(&cifs_tcp_ses_lock);
2303 spin_unlock(&cifs_tcp_ses_lock);
2308 cifs_put_smb_ses(struct cifs_ses *ses)
2311 struct TCP_Server_Info *server = ses->server;
2313 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
2314 spin_lock(&cifs_tcp_ses_lock);
2315 if (--ses->ses_count > 0) {
2316 spin_unlock(&cifs_tcp_ses_lock);
2320 list_del_init(&ses->smb_ses_list);
2321 spin_unlock(&cifs_tcp_ses_lock);
2323 if (ses->status == CifsGood) {
2325 CIFSSMBLogoff(xid, ses);
2329 cifs_put_tcp_session(server);
2334 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2335 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2337 /* Populate username and pw fields from keyring if possible */
2339 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2342 char *desc, *delim, *payload;
2345 struct TCP_Server_Info *server = ses->server;
2346 struct sockaddr_in *sa;
2347 struct sockaddr_in6 *sa6;
2348 struct user_key_payload *upayload;
2350 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2354 /* try to find an address key first */
2355 switch (server->dstaddr.ss_family) {
2357 sa = (struct sockaddr_in *)&server->dstaddr;
2358 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2361 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2362 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2365 cFYI(1, "Bad ss_family (%hu)", server->dstaddr.ss_family);
2370 cFYI(1, "%s: desc=%s", __func__, desc);
2371 key = request_key(&key_type_logon, desc, "");
2373 if (!ses->domainName) {
2374 cFYI(1, "domainName is NULL");
2379 /* didn't work, try to find a domain key */
2380 sprintf(desc, "cifs:d:%s", ses->domainName);
2381 cFYI(1, "%s: desc=%s", __func__, desc);
2382 key = request_key(&key_type_logon, desc, "");
2389 down_read(&key->sem);
2390 upayload = key->payload.data;
2391 if (IS_ERR_OR_NULL(upayload)) {
2392 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2396 /* find first : in payload */
2397 payload = (char *)upayload->data;
2398 delim = strnchr(payload, upayload->datalen, ':');
2399 cFYI(1, "payload=%s", payload);
2401 cFYI(1, "Unable to find ':' in payload (datalen=%d)",
2407 len = delim - payload;
2408 if (len > MAX_USERNAME_SIZE || len <= 0) {
2409 cFYI(1, "Bad value from username search (len=%zd)", len);
2414 vol->username = kstrndup(payload, len, GFP_KERNEL);
2415 if (!vol->username) {
2416 cFYI(1, "Unable to allocate %zd bytes for username", len);
2420 cFYI(1, "%s: username=%s", __func__, vol->username);
2422 len = key->datalen - (len + 1);
2423 if (len > MAX_PASSWORD_SIZE || len <= 0) {
2424 cFYI(1, "Bad len for password search (len=%zd)", len);
2426 kfree(vol->username);
2427 vol->username = NULL;
2432 vol->password = kstrndup(delim, len, GFP_KERNEL);
2433 if (!vol->password) {
2434 cFYI(1, "Unable to allocate %zd bytes for password", len);
2436 kfree(vol->username);
2437 vol->username = NULL;
2446 cFYI(1, "%s: returning %d", __func__, rc);
2449 #else /* ! CONFIG_KEYS */
2451 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2452 struct cifs_ses *ses __attribute__((unused)))
2456 #endif /* CONFIG_KEYS */
2458 static bool warned_on_ntlm; /* globals init to false automatically */
2460 static struct cifs_ses *
2461 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2463 int rc = -ENOMEM, xid;
2464 struct cifs_ses *ses;
2465 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2466 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2470 ses = cifs_find_smb_ses(server, volume_info);
2472 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2474 mutex_lock(&ses->session_mutex);
2475 rc = cifs_negotiate_protocol(xid, ses);
2477 mutex_unlock(&ses->session_mutex);
2478 /* problem -- put our ses reference */
2479 cifs_put_smb_ses(ses);
2483 if (ses->need_reconnect) {
2484 cFYI(1, "Session needs reconnect");
2485 rc = cifs_setup_session(xid, ses,
2486 volume_info->local_nls);
2488 mutex_unlock(&ses->session_mutex);
2489 /* problem -- put our reference */
2490 cifs_put_smb_ses(ses);
2495 mutex_unlock(&ses->session_mutex);
2497 /* existing SMB ses has a server reference already */
2498 cifs_put_tcp_session(server);
2503 cFYI(1, "Existing smb sess not found");
2504 ses = sesInfoAlloc();
2508 /* new SMB session uses our server ref */
2509 ses->server = server;
2510 if (server->dstaddr.ss_family == AF_INET6)
2511 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2513 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2515 if (volume_info->username) {
2516 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2517 if (!ses->user_name)
2521 /* volume_info->password freed at unmount */
2522 if (volume_info->password) {
2523 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2527 if (volume_info->domainname) {
2528 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2529 if (!ses->domainName)
2532 ses->cred_uid = volume_info->cred_uid;
2533 ses->linux_uid = volume_info->linux_uid;
2535 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2536 supported for many years, time to update default security mechanism */
2537 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2538 warned_on_ntlm = true;
2539 cERROR(1, "default security mechanism requested. The default "
2540 "security mechanism will be upgraded from ntlm to "
2541 "ntlmv2 in kernel release 3.3");
2543 ses->overrideSecFlg = volume_info->secFlg;
2545 mutex_lock(&ses->session_mutex);
2546 rc = cifs_negotiate_protocol(xid, ses);
2548 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2549 mutex_unlock(&ses->session_mutex);
2553 /* success, put it on the list */
2554 spin_lock(&cifs_tcp_ses_lock);
2555 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2556 spin_unlock(&cifs_tcp_ses_lock);
2567 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2569 if (tcon->tidStatus == CifsExiting)
2571 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2576 static struct cifs_tcon *
2577 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2579 struct list_head *tmp;
2580 struct cifs_tcon *tcon;
2582 spin_lock(&cifs_tcp_ses_lock);
2583 list_for_each(tmp, &ses->tcon_list) {
2584 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2585 if (!match_tcon(tcon, unc))
2588 spin_unlock(&cifs_tcp_ses_lock);
2591 spin_unlock(&cifs_tcp_ses_lock);
2596 cifs_put_tcon(struct cifs_tcon *tcon)
2599 struct cifs_ses *ses = tcon->ses;
2601 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2602 spin_lock(&cifs_tcp_ses_lock);
2603 if (--tcon->tc_count > 0) {
2604 spin_unlock(&cifs_tcp_ses_lock);
2608 list_del_init(&tcon->tcon_list);
2609 spin_unlock(&cifs_tcp_ses_lock);
2612 CIFSSMBTDis(xid, tcon);
2615 cifs_fscache_release_super_cookie(tcon);
2617 cifs_put_smb_ses(ses);
2620 static struct cifs_tcon *
2621 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2624 struct cifs_tcon *tcon;
2626 tcon = cifs_find_tcon(ses, volume_info->UNC);
2628 cFYI(1, "Found match on UNC path");
2629 /* existing tcon already has a reference */
2630 cifs_put_smb_ses(ses);
2631 if (tcon->seal != volume_info->seal)
2632 cERROR(1, "transport encryption setting "
2633 "conflicts with existing tid");
2637 tcon = tconInfoAlloc();
2644 if (volume_info->password) {
2645 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2646 if (!tcon->password) {
2652 if (strchr(volume_info->UNC + 3, '\\') == NULL
2653 && strchr(volume_info->UNC + 3, '/') == NULL) {
2654 cERROR(1, "Missing share name");
2659 /* BB Do we need to wrap session_mutex around
2660 * this TCon call and Unix SetFS as
2661 * we do on SessSetup and reconnect? */
2663 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2665 cFYI(1, "CIFS Tcon rc = %d", rc);
2669 if (volume_info->nodfs) {
2670 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2671 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2673 tcon->seal = volume_info->seal;
2674 /* we can have only one retry value for a connection
2675 to a share so for resources mounted more than once
2676 to the same server share the last value passed in
2677 for the retry flag is used */
2678 tcon->retry = volume_info->retry;
2679 tcon->nocase = volume_info->nocase;
2680 tcon->local_lease = volume_info->local_lease;
2682 spin_lock(&cifs_tcp_ses_lock);
2683 list_add(&tcon->tcon_list, &ses->tcon_list);
2684 spin_unlock(&cifs_tcp_ses_lock);
2686 cifs_fscache_get_super_cookie(tcon);
2696 cifs_put_tlink(struct tcon_link *tlink)
2698 if (!tlink || IS_ERR(tlink))
2701 if (!atomic_dec_and_test(&tlink->tl_count) ||
2702 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2703 tlink->tl_time = jiffies;
2707 if (!IS_ERR(tlink_tcon(tlink)))
2708 cifs_put_tcon(tlink_tcon(tlink));
2713 static inline struct tcon_link *
2714 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2716 return cifs_sb->master_tlink;
2720 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2722 struct cifs_sb_info *old = CIFS_SB(sb);
2723 struct cifs_sb_info *new = mnt_data->cifs_sb;
2725 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2728 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2729 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2733 * We want to share sb only if we don't specify an r/wsize or
2734 * specified r/wsize is greater than or equal to existing one.
2736 if (new->wsize && new->wsize < old->wsize)
2739 if (new->rsize && new->rsize < old->rsize)
2742 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2745 if (old->mnt_file_mode != new->mnt_file_mode ||
2746 old->mnt_dir_mode != new->mnt_dir_mode)
2749 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2752 if (old->actimeo != new->actimeo)
2759 cifs_match_super(struct super_block *sb, void *data)
2761 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2762 struct smb_vol *volume_info;
2763 struct cifs_sb_info *cifs_sb;
2764 struct TCP_Server_Info *tcp_srv;
2765 struct cifs_ses *ses;
2766 struct cifs_tcon *tcon;
2767 struct tcon_link *tlink;
2768 struct sockaddr_storage addr;
2771 memset(&addr, 0, sizeof(struct sockaddr_storage));
2773 spin_lock(&cifs_tcp_ses_lock);
2774 cifs_sb = CIFS_SB(sb);
2775 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2776 if (IS_ERR(tlink)) {
2777 spin_unlock(&cifs_tcp_ses_lock);
2780 tcon = tlink_tcon(tlink);
2782 tcp_srv = ses->server;
2784 volume_info = mnt_data->vol;
2786 if (!volume_info->UNCip || !volume_info->UNC)
2789 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2791 strlen(volume_info->UNCip),
2796 if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2797 !match_session(ses, volume_info) ||
2798 !match_tcon(tcon, volume_info->UNC)) {
2803 rc = compare_mount_options(sb, mnt_data);
2805 spin_unlock(&cifs_tcp_ses_lock);
2806 cifs_put_tlink(tlink);
2811 get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path,
2812 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
2813 struct dfs_info3_param **preferrals, int remap)
2818 *pnum_referrals = 0;
2821 if (pSesInfo->ipc_tid == 0) {
2822 temp_unc = kmalloc(2 /* for slashes */ +
2823 strnlen(pSesInfo->serverName,
2824 SERVER_NAME_LEN_WITH_NULL * 2)
2825 + 1 + 4 /* slash IPC$ */ + 2,
2827 if (temp_unc == NULL)
2831 strcpy(temp_unc + 2, pSesInfo->serverName);
2832 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2833 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
2834 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
2838 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
2839 pnum_referrals, nls_codepage, remap);
2840 /* BB map targetUNCs to dfs_info3 structures, here or
2841 in CIFSGetDFSRefer BB */
2846 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2847 static struct lock_class_key cifs_key[2];
2848 static struct lock_class_key cifs_slock_key[2];
2851 cifs_reclassify_socket4(struct socket *sock)
2853 struct sock *sk = sock->sk;
2854 BUG_ON(sock_owned_by_user(sk));
2855 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2856 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2860 cifs_reclassify_socket6(struct socket *sock)
2862 struct sock *sk = sock->sk;
2863 BUG_ON(sock_owned_by_user(sk));
2864 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2865 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2869 cifs_reclassify_socket4(struct socket *sock)
2874 cifs_reclassify_socket6(struct socket *sock)
2879 /* See RFC1001 section 14 on representation of Netbios names */
2880 static void rfc1002mangle(char *target, char *source, unsigned int length)
2884 for (i = 0, j = 0; i < (length); i++) {
2885 /* mask a nibble at a time and encode */
2886 target[j] = 'A' + (0x0F & (source[i] >> 4));
2887 target[j+1] = 'A' + (0x0F & source[i]);
2894 bind_socket(struct TCP_Server_Info *server)
2897 if (server->srcaddr.ss_family != AF_UNSPEC) {
2898 /* Bind to the specified local IP address */
2899 struct socket *socket = server->ssocket;
2900 rc = socket->ops->bind(socket,
2901 (struct sockaddr *) &server->srcaddr,
2902 sizeof(server->srcaddr));
2904 struct sockaddr_in *saddr4;
2905 struct sockaddr_in6 *saddr6;
2906 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2907 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2908 if (saddr6->sin6_family == AF_INET6)
2910 "Failed to bind to: %pI6c, error: %d\n",
2911 &saddr6->sin6_addr, rc);
2914 "Failed to bind to: %pI4, error: %d\n",
2915 &saddr4->sin_addr.s_addr, rc);
2922 ip_rfc1001_connect(struct TCP_Server_Info *server)
2926 * some servers require RFC1001 sessinit before sending
2927 * negprot - BB check reconnection in case where second
2928 * sessinit is sent but no second negprot
2930 struct rfc1002_session_packet *ses_init_buf;
2931 struct smb_hdr *smb_buf;
2932 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2935 ses_init_buf->trailer.session_req.called_len = 32;
2937 if (server->server_RFC1001_name &&
2938 server->server_RFC1001_name[0] != 0)
2939 rfc1002mangle(ses_init_buf->trailer.
2940 session_req.called_name,
2941 server->server_RFC1001_name,
2942 RFC1001_NAME_LEN_WITH_NULL);
2944 rfc1002mangle(ses_init_buf->trailer.
2945 session_req.called_name,
2946 DEFAULT_CIFS_CALLED_NAME,
2947 RFC1001_NAME_LEN_WITH_NULL);
2949 ses_init_buf->trailer.session_req.calling_len = 32;
2952 * calling name ends in null (byte 16) from old smb
2955 if (server->workstation_RFC1001_name &&
2956 server->workstation_RFC1001_name[0] != 0)
2957 rfc1002mangle(ses_init_buf->trailer.
2958 session_req.calling_name,
2959 server->workstation_RFC1001_name,
2960 RFC1001_NAME_LEN_WITH_NULL);
2962 rfc1002mangle(ses_init_buf->trailer.
2963 session_req.calling_name,
2965 RFC1001_NAME_LEN_WITH_NULL);
2967 ses_init_buf->trailer.session_req.scope1 = 0;
2968 ses_init_buf->trailer.session_req.scope2 = 0;
2969 smb_buf = (struct smb_hdr *)ses_init_buf;
2971 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2972 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2973 rc = smb_send(server, smb_buf, 0x44);
2974 kfree(ses_init_buf);
2976 * RFC1001 layer in at least one server
2977 * requires very short break before negprot
2978 * presumably because not expecting negprot
2979 * to follow so fast. This is a simple
2980 * solution that works without
2981 * complicating the code and causes no
2982 * significant slowing down on mount
2985 usleep_range(1000, 2000);
2988 * else the negprot may still work without this
2989 * even though malloc failed
2996 generic_ip_connect(struct TCP_Server_Info *server)
3001 struct socket *socket = server->ssocket;
3002 struct sockaddr *saddr;
3004 saddr = (struct sockaddr *) &server->dstaddr;
3006 if (server->dstaddr.ss_family == AF_INET6) {
3007 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3008 slen = sizeof(struct sockaddr_in6);
3011 sport = ((struct sockaddr_in *) saddr)->sin_port;
3012 slen = sizeof(struct sockaddr_in);
3016 if (socket == NULL) {
3017 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3018 IPPROTO_TCP, &socket, 1);
3020 cERROR(1, "Error %d creating socket", rc);
3021 server->ssocket = NULL;
3025 /* BB other socket options to set KEEPALIVE, NODELAY? */
3026 cFYI(1, "Socket created");
3027 server->ssocket = socket;
3028 socket->sk->sk_allocation = GFP_NOFS;
3029 if (sfamily == AF_INET6)
3030 cifs_reclassify_socket6(socket);
3032 cifs_reclassify_socket4(socket);
3035 rc = bind_socket(server);
3040 * Eventually check for other socket options to change from
3041 * the default. sock_setsockopt not used because it expects
3044 socket->sk->sk_rcvtimeo = 7 * HZ;
3045 socket->sk->sk_sndtimeo = 5 * HZ;
3047 /* make the bufsizes depend on wsize/rsize and max requests */
3048 if (server->noautotune) {
3049 if (socket->sk->sk_sndbuf < (200 * 1024))
3050 socket->sk->sk_sndbuf = 200 * 1024;
3051 if (socket->sk->sk_rcvbuf < (140 * 1024))
3052 socket->sk->sk_rcvbuf = 140 * 1024;
3055 if (server->tcp_nodelay) {
3057 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3058 (char *)&val, sizeof(val));
3060 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
3063 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
3064 socket->sk->sk_sndbuf,
3065 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3067 rc = socket->ops->connect(socket, saddr, slen, 0);
3069 cFYI(1, "Error %d connecting to server", rc);
3070 sock_release(socket);
3071 server->ssocket = NULL;
3075 if (sport == htons(RFC1001_PORT))
3076 rc = ip_rfc1001_connect(server);
3082 ip_connect(struct TCP_Server_Info *server)
3085 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3086 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3088 if (server->dstaddr.ss_family == AF_INET6)
3089 sport = &addr6->sin6_port;
3091 sport = &addr->sin_port;
3096 /* try with 445 port at first */
3097 *sport = htons(CIFS_PORT);
3099 rc = generic_ip_connect(server);
3103 /* if it failed, try with 139 port */
3104 *sport = htons(RFC1001_PORT);
3107 return generic_ip_connect(server);
3110 void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
3111 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3113 /* if we are reconnecting then should we check to see if
3114 * any requested capabilities changed locally e.g. via
3115 * remount but we can not do much about it here
3116 * if they have (even if we could detect it by the following)
3117 * Perhaps we could add a backpointer to array of sb from tcon
3118 * or if we change to make all sb to same share the same
3119 * sb as NFS - then we only have one backpointer to sb.
3120 * What if we wanted to mount the server share twice once with
3121 * and once without posixacls or posix paths? */
3122 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3124 if (vol_info && vol_info->no_linux_ext) {
3125 tcon->fsUnixInfo.Capability = 0;
3126 tcon->unix_ext = 0; /* Unix Extensions disabled */
3127 cFYI(1, "Linux protocol extensions disabled");
3129 } else if (vol_info)
3130 tcon->unix_ext = 1; /* Unix Extensions supported */
3132 if (tcon->unix_ext == 0) {
3133 cFYI(1, "Unix extensions disabled so not set on reconnect");
3137 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3138 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3139 cFYI(1, "unix caps which server supports %lld", cap);
3140 /* check for reconnect case in which we do not
3141 want to change the mount behavior if we can avoid it */
3142 if (vol_info == NULL) {
3143 /* turn off POSIX ACL and PATHNAMES if not set
3144 originally at mount time */
3145 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3146 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3147 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3148 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3149 cERROR(1, "POSIXPATH support change");
3150 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3151 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3152 cERROR(1, "possible reconnect error");
3153 cERROR(1, "server disabled POSIX path support");
3157 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3158 cERROR(1, "per-share encryption not supported yet");
3160 cap &= CIFS_UNIX_CAP_MASK;
3161 if (vol_info && vol_info->no_psx_acl)
3162 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3163 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3164 cFYI(1, "negotiated posix acl support");
3166 cifs_sb->mnt_cifs_flags |=
3167 CIFS_MOUNT_POSIXACL;
3170 if (vol_info && vol_info->posix_paths == 0)
3171 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3172 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3173 cFYI(1, "negotiate posix pathnames");
3175 cifs_sb->mnt_cifs_flags |=
3176 CIFS_MOUNT_POSIX_PATHS;
3179 cFYI(1, "Negotiate caps 0x%x", (int)cap);
3180 #ifdef CONFIG_CIFS_DEBUG2
3181 if (cap & CIFS_UNIX_FCNTL_CAP)
3182 cFYI(1, "FCNTL cap");
3183 if (cap & CIFS_UNIX_EXTATTR_CAP)
3184 cFYI(1, "EXTATTR cap");
3185 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3186 cFYI(1, "POSIX path cap");
3187 if (cap & CIFS_UNIX_XATTR_CAP)
3188 cFYI(1, "XATTR cap");
3189 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3190 cFYI(1, "POSIX ACL cap");
3191 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3192 cFYI(1, "very large read cap");
3193 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3194 cFYI(1, "very large write cap");
3195 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3196 cFYI(1, "transport encryption cap");
3197 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3198 cFYI(1, "mandatory transport encryption cap");
3199 #endif /* CIFS_DEBUG2 */
3200 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3201 if (vol_info == NULL) {
3202 cFYI(1, "resetting capabilities failed");
3204 cERROR(1, "Negotiating Unix capabilities "
3205 "with the server failed. Consider "
3206 "mounting with the Unix Extensions\n"
3207 "disabled, if problems are found, "
3208 "by specifying the nounix mount "
3215 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3216 struct cifs_sb_info *cifs_sb)
3218 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3220 spin_lock_init(&cifs_sb->tlink_tree_lock);
3221 cifs_sb->tlink_tree = RB_ROOT;
3224 * Temporarily set r/wsize for matching superblock. If we end up using
3225 * new sb then client will later negotiate it downward if needed.
3227 cifs_sb->rsize = pvolume_info->rsize;
3228 cifs_sb->wsize = pvolume_info->wsize;
3230 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3231 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3232 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3233 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3234 cFYI(1, "file mode: 0x%hx dir mode: 0x%hx",
3235 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3237 cifs_sb->actimeo = pvolume_info->actimeo;
3238 cifs_sb->local_nls = pvolume_info->local_nls;
3240 if (pvolume_info->noperm)
3241 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3242 if (pvolume_info->setuids)
3243 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3244 if (pvolume_info->server_ino)
3245 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3246 if (pvolume_info->remap)
3247 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3248 if (pvolume_info->no_xattr)
3249 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3250 if (pvolume_info->sfu_emul)
3251 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3252 if (pvolume_info->nobrl)
3253 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3254 if (pvolume_info->nostrictsync)
3255 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3256 if (pvolume_info->mand_lock)
3257 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3258 if (pvolume_info->rwpidforward)
3259 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3260 if (pvolume_info->cifs_acl)
3261 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3262 if (pvolume_info->backupuid_specified) {
3263 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3264 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3266 if (pvolume_info->backupgid_specified) {
3267 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3268 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3270 if (pvolume_info->override_uid)
3271 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3272 if (pvolume_info->override_gid)
3273 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3274 if (pvolume_info->dynperm)
3275 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3276 if (pvolume_info->fsc)
3277 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3278 if (pvolume_info->multiuser)
3279 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3280 CIFS_MOUNT_NO_PERM);
3281 if (pvolume_info->strict_io)
3282 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3283 if (pvolume_info->direct_io) {
3284 cFYI(1, "mounting share using direct i/o");
3285 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3287 if (pvolume_info->mfsymlinks) {
3288 if (pvolume_info->sfu_emul) {
3289 cERROR(1, "mount option mfsymlinks ignored if sfu "
3290 "mount option is used");
3292 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3296 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3297 cERROR(1, "mount option dynperm ignored if cifsacl "
3298 "mount option supported");
3302 * When the server supports very large reads and writes via POSIX extensions,
3303 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
3304 * including the RFC1001 length.
3306 * Note that this might make for "interesting" allocation problems during
3307 * writeback however as we have to allocate an array of pointers for the
3308 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
3310 * For reads, there is a similar problem as we need to allocate an array
3311 * of kvecs to handle the receive, though that should only need to be done
3314 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
3315 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
3318 * When the server doesn't allow large posix writes, only allow a rsize/wsize
3319 * of 2^17-1 minus the size of the call header. That allows for a read or
3320 * write up to the maximum size described by RFC1002.
3322 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
3323 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
3326 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
3327 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
3328 * a single wsize request with a single call.
3330 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
3333 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
3334 * those values when posix extensions aren't in force. In actuality here, we
3335 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
3336 * to be ok with the extra byte even though Windows doesn't send writes that
3341 * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
3343 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
3344 #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
3347 cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
3349 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3350 struct TCP_Server_Info *server = tcon->ses->server;
3353 /* start with specified wsize, or default */
3354 if (pvolume_info->wsize)
3355 wsize = pvolume_info->wsize;
3356 else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
3357 wsize = CIFS_DEFAULT_IOSIZE;
3359 wsize = CIFS_DEFAULT_NON_POSIX_WSIZE;
3361 /* can server support 24-bit write sizes? (via UNIX extensions) */
3362 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
3363 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
3366 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
3367 * Limit it to max buffer offered by the server, minus the size of the
3368 * WRITEX header, not including the 4 byte RFC1001 length.
3370 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
3371 (!(server->capabilities & CAP_UNIX) &&
3372 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
3373 wsize = min_t(unsigned int, wsize,
3374 server->maxBuf - sizeof(WRITE_REQ) + 4);
3376 /* hard limit of CIFS_MAX_WSIZE */
3377 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
3383 cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
3385 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3386 struct TCP_Server_Info *server = tcon->ses->server;
3387 unsigned int rsize, defsize;
3390 * Set default value...
3392 * HACK alert! Ancient servers have very small buffers. Even though
3393 * MS-CIFS indicates that servers are only limited by the client's
3394 * bufsize for reads, testing against win98se shows that it throws
3395 * INVALID_PARAMETER errors if you try to request too large a read.
3397 * If the server advertises a MaxBufferSize of less than one page,
3398 * assume that it also can't satisfy reads larger than that either.
3400 * FIXME: Is there a better heuristic for this?
3402 if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP))
3403 defsize = CIFS_DEFAULT_IOSIZE;
3404 else if (server->capabilities & CAP_LARGE_READ_X)
3405 defsize = CIFS_DEFAULT_NON_POSIX_RSIZE;
3406 else if (server->maxBuf >= PAGE_CACHE_SIZE)
3407 defsize = CIFSMaxBufSize;
3409 defsize = server->maxBuf - sizeof(READ_RSP);
3411 rsize = pvolume_info->rsize ? pvolume_info->rsize : defsize;
3414 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
3415 * the client's MaxBufferSize.
3417 if (!(server->capabilities & CAP_LARGE_READ_X))
3418 rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
3420 /* hard limit of CIFS_MAX_RSIZE */
3421 rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
3427 is_path_accessible(int xid, struct cifs_tcon *tcon,
3428 struct cifs_sb_info *cifs_sb, const char *full_path)
3431 FILE_ALL_INFO *pfile_info;
3433 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
3434 if (pfile_info == NULL)
3437 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
3438 0 /* not legacy */, cifs_sb->local_nls,
3439 cifs_sb->mnt_cifs_flags &
3440 CIFS_MOUNT_MAP_SPECIAL_CHR);
3442 if (rc == -EOPNOTSUPP || rc == -EINVAL)
3443 rc = SMBQueryInformation(xid, tcon, full_path, pfile_info,
3444 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
3445 CIFS_MOUNT_MAP_SPECIAL_CHR);
3451 cleanup_volume_info_contents(struct smb_vol *volume_info)
3453 kfree(volume_info->username);
3454 kzfree(volume_info->password);
3455 if (volume_info->UNCip != volume_info->UNC + 2)
3456 kfree(volume_info->UNCip);
3457 kfree(volume_info->UNC);
3458 kfree(volume_info->domainname);
3459 kfree(volume_info->iocharset);
3460 kfree(volume_info->prepath);
3464 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3468 cleanup_volume_info_contents(volume_info);
3473 #ifdef CONFIG_CIFS_DFS_UPCALL
3474 /* build_path_to_root returns full path to root when
3475 * we do not have an exiting connection (tcon) */
3477 build_unc_path_to_root(const struct smb_vol *vol,
3478 const struct cifs_sb_info *cifs_sb)
3480 char *full_path, *pos;
3481 unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
3482 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3484 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3485 if (full_path == NULL)
3486 return ERR_PTR(-ENOMEM);
3488 strncpy(full_path, vol->UNC, unc_len);
3489 pos = full_path + unc_len;
3492 strncpy(pos, vol->prepath, pplen);
3496 *pos = '\0'; /* add trailing null */
3497 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3498 cFYI(1, "%s: full_path=%s", __func__, full_path);
3503 * Perform a dfs referral query for a share and (optionally) prefix
3505 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3506 * to a string containing updated options for the submount. Otherwise it
3507 * will be left untouched.
3509 * Returns the rc from get_dfs_path to the caller, which can be used to
3510 * determine whether there were referrals.
3513 expand_dfs_referral(int xid, struct cifs_ses *pSesInfo,
3514 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3518 unsigned int num_referrals = 0;
3519 struct dfs_info3_param *referrals = NULL;
3520 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3522 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3523 if (IS_ERR(full_path))
3524 return PTR_ERR(full_path);
3526 /* For DFS paths, skip the first '\' of the UNC */
3527 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3529 rc = get_dfs_path(xid, pSesInfo , ref_path, cifs_sb->local_nls,
3530 &num_referrals, &referrals,
3531 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3533 if (!rc && num_referrals > 0) {
3534 char *fake_devname = NULL;
3536 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3537 full_path + 1, referrals,
3540 free_dfs_info_array(referrals, num_referrals);
3542 if (IS_ERR(mdata)) {
3543 rc = PTR_ERR(mdata);
3546 cleanup_volume_info_contents(volume_info);
3547 memset(volume_info, '\0', sizeof(*volume_info));
3548 rc = cifs_setup_volume_info(volume_info, mdata,
3551 kfree(fake_devname);
3552 kfree(cifs_sb->mountdata);
3553 cifs_sb->mountdata = mdata;
3561 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3562 const char *devname)
3566 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3569 if (volume_info->nullauth) {
3570 cFYI(1, "Anonymous login");
3571 kfree(volume_info->username);
3572 volume_info->username = NULL;
3573 } else if (volume_info->username) {
3574 /* BB fixme parse for domain name here */
3575 cFYI(1, "Username: %s", volume_info->username);
3577 cifserror("No username specified");
3578 /* In userspace mount helper we can get user name from alternate
3579 locations such as env variables and files on disk */
3583 /* this is needed for ASCII cp to Unicode converts */
3584 if (volume_info->iocharset == NULL) {
3585 /* load_nls_default cannot return null */
3586 volume_info->local_nls = load_nls_default();
3588 volume_info->local_nls = load_nls(volume_info->iocharset);
3589 if (volume_info->local_nls == NULL) {
3590 cERROR(1, "CIFS mount error: iocharset %s not found",
3591 volume_info->iocharset);
3600 cifs_get_volume_info(char *mount_data, const char *devname)
3603 struct smb_vol *volume_info;
3605 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3607 return ERR_PTR(-ENOMEM);
3609 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3611 cifs_cleanup_volume_info(volume_info);
3612 volume_info = ERR_PTR(rc);
3619 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3623 struct cifs_ses *pSesInfo;
3624 struct cifs_tcon *tcon;
3625 struct TCP_Server_Info *srvTcp;
3627 struct tcon_link *tlink;
3628 #ifdef CONFIG_CIFS_DFS_UPCALL
3629 int referral_walks_count = 0;
3632 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3636 #ifdef CONFIG_CIFS_DFS_UPCALL
3638 /* cleanup activities if we're chasing a referral */
3639 if (referral_walks_count) {
3641 cifs_put_tcon(tcon);
3643 cifs_put_smb_ses(pSesInfo);
3657 /* get a reference to a tcp session */
3658 srvTcp = cifs_get_tcp_session(volume_info);
3659 if (IS_ERR(srvTcp)) {
3660 rc = PTR_ERR(srvTcp);
3661 bdi_destroy(&cifs_sb->bdi);
3665 /* get a reference to a SMB session */
3666 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
3667 if (IS_ERR(pSesInfo)) {
3668 rc = PTR_ERR(pSesInfo);
3670 goto mount_fail_check;
3673 /* search for existing tcon to this server share */
3674 tcon = cifs_get_tcon(pSesInfo, volume_info);
3678 goto remote_path_check;
3681 /* tell server which Unix caps we support */
3682 if (tcon->ses->capabilities & CAP_UNIX) {
3683 /* reset of caps checks mount to see if unix extensions
3684 disabled for just this mount */
3685 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3686 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3687 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3688 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3690 goto mount_fail_check;
3693 tcon->unix_ext = 0; /* server does not support them */
3695 /* do not care if following two calls succeed - informational */
3697 CIFSSMBQFSDeviceInfo(xid, tcon);
3698 CIFSSMBQFSAttributeInfo(xid, tcon);
3701 cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3702 cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info);
3704 /* tune readahead according to rsize */
3705 cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3708 #ifdef CONFIG_CIFS_DFS_UPCALL
3710 * Perform an unconditional check for whether there are DFS
3711 * referrals for this path without prefix, to provide support
3712 * for DFS referrals from w2k8 servers which don't seem to respond
3713 * with PATH_NOT_COVERED to requests that include the prefix.
3714 * Chase the referral if found, otherwise continue normally.
3716 if (referral_walks_count == 0) {
3717 int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
3720 referral_walks_count++;
3721 goto try_mount_again;
3726 /* check if a whole path is not remote */
3728 /* build_path_to_root works only when we have a valid tcon */
3729 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3730 if (full_path == NULL) {
3732 goto mount_fail_check;
3734 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
3735 if (rc != 0 && rc != -EREMOTE) {
3737 goto mount_fail_check;
3742 /* get referral if needed */
3743 if (rc == -EREMOTE) {
3744 #ifdef CONFIG_CIFS_DFS_UPCALL
3745 if (referral_walks_count > MAX_NESTED_LINKS) {
3747 * BB: when we implement proper loop detection,
3748 * we will remove this check. But now we need it
3749 * to prevent an indefinite loop if 'DFS tree' is
3750 * misconfigured (i.e. has loops).
3753 goto mount_fail_check;
3756 rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb,
3760 referral_walks_count++;
3761 goto try_mount_again;
3763 goto mount_fail_check;
3764 #else /* No DFS support, return error on mount */
3770 goto mount_fail_check;
3772 /* now, hang the tcon off of the superblock */
3773 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3774 if (tlink == NULL) {
3776 goto mount_fail_check;
3779 tlink->tl_uid = pSesInfo->linux_uid;
3780 tlink->tl_tcon = tcon;
3781 tlink->tl_time = jiffies;
3782 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3783 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3785 cifs_sb->master_tlink = tlink;
3786 spin_lock(&cifs_sb->tlink_tree_lock);
3787 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3788 spin_unlock(&cifs_sb->tlink_tree_lock);
3790 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3794 /* on error free sesinfo and tcon struct if needed */
3796 /* If find_unc succeeded then rc == 0 so we can not end */
3797 /* up accidentally freeing someone elses tcon struct */
3799 cifs_put_tcon(tcon);
3801 cifs_put_smb_ses(pSesInfo);
3803 cifs_put_tcp_session(srvTcp);
3804 bdi_destroy(&cifs_sb->bdi);
3813 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3814 * pointer may be NULL.
3817 CIFSTCon(unsigned int xid, struct cifs_ses *ses,
3818 const char *tree, struct cifs_tcon *tcon,
3819 const struct nls_table *nls_codepage)
3821 struct smb_hdr *smb_buffer;
3822 struct smb_hdr *smb_buffer_response;
3825 unsigned char *bcc_ptr;
3828 __u16 bytes_left, count;
3833 smb_buffer = cifs_buf_get();
3834 if (smb_buffer == NULL)
3837 smb_buffer_response = smb_buffer;
3839 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3840 NULL /*no tid */ , 4 /*wct */ );
3842 smb_buffer->Mid = GetNextMid(ses->server);
3843 smb_buffer->Uid = ses->Suid;
3844 pSMB = (TCONX_REQ *) smb_buffer;
3845 pSMBr = (TCONX_RSP *) smb_buffer_response;
3847 pSMB->AndXCommand = 0xFF;
3848 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3849 bcc_ptr = &pSMB->Password[0];
3850 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3851 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3852 *bcc_ptr = 0; /* password is null byte */
3853 bcc_ptr++; /* skip password */
3854 /* already aligned so no need to do it below */
3856 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3857 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3858 specified as required (when that support is added to
3859 the vfs in the future) as only NTLM or the much
3860 weaker LANMAN (which we do not send by default) is accepted
3861 by Samba (not sure whether other servers allow
3862 NTLMv2 password here) */
3863 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3864 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3865 (ses->server->secType == LANMAN))
3866 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3867 ses->server->sec_mode &
3868 SECMODE_PW_ENCRYPT ? true : false,
3871 #endif /* CIFS_WEAK_PW_HASH */
3872 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3873 bcc_ptr, nls_codepage);
3875 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3876 if (ses->capabilities & CAP_UNICODE) {
3877 /* must align unicode strings */
3878 *bcc_ptr = 0; /* null byte password */
3883 if (ses->server->sec_mode &
3884 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3885 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3887 if (ses->capabilities & CAP_STATUS32) {
3888 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3890 if (ses->capabilities & CAP_DFS) {
3891 smb_buffer->Flags2 |= SMBFLG2_DFS;
3893 if (ses->capabilities & CAP_UNICODE) {
3894 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3896 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3897 6 /* max utf8 char length in bytes */ *
3898 (/* server len*/ + 256 /* share len */), nls_codepage);
3899 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3900 bcc_ptr += 2; /* skip trailing null */
3901 } else { /* ASCII */
3902 strcpy(bcc_ptr, tree);
3903 bcc_ptr += strlen(tree) + 1;
3905 strcpy(bcc_ptr, "?????");
3906 bcc_ptr += strlen("?????");
3908 count = bcc_ptr - &pSMB->Password[0];
3909 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3910 pSMB->hdr.smb_buf_length) + count);
3911 pSMB->ByteCount = cpu_to_le16(count);
3913 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3916 /* above now done in SendReceive */
3917 if ((rc == 0) && (tcon != NULL)) {
3920 tcon->tidStatus = CifsGood;
3921 tcon->need_reconnect = false;
3922 tcon->tid = smb_buffer_response->Tid;
3923 bcc_ptr = pByteArea(smb_buffer_response);
3924 bytes_left = get_bcc(smb_buffer_response);
3925 length = strnlen(bcc_ptr, bytes_left - 2);
3926 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3932 /* skip service field (NB: this field is always ASCII) */
3934 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3935 (bcc_ptr[2] == 'C')) {
3936 cFYI(1, "IPC connection");
3939 } else if (length == 2) {
3940 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3941 /* the most common case */
3942 cFYI(1, "disk share connection");
3945 bcc_ptr += length + 1;
3946 bytes_left -= (length + 1);
3947 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3949 /* mostly informational -- no need to fail on error here */
3950 kfree(tcon->nativeFileSystem);
3951 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3952 bytes_left, is_unicode,
3955 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3957 if ((smb_buffer_response->WordCount == 3) ||
3958 (smb_buffer_response->WordCount == 7))
3959 /* field is in same location */
3960 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3963 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3964 } else if ((rc == 0) && tcon == NULL) {
3965 /* all we need to save for IPC$ connection */
3966 ses->ipc_tid = smb_buffer_response->Tid;
3969 cifs_buf_release(smb_buffer);
3974 cifs_umount(struct cifs_sb_info *cifs_sb)
3976 struct rb_root *root = &cifs_sb->tlink_tree;
3977 struct rb_node *node;
3978 struct tcon_link *tlink;
3980 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3982 spin_lock(&cifs_sb->tlink_tree_lock);
3983 while ((node = rb_first(root))) {
3984 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3985 cifs_get_tlink(tlink);
3986 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3987 rb_erase(node, root);
3989 spin_unlock(&cifs_sb->tlink_tree_lock);
3990 cifs_put_tlink(tlink);
3991 spin_lock(&cifs_sb->tlink_tree_lock);
3993 spin_unlock(&cifs_sb->tlink_tree_lock);
3995 bdi_destroy(&cifs_sb->bdi);
3996 kfree(cifs_sb->mountdata);
3997 unload_nls(cifs_sb->local_nls);
4001 int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses)
4004 struct TCP_Server_Info *server = ses->server;
4006 /* only send once per connect */
4007 if (server->maxBuf != 0)
4010 cifs_set_credits(server, 1);
4011 rc = CIFSSMBNegotiate(xid, ses);
4012 if (rc == -EAGAIN) {
4013 /* retry only once on 1st time connection */
4014 cifs_set_credits(server, 1);
4015 rc = CIFSSMBNegotiate(xid, ses);
4020 spin_lock(&GlobalMid_Lock);
4021 if (server->tcpStatus == CifsNeedNegotiate)
4022 server->tcpStatus = CifsGood;
4025 spin_unlock(&GlobalMid_Lock);
4033 int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
4034 struct nls_table *nls_info)
4037 struct TCP_Server_Info *server = ses->server;
4040 ses->capabilities = server->capabilities;
4041 if (linuxExtEnabled == 0)
4042 ses->capabilities &= (~CAP_UNIX);
4044 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
4045 server->sec_mode, server->capabilities, server->timeAdj);
4047 rc = CIFS_SessSetup(xid, ses, nls_info);
4049 cERROR(1, "Send error in SessSetup = %d", rc);
4051 mutex_lock(&ses->server->srv_mutex);
4052 if (!server->session_estab) {
4053 server->session_key.response = ses->auth_key.response;
4054 server->session_key.len = ses->auth_key.len;
4055 server->sequence_number = 0x2;
4056 server->session_estab = true;
4057 ses->auth_key.response = NULL;
4059 mutex_unlock(&server->srv_mutex);
4061 cFYI(1, "CIFS Session Established successfully");
4062 spin_lock(&GlobalMid_Lock);
4063 ses->status = CifsGood;
4064 ses->need_reconnect = false;
4065 spin_unlock(&GlobalMid_Lock);
4068 kfree(ses->auth_key.response);
4069 ses->auth_key.response = NULL;
4070 ses->auth_key.len = 0;
4071 kfree(ses->ntlmssp);
4072 ses->ntlmssp = NULL;
4078 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4080 switch (ses->server->secType) {
4082 vol->secFlg = CIFSSEC_MUST_KRB5;
4085 vol->secFlg = CIFSSEC_MUST_NTLMV2;
4088 vol->secFlg = CIFSSEC_MUST_NTLM;
4091 vol->secFlg = CIFSSEC_MUST_NTLMSSP;
4094 vol->secFlg = CIFSSEC_MUST_LANMAN;
4098 return cifs_set_cifscreds(vol, ses);
4101 static struct cifs_tcon *
4102 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
4105 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4106 struct cifs_ses *ses;
4107 struct cifs_tcon *tcon = NULL;
4108 struct smb_vol *vol_info;
4110 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4111 if (vol_info == NULL)
4112 return ERR_PTR(-ENOMEM);
4114 vol_info->local_nls = cifs_sb->local_nls;
4115 vol_info->linux_uid = fsuid;
4116 vol_info->cred_uid = fsuid;
4117 vol_info->UNC = master_tcon->treeName;
4118 vol_info->retry = master_tcon->retry;
4119 vol_info->nocase = master_tcon->nocase;
4120 vol_info->local_lease = master_tcon->local_lease;
4121 vol_info->no_linux_ext = !master_tcon->unix_ext;
4123 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4129 /* get a reference for the same TCP session */
4130 spin_lock(&cifs_tcp_ses_lock);
4131 ++master_tcon->ses->server->srv_count;
4132 spin_unlock(&cifs_tcp_ses_lock);
4134 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4136 tcon = (struct cifs_tcon *)ses;
4137 cifs_put_tcp_session(master_tcon->ses->server);
4141 tcon = cifs_get_tcon(ses, vol_info);
4143 cifs_put_smb_ses(ses);
4147 if (ses->capabilities & CAP_UNIX)
4148 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4150 kfree(vol_info->username);
4151 kfree(vol_info->password);
4158 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4160 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4164 cifs_sb_tcon_pending_wait(void *unused)
4167 return signal_pending(current) ? -ERESTARTSYS : 0;
4170 /* find and return a tlink with given uid */
4171 static struct tcon_link *
4172 tlink_rb_search(struct rb_root *root, uid_t uid)
4174 struct rb_node *node = root->rb_node;
4175 struct tcon_link *tlink;
4178 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4180 if (tlink->tl_uid > uid)
4181 node = node->rb_left;
4182 else if (tlink->tl_uid < uid)
4183 node = node->rb_right;
4190 /* insert a tcon_link into the tree */
4192 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4194 struct rb_node **new = &(root->rb_node), *parent = NULL;
4195 struct tcon_link *tlink;
4198 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4201 if (tlink->tl_uid > new_tlink->tl_uid)
4202 new = &((*new)->rb_left);
4204 new = &((*new)->rb_right);
4207 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4208 rb_insert_color(&new_tlink->tl_rbnode, root);
4212 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4215 * If the superblock doesn't refer to a multiuser mount, then just return
4216 * the master tcon for the mount.
4218 * First, search the rbtree for an existing tcon for this fsuid. If one
4219 * exists, then check to see if it's pending construction. If it is then wait
4220 * for construction to complete. Once it's no longer pending, check to see if
4221 * it failed and either return an error or retry construction, depending on
4224 * If one doesn't exist then insert a new tcon_link struct into the tree and
4225 * try to construct a new one.
4228 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4231 uid_t fsuid = current_fsuid();
4232 struct tcon_link *tlink, *newtlink;
4234 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4235 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4237 spin_lock(&cifs_sb->tlink_tree_lock);
4238 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4240 cifs_get_tlink(tlink);
4241 spin_unlock(&cifs_sb->tlink_tree_lock);
4243 if (tlink == NULL) {
4244 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4245 if (newtlink == NULL)
4246 return ERR_PTR(-ENOMEM);
4247 newtlink->tl_uid = fsuid;
4248 newtlink->tl_tcon = ERR_PTR(-EACCES);
4249 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4250 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4251 cifs_get_tlink(newtlink);
4253 spin_lock(&cifs_sb->tlink_tree_lock);
4254 /* was one inserted after previous search? */
4255 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4257 cifs_get_tlink(tlink);
4258 spin_unlock(&cifs_sb->tlink_tree_lock);
4260 goto wait_for_construction;
4263 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4264 spin_unlock(&cifs_sb->tlink_tree_lock);
4266 wait_for_construction:
4267 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4268 cifs_sb_tcon_pending_wait,
4269 TASK_INTERRUPTIBLE);
4271 cifs_put_tlink(tlink);
4272 return ERR_PTR(ret);
4275 /* if it's good, return it */
4276 if (!IS_ERR(tlink->tl_tcon))
4279 /* return error if we tried this already recently */
4280 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4281 cifs_put_tlink(tlink);
4282 return ERR_PTR(-EACCES);
4285 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4286 goto wait_for_construction;
4289 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4290 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4291 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4293 if (IS_ERR(tlink->tl_tcon)) {
4294 cifs_put_tlink(tlink);
4295 return ERR_PTR(-EACCES);
4302 * periodic workqueue job that scans tcon_tree for a superblock and closes
4306 cifs_prune_tlinks(struct work_struct *work)
4308 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4310 struct rb_root *root = &cifs_sb->tlink_tree;
4311 struct rb_node *node = rb_first(root);
4312 struct rb_node *tmp;
4313 struct tcon_link *tlink;
4316 * Because we drop the spinlock in the loop in order to put the tlink
4317 * it's not guarded against removal of links from the tree. The only
4318 * places that remove entries from the tree are this function and
4319 * umounts. Because this function is non-reentrant and is canceled
4320 * before umount can proceed, this is safe.
4322 spin_lock(&cifs_sb->tlink_tree_lock);
4323 node = rb_first(root);
4324 while (node != NULL) {
4326 node = rb_next(tmp);
4327 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4329 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4330 atomic_read(&tlink->tl_count) != 0 ||
4331 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4334 cifs_get_tlink(tlink);
4335 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4336 rb_erase(tmp, root);
4338 spin_unlock(&cifs_sb->tlink_tree_lock);
4339 cifs_put_tlink(tlink);
4340 spin_lock(&cifs_sb->tlink_tree_lock);
4342 spin_unlock(&cifs_sb->tlink_tree_lock);
4344 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,