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
,
105 Opt_ver
, Opt_vers
, Opt_sec
, Opt_cache
,
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
, "directio" },
168 { Opt_direct
, "forcedirectio" },
169 { Opt_strictcache
, "strictcache" },
170 { Opt_noac
, "noac" },
172 { Opt_mfsymlinks
, "mfsymlinks" },
173 { Opt_multiuser
, "multiuser" },
174 { Opt_sloppy
, "sloppy" },
176 { Opt_backupuid
, "backupuid=%s" },
177 { Opt_backupgid
, "backupgid=%s" },
178 { Opt_uid
, "uid=%s" },
179 { Opt_cruid
, "cruid=%s" },
180 { Opt_gid
, "gid=%s" },
181 { Opt_file_mode
, "file_mode=%s" },
182 { Opt_dirmode
, "dirmode=%s" },
183 { Opt_dirmode
, "dir_mode=%s" },
184 { Opt_port
, "port=%s" },
185 { Opt_rsize
, "rsize=%s" },
186 { Opt_wsize
, "wsize=%s" },
187 { Opt_actimeo
, "actimeo=%s" },
189 { Opt_blank_user
, "user=" },
190 { Opt_blank_user
, "username=" },
191 { Opt_user
, "user=%s" },
192 { Opt_user
, "username=%s" },
193 { Opt_blank_pass
, "pass=" },
194 { Opt_pass
, "pass=%s" },
195 { Opt_pass
, "password=%s" },
196 { Opt_blank_ip
, "ip=" },
197 { Opt_blank_ip
, "addr=" },
199 { Opt_ip
, "addr=%s" },
200 { Opt_unc
, "unc=%s" },
201 { Opt_unc
, "target=%s" },
202 { Opt_unc
, "path=%s" },
203 { Opt_domain
, "dom=%s" },
204 { Opt_domain
, "domain=%s" },
205 { Opt_domain
, "workgroup=%s" },
206 { Opt_srcaddr
, "srcaddr=%s" },
207 { Opt_prefixpath
, "prefixpath=%s" },
208 { Opt_iocharset
, "iocharset=%s" },
209 { Opt_sockopt
, "sockopt=%s" },
210 { Opt_netbiosname
, "netbiosname=%s" },
211 { Opt_servern
, "servern=%s" },
212 { Opt_ver
, "ver=%s" },
213 { Opt_vers
, "vers=%s" },
214 { Opt_sec
, "sec=%s" },
215 { Opt_cache
, "cache=%s" },
217 { Opt_ignore
, "cred" },
218 { Opt_ignore
, "credentials" },
219 { Opt_ignore
, "cred=%s" },
220 { Opt_ignore
, "credentials=%s" },
221 { Opt_ignore
, "guest" },
222 { Opt_ignore
, "rw" },
223 { Opt_ignore
, "ro" },
224 { Opt_ignore
, "suid" },
225 { Opt_ignore
, "nosuid" },
226 { Opt_ignore
, "exec" },
227 { Opt_ignore
, "noexec" },
228 { Opt_ignore
, "nodev" },
229 { Opt_ignore
, "noauto" },
230 { Opt_ignore
, "dev" },
231 { Opt_ignore
, "mand" },
232 { Opt_ignore
, "nomand" },
233 { Opt_ignore
, "_netdev" },
239 Opt_sec_krb5
, Opt_sec_krb5i
, Opt_sec_krb5p
,
240 Opt_sec_ntlmsspi
, Opt_sec_ntlmssp
,
241 Opt_ntlm
, Opt_sec_ntlmi
, Opt_sec_ntlmv2i
,
242 Opt_sec_nontlm
, Opt_sec_lanman
,
248 static const match_table_t cifs_secflavor_tokens
= {
249 { Opt_sec_krb5
, "krb5" },
250 { Opt_sec_krb5i
, "krb5i" },
251 { Opt_sec_krb5p
, "krb5p" },
252 { Opt_sec_ntlmsspi
, "ntlmsspi" },
253 { Opt_sec_ntlmssp
, "ntlmssp" },
254 { Opt_ntlm
, "ntlm" },
255 { Opt_sec_ntlmi
, "ntlmi" },
256 { Opt_sec_ntlmv2i
, "ntlmv2i" },
257 { Opt_sec_nontlm
, "nontlm" },
258 { Opt_sec_lanman
, "lanman" },
259 { Opt_sec_none
, "none" },
261 { Opt_sec_err
, NULL
}
272 static const match_table_t cifs_cacheflavor_tokens
= {
273 { Opt_cache_loose
, "loose" },
274 { Opt_cache_strict
, "strict" },
275 { Opt_cache_none
, "none" },
276 { Opt_cache_err
, NULL
}
279 static const match_table_t cifs_smb_version_tokens
= {
280 { Smb_1
, SMB1_VERSION_STRING
},
283 static int ip_connect(struct TCP_Server_Info
*server
);
284 static int generic_ip_connect(struct TCP_Server_Info
*server
);
285 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
286 static void cifs_prune_tlinks(struct work_struct
*work
);
287 static int cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
288 const char *devname
);
291 * cifs tcp session reconnection
293 * mark tcp session as reconnecting so temporarily locked
294 * mark all smb sessions as reconnecting for tcp session
295 * reconnect tcp session
296 * wake up waiters on reconnection? - (not needed currently)
299 cifs_reconnect(struct TCP_Server_Info
*server
)
302 struct list_head
*tmp
, *tmp2
;
303 struct cifs_ses
*ses
;
304 struct cifs_tcon
*tcon
;
305 struct mid_q_entry
*mid_entry
;
306 struct list_head retry_list
;
308 spin_lock(&GlobalMid_Lock
);
309 if (server
->tcpStatus
== CifsExiting
) {
310 /* the demux thread will exit normally
311 next time through the loop */
312 spin_unlock(&GlobalMid_Lock
);
315 server
->tcpStatus
= CifsNeedReconnect
;
316 spin_unlock(&GlobalMid_Lock
);
319 cFYI(1, "Reconnecting tcp session");
321 /* before reconnecting the tcp session, mark the smb session (uid)
322 and the tid bad so they are not used until reconnected */
323 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__
);
324 spin_lock(&cifs_tcp_ses_lock
);
325 list_for_each(tmp
, &server
->smb_ses_list
) {
326 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
327 ses
->need_reconnect
= true;
329 list_for_each(tmp2
, &ses
->tcon_list
) {
330 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
331 tcon
->need_reconnect
= true;
334 spin_unlock(&cifs_tcp_ses_lock
);
336 /* do not want to be sending data on a socket we are freeing */
337 cFYI(1, "%s: tearing down socket", __func__
);
338 mutex_lock(&server
->srv_mutex
);
339 if (server
->ssocket
) {
340 cFYI(1, "State: 0x%x Flags: 0x%lx", server
->ssocket
->state
,
341 server
->ssocket
->flags
);
342 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
343 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
344 server
->ssocket
->state
,
345 server
->ssocket
->flags
);
346 sock_release(server
->ssocket
);
347 server
->ssocket
= NULL
;
349 server
->sequence_number
= 0;
350 server
->session_estab
= false;
351 kfree(server
->session_key
.response
);
352 server
->session_key
.response
= NULL
;
353 server
->session_key
.len
= 0;
354 server
->lstrp
= jiffies
;
355 mutex_unlock(&server
->srv_mutex
);
357 /* mark submitted MIDs for retry and issue callback */
358 INIT_LIST_HEAD(&retry_list
);
359 cFYI(1, "%s: moving mids to private list", __func__
);
360 spin_lock(&GlobalMid_Lock
);
361 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
362 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
363 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
364 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
365 list_move(&mid_entry
->qhead
, &retry_list
);
367 spin_unlock(&GlobalMid_Lock
);
369 cFYI(1, "%s: issuing mid callbacks", __func__
);
370 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
371 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
372 list_del_init(&mid_entry
->qhead
);
373 mid_entry
->callback(mid_entry
);
379 /* we should try only the port we connected to before */
380 rc
= generic_ip_connect(server
);
382 cFYI(1, "reconnect error %d", rc
);
385 atomic_inc(&tcpSesReconnectCount
);
386 spin_lock(&GlobalMid_Lock
);
387 if (server
->tcpStatus
!= CifsExiting
)
388 server
->tcpStatus
= CifsNeedNegotiate
;
389 spin_unlock(&GlobalMid_Lock
);
391 } while (server
->tcpStatus
== CifsNeedReconnect
);
398 0 not a transact2, or all data present
399 >0 transact2 with that much data missing
400 -EINVAL = invalid transact2
403 static int check2ndT2(char *buf
)
405 struct smb_hdr
*pSMB
= (struct smb_hdr
*)buf
;
406 struct smb_t2_rsp
*pSMBt
;
408 __u16 total_data_size
, data_in_this_rsp
;
410 if (pSMB
->Command
!= SMB_COM_TRANSACTION2
)
413 /* check for plausible wct, bcc and t2 data and parm sizes */
414 /* check for parm and data offset going beyond end of smb */
415 if (pSMB
->WordCount
!= 10) { /* coalesce_t2 depends on this */
416 cFYI(1, "invalid transact2 word count");
420 pSMBt
= (struct smb_t2_rsp
*)pSMB
;
422 total_data_size
= get_unaligned_le16(&pSMBt
->t2_rsp
.TotalDataCount
);
423 data_in_this_rsp
= get_unaligned_le16(&pSMBt
->t2_rsp
.DataCount
);
425 if (total_data_size
== data_in_this_rsp
)
427 else if (total_data_size
< data_in_this_rsp
) {
428 cFYI(1, "total data %d smaller than data in frame %d",
429 total_data_size
, data_in_this_rsp
);
433 remaining
= total_data_size
- data_in_this_rsp
;
435 cFYI(1, "missing %d bytes from transact2, check next response",
437 if (total_data_size
> CIFSMaxBufSize
) {
438 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
439 total_data_size
, CIFSMaxBufSize
);
445 static int coalesce_t2(char *second_buf
, struct smb_hdr
*target_hdr
)
447 struct smb_t2_rsp
*pSMBs
= (struct smb_t2_rsp
*)second_buf
;
448 struct smb_t2_rsp
*pSMBt
= (struct smb_t2_rsp
*)target_hdr
;
449 char *data_area_of_tgt
;
450 char *data_area_of_src
;
452 unsigned int byte_count
, total_in_tgt
;
453 __u16 tgt_total_cnt
, src_total_cnt
, total_in_src
;
455 src_total_cnt
= get_unaligned_le16(&pSMBs
->t2_rsp
.TotalDataCount
);
456 tgt_total_cnt
= get_unaligned_le16(&pSMBt
->t2_rsp
.TotalDataCount
);
458 if (tgt_total_cnt
!= src_total_cnt
)
459 cFYI(1, "total data count of primary and secondary t2 differ "
460 "source=%hu target=%hu", src_total_cnt
, tgt_total_cnt
);
462 total_in_tgt
= get_unaligned_le16(&pSMBt
->t2_rsp
.DataCount
);
464 remaining
= tgt_total_cnt
- total_in_tgt
;
467 cFYI(1, "Server sent too much data. tgt_total_cnt=%hu "
468 "total_in_tgt=%hu", tgt_total_cnt
, total_in_tgt
);
472 if (remaining
== 0) {
473 /* nothing to do, ignore */
474 cFYI(1, "no more data remains");
478 total_in_src
= get_unaligned_le16(&pSMBs
->t2_rsp
.DataCount
);
479 if (remaining
< total_in_src
)
480 cFYI(1, "transact2 2nd response contains too much data");
482 /* find end of first SMB data area */
483 data_area_of_tgt
= (char *)&pSMBt
->hdr
.Protocol
+
484 get_unaligned_le16(&pSMBt
->t2_rsp
.DataOffset
);
486 /* validate target area */
487 data_area_of_src
= (char *)&pSMBs
->hdr
.Protocol
+
488 get_unaligned_le16(&pSMBs
->t2_rsp
.DataOffset
);
490 data_area_of_tgt
+= total_in_tgt
;
492 total_in_tgt
+= total_in_src
;
493 /* is the result too big for the field? */
494 if (total_in_tgt
> USHRT_MAX
) {
495 cFYI(1, "coalesced DataCount too large (%u)", total_in_tgt
);
498 put_unaligned_le16(total_in_tgt
, &pSMBt
->t2_rsp
.DataCount
);
501 byte_count
= get_bcc(target_hdr
);
502 byte_count
+= total_in_src
;
503 /* is the result too big for the field? */
504 if (byte_count
> USHRT_MAX
) {
505 cFYI(1, "coalesced BCC too large (%u)", byte_count
);
508 put_bcc(byte_count
, target_hdr
);
510 byte_count
= be32_to_cpu(target_hdr
->smb_buf_length
);
511 byte_count
+= total_in_src
;
512 /* don't allow buffer to overflow */
513 if (byte_count
> CIFSMaxBufSize
+ MAX_CIFS_HDR_SIZE
- 4) {
514 cFYI(1, "coalesced BCC exceeds buffer size (%u)", byte_count
);
517 target_hdr
->smb_buf_length
= cpu_to_be32(byte_count
);
519 /* copy second buffer into end of first buffer */
520 memcpy(data_area_of_tgt
, data_area_of_src
, total_in_src
);
522 if (remaining
!= total_in_src
) {
523 /* more responses to go */
524 cFYI(1, "waiting for more secondary responses");
529 cFYI(1, "found the last secondary response");
534 cifs_echo_request(struct work_struct
*work
)
537 struct TCP_Server_Info
*server
= container_of(work
,
538 struct TCP_Server_Info
, echo
.work
);
541 * We cannot send an echo until the NEGOTIATE_PROTOCOL request is
542 * done, which is indicated by maxBuf != 0. Also, no need to ping if
543 * we got a response recently
545 if (server
->maxBuf
== 0 ||
546 time_before(jiffies
, server
->lstrp
+ SMB_ECHO_INTERVAL
- HZ
))
549 rc
= CIFSSMBEcho(server
);
551 cFYI(1, "Unable to send echo request to server: %s",
555 queue_delayed_work(cifsiod_wq
, &server
->echo
, SMB_ECHO_INTERVAL
);
559 allocate_buffers(struct TCP_Server_Info
*server
)
561 if (!server
->bigbuf
) {
562 server
->bigbuf
= (char *)cifs_buf_get();
563 if (!server
->bigbuf
) {
564 cERROR(1, "No memory for large SMB response");
566 /* retry will check if exiting */
569 } else if (server
->large_buf
) {
570 /* we are reusing a dirty large buf, clear its start */
571 memset(server
->bigbuf
, 0, header_size());
574 if (!server
->smallbuf
) {
575 server
->smallbuf
= (char *)cifs_small_buf_get();
576 if (!server
->smallbuf
) {
577 cERROR(1, "No memory for SMB response");
579 /* retry will check if exiting */
582 /* beginning of smb buffer is cleared in our buf_get */
584 /* if existing small buf clear beginning */
585 memset(server
->smallbuf
, 0, header_size());
592 server_unresponsive(struct TCP_Server_Info
*server
)
595 * We need to wait 2 echo intervals to make sure we handle such
597 * 1s client sends a normal SMB request
598 * 2s client gets a response
599 * 30s echo workqueue job pops, and decides we got a response recently
600 * and don't need to send another
602 * 65s kernel_recvmsg times out, and we see that we haven't gotten
603 * a response in >60s.
605 if (server
->tcpStatus
== CifsGood
&&
606 time_after(jiffies
, server
->lstrp
+ 2 * SMB_ECHO_INTERVAL
)) {
607 cERROR(1, "Server %s has not responded in %d seconds. "
608 "Reconnecting...", server
->hostname
,
609 (2 * SMB_ECHO_INTERVAL
) / HZ
);
610 cifs_reconnect(server
);
611 wake_up(&server
->response_q
);
619 * kvec_array_init - clone a kvec array, and advance into it
620 * @new: pointer to memory for cloned array
621 * @iov: pointer to original array
622 * @nr_segs: number of members in original array
623 * @bytes: number of bytes to advance into the cloned array
625 * This function will copy the array provided in iov to a section of memory
626 * and advance the specified number of bytes into the new array. It returns
627 * the number of segments in the new array. "new" must be at least as big as
628 * the original iov array.
631 kvec_array_init(struct kvec
*new, struct kvec
*iov
, unsigned int nr_segs
,
636 while (bytes
|| !iov
->iov_len
) {
637 int copy
= min(bytes
, iov
->iov_len
);
641 if (iov
->iov_len
== base
) {
647 memcpy(new, iov
, sizeof(*iov
) * nr_segs
);
648 new->iov_base
+= base
;
649 new->iov_len
-= base
;
654 get_server_iovec(struct TCP_Server_Info
*server
, unsigned int nr_segs
)
656 struct kvec
*new_iov
;
658 if (server
->iov
&& nr_segs
<= server
->nr_iov
)
661 /* not big enough -- allocate a new one and release the old */
662 new_iov
= kmalloc(sizeof(*new_iov
) * nr_segs
, GFP_NOFS
);
665 server
->iov
= new_iov
;
666 server
->nr_iov
= nr_segs
;
672 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct kvec
*iov_orig
,
673 unsigned int nr_segs
, unsigned int to_read
)
678 struct msghdr smb_msg
;
681 iov
= get_server_iovec(server
, nr_segs
);
685 smb_msg
.msg_control
= NULL
;
686 smb_msg
.msg_controllen
= 0;
688 for (total_read
= 0; to_read
; total_read
+= length
, to_read
-= length
) {
691 if (server_unresponsive(server
)) {
692 total_read
= -EAGAIN
;
696 segs
= kvec_array_init(iov
, iov_orig
, nr_segs
, total_read
);
698 length
= kernel_recvmsg(server
->ssocket
, &smb_msg
,
699 iov
, segs
, to_read
, 0);
701 if (server
->tcpStatus
== CifsExiting
) {
702 total_read
= -ESHUTDOWN
;
704 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
705 cifs_reconnect(server
);
706 total_read
= -EAGAIN
;
708 } else if (length
== -ERESTARTSYS
||
712 * Minimum sleep to prevent looping, allowing socket
713 * to clear and app threads to set tcpStatus
714 * CifsNeedReconnect if server hung.
716 usleep_range(1000, 2000);
719 } else if (length
<= 0) {
720 cFYI(1, "Received no data or error: expecting %d "
721 "got %d", to_read
, length
);
722 cifs_reconnect(server
);
723 total_read
= -EAGAIN
;
731 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
732 unsigned int to_read
)
737 iov
.iov_len
= to_read
;
739 return cifs_readv_from_socket(server
, &iov
, 1, to_read
);
743 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
746 * The first byte big endian of the length field,
747 * is actually not part of the length but the type
748 * with the most common, zero, as regular data.
751 case RFC1002_SESSION_MESSAGE
:
752 /* Regular SMB response */
754 case RFC1002_SESSION_KEEP_ALIVE
:
755 cFYI(1, "RFC 1002 session keep alive");
757 case RFC1002_POSITIVE_SESSION_RESPONSE
:
758 cFYI(1, "RFC 1002 positive session response");
760 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
762 * We get this from Windows 98 instead of an error on
763 * SMB negprot response.
765 cFYI(1, "RFC 1002 negative session response");
766 /* give server a second to clean up */
769 * Always try 445 first on reconnect since we get NACK
770 * on some if we ever connected to port 139 (the NACK
771 * is since we do not begin with RFC1001 session
774 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
775 cifs_reconnect(server
);
776 wake_up(&server
->response_q
);
779 cERROR(1, "RFC 1002 unknown response type 0x%x", type
);
780 cifs_reconnect(server
);
786 static struct mid_q_entry
*
787 find_mid(struct TCP_Server_Info
*server
, char *buffer
)
789 struct smb_hdr
*buf
= (struct smb_hdr
*)buffer
;
790 struct mid_q_entry
*mid
;
792 spin_lock(&GlobalMid_Lock
);
793 list_for_each_entry(mid
, &server
->pending_mid_q
, qhead
) {
794 if (mid
->mid
== buf
->Mid
&&
795 mid
->mid_state
== MID_REQUEST_SUBMITTED
&&
796 le16_to_cpu(mid
->command
) == buf
->Command
) {
797 spin_unlock(&GlobalMid_Lock
);
801 spin_unlock(&GlobalMid_Lock
);
806 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
808 #ifdef CONFIG_CIFS_STATS2
809 mid
->when_received
= jiffies
;
811 spin_lock(&GlobalMid_Lock
);
813 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
815 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
816 list_del_init(&mid
->qhead
);
817 spin_unlock(&GlobalMid_Lock
);
821 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
822 char *buf
, int malformed
)
824 if (malformed
== 0 && check2ndT2(buf
) > 0) {
825 mid
->multiRsp
= true;
827 /* merge response - fix up 1st*/
828 malformed
= coalesce_t2(buf
, mid
->resp_buf
);
832 /* All parts received or packet is malformed. */
833 mid
->multiEnd
= true;
834 return dequeue_mid(mid
, malformed
);
836 if (!server
->large_buf
) {
837 /*FIXME: switch to already allocated largebuf?*/
838 cERROR(1, "1st trans2 resp needs bigbuf");
840 /* Have first buffer */
842 mid
->large_buf
= true;
843 server
->bigbuf
= NULL
;
848 mid
->large_buf
= server
->large_buf
;
849 /* Was previous buf put in mpx struct for multi-rsp? */
850 if (!mid
->multiRsp
) {
851 /* smb buffer will be freed by user thread */
852 if (server
->large_buf
)
853 server
->bigbuf
= NULL
;
855 server
->smallbuf
= NULL
;
857 dequeue_mid(mid
, malformed
);
860 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
864 /* take it off the list, if it's not already */
865 spin_lock(&cifs_tcp_ses_lock
);
866 list_del_init(&server
->tcp_ses_list
);
867 spin_unlock(&cifs_tcp_ses_lock
);
869 spin_lock(&GlobalMid_Lock
);
870 server
->tcpStatus
= CifsExiting
;
871 spin_unlock(&GlobalMid_Lock
);
872 wake_up_all(&server
->response_q
);
874 /* check if we have blocked requests that need to free */
875 spin_lock(&server
->req_lock
);
876 if (server
->credits
<= 0)
878 spin_unlock(&server
->req_lock
);
880 * Although there should not be any requests blocked on this queue it
881 * can not hurt to be paranoid and try to wake up requests that may
882 * haven been blocked when more than 50 at time were on the wire to the
883 * same server - they now will see the session is in exit state and get
884 * out of SendReceive.
886 wake_up_all(&server
->request_q
);
887 /* give those requests time to exit */
890 if (server
->ssocket
) {
891 sock_release(server
->ssocket
);
892 server
->ssocket
= NULL
;
895 if (!list_empty(&server
->pending_mid_q
)) {
896 struct list_head dispose_list
;
897 struct mid_q_entry
*mid_entry
;
898 struct list_head
*tmp
, *tmp2
;
900 INIT_LIST_HEAD(&dispose_list
);
901 spin_lock(&GlobalMid_Lock
);
902 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
903 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
904 cFYI(1, "Clearing mid 0x%llx", mid_entry
->mid
);
905 mid_entry
->mid_state
= MID_SHUTDOWN
;
906 list_move(&mid_entry
->qhead
, &dispose_list
);
908 spin_unlock(&GlobalMid_Lock
);
910 /* now walk dispose list and issue callbacks */
911 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
912 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
913 cFYI(1, "Callback mid 0x%llx", mid_entry
->mid
);
914 list_del_init(&mid_entry
->qhead
);
915 mid_entry
->callback(mid_entry
);
917 /* 1/8th of sec is more than enough time for them to exit */
921 if (!list_empty(&server
->pending_mid_q
)) {
923 * mpx threads have not exited yet give them at least the smb
924 * send timeout time for long ops.
926 * Due to delays on oplock break requests, we need to wait at
927 * least 45 seconds before giving up on a request getting a
928 * response and going ahead and killing cifsd.
930 cFYI(1, "Wait for exit from demultiplex thread");
933 * If threads still have not exited they are probably never
934 * coming home not much else we can do but free the memory.
938 kfree(server
->hostname
);
942 length
= atomic_dec_return(&tcpSesAllocCount
);
944 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
949 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
952 char *buf
= server
->smallbuf
;
953 unsigned int pdu_length
= get_rfc1002_length(buf
);
955 /* make sure this will fit in a large buffer */
956 if (pdu_length
> CIFSMaxBufSize
+ max_header_size() - 4) {
957 cERROR(1, "SMB response too long (%u bytes)",
959 cifs_reconnect(server
);
960 wake_up(&server
->response_q
);
964 /* switch to large buffer if too big for a small one */
965 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
966 server
->large_buf
= true;
967 memcpy(server
->bigbuf
, buf
, server
->total_read
);
968 buf
= server
->bigbuf
;
971 /* now read the rest */
972 length
= cifs_read_from_socket(server
, buf
+ header_size() - 1,
973 pdu_length
- header_size() + 1 + 4);
976 server
->total_read
+= length
;
978 dump_smb(buf
, server
->total_read
);
981 * We know that we received enough to get to the MID as we
982 * checked the pdu_length earlier. Now check to see
983 * if the rest of the header is OK. We borrow the length
984 * var for the rest of the loop to avoid a new stack var.
986 * 48 bytes is enough to display the header and a little bit
987 * into the payload for debugging purposes.
989 length
= checkSMB(buf
, server
->total_read
);
991 cifs_dump_mem("Bad SMB: ", buf
,
992 min_t(unsigned int, server
->total_read
, 48));
997 handle_mid(mid
, server
, buf
, length
);
1002 cifs_demultiplex_thread(void *p
)
1005 struct TCP_Server_Info
*server
= p
;
1006 unsigned int pdu_length
;
1008 struct task_struct
*task_to_wake
= NULL
;
1009 struct mid_q_entry
*mid_entry
;
1011 current
->flags
|= PF_MEMALLOC
;
1012 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current
));
1014 length
= atomic_inc_return(&tcpSesAllocCount
);
1016 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
1020 while (server
->tcpStatus
!= CifsExiting
) {
1021 if (try_to_freeze())
1024 if (!allocate_buffers(server
))
1027 server
->large_buf
= false;
1028 buf
= server
->smallbuf
;
1029 pdu_length
= 4; /* enough to get RFC1001 header */
1031 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
1034 server
->total_read
= length
;
1037 * The right amount was read from socket - 4 bytes,
1038 * so we can now interpret the length field.
1040 pdu_length
= get_rfc1002_length(buf
);
1042 cFYI(1, "RFC1002 header 0x%x", pdu_length
);
1043 if (!is_smb_response(server
, buf
[0]))
1046 /* make sure we have enough to get to the MID */
1047 if (pdu_length
< header_size() - 1 - 4) {
1048 cERROR(1, "SMB response too short (%u bytes)",
1050 cifs_reconnect(server
);
1051 wake_up(&server
->response_q
);
1055 /* read down to the MID */
1056 length
= cifs_read_from_socket(server
, buf
+ 4,
1057 header_size() - 1 - 4);
1060 server
->total_read
+= length
;
1062 mid_entry
= find_mid(server
, buf
);
1064 if (!mid_entry
|| !mid_entry
->receive
)
1065 length
= standard_receive3(server
, mid_entry
);
1067 length
= mid_entry
->receive(server
, mid_entry
);
1072 if (server
->large_buf
)
1073 buf
= server
->bigbuf
;
1075 server
->lstrp
= jiffies
;
1076 if (mid_entry
!= NULL
) {
1077 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
1078 mid_entry
->callback(mid_entry
);
1079 } else if (!is_valid_oplock_break(buf
, server
)) {
1080 cERROR(1, "No task to wake, unknown frame received! "
1081 "NumMids %d", atomic_read(&midCount
));
1082 cifs_dump_mem("Received Data is: ", buf
, header_size());
1083 #ifdef CONFIG_CIFS_DEBUG2
1084 cifs_dump_detail(buf
);
1085 cifs_dump_mids(server
);
1086 #endif /* CIFS_DEBUG2 */
1089 } /* end while !EXITING */
1091 /* buffer usually freed in free_mid - need to free it here on exit */
1092 cifs_buf_release(server
->bigbuf
);
1093 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
1094 cifs_small_buf_release(server
->smallbuf
);
1096 task_to_wake
= xchg(&server
->tsk
, NULL
);
1097 clean_demultiplex_info(server
);
1099 /* if server->tsk was NULL then wait for a signal before exiting */
1100 if (!task_to_wake
) {
1101 set_current_state(TASK_INTERRUPTIBLE
);
1102 while (!signal_pending(current
)) {
1104 set_current_state(TASK_INTERRUPTIBLE
);
1106 set_current_state(TASK_RUNNING
);
1109 module_put_and_exit(0);
1112 /* extract the host portion of the UNC string */
1114 extract_hostname(const char *unc
)
1120 /* skip double chars at beginning of string */
1121 /* BB: check validity of these bytes? */
1124 /* delimiter between hostname and sharename is always '\\' now */
1125 delim
= strchr(src
, '\\');
1127 return ERR_PTR(-EINVAL
);
1130 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
1132 return ERR_PTR(-ENOMEM
);
1134 memcpy(dst
, src
, len
);
1140 static int get_option_ul(substring_t args
[], unsigned long *option
)
1145 string
= match_strdup(args
);
1148 rc
= kstrtoul(string
, 0, option
);
1155 static int cifs_parse_security_flavors(char *value
,
1156 struct smb_vol
*vol
)
1159 substring_t args
[MAX_OPT_ARGS
];
1161 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1163 vol
->secFlg
|= CIFSSEC_MAY_KRB5
;
1166 vol
->secFlg
|= CIFSSEC_MAY_KRB5
| CIFSSEC_MUST_SIGN
;
1169 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1170 cERROR(1, "Krb5 cifs privacy not supported");
1172 case Opt_sec_ntlmssp
:
1173 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
;
1175 case Opt_sec_ntlmsspi
:
1176 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
| CIFSSEC_MUST_SIGN
;
1179 /* ntlm is default so can be turned off too */
1180 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1183 vol
->secFlg
|= CIFSSEC_MAY_NTLM
| CIFSSEC_MUST_SIGN
;
1185 case Opt_sec_nontlm
:
1186 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1188 case Opt_sec_ntlmv2i
:
1189 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
| CIFSSEC_MUST_SIGN
;
1191 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1192 case Opt_sec_lanman
:
1193 vol
->secFlg
|= CIFSSEC_MAY_LANMAN
;
1200 cERROR(1, "bad security option: %s", value
);
1208 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1210 substring_t args
[MAX_OPT_ARGS
];
1212 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1213 case Opt_cache_loose
:
1214 vol
->direct_io
= false;
1215 vol
->strict_io
= false;
1217 case Opt_cache_strict
:
1218 vol
->direct_io
= false;
1219 vol
->strict_io
= true;
1221 case Opt_cache_none
:
1222 vol
->direct_io
= true;
1223 vol
->strict_io
= false;
1226 cERROR(1, "bad cache= option: %s", value
);
1233 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1235 substring_t args
[MAX_OPT_ARGS
];
1237 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1239 vol
->ops
= &smb1_operations
;
1240 vol
->vals
= &smb1_values
;
1243 cERROR(1, "Unknown vers= option specified: %s", value
);
1250 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1251 struct smb_vol
*vol
)
1254 char *mountdata_copy
= NULL
, *options
;
1255 unsigned int temp_len
, i
, j
;
1257 short int override_uid
= -1;
1258 short int override_gid
= -1;
1259 bool uid_specified
= false;
1260 bool gid_specified
= false;
1261 bool sloppy
= false;
1262 char *invalid
= NULL
;
1263 char *nodename
= utsname()->nodename
;
1264 char *string
= NULL
;
1265 char *tmp_end
, *value
;
1267 bool cache_specified
= false;
1268 static bool cache_warned
= false;
1272 delim
= separator
[0];
1275 * does not have to be perfect mapping since field is
1276 * informational, only used for servers that do not support
1277 * port 445 and it can be overridden at mount time
1279 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1280 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1281 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1283 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1284 /* null target name indicates to use *SMBSERVR default called name
1285 if we end up sending RFC1001 session initialize */
1286 vol
->target_rfc1001_name
[0] = 0;
1287 vol
->cred_uid
= current_uid();
1288 vol
->linux_uid
= current_uid();
1289 vol
->linux_gid
= current_gid();
1291 /* default to only allowing write access to owner of the mount */
1292 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1294 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1295 /* default is always to request posix paths. */
1296 vol
->posix_paths
= 1;
1297 /* default to using server inode numbers where available */
1298 vol
->server_ino
= 1;
1300 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1302 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1303 vol
->ops
= &smb1_operations
;
1304 vol
->vals
= &smb1_values
;
1307 goto cifs_parse_mount_err
;
1309 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1310 if (!mountdata_copy
)
1311 goto cifs_parse_mount_err
;
1313 options
= mountdata_copy
;
1314 end
= options
+ strlen(options
);
1316 if (strncmp(options
, "sep=", 4) == 0) {
1317 if (options
[4] != 0) {
1318 separator
[0] = options
[4];
1321 cFYI(1, "Null separator not allowed");
1324 vol
->backupuid_specified
= false; /* no backup intent for a user */
1325 vol
->backupgid_specified
= false; /* no backup intent for a group */
1327 while ((data
= strsep(&options
, separator
)) != NULL
) {
1328 substring_t args
[MAX_OPT_ARGS
];
1329 unsigned long option
;
1335 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1339 /* Ingnore the following */
1343 /* Boolean values */
1344 case Opt_user_xattr
:
1347 case Opt_nouser_xattr
:
1353 case Opt_noforceuid
:
1356 case Opt_noblocksend
:
1357 vol
->noblocksnd
= 1;
1359 case Opt_noautotune
:
1360 vol
->noautotune
= 1;
1377 case Opt_nomapchars
:
1389 case Opt_posixpaths
:
1390 vol
->posix_paths
= 1;
1392 case Opt_noposixpaths
:
1393 vol
->posix_paths
= 0;
1396 vol
->no_linux_ext
= 1;
1407 * turn off mandatory locking in mode
1408 * if remote locking is turned off since the
1409 * local vfs will do advisory
1411 if (vol
->file_mode
==
1412 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1413 vol
->file_mode
= S_IALLUGO
;
1415 case Opt_forcemandatorylock
:
1425 vol
->dynperm
= true;
1428 vol
->dynperm
= false;
1442 case Opt_nostrictsync
:
1443 vol
->nostrictsync
= 1;
1445 case Opt_strictsync
:
1446 vol
->nostrictsync
= 0;
1449 vol
->server_ino
= 1;
1451 case Opt_noserverino
:
1452 vol
->server_ino
= 0;
1454 case Opt_rwpidforward
:
1455 vol
->rwpidforward
= 1;
1464 vol
->no_psx_acl
= 0;
1467 vol
->no_psx_acl
= 1;
1469 case Opt_locallease
:
1470 vol
->local_lease
= 1;
1473 vol
->secFlg
|= CIFSSEC_MUST_SIGN
;
1476 /* we do not do the following in secFlags because seal
1477 * is a per tree connection (mount) not a per socket
1478 * or per-smb connection option in the protocol
1479 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1484 cache_specified
= true;
1485 vol
->direct_io
= true;
1486 vol
->strict_io
= false;
1487 cERROR(1, "The \"directio\" option will be removed in "
1488 "3.7. Please switch to the \"cache=none\" "
1491 case Opt_strictcache
:
1492 cache_specified
= true;
1493 vol
->direct_io
= false;
1494 vol
->strict_io
= true;
1495 cERROR(1, "The \"strictcache\" option will be removed "
1496 "in 3.7. Please switch to the \"cache=strict\" "
1500 printk(KERN_WARNING
"CIFS: Mount option noac not "
1501 "supported. Instead set "
1502 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1505 #ifndef CONFIG_CIFS_FSCACHE
1506 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1507 "kernel config option set");
1508 goto cifs_parse_mount_err
;
1512 case Opt_mfsymlinks
:
1513 vol
->mfsymlinks
= true;
1516 vol
->multiuser
= true;
1522 /* Numeric Values */
1524 if (get_option_ul(args
, &option
)) {
1525 cERROR(1, "%s: Invalid backupuid value",
1527 goto cifs_parse_mount_err
;
1529 vol
->backupuid
= option
;
1530 vol
->backupuid_specified
= true;
1533 if (get_option_ul(args
, &option
)) {
1534 cERROR(1, "%s: Invalid backupgid value",
1536 goto cifs_parse_mount_err
;
1538 vol
->backupgid
= option
;
1539 vol
->backupgid_specified
= true;
1542 if (get_option_ul(args
, &option
)) {
1543 cERROR(1, "%s: Invalid uid value",
1545 goto cifs_parse_mount_err
;
1547 vol
->linux_uid
= option
;
1548 uid_specified
= true;
1551 if (get_option_ul(args
, &option
)) {
1552 cERROR(1, "%s: Invalid cruid value",
1554 goto cifs_parse_mount_err
;
1556 vol
->cred_uid
= option
;
1559 if (get_option_ul(args
, &option
)) {
1560 cERROR(1, "%s: Invalid gid value",
1562 goto cifs_parse_mount_err
;
1564 vol
->linux_gid
= option
;
1565 gid_specified
= true;
1568 if (get_option_ul(args
, &option
)) {
1569 cERROR(1, "%s: Invalid file_mode value",
1571 goto cifs_parse_mount_err
;
1573 vol
->file_mode
= option
;
1576 if (get_option_ul(args
, &option
)) {
1577 cERROR(1, "%s: Invalid dir_mode value",
1579 goto cifs_parse_mount_err
;
1581 vol
->dir_mode
= option
;
1584 if (get_option_ul(args
, &option
)) {
1585 cERROR(1, "%s: Invalid port value",
1587 goto cifs_parse_mount_err
;
1592 if (get_option_ul(args
, &option
)) {
1593 cERROR(1, "%s: Invalid rsize value",
1595 goto cifs_parse_mount_err
;
1597 vol
->rsize
= option
;
1600 if (get_option_ul(args
, &option
)) {
1601 cERROR(1, "%s: Invalid wsize value",
1603 goto cifs_parse_mount_err
;
1605 vol
->wsize
= option
;
1608 if (get_option_ul(args
, &option
)) {
1609 cERROR(1, "%s: Invalid actimeo value",
1611 goto cifs_parse_mount_err
;
1613 vol
->actimeo
= HZ
* option
;
1614 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1615 cERROR(1, "CIFS: attribute cache"
1616 "timeout too large");
1617 goto cifs_parse_mount_err
;
1621 /* String Arguments */
1623 case Opt_blank_user
:
1624 /* null user, ie. anonymous authentication */
1626 vol
->username
= NULL
;
1629 string
= match_strdup(args
);
1633 if (strnlen(string
, MAX_USERNAME_SIZE
) >
1634 MAX_USERNAME_SIZE
) {
1635 printk(KERN_WARNING
"CIFS: username too long\n");
1636 goto cifs_parse_mount_err
;
1638 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1639 if (!vol
->username
) {
1640 printk(KERN_WARNING
"CIFS: no memory "
1642 goto cifs_parse_mount_err
;
1645 case Opt_blank_pass
:
1646 vol
->password
= NULL
;
1649 /* passwords have to be handled differently
1650 * to allow the character used for deliminator
1651 * to be passed within them
1654 /* Obtain the value string */
1655 value
= strchr(data
, '=');
1658 /* Set tmp_end to end of the string */
1659 tmp_end
= (char *) value
+ strlen(value
);
1661 /* Check if following character is the deliminator
1662 * If yes, we have encountered a double deliminator
1663 * reset the NULL character to the deliminator
1665 if (tmp_end
< end
&& tmp_end
[1] == delim
)
1668 /* Keep iterating until we get to a single deliminator
1671 while ((tmp_end
= strchr(tmp_end
, delim
)) != NULL
&&
1672 (tmp_end
[1] == delim
)) {
1673 tmp_end
= (char *) &tmp_end
[2];
1676 /* Reset var options to point to next element */
1679 options
= (char *) &tmp_end
[1];
1681 /* Reached the end of the mount option string */
1684 /* Now build new password string */
1685 temp_len
= strlen(value
);
1686 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1687 if (vol
->password
== NULL
) {
1688 printk(KERN_WARNING
"CIFS: no memory "
1690 goto cifs_parse_mount_err
;
1693 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1694 vol
->password
[j
] = value
[i
];
1695 if ((value
[i
] == delim
) &&
1696 value
[i
+1] == delim
)
1697 /* skip the second deliminator */
1700 vol
->password
[j
] = '\0';
1706 string
= match_strdup(args
);
1710 if (strnlen(string
, INET6_ADDRSTRLEN
) >
1712 printk(KERN_WARNING
"CIFS: ip address "
1714 goto cifs_parse_mount_err
;
1716 vol
->UNCip
= kstrdup(string
, GFP_KERNEL
);
1718 printk(KERN_WARNING
"CIFS: no memory "
1720 goto cifs_parse_mount_err
;
1724 string
= match_strdup(args
);
1728 temp_len
= strnlen(string
, 300);
1729 if (temp_len
== 300) {
1730 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1731 goto cifs_parse_mount_err
;
1734 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1735 if (vol
->UNC
== NULL
) {
1736 printk(KERN_WARNING
"CIFS: no memory for UNC\n");
1737 goto cifs_parse_mount_err
;
1739 strcpy(vol
->UNC
, string
);
1741 if (strncmp(string
, "//", 2) == 0) {
1744 } else if (strncmp(string
, "\\\\", 2) != 0) {
1745 printk(KERN_WARNING
"CIFS: UNC Path does not "
1746 "begin with // or \\\\\n");
1747 goto cifs_parse_mount_err
;
1752 string
= match_strdup(args
);
1756 if (strnlen(string
, 256) == 256) {
1757 printk(KERN_WARNING
"CIFS: domain name too"
1759 goto cifs_parse_mount_err
;
1762 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1763 if (!vol
->domainname
) {
1764 printk(KERN_WARNING
"CIFS: no memory "
1765 "for domainname\n");
1766 goto cifs_parse_mount_err
;
1768 cFYI(1, "Domain name set");
1771 string
= match_strdup(args
);
1775 if (!cifs_convert_address(
1776 (struct sockaddr
*)&vol
->srcaddr
,
1777 string
, strlen(string
))) {
1778 printk(KERN_WARNING
"CIFS: Could not parse"
1779 " srcaddr: %s\n", string
);
1780 goto cifs_parse_mount_err
;
1783 case Opt_prefixpath
:
1784 string
= match_strdup(args
);
1788 temp_len
= strnlen(string
, 1024);
1789 if (string
[0] != '/')
1790 temp_len
++; /* missing leading slash */
1791 if (temp_len
> 1024) {
1792 printk(KERN_WARNING
"CIFS: prefix too long\n");
1793 goto cifs_parse_mount_err
;
1796 vol
->prepath
= kmalloc(temp_len
+1, GFP_KERNEL
);
1797 if (vol
->prepath
== NULL
) {
1798 printk(KERN_WARNING
"CIFS: no memory "
1799 "for path prefix\n");
1800 goto cifs_parse_mount_err
;
1803 if (string
[0] != '/') {
1804 vol
->prepath
[0] = '/';
1805 strcpy(vol
->prepath
+1, string
);
1807 strcpy(vol
->prepath
, string
);
1811 string
= match_strdup(args
);
1815 if (strnlen(string
, 1024) >= 65) {
1816 printk(KERN_WARNING
"CIFS: iocharset name "
1818 goto cifs_parse_mount_err
;
1821 if (strnicmp(string
, "default", 7) != 0) {
1822 vol
->iocharset
= kstrdup(string
,
1824 if (!vol
->iocharset
) {
1825 printk(KERN_WARNING
"CIFS: no memory"
1827 goto cifs_parse_mount_err
;
1830 /* if iocharset not set then load_nls_default
1833 cFYI(1, "iocharset set to %s", string
);
1836 string
= match_strdup(args
);
1840 if (strnicmp(string
, "TCP_NODELAY", 11) == 0)
1841 vol
->sockopt_tcp_nodelay
= 1;
1843 case Opt_netbiosname
:
1844 string
= match_strdup(args
);
1848 memset(vol
->source_rfc1001_name
, 0x20,
1851 * FIXME: are there cases in which a comma can
1852 * be valid in workstation netbios name (and
1853 * need special handling)?
1855 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1856 /* don't ucase netbiosname for user */
1859 vol
->source_rfc1001_name
[i
] = string
[i
];
1861 /* The string has 16th byte zero still from
1862 * set at top of the function
1864 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1865 printk(KERN_WARNING
"CIFS: netbiosname"
1866 " longer than 15 truncated.\n");
1870 /* servernetbiosname specified override *SMBSERVER */
1871 string
= match_strdup(args
);
1875 /* last byte, type, is 0x20 for servr type */
1876 memset(vol
->target_rfc1001_name
, 0x20,
1877 RFC1001_NAME_LEN_WITH_NULL
);
1879 /* BB are there cases in which a comma can be
1880 valid in this workstation netbios name
1881 (and need special handling)? */
1883 /* user or mount helper must uppercase the
1885 for (i
= 0; i
< 15; i
++) {
1888 vol
->target_rfc1001_name
[i
] = string
[i
];
1890 /* The string has 16th byte zero still from
1891 set at top of the function */
1892 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1893 printk(KERN_WARNING
"CIFS: server net"
1894 "biosname longer than 15 truncated.\n");
1897 string
= match_strdup(args
);
1901 if (strnicmp(string
, "1", 1) == 0) {
1902 /* This is the default */
1905 /* For all other value, error */
1906 printk(KERN_WARNING
"CIFS: Invalid version"
1908 goto cifs_parse_mount_err
;
1910 string
= match_strdup(args
);
1914 if (cifs_parse_smb_version(string
, vol
) != 0)
1915 goto cifs_parse_mount_err
;
1918 string
= match_strdup(args
);
1922 if (cifs_parse_security_flavors(string
, vol
) != 0)
1923 goto cifs_parse_mount_err
;
1926 cache_specified
= true;
1927 string
= match_strdup(args
);
1931 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1932 goto cifs_parse_mount_err
;
1936 * An option we don't recognize. Save it off for later
1937 * if we haven't already found one
1943 /* Free up any allocated string */
1948 if (!sloppy
&& invalid
) {
1949 printk(KERN_ERR
"CIFS: Unknown mount option \"%s\"\n", invalid
);
1950 goto cifs_parse_mount_err
;
1954 /* Muliuser mounts require CONFIG_KEYS support */
1955 if (vol
->multiuser
) {
1956 cERROR(1, "Multiuser mounts require kernels with "
1957 "CONFIG_KEYS enabled.");
1958 goto cifs_parse_mount_err
;
1962 if (vol
->UNCip
== NULL
)
1963 vol
->UNCip
= &vol
->UNC
[2];
1966 vol
->override_uid
= override_uid
;
1967 else if (override_uid
== 1)
1968 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1969 "specified with no uid= option.\n");
1972 vol
->override_gid
= override_gid
;
1973 else if (override_gid
== 1)
1974 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1975 "specified with no gid= option.\n");
1977 /* FIXME: remove this block in 3.7 */
1978 if (!cache_specified
&& !cache_warned
) {
1979 cache_warned
= true;
1980 printk(KERN_NOTICE
"CIFS: no cache= option specified, using "
1981 "\"cache=loose\". This default will change "
1982 "to \"cache=strict\" in 3.7.\n");
1985 kfree(mountdata_copy
);
1989 printk(KERN_WARNING
"Could not allocate temporary buffer\n");
1990 cifs_parse_mount_err
:
1992 kfree(mountdata_copy
);
1996 /** Returns true if srcaddr isn't specified and rhs isn't
1997 * specified, or if srcaddr is specified and
1998 * matches the IP address of the rhs argument.
2001 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
2003 switch (srcaddr
->sa_family
) {
2005 return (rhs
->sa_family
== AF_UNSPEC
);
2007 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
2008 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
2009 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
2012 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
2013 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)&rhs
;
2014 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
2018 return false; /* don't expect to be here */
2023 * If no port is specified in addr structure, we try to match with 445 port
2024 * and if it fails - with 139 ports. It should be called only if address
2025 * families of server and addr are equal.
2028 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
2030 __be16 port
, *sport
;
2032 switch (addr
->sa_family
) {
2034 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
2035 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
2038 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
2039 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
2047 port
= htons(CIFS_PORT
);
2051 port
= htons(RFC1001_PORT
);
2054 return port
== *sport
;
2058 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2059 struct sockaddr
*srcaddr
)
2061 switch (addr
->sa_family
) {
2063 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
2064 struct sockaddr_in
*srv_addr4
=
2065 (struct sockaddr_in
*)&server
->dstaddr
;
2067 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
2072 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
2073 struct sockaddr_in6
*srv_addr6
=
2074 (struct sockaddr_in6
*)&server
->dstaddr
;
2076 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
2077 &srv_addr6
->sin6_addr
))
2079 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
2085 return false; /* don't expect to be here */
2088 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2095 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2097 unsigned int secFlags
;
2099 if (vol
->secFlg
& (~(CIFSSEC_MUST_SIGN
| CIFSSEC_MUST_SEAL
)))
2100 secFlags
= vol
->secFlg
;
2102 secFlags
= global_secflags
| vol
->secFlg
;
2104 switch (server
->secType
) {
2106 if (!(secFlags
& (CIFSSEC_MAY_LANMAN
|CIFSSEC_MAY_PLNTXT
)))
2110 if (!(secFlags
& CIFSSEC_MAY_NTLMV2
))
2114 if (!(secFlags
& CIFSSEC_MAY_NTLM
))
2118 if (!(secFlags
& CIFSSEC_MAY_KRB5
))
2122 if (!(secFlags
& CIFSSEC_MAY_NTLMSSP
))
2126 /* shouldn't happen */
2130 /* now check if signing mode is acceptable */
2131 if ((secFlags
& CIFSSEC_MAY_SIGN
) == 0 &&
2132 (server
->sec_mode
& SECMODE_SIGN_REQUIRED
))
2134 else if (((secFlags
& CIFSSEC_MUST_SIGN
) == CIFSSEC_MUST_SIGN
) &&
2136 (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
)) == 0)
2142 static int match_server(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2143 struct smb_vol
*vol
)
2145 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2148 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2151 if (!match_address(server
, addr
,
2152 (struct sockaddr
*)&vol
->srcaddr
))
2155 if (!match_port(server
, addr
))
2158 if (!match_security(server
, vol
))
2164 static struct TCP_Server_Info
*
2165 cifs_find_tcp_session(struct sockaddr
*addr
, struct smb_vol
*vol
)
2167 struct TCP_Server_Info
*server
;
2169 spin_lock(&cifs_tcp_ses_lock
);
2170 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2171 if (!match_server(server
, addr
, vol
))
2174 ++server
->srv_count
;
2175 spin_unlock(&cifs_tcp_ses_lock
);
2176 cFYI(1, "Existing tcp session with server found");
2179 spin_unlock(&cifs_tcp_ses_lock
);
2184 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
2186 struct task_struct
*task
;
2188 spin_lock(&cifs_tcp_ses_lock
);
2189 if (--server
->srv_count
> 0) {
2190 spin_unlock(&cifs_tcp_ses_lock
);
2194 put_net(cifs_net_ns(server
));
2196 list_del_init(&server
->tcp_ses_list
);
2197 spin_unlock(&cifs_tcp_ses_lock
);
2199 cancel_delayed_work_sync(&server
->echo
);
2201 spin_lock(&GlobalMid_Lock
);
2202 server
->tcpStatus
= CifsExiting
;
2203 spin_unlock(&GlobalMid_Lock
);
2205 cifs_crypto_shash_release(server
);
2206 cifs_fscache_release_client_cookie(server
);
2208 kfree(server
->session_key
.response
);
2209 server
->session_key
.response
= NULL
;
2210 server
->session_key
.len
= 0;
2212 task
= xchg(&server
->tsk
, NULL
);
2214 force_sig(SIGKILL
, task
);
2217 static struct TCP_Server_Info
*
2218 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2220 struct TCP_Server_Info
*tcp_ses
= NULL
;
2221 struct sockaddr_storage addr
;
2222 struct sockaddr_in
*sin_server
= (struct sockaddr_in
*) &addr
;
2223 struct sockaddr_in6
*sin_server6
= (struct sockaddr_in6
*) &addr
;
2226 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
2228 cFYI(1, "UNC: %s ip: %s", volume_info
->UNC
, volume_info
->UNCip
);
2230 if (volume_info
->UNCip
&& volume_info
->UNC
) {
2231 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
2233 strlen(volume_info
->UNCip
),
2236 /* we failed translating address */
2240 } else if (volume_info
->UNCip
) {
2241 /* BB using ip addr as tcp_ses name to connect to the
2243 cERROR(1, "Connecting to DFS root not implemented yet");
2246 } else /* which tcp_sess DFS root would we conect to */ {
2247 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
2248 "unc=//192.168.1.100/public) specified");
2253 /* see if we already have a matching tcp_ses */
2254 tcp_ses
= cifs_find_tcp_session((struct sockaddr
*)&addr
, volume_info
);
2258 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2264 rc
= cifs_crypto_shash_allocate(tcp_ses
);
2266 cERROR(1, "could not setup hash structures rc %d", rc
);
2270 tcp_ses
->ops
= volume_info
->ops
;
2271 tcp_ses
->vals
= volume_info
->vals
;
2272 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2273 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2274 if (IS_ERR(tcp_ses
->hostname
)) {
2275 rc
= PTR_ERR(tcp_ses
->hostname
);
2276 goto out_err_crypto_release
;
2279 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2280 tcp_ses
->noautotune
= volume_info
->noautotune
;
2281 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2282 tcp_ses
->in_flight
= 0;
2283 tcp_ses
->credits
= 1;
2284 init_waitqueue_head(&tcp_ses
->response_q
);
2285 init_waitqueue_head(&tcp_ses
->request_q
);
2286 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2287 mutex_init(&tcp_ses
->srv_mutex
);
2288 memcpy(tcp_ses
->workstation_RFC1001_name
,
2289 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2290 memcpy(tcp_ses
->server_RFC1001_name
,
2291 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2292 tcp_ses
->session_estab
= false;
2293 tcp_ses
->sequence_number
= 0;
2294 tcp_ses
->lstrp
= jiffies
;
2295 spin_lock_init(&tcp_ses
->req_lock
);
2296 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2297 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2298 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2301 * at this point we are the only ones with the pointer
2302 * to the struct since the kernel thread not created yet
2303 * no need to spinlock this init of tcpStatus or srv_count
2305 tcp_ses
->tcpStatus
= CifsNew
;
2306 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2307 sizeof(tcp_ses
->srcaddr
));
2308 ++tcp_ses
->srv_count
;
2310 if (addr
.ss_family
== AF_INET6
) {
2311 cFYI(1, "attempting ipv6 connect");
2312 /* BB should we allow ipv6 on port 139? */
2313 /* other OS never observed in Wild doing 139 with v6 */
2314 memcpy(&tcp_ses
->dstaddr
, sin_server6
,
2315 sizeof(struct sockaddr_in6
));
2317 memcpy(&tcp_ses
->dstaddr
, sin_server
,
2318 sizeof(struct sockaddr_in
));
2320 rc
= ip_connect(tcp_ses
);
2322 cERROR(1, "Error connecting to socket. Aborting operation");
2323 goto out_err_crypto_release
;
2327 * since we're in a cifs function already, we know that
2328 * this will succeed. No need for try_module_get().
2330 __module_get(THIS_MODULE
);
2331 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2333 if (IS_ERR(tcp_ses
->tsk
)) {
2334 rc
= PTR_ERR(tcp_ses
->tsk
);
2335 cERROR(1, "error %d create cifsd thread", rc
);
2336 module_put(THIS_MODULE
);
2337 goto out_err_crypto_release
;
2339 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2341 /* thread spawned, put it on the list */
2342 spin_lock(&cifs_tcp_ses_lock
);
2343 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2344 spin_unlock(&cifs_tcp_ses_lock
);
2346 cifs_fscache_get_client_cookie(tcp_ses
);
2348 /* queue echo request delayed work */
2349 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
2353 out_err_crypto_release
:
2354 cifs_crypto_shash_release(tcp_ses
);
2356 put_net(cifs_net_ns(tcp_ses
));
2360 if (!IS_ERR(tcp_ses
->hostname
))
2361 kfree(tcp_ses
->hostname
);
2362 if (tcp_ses
->ssocket
)
2363 sock_release(tcp_ses
->ssocket
);
2369 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2371 switch (ses
->server
->secType
) {
2373 if (vol
->cred_uid
!= ses
->cred_uid
)
2377 /* NULL username means anonymous session */
2378 if (ses
->user_name
== NULL
) {
2384 /* anything else takes username/password */
2385 if (strncmp(ses
->user_name
,
2386 vol
->username
? vol
->username
: "",
2389 if (strlen(vol
->username
) != 0 &&
2390 ses
->password
!= NULL
&&
2391 strncmp(ses
->password
,
2392 vol
->password
? vol
->password
: "",
2399 static struct cifs_ses
*
2400 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2402 struct cifs_ses
*ses
;
2404 spin_lock(&cifs_tcp_ses_lock
);
2405 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2406 if (!match_session(ses
, vol
))
2409 spin_unlock(&cifs_tcp_ses_lock
);
2412 spin_unlock(&cifs_tcp_ses_lock
);
2417 cifs_put_smb_ses(struct cifs_ses
*ses
)
2420 struct TCP_Server_Info
*server
= ses
->server
;
2422 cFYI(1, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2423 spin_lock(&cifs_tcp_ses_lock
);
2424 if (--ses
->ses_count
> 0) {
2425 spin_unlock(&cifs_tcp_ses_lock
);
2429 list_del_init(&ses
->smb_ses_list
);
2430 spin_unlock(&cifs_tcp_ses_lock
);
2432 if (ses
->status
== CifsGood
) {
2434 CIFSSMBLogoff(xid
, ses
);
2438 cifs_put_tcp_session(server
);
2443 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2444 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2446 /* Populate username and pw fields from keyring if possible */
2448 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2451 char *desc
, *delim
, *payload
;
2454 struct TCP_Server_Info
*server
= ses
->server
;
2455 struct sockaddr_in
*sa
;
2456 struct sockaddr_in6
*sa6
;
2457 struct user_key_payload
*upayload
;
2459 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2463 /* try to find an address key first */
2464 switch (server
->dstaddr
.ss_family
) {
2466 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2467 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2470 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2471 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2474 cFYI(1, "Bad ss_family (%hu)", server
->dstaddr
.ss_family
);
2479 cFYI(1, "%s: desc=%s", __func__
, desc
);
2480 key
= request_key(&key_type_logon
, desc
, "");
2482 if (!ses
->domainName
) {
2483 cFYI(1, "domainName is NULL");
2488 /* didn't work, try to find a domain key */
2489 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2490 cFYI(1, "%s: desc=%s", __func__
, desc
);
2491 key
= request_key(&key_type_logon
, desc
, "");
2498 down_read(&key
->sem
);
2499 upayload
= key
->payload
.data
;
2500 if (IS_ERR_OR_NULL(upayload
)) {
2501 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2505 /* find first : in payload */
2506 payload
= (char *)upayload
->data
;
2507 delim
= strnchr(payload
, upayload
->datalen
, ':');
2508 cFYI(1, "payload=%s", payload
);
2510 cFYI(1, "Unable to find ':' in payload (datalen=%d)",
2516 len
= delim
- payload
;
2517 if (len
> MAX_USERNAME_SIZE
|| len
<= 0) {
2518 cFYI(1, "Bad value from username search (len=%zd)", len
);
2523 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2524 if (!vol
->username
) {
2525 cFYI(1, "Unable to allocate %zd bytes for username", len
);
2529 cFYI(1, "%s: username=%s", __func__
, vol
->username
);
2531 len
= key
->datalen
- (len
+ 1);
2532 if (len
> MAX_PASSWORD_SIZE
|| len
<= 0) {
2533 cFYI(1, "Bad len for password search (len=%zd)", len
);
2535 kfree(vol
->username
);
2536 vol
->username
= NULL
;
2541 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2542 if (!vol
->password
) {
2543 cFYI(1, "Unable to allocate %zd bytes for password", len
);
2545 kfree(vol
->username
);
2546 vol
->username
= NULL
;
2555 cFYI(1, "%s: returning %d", __func__
, rc
);
2558 #else /* ! CONFIG_KEYS */
2560 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2561 struct cifs_ses
*ses
__attribute__((unused
)))
2565 #endif /* CONFIG_KEYS */
2567 static bool warned_on_ntlm
; /* globals init to false automatically */
2569 static struct cifs_ses
*
2570 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2572 int rc
= -ENOMEM
, xid
;
2573 struct cifs_ses
*ses
;
2574 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2575 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2579 ses
= cifs_find_smb_ses(server
, volume_info
);
2581 cFYI(1, "Existing smb sess found (status=%d)", ses
->status
);
2583 mutex_lock(&ses
->session_mutex
);
2584 rc
= cifs_negotiate_protocol(xid
, ses
);
2586 mutex_unlock(&ses
->session_mutex
);
2587 /* problem -- put our ses reference */
2588 cifs_put_smb_ses(ses
);
2592 if (ses
->need_reconnect
) {
2593 cFYI(1, "Session needs reconnect");
2594 rc
= cifs_setup_session(xid
, ses
,
2595 volume_info
->local_nls
);
2597 mutex_unlock(&ses
->session_mutex
);
2598 /* problem -- put our reference */
2599 cifs_put_smb_ses(ses
);
2604 mutex_unlock(&ses
->session_mutex
);
2606 /* existing SMB ses has a server reference already */
2607 cifs_put_tcp_session(server
);
2612 cFYI(1, "Existing smb sess not found");
2613 ses
= sesInfoAlloc();
2617 /* new SMB session uses our server ref */
2618 ses
->server
= server
;
2619 if (server
->dstaddr
.ss_family
== AF_INET6
)
2620 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2622 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2624 if (volume_info
->username
) {
2625 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2626 if (!ses
->user_name
)
2630 /* volume_info->password freed at unmount */
2631 if (volume_info
->password
) {
2632 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2636 if (volume_info
->domainname
) {
2637 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2638 if (!ses
->domainName
)
2641 ses
->cred_uid
= volume_info
->cred_uid
;
2642 ses
->linux_uid
= volume_info
->linux_uid
;
2644 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2645 supported for many years, time to update default security mechanism */
2646 if ((volume_info
->secFlg
== 0) && warned_on_ntlm
== false) {
2647 warned_on_ntlm
= true;
2648 cERROR(1, "default security mechanism requested. The default "
2649 "security mechanism will be upgraded from ntlm to "
2650 "ntlmv2 in kernel release 3.3");
2652 ses
->overrideSecFlg
= volume_info
->secFlg
;
2654 mutex_lock(&ses
->session_mutex
);
2655 rc
= cifs_negotiate_protocol(xid
, ses
);
2657 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2658 mutex_unlock(&ses
->session_mutex
);
2662 /* success, put it on the list */
2663 spin_lock(&cifs_tcp_ses_lock
);
2664 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2665 spin_unlock(&cifs_tcp_ses_lock
);
2676 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2678 if (tcon
->tidStatus
== CifsExiting
)
2680 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2685 static struct cifs_tcon
*
2686 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2688 struct list_head
*tmp
;
2689 struct cifs_tcon
*tcon
;
2691 spin_lock(&cifs_tcp_ses_lock
);
2692 list_for_each(tmp
, &ses
->tcon_list
) {
2693 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2694 if (!match_tcon(tcon
, unc
))
2697 spin_unlock(&cifs_tcp_ses_lock
);
2700 spin_unlock(&cifs_tcp_ses_lock
);
2705 cifs_put_tcon(struct cifs_tcon
*tcon
)
2708 struct cifs_ses
*ses
= tcon
->ses
;
2710 cFYI(1, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2711 spin_lock(&cifs_tcp_ses_lock
);
2712 if (--tcon
->tc_count
> 0) {
2713 spin_unlock(&cifs_tcp_ses_lock
);
2717 list_del_init(&tcon
->tcon_list
);
2718 spin_unlock(&cifs_tcp_ses_lock
);
2721 CIFSSMBTDis(xid
, tcon
);
2724 cifs_fscache_release_super_cookie(tcon
);
2726 cifs_put_smb_ses(ses
);
2729 static struct cifs_tcon
*
2730 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2733 struct cifs_tcon
*tcon
;
2735 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2737 cFYI(1, "Found match on UNC path");
2738 /* existing tcon already has a reference */
2739 cifs_put_smb_ses(ses
);
2740 if (tcon
->seal
!= volume_info
->seal
)
2741 cERROR(1, "transport encryption setting "
2742 "conflicts with existing tid");
2746 tcon
= tconInfoAlloc();
2753 if (volume_info
->password
) {
2754 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2755 if (!tcon
->password
) {
2761 if (strchr(volume_info
->UNC
+ 3, '\\') == NULL
2762 && strchr(volume_info
->UNC
+ 3, '/') == NULL
) {
2763 cERROR(1, "Missing share name");
2768 /* BB Do we need to wrap session_mutex around
2769 * this TCon call and Unix SetFS as
2770 * we do on SessSetup and reconnect? */
2772 rc
= CIFSTCon(xid
, ses
, volume_info
->UNC
, tcon
, volume_info
->local_nls
);
2774 cFYI(1, "CIFS Tcon rc = %d", rc
);
2778 if (volume_info
->nodfs
) {
2779 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2780 cFYI(1, "DFS disabled (%d)", tcon
->Flags
);
2782 tcon
->seal
= volume_info
->seal
;
2783 /* we can have only one retry value for a connection
2784 to a share so for resources mounted more than once
2785 to the same server share the last value passed in
2786 for the retry flag is used */
2787 tcon
->retry
= volume_info
->retry
;
2788 tcon
->nocase
= volume_info
->nocase
;
2789 tcon
->local_lease
= volume_info
->local_lease
;
2791 spin_lock(&cifs_tcp_ses_lock
);
2792 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2793 spin_unlock(&cifs_tcp_ses_lock
);
2795 cifs_fscache_get_super_cookie(tcon
);
2805 cifs_put_tlink(struct tcon_link
*tlink
)
2807 if (!tlink
|| IS_ERR(tlink
))
2810 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2811 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2812 tlink
->tl_time
= jiffies
;
2816 if (!IS_ERR(tlink_tcon(tlink
)))
2817 cifs_put_tcon(tlink_tcon(tlink
));
2822 static inline struct tcon_link
*
2823 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2825 return cifs_sb
->master_tlink
;
2829 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2831 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2832 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2834 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2837 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2838 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2842 * We want to share sb only if we don't specify an r/wsize or
2843 * specified r/wsize is greater than or equal to existing one.
2845 if (new->wsize
&& new->wsize
< old
->wsize
)
2848 if (new->rsize
&& new->rsize
< old
->rsize
)
2851 if (old
->mnt_uid
!= new->mnt_uid
|| old
->mnt_gid
!= new->mnt_gid
)
2854 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2855 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2858 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2861 if (old
->actimeo
!= new->actimeo
)
2868 cifs_match_super(struct super_block
*sb
, void *data
)
2870 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2871 struct smb_vol
*volume_info
;
2872 struct cifs_sb_info
*cifs_sb
;
2873 struct TCP_Server_Info
*tcp_srv
;
2874 struct cifs_ses
*ses
;
2875 struct cifs_tcon
*tcon
;
2876 struct tcon_link
*tlink
;
2877 struct sockaddr_storage addr
;
2880 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
2882 spin_lock(&cifs_tcp_ses_lock
);
2883 cifs_sb
= CIFS_SB(sb
);
2884 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2885 if (IS_ERR(tlink
)) {
2886 spin_unlock(&cifs_tcp_ses_lock
);
2889 tcon
= tlink_tcon(tlink
);
2891 tcp_srv
= ses
->server
;
2893 volume_info
= mnt_data
->vol
;
2895 if (!volume_info
->UNCip
|| !volume_info
->UNC
)
2898 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
2900 strlen(volume_info
->UNCip
),
2905 if (!match_server(tcp_srv
, (struct sockaddr
*)&addr
, volume_info
) ||
2906 !match_session(ses
, volume_info
) ||
2907 !match_tcon(tcon
, volume_info
->UNC
)) {
2912 rc
= compare_mount_options(sb
, mnt_data
);
2914 spin_unlock(&cifs_tcp_ses_lock
);
2915 cifs_put_tlink(tlink
);
2920 get_dfs_path(int xid
, struct cifs_ses
*pSesInfo
, const char *old_path
,
2921 const struct nls_table
*nls_codepage
, unsigned int *pnum_referrals
,
2922 struct dfs_info3_param
**preferrals
, int remap
)
2927 *pnum_referrals
= 0;
2930 if (pSesInfo
->ipc_tid
== 0) {
2931 temp_unc
= kmalloc(2 /* for slashes */ +
2932 strnlen(pSesInfo
->serverName
,
2933 SERVER_NAME_LEN_WITH_NULL
* 2)
2934 + 1 + 4 /* slash IPC$ */ + 2,
2936 if (temp_unc
== NULL
)
2940 strcpy(temp_unc
+ 2, pSesInfo
->serverName
);
2941 strcpy(temp_unc
+ 2 + strlen(pSesInfo
->serverName
), "\\IPC$");
2942 rc
= CIFSTCon(xid
, pSesInfo
, temp_unc
, NULL
, nls_codepage
);
2943 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc
, pSesInfo
->ipc_tid
);
2947 rc
= CIFSGetDFSRefer(xid
, pSesInfo
, old_path
, preferrals
,
2948 pnum_referrals
, nls_codepage
, remap
);
2949 /* BB map targetUNCs to dfs_info3 structures, here or
2950 in CIFSGetDFSRefer BB */
2955 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2956 static struct lock_class_key cifs_key
[2];
2957 static struct lock_class_key cifs_slock_key
[2];
2960 cifs_reclassify_socket4(struct socket
*sock
)
2962 struct sock
*sk
= sock
->sk
;
2963 BUG_ON(sock_owned_by_user(sk
));
2964 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2965 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2969 cifs_reclassify_socket6(struct socket
*sock
)
2971 struct sock
*sk
= sock
->sk
;
2972 BUG_ON(sock_owned_by_user(sk
));
2973 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2974 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2978 cifs_reclassify_socket4(struct socket
*sock
)
2983 cifs_reclassify_socket6(struct socket
*sock
)
2988 /* See RFC1001 section 14 on representation of Netbios names */
2989 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2993 for (i
= 0, j
= 0; i
< (length
); i
++) {
2994 /* mask a nibble at a time and encode */
2995 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2996 target
[j
+1] = 'A' + (0x0F & source
[i
]);
3003 bind_socket(struct TCP_Server_Info
*server
)
3006 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
3007 /* Bind to the specified local IP address */
3008 struct socket
*socket
= server
->ssocket
;
3009 rc
= socket
->ops
->bind(socket
,
3010 (struct sockaddr
*) &server
->srcaddr
,
3011 sizeof(server
->srcaddr
));
3013 struct sockaddr_in
*saddr4
;
3014 struct sockaddr_in6
*saddr6
;
3015 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
3016 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
3017 if (saddr6
->sin6_family
== AF_INET6
)
3019 "Failed to bind to: %pI6c, error: %d\n",
3020 &saddr6
->sin6_addr
, rc
);
3023 "Failed to bind to: %pI4, error: %d\n",
3024 &saddr4
->sin_addr
.s_addr
, rc
);
3031 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
3035 * some servers require RFC1001 sessinit before sending
3036 * negprot - BB check reconnection in case where second
3037 * sessinit is sent but no second negprot
3039 struct rfc1002_session_packet
*ses_init_buf
;
3040 struct smb_hdr
*smb_buf
;
3041 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
3044 ses_init_buf
->trailer
.session_req
.called_len
= 32;
3046 if (server
->server_RFC1001_name
&&
3047 server
->server_RFC1001_name
[0] != 0)
3048 rfc1002mangle(ses_init_buf
->trailer
.
3049 session_req
.called_name
,
3050 server
->server_RFC1001_name
,
3051 RFC1001_NAME_LEN_WITH_NULL
);
3053 rfc1002mangle(ses_init_buf
->trailer
.
3054 session_req
.called_name
,
3055 DEFAULT_CIFS_CALLED_NAME
,
3056 RFC1001_NAME_LEN_WITH_NULL
);
3058 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
3061 * calling name ends in null (byte 16) from old smb
3064 if (server
->workstation_RFC1001_name
&&
3065 server
->workstation_RFC1001_name
[0] != 0)
3066 rfc1002mangle(ses_init_buf
->trailer
.
3067 session_req
.calling_name
,
3068 server
->workstation_RFC1001_name
,
3069 RFC1001_NAME_LEN_WITH_NULL
);
3071 rfc1002mangle(ses_init_buf
->trailer
.
3072 session_req
.calling_name
,
3074 RFC1001_NAME_LEN_WITH_NULL
);
3076 ses_init_buf
->trailer
.session_req
.scope1
= 0;
3077 ses_init_buf
->trailer
.session_req
.scope2
= 0;
3078 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
3080 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3081 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
3082 rc
= smb_send(server
, smb_buf
, 0x44);
3083 kfree(ses_init_buf
);
3085 * RFC1001 layer in at least one server
3086 * requires very short break before negprot
3087 * presumably because not expecting negprot
3088 * to follow so fast. This is a simple
3089 * solution that works without
3090 * complicating the code and causes no
3091 * significant slowing down on mount
3094 usleep_range(1000, 2000);
3097 * else the negprot may still work without this
3098 * even though malloc failed
3105 generic_ip_connect(struct TCP_Server_Info
*server
)
3110 struct socket
*socket
= server
->ssocket
;
3111 struct sockaddr
*saddr
;
3113 saddr
= (struct sockaddr
*) &server
->dstaddr
;
3115 if (server
->dstaddr
.ss_family
== AF_INET6
) {
3116 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
3117 slen
= sizeof(struct sockaddr_in6
);
3120 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
3121 slen
= sizeof(struct sockaddr_in
);
3125 if (socket
== NULL
) {
3126 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
3127 IPPROTO_TCP
, &socket
, 1);
3129 cERROR(1, "Error %d creating socket", rc
);
3130 server
->ssocket
= NULL
;
3134 /* BB other socket options to set KEEPALIVE, NODELAY? */
3135 cFYI(1, "Socket created");
3136 server
->ssocket
= socket
;
3137 socket
->sk
->sk_allocation
= GFP_NOFS
;
3138 if (sfamily
== AF_INET6
)
3139 cifs_reclassify_socket6(socket
);
3141 cifs_reclassify_socket4(socket
);
3144 rc
= bind_socket(server
);
3149 * Eventually check for other socket options to change from
3150 * the default. sock_setsockopt not used because it expects
3153 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3154 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3156 /* make the bufsizes depend on wsize/rsize and max requests */
3157 if (server
->noautotune
) {
3158 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3159 socket
->sk
->sk_sndbuf
= 200 * 1024;
3160 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3161 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3164 if (server
->tcp_nodelay
) {
3166 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
3167 (char *)&val
, sizeof(val
));
3169 cFYI(1, "set TCP_NODELAY socket option error %d", rc
);
3172 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
3173 socket
->sk
->sk_sndbuf
,
3174 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3176 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3178 cFYI(1, "Error %d connecting to server", rc
);
3179 sock_release(socket
);
3180 server
->ssocket
= NULL
;
3184 if (sport
== htons(RFC1001_PORT
))
3185 rc
= ip_rfc1001_connect(server
);
3191 ip_connect(struct TCP_Server_Info
*server
)
3194 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3195 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3197 if (server
->dstaddr
.ss_family
== AF_INET6
)
3198 sport
= &addr6
->sin6_port
;
3200 sport
= &addr
->sin_port
;
3205 /* try with 445 port at first */
3206 *sport
= htons(CIFS_PORT
);
3208 rc
= generic_ip_connect(server
);
3212 /* if it failed, try with 139 port */
3213 *sport
= htons(RFC1001_PORT
);
3216 return generic_ip_connect(server
);
3219 void reset_cifs_unix_caps(int xid
, struct cifs_tcon
*tcon
,
3220 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3222 /* if we are reconnecting then should we check to see if
3223 * any requested capabilities changed locally e.g. via
3224 * remount but we can not do much about it here
3225 * if they have (even if we could detect it by the following)
3226 * Perhaps we could add a backpointer to array of sb from tcon
3227 * or if we change to make all sb to same share the same
3228 * sb as NFS - then we only have one backpointer to sb.
3229 * What if we wanted to mount the server share twice once with
3230 * and once without posixacls or posix paths? */
3231 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3233 if (vol_info
&& vol_info
->no_linux_ext
) {
3234 tcon
->fsUnixInfo
.Capability
= 0;
3235 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3236 cFYI(1, "Linux protocol extensions disabled");
3238 } else if (vol_info
)
3239 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3241 if (tcon
->unix_ext
== 0) {
3242 cFYI(1, "Unix extensions disabled so not set on reconnect");
3246 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3247 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3248 cFYI(1, "unix caps which server supports %lld", cap
);
3249 /* check for reconnect case in which we do not
3250 want to change the mount behavior if we can avoid it */
3251 if (vol_info
== NULL
) {
3252 /* turn off POSIX ACL and PATHNAMES if not set
3253 originally at mount time */
3254 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3255 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3256 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3257 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3258 cERROR(1, "POSIXPATH support change");
3259 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3260 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3261 cERROR(1, "possible reconnect error");
3262 cERROR(1, "server disabled POSIX path support");
3266 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3267 cERROR(1, "per-share encryption not supported yet");
3269 cap
&= CIFS_UNIX_CAP_MASK
;
3270 if (vol_info
&& vol_info
->no_psx_acl
)
3271 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3272 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3273 cFYI(1, "negotiated posix acl support");
3275 cifs_sb
->mnt_cifs_flags
|=
3276 CIFS_MOUNT_POSIXACL
;
3279 if (vol_info
&& vol_info
->posix_paths
== 0)
3280 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3281 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3282 cFYI(1, "negotiate posix pathnames");
3284 cifs_sb
->mnt_cifs_flags
|=
3285 CIFS_MOUNT_POSIX_PATHS
;
3288 cFYI(1, "Negotiate caps 0x%x", (int)cap
);
3289 #ifdef CONFIG_CIFS_DEBUG2
3290 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3291 cFYI(1, "FCNTL cap");
3292 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3293 cFYI(1, "EXTATTR cap");
3294 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3295 cFYI(1, "POSIX path cap");
3296 if (cap
& CIFS_UNIX_XATTR_CAP
)
3297 cFYI(1, "XATTR cap");
3298 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3299 cFYI(1, "POSIX ACL cap");
3300 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3301 cFYI(1, "very large read cap");
3302 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3303 cFYI(1, "very large write cap");
3304 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3305 cFYI(1, "transport encryption cap");
3306 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3307 cFYI(1, "mandatory transport encryption cap");
3308 #endif /* CIFS_DEBUG2 */
3309 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3310 if (vol_info
== NULL
) {
3311 cFYI(1, "resetting capabilities failed");
3313 cERROR(1, "Negotiating Unix capabilities "
3314 "with the server failed. Consider "
3315 "mounting with the Unix Extensions\n"
3316 "disabled, if problems are found, "
3317 "by specifying the nounix mount "
3324 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3325 struct cifs_sb_info
*cifs_sb
)
3327 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3329 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3330 cifs_sb
->tlink_tree
= RB_ROOT
;
3333 * Temporarily set r/wsize for matching superblock. If we end up using
3334 * new sb then client will later negotiate it downward if needed.
3336 cifs_sb
->rsize
= pvolume_info
->rsize
;
3337 cifs_sb
->wsize
= pvolume_info
->wsize
;
3339 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3340 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3341 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3342 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3343 cFYI(1, "file mode: 0x%hx dir mode: 0x%hx",
3344 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3346 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3347 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3349 if (pvolume_info
->noperm
)
3350 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3351 if (pvolume_info
->setuids
)
3352 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3353 if (pvolume_info
->server_ino
)
3354 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3355 if (pvolume_info
->remap
)
3356 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3357 if (pvolume_info
->no_xattr
)
3358 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3359 if (pvolume_info
->sfu_emul
)
3360 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3361 if (pvolume_info
->nobrl
)
3362 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3363 if (pvolume_info
->nostrictsync
)
3364 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3365 if (pvolume_info
->mand_lock
)
3366 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3367 if (pvolume_info
->rwpidforward
)
3368 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3369 if (pvolume_info
->cifs_acl
)
3370 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3371 if (pvolume_info
->backupuid_specified
) {
3372 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3373 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3375 if (pvolume_info
->backupgid_specified
) {
3376 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3377 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3379 if (pvolume_info
->override_uid
)
3380 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3381 if (pvolume_info
->override_gid
)
3382 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3383 if (pvolume_info
->dynperm
)
3384 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3385 if (pvolume_info
->fsc
)
3386 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3387 if (pvolume_info
->multiuser
)
3388 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3389 CIFS_MOUNT_NO_PERM
);
3390 if (pvolume_info
->strict_io
)
3391 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3392 if (pvolume_info
->direct_io
) {
3393 cFYI(1, "mounting share using direct i/o");
3394 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3396 if (pvolume_info
->mfsymlinks
) {
3397 if (pvolume_info
->sfu_emul
) {
3398 cERROR(1, "mount option mfsymlinks ignored if sfu "
3399 "mount option is used");
3401 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3405 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3406 cERROR(1, "mount option dynperm ignored if cifsacl "
3407 "mount option supported");
3411 * When the server supports very large reads and writes via POSIX extensions,
3412 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
3413 * including the RFC1001 length.
3415 * Note that this might make for "interesting" allocation problems during
3416 * writeback however as we have to allocate an array of pointers for the
3417 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
3419 * For reads, there is a similar problem as we need to allocate an array
3420 * of kvecs to handle the receive, though that should only need to be done
3423 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
3424 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
3427 * When the server doesn't allow large posix writes, only allow a rsize/wsize
3428 * of 2^17-1 minus the size of the call header. That allows for a read or
3429 * write up to the maximum size described by RFC1002.
3431 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
3432 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
3435 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
3436 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
3437 * a single wsize request with a single call.
3439 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
3442 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
3443 * those values when posix extensions aren't in force. In actuality here, we
3444 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
3445 * to be ok with the extra byte even though Windows doesn't send writes that
3450 * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
3452 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
3453 #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
3456 cifs_negotiate_wsize(struct cifs_tcon
*tcon
, struct smb_vol
*pvolume_info
)
3458 __u64 unix_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3459 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
3462 /* start with specified wsize, or default */
3463 if (pvolume_info
->wsize
)
3464 wsize
= pvolume_info
->wsize
;
3465 else if (tcon
->unix_ext
&& (unix_cap
& CIFS_UNIX_LARGE_WRITE_CAP
))
3466 wsize
= CIFS_DEFAULT_IOSIZE
;
3468 wsize
= CIFS_DEFAULT_NON_POSIX_WSIZE
;
3470 /* can server support 24-bit write sizes? (via UNIX extensions) */
3471 if (!tcon
->unix_ext
|| !(unix_cap
& CIFS_UNIX_LARGE_WRITE_CAP
))
3472 wsize
= min_t(unsigned int, wsize
, CIFS_MAX_RFC1002_WSIZE
);
3475 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
3476 * Limit it to max buffer offered by the server, minus the size of the
3477 * WRITEX header, not including the 4 byte RFC1001 length.
3479 if (!(server
->capabilities
& CAP_LARGE_WRITE_X
) ||
3480 (!(server
->capabilities
& CAP_UNIX
) &&
3481 (server
->sec_mode
& (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
))))
3482 wsize
= min_t(unsigned int, wsize
,
3483 server
->maxBuf
- sizeof(WRITE_REQ
) + 4);
3485 /* hard limit of CIFS_MAX_WSIZE */
3486 wsize
= min_t(unsigned int, wsize
, CIFS_MAX_WSIZE
);
3492 cifs_negotiate_rsize(struct cifs_tcon
*tcon
, struct smb_vol
*pvolume_info
)
3494 __u64 unix_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3495 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
3496 unsigned int rsize
, defsize
;
3499 * Set default value...
3501 * HACK alert! Ancient servers have very small buffers. Even though
3502 * MS-CIFS indicates that servers are only limited by the client's
3503 * bufsize for reads, testing against win98se shows that it throws
3504 * INVALID_PARAMETER errors if you try to request too large a read.
3506 * If the server advertises a MaxBufferSize of less than one page,
3507 * assume that it also can't satisfy reads larger than that either.
3509 * FIXME: Is there a better heuristic for this?
3511 if (tcon
->unix_ext
&& (unix_cap
& CIFS_UNIX_LARGE_READ_CAP
))
3512 defsize
= CIFS_DEFAULT_IOSIZE
;
3513 else if (server
->capabilities
& CAP_LARGE_READ_X
)
3514 defsize
= CIFS_DEFAULT_NON_POSIX_RSIZE
;
3515 else if (server
->maxBuf
>= PAGE_CACHE_SIZE
)
3516 defsize
= CIFSMaxBufSize
;
3518 defsize
= server
->maxBuf
- sizeof(READ_RSP
);
3520 rsize
= pvolume_info
->rsize
? pvolume_info
->rsize
: defsize
;
3523 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
3524 * the client's MaxBufferSize.
3526 if (!(server
->capabilities
& CAP_LARGE_READ_X
))
3527 rsize
= min_t(unsigned int, CIFSMaxBufSize
, rsize
);
3529 /* hard limit of CIFS_MAX_RSIZE */
3530 rsize
= min_t(unsigned int, rsize
, CIFS_MAX_RSIZE
);
3536 is_path_accessible(int xid
, struct cifs_tcon
*tcon
,
3537 struct cifs_sb_info
*cifs_sb
, const char *full_path
)
3540 FILE_ALL_INFO
*pfile_info
;
3542 pfile_info
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
3543 if (pfile_info
== NULL
)
3546 rc
= CIFSSMBQPathInfo(xid
, tcon
, full_path
, pfile_info
,
3547 0 /* not legacy */, cifs_sb
->local_nls
,
3548 cifs_sb
->mnt_cifs_flags
&
3549 CIFS_MOUNT_MAP_SPECIAL_CHR
);
3551 if (rc
== -EOPNOTSUPP
|| rc
== -EINVAL
)
3552 rc
= SMBQueryInformation(xid
, tcon
, full_path
, pfile_info
,
3553 cifs_sb
->local_nls
, cifs_sb
->mnt_cifs_flags
&
3554 CIFS_MOUNT_MAP_SPECIAL_CHR
);
3560 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3562 kfree(volume_info
->username
);
3563 kzfree(volume_info
->password
);
3564 if (volume_info
->UNCip
!= volume_info
->UNC
+ 2)
3565 kfree(volume_info
->UNCip
);
3566 kfree(volume_info
->UNC
);
3567 kfree(volume_info
->domainname
);
3568 kfree(volume_info
->iocharset
);
3569 kfree(volume_info
->prepath
);
3573 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3577 cleanup_volume_info_contents(volume_info
);
3582 #ifdef CONFIG_CIFS_DFS_UPCALL
3583 /* build_path_to_root returns full path to root when
3584 * we do not have an exiting connection (tcon) */
3586 build_unc_path_to_root(const struct smb_vol
*vol
,
3587 const struct cifs_sb_info
*cifs_sb
)
3589 char *full_path
, *pos
;
3590 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) : 0;
3591 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3593 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3594 if (full_path
== NULL
)
3595 return ERR_PTR(-ENOMEM
);
3597 strncpy(full_path
, vol
->UNC
, unc_len
);
3598 pos
= full_path
+ unc_len
;
3601 strncpy(pos
, vol
->prepath
, pplen
);
3605 *pos
= '\0'; /* add trailing null */
3606 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3607 cFYI(1, "%s: full_path=%s", __func__
, full_path
);
3612 * Perform a dfs referral query for a share and (optionally) prefix
3614 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3615 * to a string containing updated options for the submount. Otherwise it
3616 * will be left untouched.
3618 * Returns the rc from get_dfs_path to the caller, which can be used to
3619 * determine whether there were referrals.
3622 expand_dfs_referral(int xid
, struct cifs_ses
*pSesInfo
,
3623 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3627 unsigned int num_referrals
= 0;
3628 struct dfs_info3_param
*referrals
= NULL
;
3629 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3631 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3632 if (IS_ERR(full_path
))
3633 return PTR_ERR(full_path
);
3635 /* For DFS paths, skip the first '\' of the UNC */
3636 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3638 rc
= get_dfs_path(xid
, pSesInfo
, ref_path
, cifs_sb
->local_nls
,
3639 &num_referrals
, &referrals
,
3640 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
3642 if (!rc
&& num_referrals
> 0) {
3643 char *fake_devname
= NULL
;
3645 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3646 full_path
+ 1, referrals
,
3649 free_dfs_info_array(referrals
, num_referrals
);
3651 if (IS_ERR(mdata
)) {
3652 rc
= PTR_ERR(mdata
);
3655 cleanup_volume_info_contents(volume_info
);
3656 memset(volume_info
, '\0', sizeof(*volume_info
));
3657 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3660 kfree(fake_devname
);
3661 kfree(cifs_sb
->mountdata
);
3662 cifs_sb
->mountdata
= mdata
;
3670 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3671 const char *devname
)
3675 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3679 if (volume_info
->nullauth
) {
3680 cFYI(1, "Anonymous login");
3681 kfree(volume_info
->username
);
3682 volume_info
->username
= NULL
;
3683 } else if (volume_info
->username
) {
3684 /* BB fixme parse for domain name here */
3685 cFYI(1, "Username: %s", volume_info
->username
);
3687 cifserror("No username specified");
3688 /* In userspace mount helper we can get user name from alternate
3689 locations such as env variables and files on disk */
3693 /* this is needed for ASCII cp to Unicode converts */
3694 if (volume_info
->iocharset
== NULL
) {
3695 /* load_nls_default cannot return null */
3696 volume_info
->local_nls
= load_nls_default();
3698 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3699 if (volume_info
->local_nls
== NULL
) {
3700 cERROR(1, "CIFS mount error: iocharset %s not found",
3701 volume_info
->iocharset
);
3710 cifs_get_volume_info(char *mount_data
, const char *devname
)
3713 struct smb_vol
*volume_info
;
3715 volume_info
= kzalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3717 return ERR_PTR(-ENOMEM
);
3719 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3721 cifs_cleanup_volume_info(volume_info
);
3722 volume_info
= ERR_PTR(rc
);
3729 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3733 struct cifs_ses
*pSesInfo
;
3734 struct cifs_tcon
*tcon
;
3735 struct TCP_Server_Info
*srvTcp
;
3737 struct tcon_link
*tlink
;
3738 #ifdef CONFIG_CIFS_DFS_UPCALL
3739 int referral_walks_count
= 0;
3742 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs", BDI_CAP_MAP_COPY
);
3746 #ifdef CONFIG_CIFS_DFS_UPCALL
3748 /* cleanup activities if we're chasing a referral */
3749 if (referral_walks_count
) {
3751 cifs_put_tcon(tcon
);
3753 cifs_put_smb_ses(pSesInfo
);
3767 /* get a reference to a tcp session */
3768 srvTcp
= cifs_get_tcp_session(volume_info
);
3769 if (IS_ERR(srvTcp
)) {
3770 rc
= PTR_ERR(srvTcp
);
3771 bdi_destroy(&cifs_sb
->bdi
);
3775 /* get a reference to a SMB session */
3776 pSesInfo
= cifs_get_smb_ses(srvTcp
, volume_info
);
3777 if (IS_ERR(pSesInfo
)) {
3778 rc
= PTR_ERR(pSesInfo
);
3780 goto mount_fail_check
;
3783 /* search for existing tcon to this server share */
3784 tcon
= cifs_get_tcon(pSesInfo
, volume_info
);
3788 goto remote_path_check
;
3791 /* tell server which Unix caps we support */
3792 if (tcon
->ses
->capabilities
& CAP_UNIX
) {
3793 /* reset of caps checks mount to see if unix extensions
3794 disabled for just this mount */
3795 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3796 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3797 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3798 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3800 goto mount_fail_check
;
3803 tcon
->unix_ext
= 0; /* server does not support them */
3805 /* do not care if following two calls succeed - informational */
3807 CIFSSMBQFSDeviceInfo(xid
, tcon
);
3808 CIFSSMBQFSAttributeInfo(xid
, tcon
);
3811 cifs_sb
->wsize
= cifs_negotiate_wsize(tcon
, volume_info
);
3812 cifs_sb
->rsize
= cifs_negotiate_rsize(tcon
, volume_info
);
3814 /* tune readahead according to rsize */
3815 cifs_sb
->bdi
.ra_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3818 #ifdef CONFIG_CIFS_DFS_UPCALL
3820 * Perform an unconditional check for whether there are DFS
3821 * referrals for this path without prefix, to provide support
3822 * for DFS referrals from w2k8 servers which don't seem to respond
3823 * with PATH_NOT_COVERED to requests that include the prefix.
3824 * Chase the referral if found, otherwise continue normally.
3826 if (referral_walks_count
== 0) {
3827 int refrc
= expand_dfs_referral(xid
, pSesInfo
, volume_info
,
3830 referral_walks_count
++;
3831 goto try_mount_again
;
3836 /* check if a whole path is not remote */
3838 /* build_path_to_root works only when we have a valid tcon */
3839 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3840 if (full_path
== NULL
) {
3842 goto mount_fail_check
;
3844 rc
= is_path_accessible(xid
, tcon
, cifs_sb
, full_path
);
3845 if (rc
!= 0 && rc
!= -EREMOTE
) {
3847 goto mount_fail_check
;
3852 /* get referral if needed */
3853 if (rc
== -EREMOTE
) {
3854 #ifdef CONFIG_CIFS_DFS_UPCALL
3855 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3857 * BB: when we implement proper loop detection,
3858 * we will remove this check. But now we need it
3859 * to prevent an indefinite loop if 'DFS tree' is
3860 * misconfigured (i.e. has loops).
3863 goto mount_fail_check
;
3866 rc
= expand_dfs_referral(xid
, pSesInfo
, volume_info
, cifs_sb
,
3870 referral_walks_count
++;
3871 goto try_mount_again
;
3873 goto mount_fail_check
;
3874 #else /* No DFS support, return error on mount */
3880 goto mount_fail_check
;
3882 /* now, hang the tcon off of the superblock */
3883 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3884 if (tlink
== NULL
) {
3886 goto mount_fail_check
;
3889 tlink
->tl_uid
= pSesInfo
->linux_uid
;
3890 tlink
->tl_tcon
= tcon
;
3891 tlink
->tl_time
= jiffies
;
3892 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3893 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3895 cifs_sb
->master_tlink
= tlink
;
3896 spin_lock(&cifs_sb
->tlink_tree_lock
);
3897 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3898 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3900 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3904 /* on error free sesinfo and tcon struct if needed */
3906 /* If find_unc succeeded then rc == 0 so we can not end */
3907 /* up accidentally freeing someone elses tcon struct */
3909 cifs_put_tcon(tcon
);
3911 cifs_put_smb_ses(pSesInfo
);
3913 cifs_put_tcp_session(srvTcp
);
3914 bdi_destroy(&cifs_sb
->bdi
);
3923 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3924 * pointer may be NULL.
3927 CIFSTCon(unsigned int xid
, struct cifs_ses
*ses
,
3928 const char *tree
, struct cifs_tcon
*tcon
,
3929 const struct nls_table
*nls_codepage
)
3931 struct smb_hdr
*smb_buffer
;
3932 struct smb_hdr
*smb_buffer_response
;
3935 unsigned char *bcc_ptr
;
3938 __u16 bytes_left
, count
;
3943 smb_buffer
= cifs_buf_get();
3944 if (smb_buffer
== NULL
)
3947 smb_buffer_response
= smb_buffer
;
3949 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3950 NULL
/*no tid */ , 4 /*wct */ );
3952 smb_buffer
->Mid
= GetNextMid(ses
->server
);
3953 smb_buffer
->Uid
= ses
->Suid
;
3954 pSMB
= (TCONX_REQ
*) smb_buffer
;
3955 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3957 pSMB
->AndXCommand
= 0xFF;
3958 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3959 bcc_ptr
= &pSMB
->Password
[0];
3960 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3961 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3962 *bcc_ptr
= 0; /* password is null byte */
3963 bcc_ptr
++; /* skip password */
3964 /* already aligned so no need to do it below */
3966 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3967 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3968 specified as required (when that support is added to
3969 the vfs in the future) as only NTLM or the much
3970 weaker LANMAN (which we do not send by default) is accepted
3971 by Samba (not sure whether other servers allow
3972 NTLMv2 password here) */
3973 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3974 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3975 (ses
->server
->secType
== LANMAN
))
3976 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3977 ses
->server
->sec_mode
&
3978 SECMODE_PW_ENCRYPT
? true : false,
3981 #endif /* CIFS_WEAK_PW_HASH */
3982 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3983 bcc_ptr
, nls_codepage
);
3985 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3986 if (ses
->capabilities
& CAP_UNICODE
) {
3987 /* must align unicode strings */
3988 *bcc_ptr
= 0; /* null byte password */
3993 if (ses
->server
->sec_mode
&
3994 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
3995 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3997 if (ses
->capabilities
& CAP_STATUS32
) {
3998 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
4000 if (ses
->capabilities
& CAP_DFS
) {
4001 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
4003 if (ses
->capabilities
& CAP_UNICODE
) {
4004 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
4006 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
4007 6 /* max utf8 char length in bytes */ *
4008 (/* server len*/ + 256 /* share len */), nls_codepage
);
4009 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
4010 bcc_ptr
+= 2; /* skip trailing null */
4011 } else { /* ASCII */
4012 strcpy(bcc_ptr
, tree
);
4013 bcc_ptr
+= strlen(tree
) + 1;
4015 strcpy(bcc_ptr
, "?????");
4016 bcc_ptr
+= strlen("?????");
4018 count
= bcc_ptr
- &pSMB
->Password
[0];
4019 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
4020 pSMB
->hdr
.smb_buf_length
) + count
);
4021 pSMB
->ByteCount
= cpu_to_le16(count
);
4023 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
4026 /* above now done in SendReceive */
4027 if ((rc
== 0) && (tcon
!= NULL
)) {
4030 tcon
->tidStatus
= CifsGood
;
4031 tcon
->need_reconnect
= false;
4032 tcon
->tid
= smb_buffer_response
->Tid
;
4033 bcc_ptr
= pByteArea(smb_buffer_response
);
4034 bytes_left
= get_bcc(smb_buffer_response
);
4035 length
= strnlen(bcc_ptr
, bytes_left
- 2);
4036 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
4042 /* skip service field (NB: this field is always ASCII) */
4044 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
4045 (bcc_ptr
[2] == 'C')) {
4046 cFYI(1, "IPC connection");
4049 } else if (length
== 2) {
4050 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
4051 /* the most common case */
4052 cFYI(1, "disk share connection");
4055 bcc_ptr
+= length
+ 1;
4056 bytes_left
-= (length
+ 1);
4057 strncpy(tcon
->treeName
, tree
, MAX_TREE_SIZE
);
4059 /* mostly informational -- no need to fail on error here */
4060 kfree(tcon
->nativeFileSystem
);
4061 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
4062 bytes_left
, is_unicode
,
4065 cFYI(1, "nativeFileSystem=%s", tcon
->nativeFileSystem
);
4067 if ((smb_buffer_response
->WordCount
== 3) ||
4068 (smb_buffer_response
->WordCount
== 7))
4069 /* field is in same location */
4070 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
4073 cFYI(1, "Tcon flags: 0x%x ", tcon
->Flags
);
4074 } else if ((rc
== 0) && tcon
== NULL
) {
4075 /* all we need to save for IPC$ connection */
4076 ses
->ipc_tid
= smb_buffer_response
->Tid
;
4079 cifs_buf_release(smb_buffer
);
4084 cifs_umount(struct cifs_sb_info
*cifs_sb
)
4086 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4087 struct rb_node
*node
;
4088 struct tcon_link
*tlink
;
4090 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
4092 spin_lock(&cifs_sb
->tlink_tree_lock
);
4093 while ((node
= rb_first(root
))) {
4094 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4095 cifs_get_tlink(tlink
);
4096 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4097 rb_erase(node
, root
);
4099 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4100 cifs_put_tlink(tlink
);
4101 spin_lock(&cifs_sb
->tlink_tree_lock
);
4103 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4105 bdi_destroy(&cifs_sb
->bdi
);
4106 kfree(cifs_sb
->mountdata
);
4107 unload_nls(cifs_sb
->local_nls
);
4111 int cifs_negotiate_protocol(unsigned int xid
, struct cifs_ses
*ses
)
4114 struct TCP_Server_Info
*server
= ses
->server
;
4116 /* only send once per connect */
4117 if (server
->maxBuf
!= 0)
4120 cifs_set_credits(server
, 1);
4121 rc
= CIFSSMBNegotiate(xid
, ses
);
4122 if (rc
== -EAGAIN
) {
4123 /* retry only once on 1st time connection */
4124 cifs_set_credits(server
, 1);
4125 rc
= CIFSSMBNegotiate(xid
, ses
);
4130 spin_lock(&GlobalMid_Lock
);
4131 if (server
->tcpStatus
== CifsNeedNegotiate
)
4132 server
->tcpStatus
= CifsGood
;
4135 spin_unlock(&GlobalMid_Lock
);
4143 int cifs_setup_session(unsigned int xid
, struct cifs_ses
*ses
,
4144 struct nls_table
*nls_info
)
4147 struct TCP_Server_Info
*server
= ses
->server
;
4150 ses
->capabilities
= server
->capabilities
;
4151 if (linuxExtEnabled
== 0)
4152 ses
->capabilities
&= (~CAP_UNIX
);
4154 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
4155 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
4157 rc
= CIFS_SessSetup(xid
, ses
, nls_info
);
4159 cERROR(1, "Send error in SessSetup = %d", rc
);
4161 mutex_lock(&ses
->server
->srv_mutex
);
4162 if (!server
->session_estab
) {
4163 server
->session_key
.response
= ses
->auth_key
.response
;
4164 server
->session_key
.len
= ses
->auth_key
.len
;
4165 server
->sequence_number
= 0x2;
4166 server
->session_estab
= true;
4167 ses
->auth_key
.response
= NULL
;
4169 mutex_unlock(&server
->srv_mutex
);
4171 cFYI(1, "CIFS Session Established successfully");
4172 spin_lock(&GlobalMid_Lock
);
4173 ses
->status
= CifsGood
;
4174 ses
->need_reconnect
= false;
4175 spin_unlock(&GlobalMid_Lock
);
4178 kfree(ses
->auth_key
.response
);
4179 ses
->auth_key
.response
= NULL
;
4180 ses
->auth_key
.len
= 0;
4181 kfree(ses
->ntlmssp
);
4182 ses
->ntlmssp
= NULL
;
4188 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
4190 switch (ses
->server
->secType
) {
4192 vol
->secFlg
= CIFSSEC_MUST_KRB5
;
4195 vol
->secFlg
= CIFSSEC_MUST_NTLMV2
;
4198 vol
->secFlg
= CIFSSEC_MUST_NTLM
;
4201 vol
->secFlg
= CIFSSEC_MUST_NTLMSSP
;
4204 vol
->secFlg
= CIFSSEC_MUST_LANMAN
;
4208 return cifs_set_cifscreds(vol
, ses
);
4211 static struct cifs_tcon
*
4212 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, uid_t fsuid
)
4215 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
4216 struct cifs_ses
*ses
;
4217 struct cifs_tcon
*tcon
= NULL
;
4218 struct smb_vol
*vol_info
;
4220 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
4221 if (vol_info
== NULL
)
4222 return ERR_PTR(-ENOMEM
);
4224 vol_info
->local_nls
= cifs_sb
->local_nls
;
4225 vol_info
->linux_uid
= fsuid
;
4226 vol_info
->cred_uid
= fsuid
;
4227 vol_info
->UNC
= master_tcon
->treeName
;
4228 vol_info
->retry
= master_tcon
->retry
;
4229 vol_info
->nocase
= master_tcon
->nocase
;
4230 vol_info
->local_lease
= master_tcon
->local_lease
;
4231 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
4233 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
4239 /* get a reference for the same TCP session */
4240 spin_lock(&cifs_tcp_ses_lock
);
4241 ++master_tcon
->ses
->server
->srv_count
;
4242 spin_unlock(&cifs_tcp_ses_lock
);
4244 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
4246 tcon
= (struct cifs_tcon
*)ses
;
4247 cifs_put_tcp_session(master_tcon
->ses
->server
);
4251 tcon
= cifs_get_tcon(ses
, vol_info
);
4253 cifs_put_smb_ses(ses
);
4257 if (ses
->capabilities
& CAP_UNIX
)
4258 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
4260 kfree(vol_info
->username
);
4261 kfree(vol_info
->password
);
4268 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
4270 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
4274 cifs_sb_tcon_pending_wait(void *unused
)
4277 return signal_pending(current
) ? -ERESTARTSYS
: 0;
4280 /* find and return a tlink with given uid */
4281 static struct tcon_link
*
4282 tlink_rb_search(struct rb_root
*root
, uid_t uid
)
4284 struct rb_node
*node
= root
->rb_node
;
4285 struct tcon_link
*tlink
;
4288 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4290 if (tlink
->tl_uid
> uid
)
4291 node
= node
->rb_left
;
4292 else if (tlink
->tl_uid
< uid
)
4293 node
= node
->rb_right
;
4300 /* insert a tcon_link into the tree */
4302 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
4304 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
4305 struct tcon_link
*tlink
;
4308 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
4311 if (tlink
->tl_uid
> new_tlink
->tl_uid
)
4312 new = &((*new)->rb_left
);
4314 new = &((*new)->rb_right
);
4317 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
4318 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
4322 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4325 * If the superblock doesn't refer to a multiuser mount, then just return
4326 * the master tcon for the mount.
4328 * First, search the rbtree for an existing tcon for this fsuid. If one
4329 * exists, then check to see if it's pending construction. If it is then wait
4330 * for construction to complete. Once it's no longer pending, check to see if
4331 * it failed and either return an error or retry construction, depending on
4334 * If one doesn't exist then insert a new tcon_link struct into the tree and
4335 * try to construct a new one.
4338 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4341 uid_t fsuid
= current_fsuid();
4342 struct tcon_link
*tlink
, *newtlink
;
4344 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4345 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4347 spin_lock(&cifs_sb
->tlink_tree_lock
);
4348 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4350 cifs_get_tlink(tlink
);
4351 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4353 if (tlink
== NULL
) {
4354 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4355 if (newtlink
== NULL
)
4356 return ERR_PTR(-ENOMEM
);
4357 newtlink
->tl_uid
= fsuid
;
4358 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4359 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4360 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4361 cifs_get_tlink(newtlink
);
4363 spin_lock(&cifs_sb
->tlink_tree_lock
);
4364 /* was one inserted after previous search? */
4365 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4367 cifs_get_tlink(tlink
);
4368 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4370 goto wait_for_construction
;
4373 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4374 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4376 wait_for_construction
:
4377 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4378 cifs_sb_tcon_pending_wait
,
4379 TASK_INTERRUPTIBLE
);
4381 cifs_put_tlink(tlink
);
4382 return ERR_PTR(ret
);
4385 /* if it's good, return it */
4386 if (!IS_ERR(tlink
->tl_tcon
))
4389 /* return error if we tried this already recently */
4390 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4391 cifs_put_tlink(tlink
);
4392 return ERR_PTR(-EACCES
);
4395 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4396 goto wait_for_construction
;
4399 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4400 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4401 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4403 if (IS_ERR(tlink
->tl_tcon
)) {
4404 cifs_put_tlink(tlink
);
4405 return ERR_PTR(-EACCES
);
4412 * periodic workqueue job that scans tcon_tree for a superblock and closes
4416 cifs_prune_tlinks(struct work_struct
*work
)
4418 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4420 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4421 struct rb_node
*node
= rb_first(root
);
4422 struct rb_node
*tmp
;
4423 struct tcon_link
*tlink
;
4426 * Because we drop the spinlock in the loop in order to put the tlink
4427 * it's not guarded against removal of links from the tree. The only
4428 * places that remove entries from the tree are this function and
4429 * umounts. Because this function is non-reentrant and is canceled
4430 * before umount can proceed, this is safe.
4432 spin_lock(&cifs_sb
->tlink_tree_lock
);
4433 node
= rb_first(root
);
4434 while (node
!= NULL
) {
4436 node
= rb_next(tmp
);
4437 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4439 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4440 atomic_read(&tlink
->tl_count
) != 0 ||
4441 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4444 cifs_get_tlink(tlink
);
4445 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4446 rb_erase(tmp
, root
);
4448 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4449 cifs_put_tlink(tlink
);
4450 spin_lock(&cifs_sb
->tlink_tree_lock
);
4452 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4454 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,