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 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2187 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2188 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2191 * at this point we are the only ones with the pointer
2192 * to the struct since the kernel thread not created yet
2193 * no need to spinlock this init of tcpStatus or srv_count
2195 tcp_ses->tcpStatus = CifsNew;
2196 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2197 sizeof(tcp_ses->srcaddr));
2198 ++tcp_ses->srv_count;
2200 if (addr.ss_family == AF_INET6) {
2201 cFYI(1, "attempting ipv6 connect");
2202 /* BB should we allow ipv6 on port 139? */
2203 /* other OS never observed in Wild doing 139 with v6 */
2204 memcpy(&tcp_ses->dstaddr, sin_server6,
2205 sizeof(struct sockaddr_in6));
2207 memcpy(&tcp_ses->dstaddr, sin_server,
2208 sizeof(struct sockaddr_in));
2210 rc = ip_connect(tcp_ses);
2212 cERROR(1, "Error connecting to socket. Aborting operation");
2213 goto out_err_crypto_release;
2217 * since we're in a cifs function already, we know that
2218 * this will succeed. No need for try_module_get().
2220 __module_get(THIS_MODULE);
2221 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2223 if (IS_ERR(tcp_ses->tsk)) {
2224 rc = PTR_ERR(tcp_ses->tsk);
2225 cERROR(1, "error %d create cifsd thread", rc);
2226 module_put(THIS_MODULE);
2227 goto out_err_crypto_release;
2229 tcp_ses->tcpStatus = CifsNeedNegotiate;
2231 /* thread spawned, put it on the list */
2232 spin_lock(&cifs_tcp_ses_lock);
2233 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2234 spin_unlock(&cifs_tcp_ses_lock);
2236 cifs_fscache_get_client_cookie(tcp_ses);
2238 /* queue echo request delayed work */
2239 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
2243 out_err_crypto_release:
2244 cifs_crypto_shash_release(tcp_ses);
2246 put_net(cifs_net_ns(tcp_ses));
2250 if (!IS_ERR(tcp_ses->hostname))
2251 kfree(tcp_ses->hostname);
2252 if (tcp_ses->ssocket)
2253 sock_release(tcp_ses->ssocket);
2259 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2261 switch (ses->server->secType) {
2263 if (vol->cred_uid != ses->cred_uid)
2267 /* NULL username means anonymous session */
2268 if (ses->user_name == NULL) {
2274 /* anything else takes username/password */
2275 if (strncmp(ses->user_name,
2276 vol->username ? vol->username : "",
2279 if (strlen(vol->username) != 0 &&
2280 ses->password != NULL &&
2281 strncmp(ses->password,
2282 vol->password ? vol->password : "",
2289 static struct cifs_ses *
2290 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2292 struct cifs_ses *ses;
2294 spin_lock(&cifs_tcp_ses_lock);
2295 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2296 if (!match_session(ses, vol))
2299 spin_unlock(&cifs_tcp_ses_lock);
2302 spin_unlock(&cifs_tcp_ses_lock);
2307 cifs_put_smb_ses(struct cifs_ses *ses)
2310 struct TCP_Server_Info *server = ses->server;
2312 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
2313 spin_lock(&cifs_tcp_ses_lock);
2314 if (--ses->ses_count > 0) {
2315 spin_unlock(&cifs_tcp_ses_lock);
2319 list_del_init(&ses->smb_ses_list);
2320 spin_unlock(&cifs_tcp_ses_lock);
2322 if (ses->status == CifsGood) {
2324 CIFSSMBLogoff(xid, ses);
2328 cifs_put_tcp_session(server);
2333 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2334 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2336 /* Populate username and pw fields from keyring if possible */
2338 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2341 char *desc, *delim, *payload;
2344 struct TCP_Server_Info *server = ses->server;
2345 struct sockaddr_in *sa;
2346 struct sockaddr_in6 *sa6;
2347 struct user_key_payload *upayload;
2349 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2353 /* try to find an address key first */
2354 switch (server->dstaddr.ss_family) {
2356 sa = (struct sockaddr_in *)&server->dstaddr;
2357 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2360 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2361 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2364 cFYI(1, "Bad ss_family (%hu)", server->dstaddr.ss_family);
2369 cFYI(1, "%s: desc=%s", __func__, desc);
2370 key = request_key(&key_type_logon, desc, "");
2372 if (!ses->domainName) {
2373 cFYI(1, "domainName is NULL");
2378 /* didn't work, try to find a domain key */
2379 sprintf(desc, "cifs:d:%s", ses->domainName);
2380 cFYI(1, "%s: desc=%s", __func__, desc);
2381 key = request_key(&key_type_logon, desc, "");
2388 down_read(&key->sem);
2389 upayload = key->payload.data;
2390 if (IS_ERR_OR_NULL(upayload)) {
2391 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2395 /* find first : in payload */
2396 payload = (char *)upayload->data;
2397 delim = strnchr(payload, upayload->datalen, ':');
2398 cFYI(1, "payload=%s", payload);
2400 cFYI(1, "Unable to find ':' in payload (datalen=%d)",
2406 len = delim - payload;
2407 if (len > MAX_USERNAME_SIZE || len <= 0) {
2408 cFYI(1, "Bad value from username search (len=%zd)", len);
2413 vol->username = kstrndup(payload, len, GFP_KERNEL);
2414 if (!vol->username) {
2415 cFYI(1, "Unable to allocate %zd bytes for username", len);
2419 cFYI(1, "%s: username=%s", __func__, vol->username);
2421 len = key->datalen - (len + 1);
2422 if (len > MAX_PASSWORD_SIZE || len <= 0) {
2423 cFYI(1, "Bad len for password search (len=%zd)", len);
2425 kfree(vol->username);
2426 vol->username = NULL;
2431 vol->password = kstrndup(delim, len, GFP_KERNEL);
2432 if (!vol->password) {
2433 cFYI(1, "Unable to allocate %zd bytes for password", len);
2435 kfree(vol->username);
2436 vol->username = NULL;
2445 cFYI(1, "%s: returning %d", __func__, rc);
2448 #else /* ! CONFIG_KEYS */
2450 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2451 struct cifs_ses *ses __attribute__((unused)))
2455 #endif /* CONFIG_KEYS */
2457 static bool warned_on_ntlm; /* globals init to false automatically */
2459 static struct cifs_ses *
2460 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2462 int rc = -ENOMEM, xid;
2463 struct cifs_ses *ses;
2464 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2465 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2469 ses = cifs_find_smb_ses(server, volume_info);
2471 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2473 mutex_lock(&ses->session_mutex);
2474 rc = cifs_negotiate_protocol(xid, ses);
2476 mutex_unlock(&ses->session_mutex);
2477 /* problem -- put our ses reference */
2478 cifs_put_smb_ses(ses);
2482 if (ses->need_reconnect) {
2483 cFYI(1, "Session needs reconnect");
2484 rc = cifs_setup_session(xid, ses,
2485 volume_info->local_nls);
2487 mutex_unlock(&ses->session_mutex);
2488 /* problem -- put our reference */
2489 cifs_put_smb_ses(ses);
2494 mutex_unlock(&ses->session_mutex);
2496 /* existing SMB ses has a server reference already */
2497 cifs_put_tcp_session(server);
2502 cFYI(1, "Existing smb sess not found");
2503 ses = sesInfoAlloc();
2507 /* new SMB session uses our server ref */
2508 ses->server = server;
2509 if (server->dstaddr.ss_family == AF_INET6)
2510 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2512 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2514 if (volume_info->username) {
2515 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2516 if (!ses->user_name)
2520 /* volume_info->password freed at unmount */
2521 if (volume_info->password) {
2522 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2526 if (volume_info->domainname) {
2527 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2528 if (!ses->domainName)
2531 ses->cred_uid = volume_info->cred_uid;
2532 ses->linux_uid = volume_info->linux_uid;
2534 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2535 supported for many years, time to update default security mechanism */
2536 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2537 warned_on_ntlm = true;
2538 cERROR(1, "default security mechanism requested. The default "
2539 "security mechanism will be upgraded from ntlm to "
2540 "ntlmv2 in kernel release 3.3");
2542 ses->overrideSecFlg = volume_info->secFlg;
2544 mutex_lock(&ses->session_mutex);
2545 rc = cifs_negotiate_protocol(xid, ses);
2547 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2548 mutex_unlock(&ses->session_mutex);
2552 /* success, put it on the list */
2553 spin_lock(&cifs_tcp_ses_lock);
2554 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2555 spin_unlock(&cifs_tcp_ses_lock);
2566 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2568 if (tcon->tidStatus == CifsExiting)
2570 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2575 static struct cifs_tcon *
2576 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2578 struct list_head *tmp;
2579 struct cifs_tcon *tcon;
2581 spin_lock(&cifs_tcp_ses_lock);
2582 list_for_each(tmp, &ses->tcon_list) {
2583 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2584 if (!match_tcon(tcon, unc))
2587 spin_unlock(&cifs_tcp_ses_lock);
2590 spin_unlock(&cifs_tcp_ses_lock);
2595 cifs_put_tcon(struct cifs_tcon *tcon)
2598 struct cifs_ses *ses = tcon->ses;
2600 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2601 spin_lock(&cifs_tcp_ses_lock);
2602 if (--tcon->tc_count > 0) {
2603 spin_unlock(&cifs_tcp_ses_lock);
2607 list_del_init(&tcon->tcon_list);
2608 spin_unlock(&cifs_tcp_ses_lock);
2611 CIFSSMBTDis(xid, tcon);
2614 cifs_fscache_release_super_cookie(tcon);
2616 cifs_put_smb_ses(ses);
2619 static struct cifs_tcon *
2620 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2623 struct cifs_tcon *tcon;
2625 tcon = cifs_find_tcon(ses, volume_info->UNC);
2627 cFYI(1, "Found match on UNC path");
2628 /* existing tcon already has a reference */
2629 cifs_put_smb_ses(ses);
2630 if (tcon->seal != volume_info->seal)
2631 cERROR(1, "transport encryption setting "
2632 "conflicts with existing tid");
2636 tcon = tconInfoAlloc();
2643 if (volume_info->password) {
2644 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2645 if (!tcon->password) {
2651 if (strchr(volume_info->UNC + 3, '\\') == NULL
2652 && strchr(volume_info->UNC + 3, '/') == NULL) {
2653 cERROR(1, "Missing share name");
2658 /* BB Do we need to wrap session_mutex around
2659 * this TCon call and Unix SetFS as
2660 * we do on SessSetup and reconnect? */
2662 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2664 cFYI(1, "CIFS Tcon rc = %d", rc);
2668 if (volume_info->nodfs) {
2669 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2670 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2672 tcon->seal = volume_info->seal;
2673 /* we can have only one retry value for a connection
2674 to a share so for resources mounted more than once
2675 to the same server share the last value passed in
2676 for the retry flag is used */
2677 tcon->retry = volume_info->retry;
2678 tcon->nocase = volume_info->nocase;
2679 tcon->local_lease = volume_info->local_lease;
2681 spin_lock(&cifs_tcp_ses_lock);
2682 list_add(&tcon->tcon_list, &ses->tcon_list);
2683 spin_unlock(&cifs_tcp_ses_lock);
2685 cifs_fscache_get_super_cookie(tcon);
2695 cifs_put_tlink(struct tcon_link *tlink)
2697 if (!tlink || IS_ERR(tlink))
2700 if (!atomic_dec_and_test(&tlink->tl_count) ||
2701 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2702 tlink->tl_time = jiffies;
2706 if (!IS_ERR(tlink_tcon(tlink)))
2707 cifs_put_tcon(tlink_tcon(tlink));
2712 static inline struct tcon_link *
2713 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2715 return cifs_sb->master_tlink;
2719 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2721 struct cifs_sb_info *old = CIFS_SB(sb);
2722 struct cifs_sb_info *new = mnt_data->cifs_sb;
2724 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2727 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2728 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2732 * We want to share sb only if we don't specify an r/wsize or
2733 * specified r/wsize is greater than or equal to existing one.
2735 if (new->wsize && new->wsize < old->wsize)
2738 if (new->rsize && new->rsize < old->rsize)
2741 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2744 if (old->mnt_file_mode != new->mnt_file_mode ||
2745 old->mnt_dir_mode != new->mnt_dir_mode)
2748 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2751 if (old->actimeo != new->actimeo)
2758 cifs_match_super(struct super_block *sb, void *data)
2760 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2761 struct smb_vol *volume_info;
2762 struct cifs_sb_info *cifs_sb;
2763 struct TCP_Server_Info *tcp_srv;
2764 struct cifs_ses *ses;
2765 struct cifs_tcon *tcon;
2766 struct tcon_link *tlink;
2767 struct sockaddr_storage addr;
2770 memset(&addr, 0, sizeof(struct sockaddr_storage));
2772 spin_lock(&cifs_tcp_ses_lock);
2773 cifs_sb = CIFS_SB(sb);
2774 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2775 if (IS_ERR(tlink)) {
2776 spin_unlock(&cifs_tcp_ses_lock);
2779 tcon = tlink_tcon(tlink);
2781 tcp_srv = ses->server;
2783 volume_info = mnt_data->vol;
2785 if (!volume_info->UNCip || !volume_info->UNC)
2788 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2790 strlen(volume_info->UNCip),
2795 if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2796 !match_session(ses, volume_info) ||
2797 !match_tcon(tcon, volume_info->UNC)) {
2802 rc = compare_mount_options(sb, mnt_data);
2804 spin_unlock(&cifs_tcp_ses_lock);
2805 cifs_put_tlink(tlink);
2810 get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path,
2811 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
2812 struct dfs_info3_param **preferrals, int remap)
2817 *pnum_referrals = 0;
2820 if (pSesInfo->ipc_tid == 0) {
2821 temp_unc = kmalloc(2 /* for slashes */ +
2822 strnlen(pSesInfo->serverName,
2823 SERVER_NAME_LEN_WITH_NULL * 2)
2824 + 1 + 4 /* slash IPC$ */ + 2,
2826 if (temp_unc == NULL)
2830 strcpy(temp_unc + 2, pSesInfo->serverName);
2831 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2832 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
2833 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
2837 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
2838 pnum_referrals, nls_codepage, remap);
2839 /* BB map targetUNCs to dfs_info3 structures, here or
2840 in CIFSGetDFSRefer BB */
2845 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2846 static struct lock_class_key cifs_key[2];
2847 static struct lock_class_key cifs_slock_key[2];
2850 cifs_reclassify_socket4(struct socket *sock)
2852 struct sock *sk = sock->sk;
2853 BUG_ON(sock_owned_by_user(sk));
2854 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2855 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2859 cifs_reclassify_socket6(struct socket *sock)
2861 struct sock *sk = sock->sk;
2862 BUG_ON(sock_owned_by_user(sk));
2863 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2864 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2868 cifs_reclassify_socket4(struct socket *sock)
2873 cifs_reclassify_socket6(struct socket *sock)
2878 /* See RFC1001 section 14 on representation of Netbios names */
2879 static void rfc1002mangle(char *target, char *source, unsigned int length)
2883 for (i = 0, j = 0; i < (length); i++) {
2884 /* mask a nibble at a time and encode */
2885 target[j] = 'A' + (0x0F & (source[i] >> 4));
2886 target[j+1] = 'A' + (0x0F & source[i]);
2893 bind_socket(struct TCP_Server_Info *server)
2896 if (server->srcaddr.ss_family != AF_UNSPEC) {
2897 /* Bind to the specified local IP address */
2898 struct socket *socket = server->ssocket;
2899 rc = socket->ops->bind(socket,
2900 (struct sockaddr *) &server->srcaddr,
2901 sizeof(server->srcaddr));
2903 struct sockaddr_in *saddr4;
2904 struct sockaddr_in6 *saddr6;
2905 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2906 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2907 if (saddr6->sin6_family == AF_INET6)
2909 "Failed to bind to: %pI6c, error: %d\n",
2910 &saddr6->sin6_addr, rc);
2913 "Failed to bind to: %pI4, error: %d\n",
2914 &saddr4->sin_addr.s_addr, rc);
2921 ip_rfc1001_connect(struct TCP_Server_Info *server)
2925 * some servers require RFC1001 sessinit before sending
2926 * negprot - BB check reconnection in case where second
2927 * sessinit is sent but no second negprot
2929 struct rfc1002_session_packet *ses_init_buf;
2930 struct smb_hdr *smb_buf;
2931 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2934 ses_init_buf->trailer.session_req.called_len = 32;
2936 if (server->server_RFC1001_name &&
2937 server->server_RFC1001_name[0] != 0)
2938 rfc1002mangle(ses_init_buf->trailer.
2939 session_req.called_name,
2940 server->server_RFC1001_name,
2941 RFC1001_NAME_LEN_WITH_NULL);
2943 rfc1002mangle(ses_init_buf->trailer.
2944 session_req.called_name,
2945 DEFAULT_CIFS_CALLED_NAME,
2946 RFC1001_NAME_LEN_WITH_NULL);
2948 ses_init_buf->trailer.session_req.calling_len = 32;
2951 * calling name ends in null (byte 16) from old smb
2954 if (server->workstation_RFC1001_name &&
2955 server->workstation_RFC1001_name[0] != 0)
2956 rfc1002mangle(ses_init_buf->trailer.
2957 session_req.calling_name,
2958 server->workstation_RFC1001_name,
2959 RFC1001_NAME_LEN_WITH_NULL);
2961 rfc1002mangle(ses_init_buf->trailer.
2962 session_req.calling_name,
2964 RFC1001_NAME_LEN_WITH_NULL);
2966 ses_init_buf->trailer.session_req.scope1 = 0;
2967 ses_init_buf->trailer.session_req.scope2 = 0;
2968 smb_buf = (struct smb_hdr *)ses_init_buf;
2970 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2971 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2972 rc = smb_send(server, smb_buf, 0x44);
2973 kfree(ses_init_buf);
2975 * RFC1001 layer in at least one server
2976 * requires very short break before negprot
2977 * presumably because not expecting negprot
2978 * to follow so fast. This is a simple
2979 * solution that works without
2980 * complicating the code and causes no
2981 * significant slowing down on mount
2984 usleep_range(1000, 2000);
2987 * else the negprot may still work without this
2988 * even though malloc failed
2995 generic_ip_connect(struct TCP_Server_Info *server)
3000 struct socket *socket = server->ssocket;
3001 struct sockaddr *saddr;
3003 saddr = (struct sockaddr *) &server->dstaddr;
3005 if (server->dstaddr.ss_family == AF_INET6) {
3006 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3007 slen = sizeof(struct sockaddr_in6);
3010 sport = ((struct sockaddr_in *) saddr)->sin_port;
3011 slen = sizeof(struct sockaddr_in);
3015 if (socket == NULL) {
3016 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3017 IPPROTO_TCP, &socket, 1);
3019 cERROR(1, "Error %d creating socket", rc);
3020 server->ssocket = NULL;
3024 /* BB other socket options to set KEEPALIVE, NODELAY? */
3025 cFYI(1, "Socket created");
3026 server->ssocket = socket;
3027 socket->sk->sk_allocation = GFP_NOFS;
3028 if (sfamily == AF_INET6)
3029 cifs_reclassify_socket6(socket);
3031 cifs_reclassify_socket4(socket);
3034 rc = bind_socket(server);
3039 * Eventually check for other socket options to change from
3040 * the default. sock_setsockopt not used because it expects
3043 socket->sk->sk_rcvtimeo = 7 * HZ;
3044 socket->sk->sk_sndtimeo = 5 * HZ;
3046 /* make the bufsizes depend on wsize/rsize and max requests */
3047 if (server->noautotune) {
3048 if (socket->sk->sk_sndbuf < (200 * 1024))
3049 socket->sk->sk_sndbuf = 200 * 1024;
3050 if (socket->sk->sk_rcvbuf < (140 * 1024))
3051 socket->sk->sk_rcvbuf = 140 * 1024;
3054 if (server->tcp_nodelay) {
3056 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3057 (char *)&val, sizeof(val));
3059 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
3062 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
3063 socket->sk->sk_sndbuf,
3064 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3066 rc = socket->ops->connect(socket, saddr, slen, 0);
3068 cFYI(1, "Error %d connecting to server", rc);
3069 sock_release(socket);
3070 server->ssocket = NULL;
3074 if (sport == htons(RFC1001_PORT))
3075 rc = ip_rfc1001_connect(server);
3081 ip_connect(struct TCP_Server_Info *server)
3084 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3085 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3087 if (server->dstaddr.ss_family == AF_INET6)
3088 sport = &addr6->sin6_port;
3090 sport = &addr->sin_port;
3095 /* try with 445 port at first */
3096 *sport = htons(CIFS_PORT);
3098 rc = generic_ip_connect(server);
3102 /* if it failed, try with 139 port */
3103 *sport = htons(RFC1001_PORT);
3106 return generic_ip_connect(server);
3109 void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
3110 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3112 /* if we are reconnecting then should we check to see if
3113 * any requested capabilities changed locally e.g. via
3114 * remount but we can not do much about it here
3115 * if they have (even if we could detect it by the following)
3116 * Perhaps we could add a backpointer to array of sb from tcon
3117 * or if we change to make all sb to same share the same
3118 * sb as NFS - then we only have one backpointer to sb.
3119 * What if we wanted to mount the server share twice once with
3120 * and once without posixacls or posix paths? */
3121 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3123 if (vol_info && vol_info->no_linux_ext) {
3124 tcon->fsUnixInfo.Capability = 0;
3125 tcon->unix_ext = 0; /* Unix Extensions disabled */
3126 cFYI(1, "Linux protocol extensions disabled");
3128 } else if (vol_info)
3129 tcon->unix_ext = 1; /* Unix Extensions supported */
3131 if (tcon->unix_ext == 0) {
3132 cFYI(1, "Unix extensions disabled so not set on reconnect");
3136 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3137 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3138 cFYI(1, "unix caps which server supports %lld", cap);
3139 /* check for reconnect case in which we do not
3140 want to change the mount behavior if we can avoid it */
3141 if (vol_info == NULL) {
3142 /* turn off POSIX ACL and PATHNAMES if not set
3143 originally at mount time */
3144 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3145 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3146 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3147 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3148 cERROR(1, "POSIXPATH support change");
3149 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3150 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3151 cERROR(1, "possible reconnect error");
3152 cERROR(1, "server disabled POSIX path support");
3156 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3157 cERROR(1, "per-share encryption not supported yet");
3159 cap &= CIFS_UNIX_CAP_MASK;
3160 if (vol_info && vol_info->no_psx_acl)
3161 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3162 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3163 cFYI(1, "negotiated posix acl support");
3165 cifs_sb->mnt_cifs_flags |=
3166 CIFS_MOUNT_POSIXACL;
3169 if (vol_info && vol_info->posix_paths == 0)
3170 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3171 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3172 cFYI(1, "negotiate posix pathnames");
3174 cifs_sb->mnt_cifs_flags |=
3175 CIFS_MOUNT_POSIX_PATHS;
3178 cFYI(1, "Negotiate caps 0x%x", (int)cap);
3179 #ifdef CONFIG_CIFS_DEBUG2
3180 if (cap & CIFS_UNIX_FCNTL_CAP)
3181 cFYI(1, "FCNTL cap");
3182 if (cap & CIFS_UNIX_EXTATTR_CAP)
3183 cFYI(1, "EXTATTR cap");
3184 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3185 cFYI(1, "POSIX path cap");
3186 if (cap & CIFS_UNIX_XATTR_CAP)
3187 cFYI(1, "XATTR cap");
3188 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3189 cFYI(1, "POSIX ACL cap");
3190 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3191 cFYI(1, "very large read cap");
3192 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3193 cFYI(1, "very large write cap");
3194 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3195 cFYI(1, "transport encryption cap");
3196 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3197 cFYI(1, "mandatory transport encryption cap");
3198 #endif /* CIFS_DEBUG2 */
3199 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3200 if (vol_info == NULL) {
3201 cFYI(1, "resetting capabilities failed");
3203 cERROR(1, "Negotiating Unix capabilities "
3204 "with the server failed. Consider "
3205 "mounting with the Unix Extensions\n"
3206 "disabled, if problems are found, "
3207 "by specifying the nounix mount "
3214 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3215 struct cifs_sb_info *cifs_sb)
3217 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3219 spin_lock_init(&cifs_sb->tlink_tree_lock);
3220 cifs_sb->tlink_tree = RB_ROOT;
3223 * Temporarily set r/wsize for matching superblock. If we end up using
3224 * new sb then client will later negotiate it downward if needed.
3226 cifs_sb->rsize = pvolume_info->rsize;
3227 cifs_sb->wsize = pvolume_info->wsize;
3229 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3230 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3231 if (pvolume_info->backupuid_specified)
3232 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3233 if (pvolume_info->backupgid_specified)
3234 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3235 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3236 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3237 cFYI(1, "file mode: 0x%hx dir mode: 0x%hx",
3238 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3240 cifs_sb->actimeo = pvolume_info->actimeo;
3241 cifs_sb->local_nls = pvolume_info->local_nls;
3243 if (pvolume_info->noperm)
3244 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3245 if (pvolume_info->setuids)
3246 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3247 if (pvolume_info->server_ino)
3248 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3249 if (pvolume_info->remap)
3250 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3251 if (pvolume_info->no_xattr)
3252 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3253 if (pvolume_info->sfu_emul)
3254 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3255 if (pvolume_info->nobrl)
3256 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3257 if (pvolume_info->nostrictsync)
3258 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3259 if (pvolume_info->mand_lock)
3260 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3261 if (pvolume_info->rwpidforward)
3262 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3263 if (pvolume_info->cifs_acl)
3264 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3265 if (pvolume_info->backupuid_specified)
3266 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3267 if (pvolume_info->backupgid_specified)
3268 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3269 if (pvolume_info->override_uid)
3270 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3271 if (pvolume_info->override_gid)
3272 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3273 if (pvolume_info->dynperm)
3274 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3275 if (pvolume_info->fsc)
3276 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3277 if (pvolume_info->multiuser)
3278 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3279 CIFS_MOUNT_NO_PERM);
3280 if (pvolume_info->strict_io)
3281 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3282 if (pvolume_info->direct_io) {
3283 cFYI(1, "mounting share using direct i/o");
3284 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3286 if (pvolume_info->mfsymlinks) {
3287 if (pvolume_info->sfu_emul) {
3288 cERROR(1, "mount option mfsymlinks ignored if sfu "
3289 "mount option is used");
3291 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3295 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3296 cERROR(1, "mount option dynperm ignored if cifsacl "
3297 "mount option supported");
3301 * When the server supports very large reads and writes via POSIX extensions,
3302 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
3303 * including the RFC1001 length.
3305 * Note that this might make for "interesting" allocation problems during
3306 * writeback however as we have to allocate an array of pointers for the
3307 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
3309 * For reads, there is a similar problem as we need to allocate an array
3310 * of kvecs to handle the receive, though that should only need to be done
3313 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
3314 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
3317 * When the server doesn't allow large posix writes, only allow a rsize/wsize
3318 * of 2^17-1 minus the size of the call header. That allows for a read or
3319 * write up to the maximum size described by RFC1002.
3321 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
3322 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
3325 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
3326 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
3327 * a single wsize request with a single call.
3329 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
3332 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
3333 * those values when posix extensions aren't in force. In actuality here, we
3334 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
3335 * to be ok with the extra byte even though Windows doesn't send writes that
3340 * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
3342 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
3343 #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
3346 cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
3348 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3349 struct TCP_Server_Info *server = tcon->ses->server;
3352 /* start with specified wsize, or default */
3353 if (pvolume_info->wsize)
3354 wsize = pvolume_info->wsize;
3355 else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
3356 wsize = CIFS_DEFAULT_IOSIZE;
3358 wsize = CIFS_DEFAULT_NON_POSIX_WSIZE;
3360 /* can server support 24-bit write sizes? (via UNIX extensions) */
3361 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
3362 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
3365 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
3366 * Limit it to max buffer offered by the server, minus the size of the
3367 * WRITEX header, not including the 4 byte RFC1001 length.
3369 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
3370 (!(server->capabilities & CAP_UNIX) &&
3371 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
3372 wsize = min_t(unsigned int, wsize,
3373 server->maxBuf - sizeof(WRITE_REQ) + 4);
3375 /* hard limit of CIFS_MAX_WSIZE */
3376 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
3382 cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
3384 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3385 struct TCP_Server_Info *server = tcon->ses->server;
3386 unsigned int rsize, defsize;
3389 * Set default value...
3391 * HACK alert! Ancient servers have very small buffers. Even though
3392 * MS-CIFS indicates that servers are only limited by the client's
3393 * bufsize for reads, testing against win98se shows that it throws
3394 * INVALID_PARAMETER errors if you try to request too large a read.
3396 * If the server advertises a MaxBufferSize of less than one page,
3397 * assume that it also can't satisfy reads larger than that either.
3399 * FIXME: Is there a better heuristic for this?
3401 if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP))
3402 defsize = CIFS_DEFAULT_IOSIZE;
3403 else if (server->capabilities & CAP_LARGE_READ_X)
3404 defsize = CIFS_DEFAULT_NON_POSIX_RSIZE;
3405 else if (server->maxBuf >= PAGE_CACHE_SIZE)
3406 defsize = CIFSMaxBufSize;
3408 defsize = server->maxBuf - sizeof(READ_RSP);
3410 rsize = pvolume_info->rsize ? pvolume_info->rsize : defsize;
3413 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
3414 * the client's MaxBufferSize.
3416 if (!(server->capabilities & CAP_LARGE_READ_X))
3417 rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
3419 /* hard limit of CIFS_MAX_RSIZE */
3420 rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
3426 is_path_accessible(int xid, struct cifs_tcon *tcon,
3427 struct cifs_sb_info *cifs_sb, const char *full_path)
3430 FILE_ALL_INFO *pfile_info;
3432 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
3433 if (pfile_info == NULL)
3436 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
3437 0 /* not legacy */, cifs_sb->local_nls,
3438 cifs_sb->mnt_cifs_flags &
3439 CIFS_MOUNT_MAP_SPECIAL_CHR);
3441 if (rc == -EOPNOTSUPP || rc == -EINVAL)
3442 rc = SMBQueryInformation(xid, tcon, full_path, pfile_info,
3443 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
3444 CIFS_MOUNT_MAP_SPECIAL_CHR);
3450 cleanup_volume_info_contents(struct smb_vol *volume_info)
3452 kfree(volume_info->username);
3453 kzfree(volume_info->password);
3454 if (volume_info->UNCip != volume_info->UNC + 2)
3455 kfree(volume_info->UNCip);
3456 kfree(volume_info->UNC);
3457 kfree(volume_info->domainname);
3458 kfree(volume_info->iocharset);
3459 kfree(volume_info->prepath);
3463 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3467 cleanup_volume_info_contents(volume_info);
3472 #ifdef CONFIG_CIFS_DFS_UPCALL
3473 /* build_path_to_root returns full path to root when
3474 * we do not have an exiting connection (tcon) */
3476 build_unc_path_to_root(const struct smb_vol *vol,
3477 const struct cifs_sb_info *cifs_sb)
3479 char *full_path, *pos;
3480 unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
3481 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3483 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3484 if (full_path == NULL)
3485 return ERR_PTR(-ENOMEM);
3487 strncpy(full_path, vol->UNC, unc_len);
3488 pos = full_path + unc_len;
3491 strncpy(pos, vol->prepath, pplen);
3495 *pos = '\0'; /* add trailing null */
3496 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3497 cFYI(1, "%s: full_path=%s", __func__, full_path);
3502 * Perform a dfs referral query for a share and (optionally) prefix
3504 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3505 * to a string containing updated options for the submount. Otherwise it
3506 * will be left untouched.
3508 * Returns the rc from get_dfs_path to the caller, which can be used to
3509 * determine whether there were referrals.
3512 expand_dfs_referral(int xid, struct cifs_ses *pSesInfo,
3513 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3517 unsigned int num_referrals = 0;
3518 struct dfs_info3_param *referrals = NULL;
3519 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3521 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3522 if (IS_ERR(full_path))
3523 return PTR_ERR(full_path);
3525 /* For DFS paths, skip the first '\' of the UNC */
3526 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3528 rc = get_dfs_path(xid, pSesInfo , ref_path, cifs_sb->local_nls,
3529 &num_referrals, &referrals,
3530 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3532 if (!rc && num_referrals > 0) {
3533 char *fake_devname = NULL;
3535 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3536 full_path + 1, referrals,
3539 free_dfs_info_array(referrals, num_referrals);
3541 if (IS_ERR(mdata)) {
3542 rc = PTR_ERR(mdata);
3545 cleanup_volume_info_contents(volume_info);
3546 memset(volume_info, '\0', sizeof(*volume_info));
3547 rc = cifs_setup_volume_info(volume_info, mdata,
3550 kfree(fake_devname);
3551 kfree(cifs_sb->mountdata);
3552 cifs_sb->mountdata = mdata;
3560 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3561 const char *devname)
3565 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3568 if (volume_info->nullauth) {
3569 cFYI(1, "Anonymous login");
3570 kfree(volume_info->username);
3571 volume_info->username = NULL;
3572 } else if (volume_info->username) {
3573 /* BB fixme parse for domain name here */
3574 cFYI(1, "Username: %s", volume_info->username);
3576 cifserror("No username specified");
3577 /* In userspace mount helper we can get user name from alternate
3578 locations such as env variables and files on disk */
3582 /* this is needed for ASCII cp to Unicode converts */
3583 if (volume_info->iocharset == NULL) {
3584 /* load_nls_default cannot return null */
3585 volume_info->local_nls = load_nls_default();
3587 volume_info->local_nls = load_nls(volume_info->iocharset);
3588 if (volume_info->local_nls == NULL) {
3589 cERROR(1, "CIFS mount error: iocharset %s not found",
3590 volume_info->iocharset);
3599 cifs_get_volume_info(char *mount_data, const char *devname)
3602 struct smb_vol *volume_info;
3604 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3606 return ERR_PTR(-ENOMEM);
3608 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3610 cifs_cleanup_volume_info(volume_info);
3611 volume_info = ERR_PTR(rc);
3617 /* make sure ra_pages is a multiple of rsize */
3618 static inline unsigned int
3619 cifs_ra_pages(struct cifs_sb_info *cifs_sb)
3622 unsigned int rsize_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3624 if (rsize_pages >= default_backing_dev_info.ra_pages)
3625 return default_backing_dev_info.ra_pages;
3626 else if (rsize_pages == 0)
3629 reads = default_backing_dev_info.ra_pages / rsize_pages;
3630 return reads * rsize_pages;
3634 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3638 struct cifs_ses *pSesInfo;
3639 struct cifs_tcon *tcon;
3640 struct TCP_Server_Info *srvTcp;
3642 struct tcon_link *tlink;
3643 #ifdef CONFIG_CIFS_DFS_UPCALL
3644 int referral_walks_count = 0;
3647 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3651 #ifdef CONFIG_CIFS_DFS_UPCALL
3653 /* cleanup activities if we're chasing a referral */
3654 if (referral_walks_count) {
3656 cifs_put_tcon(tcon);
3658 cifs_put_smb_ses(pSesInfo);
3672 /* get a reference to a tcp session */
3673 srvTcp = cifs_get_tcp_session(volume_info);
3674 if (IS_ERR(srvTcp)) {
3675 rc = PTR_ERR(srvTcp);
3676 bdi_destroy(&cifs_sb->bdi);
3680 /* get a reference to a SMB session */
3681 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
3682 if (IS_ERR(pSesInfo)) {
3683 rc = PTR_ERR(pSesInfo);
3685 goto mount_fail_check;
3688 /* search for existing tcon to this server share */
3689 tcon = cifs_get_tcon(pSesInfo, volume_info);
3693 goto remote_path_check;
3696 /* tell server which Unix caps we support */
3697 if (tcon->ses->capabilities & CAP_UNIX) {
3698 /* reset of caps checks mount to see if unix extensions
3699 disabled for just this mount */
3700 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3701 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3702 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3703 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3705 goto mount_fail_check;
3708 tcon->unix_ext = 0; /* server does not support them */
3710 /* do not care if following two calls succeed - informational */
3712 CIFSSMBQFSDeviceInfo(xid, tcon);
3713 CIFSSMBQFSAttributeInfo(xid, tcon);
3716 cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3717 cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info);
3719 /* tune readahead according to rsize */
3720 cifs_sb->bdi.ra_pages = cifs_ra_pages(cifs_sb);
3723 #ifdef CONFIG_CIFS_DFS_UPCALL
3725 * Perform an unconditional check for whether there are DFS
3726 * referrals for this path without prefix, to provide support
3727 * for DFS referrals from w2k8 servers which don't seem to respond
3728 * with PATH_NOT_COVERED to requests that include the prefix.
3729 * Chase the referral if found, otherwise continue normally.
3731 if (referral_walks_count == 0) {
3732 int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
3735 referral_walks_count++;
3736 goto try_mount_again;
3741 /* check if a whole path is not remote */
3743 /* build_path_to_root works only when we have a valid tcon */
3744 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3745 if (full_path == NULL) {
3747 goto mount_fail_check;
3749 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
3750 if (rc != 0 && rc != -EREMOTE) {
3752 goto mount_fail_check;
3757 /* get referral if needed */
3758 if (rc == -EREMOTE) {
3759 #ifdef CONFIG_CIFS_DFS_UPCALL
3760 if (referral_walks_count > MAX_NESTED_LINKS) {
3762 * BB: when we implement proper loop detection,
3763 * we will remove this check. But now we need it
3764 * to prevent an indefinite loop if 'DFS tree' is
3765 * misconfigured (i.e. has loops).
3768 goto mount_fail_check;
3771 rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb,
3775 referral_walks_count++;
3776 goto try_mount_again;
3778 goto mount_fail_check;
3779 #else /* No DFS support, return error on mount */
3785 goto mount_fail_check;
3787 /* now, hang the tcon off of the superblock */
3788 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3789 if (tlink == NULL) {
3791 goto mount_fail_check;
3794 tlink->tl_uid = pSesInfo->linux_uid;
3795 tlink->tl_tcon = tcon;
3796 tlink->tl_time = jiffies;
3797 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3798 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3800 cifs_sb->master_tlink = tlink;
3801 spin_lock(&cifs_sb->tlink_tree_lock);
3802 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3803 spin_unlock(&cifs_sb->tlink_tree_lock);
3805 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3809 /* on error free sesinfo and tcon struct if needed */
3811 /* If find_unc succeeded then rc == 0 so we can not end */
3812 /* up accidentally freeing someone elses tcon struct */
3814 cifs_put_tcon(tcon);
3816 cifs_put_smb_ses(pSesInfo);
3818 cifs_put_tcp_session(srvTcp);
3819 bdi_destroy(&cifs_sb->bdi);
3828 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3829 * pointer may be NULL.
3832 CIFSTCon(unsigned int xid, struct cifs_ses *ses,
3833 const char *tree, struct cifs_tcon *tcon,
3834 const struct nls_table *nls_codepage)
3836 struct smb_hdr *smb_buffer;
3837 struct smb_hdr *smb_buffer_response;
3840 unsigned char *bcc_ptr;
3843 __u16 bytes_left, count;
3848 smb_buffer = cifs_buf_get();
3849 if (smb_buffer == NULL)
3852 smb_buffer_response = smb_buffer;
3854 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3855 NULL /*no tid */ , 4 /*wct */ );
3857 smb_buffer->Mid = GetNextMid(ses->server);
3858 smb_buffer->Uid = ses->Suid;
3859 pSMB = (TCONX_REQ *) smb_buffer;
3860 pSMBr = (TCONX_RSP *) smb_buffer_response;
3862 pSMB->AndXCommand = 0xFF;
3863 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3864 bcc_ptr = &pSMB->Password[0];
3865 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3866 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3867 *bcc_ptr = 0; /* password is null byte */
3868 bcc_ptr++; /* skip password */
3869 /* already aligned so no need to do it below */
3871 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3872 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3873 specified as required (when that support is added to
3874 the vfs in the future) as only NTLM or the much
3875 weaker LANMAN (which we do not send by default) is accepted
3876 by Samba (not sure whether other servers allow
3877 NTLMv2 password here) */
3878 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3879 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3880 (ses->server->secType == LANMAN))
3881 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3882 ses->server->sec_mode &
3883 SECMODE_PW_ENCRYPT ? true : false,
3886 #endif /* CIFS_WEAK_PW_HASH */
3887 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3888 bcc_ptr, nls_codepage);
3890 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3891 if (ses->capabilities & CAP_UNICODE) {
3892 /* must align unicode strings */
3893 *bcc_ptr = 0; /* null byte password */
3898 if (ses->server->sec_mode &
3899 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3900 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3902 if (ses->capabilities & CAP_STATUS32) {
3903 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3905 if (ses->capabilities & CAP_DFS) {
3906 smb_buffer->Flags2 |= SMBFLG2_DFS;
3908 if (ses->capabilities & CAP_UNICODE) {
3909 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3911 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3912 6 /* max utf8 char length in bytes */ *
3913 (/* server len*/ + 256 /* share len */), nls_codepage);
3914 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3915 bcc_ptr += 2; /* skip trailing null */
3916 } else { /* ASCII */
3917 strcpy(bcc_ptr, tree);
3918 bcc_ptr += strlen(tree) + 1;
3920 strcpy(bcc_ptr, "?????");
3921 bcc_ptr += strlen("?????");
3923 count = bcc_ptr - &pSMB->Password[0];
3924 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3925 pSMB->hdr.smb_buf_length) + count);
3926 pSMB->ByteCount = cpu_to_le16(count);
3928 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3931 /* above now done in SendReceive */
3932 if ((rc == 0) && (tcon != NULL)) {
3935 tcon->tidStatus = CifsGood;
3936 tcon->need_reconnect = false;
3937 tcon->tid = smb_buffer_response->Tid;
3938 bcc_ptr = pByteArea(smb_buffer_response);
3939 bytes_left = get_bcc(smb_buffer_response);
3940 length = strnlen(bcc_ptr, bytes_left - 2);
3941 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3947 /* skip service field (NB: this field is always ASCII) */
3949 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3950 (bcc_ptr[2] == 'C')) {
3951 cFYI(1, "IPC connection");
3954 } else if (length == 2) {
3955 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3956 /* the most common case */
3957 cFYI(1, "disk share connection");
3960 bcc_ptr += length + 1;
3961 bytes_left -= (length + 1);
3962 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3964 /* mostly informational -- no need to fail on error here */
3965 kfree(tcon->nativeFileSystem);
3966 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3967 bytes_left, is_unicode,
3970 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3972 if ((smb_buffer_response->WordCount == 3) ||
3973 (smb_buffer_response->WordCount == 7))
3974 /* field is in same location */
3975 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3978 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3979 } else if ((rc == 0) && tcon == NULL) {
3980 /* all we need to save for IPC$ connection */
3981 ses->ipc_tid = smb_buffer_response->Tid;
3984 cifs_buf_release(smb_buffer);
3989 cifs_umount(struct cifs_sb_info *cifs_sb)
3991 struct rb_root *root = &cifs_sb->tlink_tree;
3992 struct rb_node *node;
3993 struct tcon_link *tlink;
3995 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3997 spin_lock(&cifs_sb->tlink_tree_lock);
3998 while ((node = rb_first(root))) {
3999 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4000 cifs_get_tlink(tlink);
4001 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4002 rb_erase(node, root);
4004 spin_unlock(&cifs_sb->tlink_tree_lock);
4005 cifs_put_tlink(tlink);
4006 spin_lock(&cifs_sb->tlink_tree_lock);
4008 spin_unlock(&cifs_sb->tlink_tree_lock);
4010 bdi_destroy(&cifs_sb->bdi);
4011 kfree(cifs_sb->mountdata);
4012 unload_nls(cifs_sb->local_nls);
4016 int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses)
4019 struct TCP_Server_Info *server = ses->server;
4021 /* only send once per connect */
4022 if (server->maxBuf != 0)
4025 cifs_set_credits(server, 1);
4026 rc = CIFSSMBNegotiate(xid, ses);
4027 if (rc == -EAGAIN) {
4028 /* retry only once on 1st time connection */
4029 cifs_set_credits(server, 1);
4030 rc = CIFSSMBNegotiate(xid, ses);
4035 spin_lock(&GlobalMid_Lock);
4036 if (server->tcpStatus == CifsNeedNegotiate)
4037 server->tcpStatus = CifsGood;
4040 spin_unlock(&GlobalMid_Lock);
4048 int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
4049 struct nls_table *nls_info)
4052 struct TCP_Server_Info *server = ses->server;
4055 ses->capabilities = server->capabilities;
4056 if (linuxExtEnabled == 0)
4057 ses->capabilities &= (~CAP_UNIX);
4059 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
4060 server->sec_mode, server->capabilities, server->timeAdj);
4062 rc = CIFS_SessSetup(xid, ses, nls_info);
4064 cERROR(1, "Send error in SessSetup = %d", rc);
4066 mutex_lock(&ses->server->srv_mutex);
4067 if (!server->session_estab) {
4068 server->session_key.response = ses->auth_key.response;
4069 server->session_key.len = ses->auth_key.len;
4070 server->sequence_number = 0x2;
4071 server->session_estab = true;
4072 ses->auth_key.response = NULL;
4074 mutex_unlock(&server->srv_mutex);
4076 cFYI(1, "CIFS Session Established successfully");
4077 spin_lock(&GlobalMid_Lock);
4078 ses->status = CifsGood;
4079 ses->need_reconnect = false;
4080 spin_unlock(&GlobalMid_Lock);
4083 kfree(ses->auth_key.response);
4084 ses->auth_key.response = NULL;
4085 ses->auth_key.len = 0;
4086 kfree(ses->ntlmssp);
4087 ses->ntlmssp = NULL;
4093 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4095 switch (ses->server->secType) {
4097 vol->secFlg = CIFSSEC_MUST_KRB5;
4100 vol->secFlg = CIFSSEC_MUST_NTLMV2;
4103 vol->secFlg = CIFSSEC_MUST_NTLM;
4106 vol->secFlg = CIFSSEC_MUST_NTLMSSP;
4109 vol->secFlg = CIFSSEC_MUST_LANMAN;
4113 return cifs_set_cifscreds(vol, ses);
4116 static struct cifs_tcon *
4117 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
4120 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4121 struct cifs_ses *ses;
4122 struct cifs_tcon *tcon = NULL;
4123 struct smb_vol *vol_info;
4125 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4126 if (vol_info == NULL)
4127 return ERR_PTR(-ENOMEM);
4129 vol_info->local_nls = cifs_sb->local_nls;
4130 vol_info->linux_uid = fsuid;
4131 vol_info->cred_uid = fsuid;
4132 vol_info->UNC = master_tcon->treeName;
4133 vol_info->retry = master_tcon->retry;
4134 vol_info->nocase = master_tcon->nocase;
4135 vol_info->local_lease = master_tcon->local_lease;
4136 vol_info->no_linux_ext = !master_tcon->unix_ext;
4138 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4144 /* get a reference for the same TCP session */
4145 spin_lock(&cifs_tcp_ses_lock);
4146 ++master_tcon->ses->server->srv_count;
4147 spin_unlock(&cifs_tcp_ses_lock);
4149 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4151 tcon = (struct cifs_tcon *)ses;
4152 cifs_put_tcp_session(master_tcon->ses->server);
4156 tcon = cifs_get_tcon(ses, vol_info);
4158 cifs_put_smb_ses(ses);
4162 if (ses->capabilities & CAP_UNIX)
4163 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4165 kfree(vol_info->username);
4166 kfree(vol_info->password);
4173 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4175 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4179 cifs_sb_tcon_pending_wait(void *unused)
4182 return signal_pending(current) ? -ERESTARTSYS : 0;
4185 /* find and return a tlink with given uid */
4186 static struct tcon_link *
4187 tlink_rb_search(struct rb_root *root, uid_t uid)
4189 struct rb_node *node = root->rb_node;
4190 struct tcon_link *tlink;
4193 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4195 if (tlink->tl_uid > uid)
4196 node = node->rb_left;
4197 else if (tlink->tl_uid < uid)
4198 node = node->rb_right;
4205 /* insert a tcon_link into the tree */
4207 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4209 struct rb_node **new = &(root->rb_node), *parent = NULL;
4210 struct tcon_link *tlink;
4213 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4216 if (tlink->tl_uid > new_tlink->tl_uid)
4217 new = &((*new)->rb_left);
4219 new = &((*new)->rb_right);
4222 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4223 rb_insert_color(&new_tlink->tl_rbnode, root);
4227 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4230 * If the superblock doesn't refer to a multiuser mount, then just return
4231 * the master tcon for the mount.
4233 * First, search the rbtree for an existing tcon for this fsuid. If one
4234 * exists, then check to see if it's pending construction. If it is then wait
4235 * for construction to complete. Once it's no longer pending, check to see if
4236 * it failed and either return an error or retry construction, depending on
4239 * If one doesn't exist then insert a new tcon_link struct into the tree and
4240 * try to construct a new one.
4243 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4246 uid_t fsuid = current_fsuid();
4247 struct tcon_link *tlink, *newtlink;
4249 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4250 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4252 spin_lock(&cifs_sb->tlink_tree_lock);
4253 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4255 cifs_get_tlink(tlink);
4256 spin_unlock(&cifs_sb->tlink_tree_lock);
4258 if (tlink == NULL) {
4259 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4260 if (newtlink == NULL)
4261 return ERR_PTR(-ENOMEM);
4262 newtlink->tl_uid = fsuid;
4263 newtlink->tl_tcon = ERR_PTR(-EACCES);
4264 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4265 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4266 cifs_get_tlink(newtlink);
4268 spin_lock(&cifs_sb->tlink_tree_lock);
4269 /* was one inserted after previous search? */
4270 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4272 cifs_get_tlink(tlink);
4273 spin_unlock(&cifs_sb->tlink_tree_lock);
4275 goto wait_for_construction;
4278 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4279 spin_unlock(&cifs_sb->tlink_tree_lock);
4281 wait_for_construction:
4282 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4283 cifs_sb_tcon_pending_wait,
4284 TASK_INTERRUPTIBLE);
4286 cifs_put_tlink(tlink);
4287 return ERR_PTR(ret);
4290 /* if it's good, return it */
4291 if (!IS_ERR(tlink->tl_tcon))
4294 /* return error if we tried this already recently */
4295 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4296 cifs_put_tlink(tlink);
4297 return ERR_PTR(-EACCES);
4300 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4301 goto wait_for_construction;
4304 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4305 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4306 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4308 if (IS_ERR(tlink->tl_tcon)) {
4309 cifs_put_tlink(tlink);
4310 return ERR_PTR(-EACCES);
4317 * periodic workqueue job that scans tcon_tree for a superblock and closes
4321 cifs_prune_tlinks(struct work_struct *work)
4323 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4325 struct rb_root *root = &cifs_sb->tlink_tree;
4326 struct rb_node *node = rb_first(root);
4327 struct rb_node *tmp;
4328 struct tcon_link *tlink;
4331 * Because we drop the spinlock in the loop in order to put the tlink
4332 * it's not guarded against removal of links from the tree. The only
4333 * places that remove entries from the tree are this function and
4334 * umounts. Because this function is non-reentrant and is canceled
4335 * before umount can proceed, this is safe.
4337 spin_lock(&cifs_sb->tlink_tree_lock);
4338 node = rb_first(root);
4339 while (node != NULL) {
4341 node = rb_next(tmp);
4342 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4344 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4345 atomic_read(&tlink->tl_count) != 0 ||
4346 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4349 cifs_get_tlink(tlink);
4350 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4351 rb_erase(tmp, root);
4353 spin_unlock(&cifs_sb->tlink_tree_lock);
4354 cifs_put_tlink(tlink);
4355 spin_lock(&cifs_sb->tlink_tree_lock);
4357 spin_unlock(&cifs_sb->tlink_tree_lock);
4359 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,