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(server
));
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(server
));
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
);
787 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
789 #ifdef CONFIG_CIFS_STATS2
790 mid
->when_received
= jiffies
;
792 spin_lock(&GlobalMid_Lock
);
794 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
796 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
797 list_del_init(&mid
->qhead
);
798 spin_unlock(&GlobalMid_Lock
);
802 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
803 char *buf
, int malformed
)
805 if (malformed
== 0 && check2ndT2(buf
) > 0) {
806 mid
->multiRsp
= true;
808 /* merge response - fix up 1st*/
809 malformed
= coalesce_t2(buf
, mid
->resp_buf
);
813 /* All parts received or packet is malformed. */
814 mid
->multiEnd
= true;
815 return dequeue_mid(mid
, malformed
);
817 if (!server
->large_buf
) {
818 /*FIXME: switch to already allocated largebuf?*/
819 cERROR(1, "1st trans2 resp needs bigbuf");
821 /* Have first buffer */
823 mid
->large_buf
= true;
824 server
->bigbuf
= NULL
;
829 mid
->large_buf
= server
->large_buf
;
830 /* Was previous buf put in mpx struct for multi-rsp? */
831 if (!mid
->multiRsp
) {
832 /* smb buffer will be freed by user thread */
833 if (server
->large_buf
)
834 server
->bigbuf
= NULL
;
836 server
->smallbuf
= NULL
;
838 dequeue_mid(mid
, malformed
);
841 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
845 /* take it off the list, if it's not already */
846 spin_lock(&cifs_tcp_ses_lock
);
847 list_del_init(&server
->tcp_ses_list
);
848 spin_unlock(&cifs_tcp_ses_lock
);
850 spin_lock(&GlobalMid_Lock
);
851 server
->tcpStatus
= CifsExiting
;
852 spin_unlock(&GlobalMid_Lock
);
853 wake_up_all(&server
->response_q
);
855 /* check if we have blocked requests that need to free */
856 spin_lock(&server
->req_lock
);
857 if (server
->credits
<= 0)
859 spin_unlock(&server
->req_lock
);
861 * Although there should not be any requests blocked on this queue it
862 * can not hurt to be paranoid and try to wake up requests that may
863 * haven been blocked when more than 50 at time were on the wire to the
864 * same server - they now will see the session is in exit state and get
865 * out of SendReceive.
867 wake_up_all(&server
->request_q
);
868 /* give those requests time to exit */
871 if (server
->ssocket
) {
872 sock_release(server
->ssocket
);
873 server
->ssocket
= NULL
;
876 if (!list_empty(&server
->pending_mid_q
)) {
877 struct list_head dispose_list
;
878 struct mid_q_entry
*mid_entry
;
879 struct list_head
*tmp
, *tmp2
;
881 INIT_LIST_HEAD(&dispose_list
);
882 spin_lock(&GlobalMid_Lock
);
883 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
884 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
885 cFYI(1, "Clearing mid 0x%llx", mid_entry
->mid
);
886 mid_entry
->mid_state
= MID_SHUTDOWN
;
887 list_move(&mid_entry
->qhead
, &dispose_list
);
889 spin_unlock(&GlobalMid_Lock
);
891 /* now walk dispose list and issue callbacks */
892 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
893 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
894 cFYI(1, "Callback mid 0x%llx", mid_entry
->mid
);
895 list_del_init(&mid_entry
->qhead
);
896 mid_entry
->callback(mid_entry
);
898 /* 1/8th of sec is more than enough time for them to exit */
902 if (!list_empty(&server
->pending_mid_q
)) {
904 * mpx threads have not exited yet give them at least the smb
905 * send timeout time for long ops.
907 * Due to delays on oplock break requests, we need to wait at
908 * least 45 seconds before giving up on a request getting a
909 * response and going ahead and killing cifsd.
911 cFYI(1, "Wait for exit from demultiplex thread");
914 * If threads still have not exited they are probably never
915 * coming home not much else we can do but free the memory.
919 kfree(server
->hostname
);
923 length
= atomic_dec_return(&tcpSesAllocCount
);
925 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
930 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
933 char *buf
= server
->smallbuf
;
934 unsigned int pdu_length
= get_rfc1002_length(buf
);
936 /* make sure this will fit in a large buffer */
937 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) - 4) {
938 cERROR(1, "SMB response too long (%u bytes)",
940 cifs_reconnect(server
);
941 wake_up(&server
->response_q
);
945 /* switch to large buffer if too big for a small one */
946 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
947 server
->large_buf
= true;
948 memcpy(server
->bigbuf
, buf
, server
->total_read
);
949 buf
= server
->bigbuf
;
952 /* now read the rest */
953 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
954 pdu_length
- HEADER_SIZE(server
) + 1 + 4);
957 server
->total_read
+= length
;
959 dump_smb(buf
, server
->total_read
);
962 * We know that we received enough to get to the MID as we
963 * checked the pdu_length earlier. Now check to see
964 * if the rest of the header is OK. We borrow the length
965 * var for the rest of the loop to avoid a new stack var.
967 * 48 bytes is enough to display the header and a little bit
968 * into the payload for debugging purposes.
970 length
= server
->ops
->check_message(buf
, server
->total_read
);
972 cifs_dump_mem("Bad SMB: ", buf
,
973 min_t(unsigned int, server
->total_read
, 48));
978 handle_mid(mid
, server
, buf
, length
);
983 cifs_demultiplex_thread(void *p
)
986 struct TCP_Server_Info
*server
= p
;
987 unsigned int pdu_length
;
989 struct task_struct
*task_to_wake
= NULL
;
990 struct mid_q_entry
*mid_entry
;
992 current
->flags
|= PF_MEMALLOC
;
993 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current
));
995 length
= atomic_inc_return(&tcpSesAllocCount
);
997 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
1001 while (server
->tcpStatus
!= CifsExiting
) {
1002 if (try_to_freeze())
1005 if (!allocate_buffers(server
))
1008 server
->large_buf
= false;
1009 buf
= server
->smallbuf
;
1010 pdu_length
= 4; /* enough to get RFC1001 header */
1012 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
1015 server
->total_read
= length
;
1018 * The right amount was read from socket - 4 bytes,
1019 * so we can now interpret the length field.
1021 pdu_length
= get_rfc1002_length(buf
);
1023 cFYI(1, "RFC1002 header 0x%x", pdu_length
);
1024 if (!is_smb_response(server
, buf
[0]))
1027 /* make sure we have enough to get to the MID */
1028 if (pdu_length
< HEADER_SIZE(server
) - 1 - 4) {
1029 cERROR(1, "SMB response too short (%u bytes)",
1031 cifs_reconnect(server
);
1032 wake_up(&server
->response_q
);
1036 /* read down to the MID */
1037 length
= cifs_read_from_socket(server
, buf
+ 4,
1038 HEADER_SIZE(server
) - 1 - 4);
1041 server
->total_read
+= length
;
1043 mid_entry
= server
->ops
->find_mid(server
, buf
);
1045 if (!mid_entry
|| !mid_entry
->receive
)
1046 length
= standard_receive3(server
, mid_entry
);
1048 length
= mid_entry
->receive(server
, mid_entry
);
1053 if (server
->large_buf
)
1054 buf
= server
->bigbuf
;
1056 server
->lstrp
= jiffies
;
1057 if (mid_entry
!= NULL
) {
1058 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
1059 mid_entry
->callback(mid_entry
);
1060 } else if (!server
->ops
->is_oplock_break(buf
, server
)) {
1061 cERROR(1, "No task to wake, unknown frame received! "
1062 "NumMids %d", atomic_read(&midCount
));
1063 cifs_dump_mem("Received Data is: ", buf
,
1064 HEADER_SIZE(server
));
1065 #ifdef CONFIG_CIFS_DEBUG2
1066 server
->ops
->dump_detail(buf
);
1067 cifs_dump_mids(server
);
1068 #endif /* CIFS_DEBUG2 */
1071 } /* end while !EXITING */
1073 /* buffer usually freed in free_mid - need to free it here on exit */
1074 cifs_buf_release(server
->bigbuf
);
1075 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
1076 cifs_small_buf_release(server
->smallbuf
);
1078 task_to_wake
= xchg(&server
->tsk
, NULL
);
1079 clean_demultiplex_info(server
);
1081 /* if server->tsk was NULL then wait for a signal before exiting */
1082 if (!task_to_wake
) {
1083 set_current_state(TASK_INTERRUPTIBLE
);
1084 while (!signal_pending(current
)) {
1086 set_current_state(TASK_INTERRUPTIBLE
);
1088 set_current_state(TASK_RUNNING
);
1091 module_put_and_exit(0);
1094 /* extract the host portion of the UNC string */
1096 extract_hostname(const char *unc
)
1102 /* skip double chars at beginning of string */
1103 /* BB: check validity of these bytes? */
1106 /* delimiter between hostname and sharename is always '\\' now */
1107 delim
= strchr(src
, '\\');
1109 return ERR_PTR(-EINVAL
);
1112 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
1114 return ERR_PTR(-ENOMEM
);
1116 memcpy(dst
, src
, len
);
1122 static int get_option_ul(substring_t args
[], unsigned long *option
)
1127 string
= match_strdup(args
);
1130 rc
= kstrtoul(string
, 0, option
);
1137 static int cifs_parse_security_flavors(char *value
,
1138 struct smb_vol
*vol
)
1141 substring_t args
[MAX_OPT_ARGS
];
1143 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1145 vol
->secFlg
|= CIFSSEC_MAY_KRB5
;
1148 vol
->secFlg
|= CIFSSEC_MAY_KRB5
| CIFSSEC_MUST_SIGN
;
1151 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1152 cERROR(1, "Krb5 cifs privacy not supported");
1154 case Opt_sec_ntlmssp
:
1155 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
;
1157 case Opt_sec_ntlmsspi
:
1158 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
| CIFSSEC_MUST_SIGN
;
1161 /* ntlm is default so can be turned off too */
1162 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1165 vol
->secFlg
|= CIFSSEC_MAY_NTLM
| CIFSSEC_MUST_SIGN
;
1167 case Opt_sec_nontlm
:
1168 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1170 case Opt_sec_ntlmv2i
:
1171 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
| CIFSSEC_MUST_SIGN
;
1173 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1174 case Opt_sec_lanman
:
1175 vol
->secFlg
|= CIFSSEC_MAY_LANMAN
;
1182 cERROR(1, "bad security option: %s", value
);
1190 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1192 substring_t args
[MAX_OPT_ARGS
];
1194 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1195 case Opt_cache_loose
:
1196 vol
->direct_io
= false;
1197 vol
->strict_io
= false;
1199 case Opt_cache_strict
:
1200 vol
->direct_io
= false;
1201 vol
->strict_io
= true;
1203 case Opt_cache_none
:
1204 vol
->direct_io
= true;
1205 vol
->strict_io
= false;
1208 cERROR(1, "bad cache= option: %s", value
);
1215 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1217 substring_t args
[MAX_OPT_ARGS
];
1219 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1221 vol
->ops
= &smb1_operations
;
1222 vol
->vals
= &smb1_values
;
1225 cERROR(1, "Unknown vers= option specified: %s", value
);
1232 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1233 struct smb_vol
*vol
)
1236 char *mountdata_copy
= NULL
, *options
;
1237 unsigned int temp_len
, i
, j
;
1239 short int override_uid
= -1;
1240 short int override_gid
= -1;
1241 bool uid_specified
= false;
1242 bool gid_specified
= false;
1243 bool sloppy
= false;
1244 char *invalid
= NULL
;
1245 char *nodename
= utsname()->nodename
;
1246 char *string
= NULL
;
1247 char *tmp_end
, *value
;
1249 bool cache_specified
= false;
1250 static bool cache_warned
= false;
1254 delim
= separator
[0];
1257 * does not have to be perfect mapping since field is
1258 * informational, only used for servers that do not support
1259 * port 445 and it can be overridden at mount time
1261 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1262 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1263 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1265 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1266 /* null target name indicates to use *SMBSERVR default called name
1267 if we end up sending RFC1001 session initialize */
1268 vol
->target_rfc1001_name
[0] = 0;
1269 vol
->cred_uid
= current_uid();
1270 vol
->linux_uid
= current_uid();
1271 vol
->linux_gid
= current_gid();
1273 /* default to only allowing write access to owner of the mount */
1274 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1276 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1277 /* default is always to request posix paths. */
1278 vol
->posix_paths
= 1;
1279 /* default to using server inode numbers where available */
1280 vol
->server_ino
= 1;
1282 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1284 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1285 vol
->ops
= &smb1_operations
;
1286 vol
->vals
= &smb1_values
;
1289 goto cifs_parse_mount_err
;
1291 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1292 if (!mountdata_copy
)
1293 goto cifs_parse_mount_err
;
1295 options
= mountdata_copy
;
1296 end
= options
+ strlen(options
);
1298 if (strncmp(options
, "sep=", 4) == 0) {
1299 if (options
[4] != 0) {
1300 separator
[0] = options
[4];
1303 cFYI(1, "Null separator not allowed");
1306 vol
->backupuid_specified
= false; /* no backup intent for a user */
1307 vol
->backupgid_specified
= false; /* no backup intent for a group */
1309 while ((data
= strsep(&options
, separator
)) != NULL
) {
1310 substring_t args
[MAX_OPT_ARGS
];
1311 unsigned long option
;
1317 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1321 /* Ingnore the following */
1325 /* Boolean values */
1326 case Opt_user_xattr
:
1329 case Opt_nouser_xattr
:
1335 case Opt_noforceuid
:
1338 case Opt_noblocksend
:
1339 vol
->noblocksnd
= 1;
1341 case Opt_noautotune
:
1342 vol
->noautotune
= 1;
1359 case Opt_nomapchars
:
1371 case Opt_posixpaths
:
1372 vol
->posix_paths
= 1;
1374 case Opt_noposixpaths
:
1375 vol
->posix_paths
= 0;
1378 vol
->no_linux_ext
= 1;
1389 * turn off mandatory locking in mode
1390 * if remote locking is turned off since the
1391 * local vfs will do advisory
1393 if (vol
->file_mode
==
1394 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1395 vol
->file_mode
= S_IALLUGO
;
1397 case Opt_forcemandatorylock
:
1407 vol
->dynperm
= true;
1410 vol
->dynperm
= false;
1424 case Opt_nostrictsync
:
1425 vol
->nostrictsync
= 1;
1427 case Opt_strictsync
:
1428 vol
->nostrictsync
= 0;
1431 vol
->server_ino
= 1;
1433 case Opt_noserverino
:
1434 vol
->server_ino
= 0;
1436 case Opt_rwpidforward
:
1437 vol
->rwpidforward
= 1;
1446 vol
->no_psx_acl
= 0;
1449 vol
->no_psx_acl
= 1;
1451 case Opt_locallease
:
1452 vol
->local_lease
= 1;
1455 vol
->secFlg
|= CIFSSEC_MUST_SIGN
;
1458 /* we do not do the following in secFlags because seal
1459 * is a per tree connection (mount) not a per socket
1460 * or per-smb connection option in the protocol
1461 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1466 cache_specified
= true;
1467 vol
->direct_io
= true;
1468 vol
->strict_io
= false;
1469 cERROR(1, "The \"directio\" option will be removed in "
1470 "3.7. Please switch to the \"cache=none\" "
1473 case Opt_strictcache
:
1474 cache_specified
= true;
1475 vol
->direct_io
= false;
1476 vol
->strict_io
= true;
1477 cERROR(1, "The \"strictcache\" option will be removed "
1478 "in 3.7. Please switch to the \"cache=strict\" "
1482 printk(KERN_WARNING
"CIFS: Mount option noac not "
1483 "supported. Instead set "
1484 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1487 #ifndef CONFIG_CIFS_FSCACHE
1488 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1489 "kernel config option set");
1490 goto cifs_parse_mount_err
;
1494 case Opt_mfsymlinks
:
1495 vol
->mfsymlinks
= true;
1498 vol
->multiuser
= true;
1504 /* Numeric Values */
1506 if (get_option_ul(args
, &option
)) {
1507 cERROR(1, "%s: Invalid backupuid value",
1509 goto cifs_parse_mount_err
;
1511 vol
->backupuid
= option
;
1512 vol
->backupuid_specified
= true;
1515 if (get_option_ul(args
, &option
)) {
1516 cERROR(1, "%s: Invalid backupgid value",
1518 goto cifs_parse_mount_err
;
1520 vol
->backupgid
= option
;
1521 vol
->backupgid_specified
= true;
1524 if (get_option_ul(args
, &option
)) {
1525 cERROR(1, "%s: Invalid uid value",
1527 goto cifs_parse_mount_err
;
1529 vol
->linux_uid
= option
;
1530 uid_specified
= true;
1533 if (get_option_ul(args
, &option
)) {
1534 cERROR(1, "%s: Invalid cruid value",
1536 goto cifs_parse_mount_err
;
1538 vol
->cred_uid
= option
;
1541 if (get_option_ul(args
, &option
)) {
1542 cERROR(1, "%s: Invalid gid value",
1544 goto cifs_parse_mount_err
;
1546 vol
->linux_gid
= option
;
1547 gid_specified
= true;
1550 if (get_option_ul(args
, &option
)) {
1551 cERROR(1, "%s: Invalid file_mode value",
1553 goto cifs_parse_mount_err
;
1555 vol
->file_mode
= option
;
1558 if (get_option_ul(args
, &option
)) {
1559 cERROR(1, "%s: Invalid dir_mode value",
1561 goto cifs_parse_mount_err
;
1563 vol
->dir_mode
= option
;
1566 if (get_option_ul(args
, &option
)) {
1567 cERROR(1, "%s: Invalid port value",
1569 goto cifs_parse_mount_err
;
1574 if (get_option_ul(args
, &option
)) {
1575 cERROR(1, "%s: Invalid rsize value",
1577 goto cifs_parse_mount_err
;
1579 vol
->rsize
= option
;
1582 if (get_option_ul(args
, &option
)) {
1583 cERROR(1, "%s: Invalid wsize value",
1585 goto cifs_parse_mount_err
;
1587 vol
->wsize
= option
;
1590 if (get_option_ul(args
, &option
)) {
1591 cERROR(1, "%s: Invalid actimeo value",
1593 goto cifs_parse_mount_err
;
1595 vol
->actimeo
= HZ
* option
;
1596 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1597 cERROR(1, "CIFS: attribute cache"
1598 "timeout too large");
1599 goto cifs_parse_mount_err
;
1603 /* String Arguments */
1605 case Opt_blank_user
:
1606 /* null user, ie. anonymous authentication */
1608 vol
->username
= NULL
;
1611 string
= match_strdup(args
);
1615 if (strnlen(string
, MAX_USERNAME_SIZE
) >
1616 MAX_USERNAME_SIZE
) {
1617 printk(KERN_WARNING
"CIFS: username too long\n");
1618 goto cifs_parse_mount_err
;
1620 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1621 if (!vol
->username
) {
1622 printk(KERN_WARNING
"CIFS: no memory "
1624 goto cifs_parse_mount_err
;
1627 case Opt_blank_pass
:
1628 vol
->password
= NULL
;
1631 /* passwords have to be handled differently
1632 * to allow the character used for deliminator
1633 * to be passed within them
1636 /* Obtain the value string */
1637 value
= strchr(data
, '=');
1640 /* Set tmp_end to end of the string */
1641 tmp_end
= (char *) value
+ strlen(value
);
1643 /* Check if following character is the deliminator
1644 * If yes, we have encountered a double deliminator
1645 * reset the NULL character to the deliminator
1647 if (tmp_end
< end
&& tmp_end
[1] == delim
)
1650 /* Keep iterating until we get to a single deliminator
1653 while ((tmp_end
= strchr(tmp_end
, delim
)) != NULL
&&
1654 (tmp_end
[1] == delim
)) {
1655 tmp_end
= (char *) &tmp_end
[2];
1658 /* Reset var options to point to next element */
1661 options
= (char *) &tmp_end
[1];
1663 /* Reached the end of the mount option string */
1666 /* Now build new password string */
1667 temp_len
= strlen(value
);
1668 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1669 if (vol
->password
== NULL
) {
1670 printk(KERN_WARNING
"CIFS: no memory "
1672 goto cifs_parse_mount_err
;
1675 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1676 vol
->password
[j
] = value
[i
];
1677 if ((value
[i
] == delim
) &&
1678 value
[i
+1] == delim
)
1679 /* skip the second deliminator */
1682 vol
->password
[j
] = '\0';
1688 string
= match_strdup(args
);
1692 if (strnlen(string
, INET6_ADDRSTRLEN
) >
1694 printk(KERN_WARNING
"CIFS: ip address "
1696 goto cifs_parse_mount_err
;
1698 vol
->UNCip
= kstrdup(string
, GFP_KERNEL
);
1700 printk(KERN_WARNING
"CIFS: no memory "
1702 goto cifs_parse_mount_err
;
1706 string
= match_strdup(args
);
1710 temp_len
= strnlen(string
, 300);
1711 if (temp_len
== 300) {
1712 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1713 goto cifs_parse_mount_err
;
1716 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1717 if (vol
->UNC
== NULL
) {
1718 printk(KERN_WARNING
"CIFS: no memory for UNC\n");
1719 goto cifs_parse_mount_err
;
1721 strcpy(vol
->UNC
, string
);
1723 if (strncmp(string
, "//", 2) == 0) {
1726 } else if (strncmp(string
, "\\\\", 2) != 0) {
1727 printk(KERN_WARNING
"CIFS: UNC Path does not "
1728 "begin with // or \\\\\n");
1729 goto cifs_parse_mount_err
;
1734 string
= match_strdup(args
);
1738 if (strnlen(string
, 256) == 256) {
1739 printk(KERN_WARNING
"CIFS: domain name too"
1741 goto cifs_parse_mount_err
;
1744 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1745 if (!vol
->domainname
) {
1746 printk(KERN_WARNING
"CIFS: no memory "
1747 "for domainname\n");
1748 goto cifs_parse_mount_err
;
1750 cFYI(1, "Domain name set");
1753 string
= match_strdup(args
);
1757 if (!cifs_convert_address(
1758 (struct sockaddr
*)&vol
->srcaddr
,
1759 string
, strlen(string
))) {
1760 printk(KERN_WARNING
"CIFS: Could not parse"
1761 " srcaddr: %s\n", string
);
1762 goto cifs_parse_mount_err
;
1765 case Opt_prefixpath
:
1766 string
= match_strdup(args
);
1770 temp_len
= strnlen(string
, 1024);
1771 if (string
[0] != '/')
1772 temp_len
++; /* missing leading slash */
1773 if (temp_len
> 1024) {
1774 printk(KERN_WARNING
"CIFS: prefix too long\n");
1775 goto cifs_parse_mount_err
;
1778 vol
->prepath
= kmalloc(temp_len
+1, GFP_KERNEL
);
1779 if (vol
->prepath
== NULL
) {
1780 printk(KERN_WARNING
"CIFS: no memory "
1781 "for path prefix\n");
1782 goto cifs_parse_mount_err
;
1785 if (string
[0] != '/') {
1786 vol
->prepath
[0] = '/';
1787 strcpy(vol
->prepath
+1, string
);
1789 strcpy(vol
->prepath
, string
);
1793 string
= match_strdup(args
);
1797 if (strnlen(string
, 1024) >= 65) {
1798 printk(KERN_WARNING
"CIFS: iocharset name "
1800 goto cifs_parse_mount_err
;
1803 if (strnicmp(string
, "default", 7) != 0) {
1804 vol
->iocharset
= kstrdup(string
,
1806 if (!vol
->iocharset
) {
1807 printk(KERN_WARNING
"CIFS: no memory"
1809 goto cifs_parse_mount_err
;
1812 /* if iocharset not set then load_nls_default
1815 cFYI(1, "iocharset set to %s", string
);
1818 string
= match_strdup(args
);
1822 if (strnicmp(string
, "TCP_NODELAY", 11) == 0)
1823 vol
->sockopt_tcp_nodelay
= 1;
1825 case Opt_netbiosname
:
1826 string
= match_strdup(args
);
1830 memset(vol
->source_rfc1001_name
, 0x20,
1833 * FIXME: are there cases in which a comma can
1834 * be valid in workstation netbios name (and
1835 * need special handling)?
1837 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1838 /* don't ucase netbiosname for user */
1841 vol
->source_rfc1001_name
[i
] = string
[i
];
1843 /* The string has 16th byte zero still from
1844 * set at top of the function
1846 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1847 printk(KERN_WARNING
"CIFS: netbiosname"
1848 " longer than 15 truncated.\n");
1852 /* servernetbiosname specified override *SMBSERVER */
1853 string
= match_strdup(args
);
1857 /* last byte, type, is 0x20 for servr type */
1858 memset(vol
->target_rfc1001_name
, 0x20,
1859 RFC1001_NAME_LEN_WITH_NULL
);
1861 /* BB are there cases in which a comma can be
1862 valid in this workstation netbios name
1863 (and need special handling)? */
1865 /* user or mount helper must uppercase the
1867 for (i
= 0; i
< 15; i
++) {
1870 vol
->target_rfc1001_name
[i
] = string
[i
];
1872 /* The string has 16th byte zero still from
1873 set at top of the function */
1874 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1875 printk(KERN_WARNING
"CIFS: server net"
1876 "biosname longer than 15 truncated.\n");
1879 string
= match_strdup(args
);
1883 if (strnicmp(string
, "1", 1) == 0) {
1884 /* This is the default */
1887 /* For all other value, error */
1888 printk(KERN_WARNING
"CIFS: Invalid version"
1890 goto cifs_parse_mount_err
;
1892 string
= match_strdup(args
);
1896 if (cifs_parse_smb_version(string
, vol
) != 0)
1897 goto cifs_parse_mount_err
;
1900 string
= match_strdup(args
);
1904 if (cifs_parse_security_flavors(string
, vol
) != 0)
1905 goto cifs_parse_mount_err
;
1908 cache_specified
= true;
1909 string
= match_strdup(args
);
1913 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1914 goto cifs_parse_mount_err
;
1918 * An option we don't recognize. Save it off for later
1919 * if we haven't already found one
1925 /* Free up any allocated string */
1930 if (!sloppy
&& invalid
) {
1931 printk(KERN_ERR
"CIFS: Unknown mount option \"%s\"\n", invalid
);
1932 goto cifs_parse_mount_err
;
1936 /* Muliuser mounts require CONFIG_KEYS support */
1937 if (vol
->multiuser
) {
1938 cERROR(1, "Multiuser mounts require kernels with "
1939 "CONFIG_KEYS enabled.");
1940 goto cifs_parse_mount_err
;
1944 if (vol
->UNCip
== NULL
)
1945 vol
->UNCip
= &vol
->UNC
[2];
1948 vol
->override_uid
= override_uid
;
1949 else if (override_uid
== 1)
1950 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1951 "specified with no uid= option.\n");
1954 vol
->override_gid
= override_gid
;
1955 else if (override_gid
== 1)
1956 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1957 "specified with no gid= option.\n");
1959 /* FIXME: remove this block in 3.7 */
1960 if (!cache_specified
&& !cache_warned
) {
1961 cache_warned
= true;
1962 printk(KERN_NOTICE
"CIFS: no cache= option specified, using "
1963 "\"cache=loose\". This default will change "
1964 "to \"cache=strict\" in 3.7.\n");
1967 kfree(mountdata_copy
);
1971 printk(KERN_WARNING
"Could not allocate temporary buffer\n");
1972 cifs_parse_mount_err
:
1974 kfree(mountdata_copy
);
1978 /** Returns true if srcaddr isn't specified and rhs isn't
1979 * specified, or if srcaddr is specified and
1980 * matches the IP address of the rhs argument.
1983 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1985 switch (srcaddr
->sa_family
) {
1987 return (rhs
->sa_family
== AF_UNSPEC
);
1989 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1990 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1991 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1994 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1995 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)&rhs
;
1996 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
2000 return false; /* don't expect to be here */
2005 * If no port is specified in addr structure, we try to match with 445 port
2006 * and if it fails - with 139 ports. It should be called only if address
2007 * families of server and addr are equal.
2010 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
2012 __be16 port
, *sport
;
2014 switch (addr
->sa_family
) {
2016 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
2017 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
2020 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
2021 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
2029 port
= htons(CIFS_PORT
);
2033 port
= htons(RFC1001_PORT
);
2036 return port
== *sport
;
2040 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2041 struct sockaddr
*srcaddr
)
2043 switch (addr
->sa_family
) {
2045 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
2046 struct sockaddr_in
*srv_addr4
=
2047 (struct sockaddr_in
*)&server
->dstaddr
;
2049 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
2054 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
2055 struct sockaddr_in6
*srv_addr6
=
2056 (struct sockaddr_in6
*)&server
->dstaddr
;
2058 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
2059 &srv_addr6
->sin6_addr
))
2061 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
2067 return false; /* don't expect to be here */
2070 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2077 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2079 unsigned int secFlags
;
2081 if (vol
->secFlg
& (~(CIFSSEC_MUST_SIGN
| CIFSSEC_MUST_SEAL
)))
2082 secFlags
= vol
->secFlg
;
2084 secFlags
= global_secflags
| vol
->secFlg
;
2086 switch (server
->secType
) {
2088 if (!(secFlags
& (CIFSSEC_MAY_LANMAN
|CIFSSEC_MAY_PLNTXT
)))
2092 if (!(secFlags
& CIFSSEC_MAY_NTLMV2
))
2096 if (!(secFlags
& CIFSSEC_MAY_NTLM
))
2100 if (!(secFlags
& CIFSSEC_MAY_KRB5
))
2104 if (!(secFlags
& CIFSSEC_MAY_NTLMSSP
))
2108 /* shouldn't happen */
2112 /* now check if signing mode is acceptable */
2113 if ((secFlags
& CIFSSEC_MAY_SIGN
) == 0 &&
2114 (server
->sec_mode
& SECMODE_SIGN_REQUIRED
))
2116 else if (((secFlags
& CIFSSEC_MUST_SIGN
) == CIFSSEC_MUST_SIGN
) &&
2118 (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
)) == 0)
2124 static int match_server(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2125 struct smb_vol
*vol
)
2127 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2130 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2133 if (!match_address(server
, addr
,
2134 (struct sockaddr
*)&vol
->srcaddr
))
2137 if (!match_port(server
, addr
))
2140 if (!match_security(server
, vol
))
2146 static struct TCP_Server_Info
*
2147 cifs_find_tcp_session(struct sockaddr
*addr
, struct smb_vol
*vol
)
2149 struct TCP_Server_Info
*server
;
2151 spin_lock(&cifs_tcp_ses_lock
);
2152 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2153 if (!match_server(server
, addr
, vol
))
2156 ++server
->srv_count
;
2157 spin_unlock(&cifs_tcp_ses_lock
);
2158 cFYI(1, "Existing tcp session with server found");
2161 spin_unlock(&cifs_tcp_ses_lock
);
2166 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
2168 struct task_struct
*task
;
2170 spin_lock(&cifs_tcp_ses_lock
);
2171 if (--server
->srv_count
> 0) {
2172 spin_unlock(&cifs_tcp_ses_lock
);
2176 put_net(cifs_net_ns(server
));
2178 list_del_init(&server
->tcp_ses_list
);
2179 spin_unlock(&cifs_tcp_ses_lock
);
2181 cancel_delayed_work_sync(&server
->echo
);
2183 spin_lock(&GlobalMid_Lock
);
2184 server
->tcpStatus
= CifsExiting
;
2185 spin_unlock(&GlobalMid_Lock
);
2187 cifs_crypto_shash_release(server
);
2188 cifs_fscache_release_client_cookie(server
);
2190 kfree(server
->session_key
.response
);
2191 server
->session_key
.response
= NULL
;
2192 server
->session_key
.len
= 0;
2194 task
= xchg(&server
->tsk
, NULL
);
2196 force_sig(SIGKILL
, task
);
2199 static struct TCP_Server_Info
*
2200 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2202 struct TCP_Server_Info
*tcp_ses
= NULL
;
2203 struct sockaddr_storage addr
;
2204 struct sockaddr_in
*sin_server
= (struct sockaddr_in
*) &addr
;
2205 struct sockaddr_in6
*sin_server6
= (struct sockaddr_in6
*) &addr
;
2208 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
2210 cFYI(1, "UNC: %s ip: %s", volume_info
->UNC
, volume_info
->UNCip
);
2212 if (volume_info
->UNCip
&& volume_info
->UNC
) {
2213 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
2215 strlen(volume_info
->UNCip
),
2218 /* we failed translating address */
2222 } else if (volume_info
->UNCip
) {
2223 /* BB using ip addr as tcp_ses name to connect to the
2225 cERROR(1, "Connecting to DFS root not implemented yet");
2228 } else /* which tcp_sess DFS root would we conect to */ {
2229 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
2230 "unc=//192.168.1.100/public) specified");
2235 /* see if we already have a matching tcp_ses */
2236 tcp_ses
= cifs_find_tcp_session((struct sockaddr
*)&addr
, volume_info
);
2240 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2246 rc
= cifs_crypto_shash_allocate(tcp_ses
);
2248 cERROR(1, "could not setup hash structures rc %d", rc
);
2252 tcp_ses
->ops
= volume_info
->ops
;
2253 tcp_ses
->vals
= volume_info
->vals
;
2254 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2255 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2256 if (IS_ERR(tcp_ses
->hostname
)) {
2257 rc
= PTR_ERR(tcp_ses
->hostname
);
2258 goto out_err_crypto_release
;
2261 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2262 tcp_ses
->noautotune
= volume_info
->noautotune
;
2263 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2264 tcp_ses
->in_flight
= 0;
2265 tcp_ses
->credits
= 1;
2266 init_waitqueue_head(&tcp_ses
->response_q
);
2267 init_waitqueue_head(&tcp_ses
->request_q
);
2268 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2269 mutex_init(&tcp_ses
->srv_mutex
);
2270 memcpy(tcp_ses
->workstation_RFC1001_name
,
2271 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2272 memcpy(tcp_ses
->server_RFC1001_name
,
2273 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2274 tcp_ses
->session_estab
= false;
2275 tcp_ses
->sequence_number
= 0;
2276 tcp_ses
->lstrp
= jiffies
;
2277 spin_lock_init(&tcp_ses
->req_lock
);
2278 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2279 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2280 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2283 * at this point we are the only ones with the pointer
2284 * to the struct since the kernel thread not created yet
2285 * no need to spinlock this init of tcpStatus or srv_count
2287 tcp_ses
->tcpStatus
= CifsNew
;
2288 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2289 sizeof(tcp_ses
->srcaddr
));
2290 ++tcp_ses
->srv_count
;
2292 if (addr
.ss_family
== AF_INET6
) {
2293 cFYI(1, "attempting ipv6 connect");
2294 /* BB should we allow ipv6 on port 139? */
2295 /* other OS never observed in Wild doing 139 with v6 */
2296 memcpy(&tcp_ses
->dstaddr
, sin_server6
,
2297 sizeof(struct sockaddr_in6
));
2299 memcpy(&tcp_ses
->dstaddr
, sin_server
,
2300 sizeof(struct sockaddr_in
));
2302 rc
= ip_connect(tcp_ses
);
2304 cERROR(1, "Error connecting to socket. Aborting operation");
2305 goto out_err_crypto_release
;
2309 * since we're in a cifs function already, we know that
2310 * this will succeed. No need for try_module_get().
2312 __module_get(THIS_MODULE
);
2313 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2315 if (IS_ERR(tcp_ses
->tsk
)) {
2316 rc
= PTR_ERR(tcp_ses
->tsk
);
2317 cERROR(1, "error %d create cifsd thread", rc
);
2318 module_put(THIS_MODULE
);
2319 goto out_err_crypto_release
;
2321 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2323 /* thread spawned, put it on the list */
2324 spin_lock(&cifs_tcp_ses_lock
);
2325 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2326 spin_unlock(&cifs_tcp_ses_lock
);
2328 cifs_fscache_get_client_cookie(tcp_ses
);
2330 /* queue echo request delayed work */
2331 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
2335 out_err_crypto_release
:
2336 cifs_crypto_shash_release(tcp_ses
);
2338 put_net(cifs_net_ns(tcp_ses
));
2342 if (!IS_ERR(tcp_ses
->hostname
))
2343 kfree(tcp_ses
->hostname
);
2344 if (tcp_ses
->ssocket
)
2345 sock_release(tcp_ses
->ssocket
);
2351 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2353 switch (ses
->server
->secType
) {
2355 if (vol
->cred_uid
!= ses
->cred_uid
)
2359 /* NULL username means anonymous session */
2360 if (ses
->user_name
== NULL
) {
2366 /* anything else takes username/password */
2367 if (strncmp(ses
->user_name
,
2368 vol
->username
? vol
->username
: "",
2371 if (strlen(vol
->username
) != 0 &&
2372 ses
->password
!= NULL
&&
2373 strncmp(ses
->password
,
2374 vol
->password
? vol
->password
: "",
2381 static struct cifs_ses
*
2382 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2384 struct cifs_ses
*ses
;
2386 spin_lock(&cifs_tcp_ses_lock
);
2387 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2388 if (!match_session(ses
, vol
))
2391 spin_unlock(&cifs_tcp_ses_lock
);
2394 spin_unlock(&cifs_tcp_ses_lock
);
2399 cifs_put_smb_ses(struct cifs_ses
*ses
)
2402 struct TCP_Server_Info
*server
= ses
->server
;
2404 cFYI(1, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2405 spin_lock(&cifs_tcp_ses_lock
);
2406 if (--ses
->ses_count
> 0) {
2407 spin_unlock(&cifs_tcp_ses_lock
);
2411 list_del_init(&ses
->smb_ses_list
);
2412 spin_unlock(&cifs_tcp_ses_lock
);
2414 if (ses
->status
== CifsGood
) {
2416 CIFSSMBLogoff(xid
, ses
);
2420 cifs_put_tcp_session(server
);
2425 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2426 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2428 /* Populate username and pw fields from keyring if possible */
2430 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2433 char *desc
, *delim
, *payload
;
2436 struct TCP_Server_Info
*server
= ses
->server
;
2437 struct sockaddr_in
*sa
;
2438 struct sockaddr_in6
*sa6
;
2439 struct user_key_payload
*upayload
;
2441 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2445 /* try to find an address key first */
2446 switch (server
->dstaddr
.ss_family
) {
2448 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2449 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2452 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2453 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2456 cFYI(1, "Bad ss_family (%hu)", server
->dstaddr
.ss_family
);
2461 cFYI(1, "%s: desc=%s", __func__
, desc
);
2462 key
= request_key(&key_type_logon
, desc
, "");
2464 if (!ses
->domainName
) {
2465 cFYI(1, "domainName is NULL");
2470 /* didn't work, try to find a domain key */
2471 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2472 cFYI(1, "%s: desc=%s", __func__
, desc
);
2473 key
= request_key(&key_type_logon
, desc
, "");
2480 down_read(&key
->sem
);
2481 upayload
= key
->payload
.data
;
2482 if (IS_ERR_OR_NULL(upayload
)) {
2483 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2487 /* find first : in payload */
2488 payload
= (char *)upayload
->data
;
2489 delim
= strnchr(payload
, upayload
->datalen
, ':');
2490 cFYI(1, "payload=%s", payload
);
2492 cFYI(1, "Unable to find ':' in payload (datalen=%d)",
2498 len
= delim
- payload
;
2499 if (len
> MAX_USERNAME_SIZE
|| len
<= 0) {
2500 cFYI(1, "Bad value from username search (len=%zd)", len
);
2505 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2506 if (!vol
->username
) {
2507 cFYI(1, "Unable to allocate %zd bytes for username", len
);
2511 cFYI(1, "%s: username=%s", __func__
, vol
->username
);
2513 len
= key
->datalen
- (len
+ 1);
2514 if (len
> MAX_PASSWORD_SIZE
|| len
<= 0) {
2515 cFYI(1, "Bad len for password search (len=%zd)", len
);
2517 kfree(vol
->username
);
2518 vol
->username
= NULL
;
2523 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2524 if (!vol
->password
) {
2525 cFYI(1, "Unable to allocate %zd bytes for password", len
);
2527 kfree(vol
->username
);
2528 vol
->username
= NULL
;
2537 cFYI(1, "%s: returning %d", __func__
, rc
);
2540 #else /* ! CONFIG_KEYS */
2542 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2543 struct cifs_ses
*ses
__attribute__((unused
)))
2547 #endif /* CONFIG_KEYS */
2549 static bool warned_on_ntlm
; /* globals init to false automatically */
2551 static struct cifs_ses
*
2552 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2554 int rc
= -ENOMEM
, xid
;
2555 struct cifs_ses
*ses
;
2556 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2557 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2561 ses
= cifs_find_smb_ses(server
, volume_info
);
2563 cFYI(1, "Existing smb sess found (status=%d)", ses
->status
);
2565 mutex_lock(&ses
->session_mutex
);
2566 rc
= cifs_negotiate_protocol(xid
, ses
);
2568 mutex_unlock(&ses
->session_mutex
);
2569 /* problem -- put our ses reference */
2570 cifs_put_smb_ses(ses
);
2574 if (ses
->need_reconnect
) {
2575 cFYI(1, "Session needs reconnect");
2576 rc
= cifs_setup_session(xid
, ses
,
2577 volume_info
->local_nls
);
2579 mutex_unlock(&ses
->session_mutex
);
2580 /* problem -- put our reference */
2581 cifs_put_smb_ses(ses
);
2586 mutex_unlock(&ses
->session_mutex
);
2588 /* existing SMB ses has a server reference already */
2589 cifs_put_tcp_session(server
);
2594 cFYI(1, "Existing smb sess not found");
2595 ses
= sesInfoAlloc();
2599 /* new SMB session uses our server ref */
2600 ses
->server
= server
;
2601 if (server
->dstaddr
.ss_family
== AF_INET6
)
2602 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2604 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2606 if (volume_info
->username
) {
2607 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2608 if (!ses
->user_name
)
2612 /* volume_info->password freed at unmount */
2613 if (volume_info
->password
) {
2614 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2618 if (volume_info
->domainname
) {
2619 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2620 if (!ses
->domainName
)
2623 ses
->cred_uid
= volume_info
->cred_uid
;
2624 ses
->linux_uid
= volume_info
->linux_uid
;
2626 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2627 supported for many years, time to update default security mechanism */
2628 if ((volume_info
->secFlg
== 0) && warned_on_ntlm
== false) {
2629 warned_on_ntlm
= true;
2630 cERROR(1, "default security mechanism requested. The default "
2631 "security mechanism will be upgraded from ntlm to "
2632 "ntlmv2 in kernel release 3.3");
2634 ses
->overrideSecFlg
= volume_info
->secFlg
;
2636 mutex_lock(&ses
->session_mutex
);
2637 rc
= cifs_negotiate_protocol(xid
, ses
);
2639 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2640 mutex_unlock(&ses
->session_mutex
);
2644 /* success, put it on the list */
2645 spin_lock(&cifs_tcp_ses_lock
);
2646 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2647 spin_unlock(&cifs_tcp_ses_lock
);
2658 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2660 if (tcon
->tidStatus
== CifsExiting
)
2662 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2667 static struct cifs_tcon
*
2668 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2670 struct list_head
*tmp
;
2671 struct cifs_tcon
*tcon
;
2673 spin_lock(&cifs_tcp_ses_lock
);
2674 list_for_each(tmp
, &ses
->tcon_list
) {
2675 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2676 if (!match_tcon(tcon
, unc
))
2679 spin_unlock(&cifs_tcp_ses_lock
);
2682 spin_unlock(&cifs_tcp_ses_lock
);
2687 cifs_put_tcon(struct cifs_tcon
*tcon
)
2690 struct cifs_ses
*ses
= tcon
->ses
;
2692 cFYI(1, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2693 spin_lock(&cifs_tcp_ses_lock
);
2694 if (--tcon
->tc_count
> 0) {
2695 spin_unlock(&cifs_tcp_ses_lock
);
2699 list_del_init(&tcon
->tcon_list
);
2700 spin_unlock(&cifs_tcp_ses_lock
);
2703 CIFSSMBTDis(xid
, tcon
);
2706 cifs_fscache_release_super_cookie(tcon
);
2708 cifs_put_smb_ses(ses
);
2711 static struct cifs_tcon
*
2712 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2715 struct cifs_tcon
*tcon
;
2717 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2719 cFYI(1, "Found match on UNC path");
2720 /* existing tcon already has a reference */
2721 cifs_put_smb_ses(ses
);
2722 if (tcon
->seal
!= volume_info
->seal
)
2723 cERROR(1, "transport encryption setting "
2724 "conflicts with existing tid");
2728 tcon
= tconInfoAlloc();
2735 if (volume_info
->password
) {
2736 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2737 if (!tcon
->password
) {
2743 if (strchr(volume_info
->UNC
+ 3, '\\') == NULL
2744 && strchr(volume_info
->UNC
+ 3, '/') == NULL
) {
2745 cERROR(1, "Missing share name");
2750 /* BB Do we need to wrap session_mutex around
2751 * this TCon call and Unix SetFS as
2752 * we do on SessSetup and reconnect? */
2754 rc
= CIFSTCon(xid
, ses
, volume_info
->UNC
, tcon
, volume_info
->local_nls
);
2756 cFYI(1, "CIFS Tcon rc = %d", rc
);
2760 if (volume_info
->nodfs
) {
2761 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2762 cFYI(1, "DFS disabled (%d)", tcon
->Flags
);
2764 tcon
->seal
= volume_info
->seal
;
2765 /* we can have only one retry value for a connection
2766 to a share so for resources mounted more than once
2767 to the same server share the last value passed in
2768 for the retry flag is used */
2769 tcon
->retry
= volume_info
->retry
;
2770 tcon
->nocase
= volume_info
->nocase
;
2771 tcon
->local_lease
= volume_info
->local_lease
;
2773 spin_lock(&cifs_tcp_ses_lock
);
2774 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2775 spin_unlock(&cifs_tcp_ses_lock
);
2777 cifs_fscache_get_super_cookie(tcon
);
2787 cifs_put_tlink(struct tcon_link
*tlink
)
2789 if (!tlink
|| IS_ERR(tlink
))
2792 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2793 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2794 tlink
->tl_time
= jiffies
;
2798 if (!IS_ERR(tlink_tcon(tlink
)))
2799 cifs_put_tcon(tlink_tcon(tlink
));
2804 static inline struct tcon_link
*
2805 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2807 return cifs_sb
->master_tlink
;
2811 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2813 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2814 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2816 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2819 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2820 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2824 * We want to share sb only if we don't specify an r/wsize or
2825 * specified r/wsize is greater than or equal to existing one.
2827 if (new->wsize
&& new->wsize
< old
->wsize
)
2830 if (new->rsize
&& new->rsize
< old
->rsize
)
2833 if (old
->mnt_uid
!= new->mnt_uid
|| old
->mnt_gid
!= new->mnt_gid
)
2836 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2837 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2840 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2843 if (old
->actimeo
!= new->actimeo
)
2850 cifs_match_super(struct super_block
*sb
, void *data
)
2852 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2853 struct smb_vol
*volume_info
;
2854 struct cifs_sb_info
*cifs_sb
;
2855 struct TCP_Server_Info
*tcp_srv
;
2856 struct cifs_ses
*ses
;
2857 struct cifs_tcon
*tcon
;
2858 struct tcon_link
*tlink
;
2859 struct sockaddr_storage addr
;
2862 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
2864 spin_lock(&cifs_tcp_ses_lock
);
2865 cifs_sb
= CIFS_SB(sb
);
2866 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2867 if (IS_ERR(tlink
)) {
2868 spin_unlock(&cifs_tcp_ses_lock
);
2871 tcon
= tlink_tcon(tlink
);
2873 tcp_srv
= ses
->server
;
2875 volume_info
= mnt_data
->vol
;
2877 if (!volume_info
->UNCip
|| !volume_info
->UNC
)
2880 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
2882 strlen(volume_info
->UNCip
),
2887 if (!match_server(tcp_srv
, (struct sockaddr
*)&addr
, volume_info
) ||
2888 !match_session(ses
, volume_info
) ||
2889 !match_tcon(tcon
, volume_info
->UNC
)) {
2894 rc
= compare_mount_options(sb
, mnt_data
);
2896 spin_unlock(&cifs_tcp_ses_lock
);
2897 cifs_put_tlink(tlink
);
2902 get_dfs_path(int xid
, struct cifs_ses
*pSesInfo
, const char *old_path
,
2903 const struct nls_table
*nls_codepage
, unsigned int *pnum_referrals
,
2904 struct dfs_info3_param
**preferrals
, int remap
)
2909 *pnum_referrals
= 0;
2912 if (pSesInfo
->ipc_tid
== 0) {
2913 temp_unc
= kmalloc(2 /* for slashes */ +
2914 strnlen(pSesInfo
->serverName
,
2915 SERVER_NAME_LEN_WITH_NULL
* 2)
2916 + 1 + 4 /* slash IPC$ */ + 2,
2918 if (temp_unc
== NULL
)
2922 strcpy(temp_unc
+ 2, pSesInfo
->serverName
);
2923 strcpy(temp_unc
+ 2 + strlen(pSesInfo
->serverName
), "\\IPC$");
2924 rc
= CIFSTCon(xid
, pSesInfo
, temp_unc
, NULL
, nls_codepage
);
2925 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc
, pSesInfo
->ipc_tid
);
2929 rc
= CIFSGetDFSRefer(xid
, pSesInfo
, old_path
, preferrals
,
2930 pnum_referrals
, nls_codepage
, remap
);
2931 /* BB map targetUNCs to dfs_info3 structures, here or
2932 in CIFSGetDFSRefer BB */
2937 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2938 static struct lock_class_key cifs_key
[2];
2939 static struct lock_class_key cifs_slock_key
[2];
2942 cifs_reclassify_socket4(struct socket
*sock
)
2944 struct sock
*sk
= sock
->sk
;
2945 BUG_ON(sock_owned_by_user(sk
));
2946 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2947 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2951 cifs_reclassify_socket6(struct socket
*sock
)
2953 struct sock
*sk
= sock
->sk
;
2954 BUG_ON(sock_owned_by_user(sk
));
2955 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2956 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2960 cifs_reclassify_socket4(struct socket
*sock
)
2965 cifs_reclassify_socket6(struct socket
*sock
)
2970 /* See RFC1001 section 14 on representation of Netbios names */
2971 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2975 for (i
= 0, j
= 0; i
< (length
); i
++) {
2976 /* mask a nibble at a time and encode */
2977 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2978 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2985 bind_socket(struct TCP_Server_Info
*server
)
2988 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2989 /* Bind to the specified local IP address */
2990 struct socket
*socket
= server
->ssocket
;
2991 rc
= socket
->ops
->bind(socket
,
2992 (struct sockaddr
*) &server
->srcaddr
,
2993 sizeof(server
->srcaddr
));
2995 struct sockaddr_in
*saddr4
;
2996 struct sockaddr_in6
*saddr6
;
2997 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2998 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2999 if (saddr6
->sin6_family
== AF_INET6
)
3001 "Failed to bind to: %pI6c, error: %d\n",
3002 &saddr6
->sin6_addr
, rc
);
3005 "Failed to bind to: %pI4, error: %d\n",
3006 &saddr4
->sin_addr
.s_addr
, rc
);
3013 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
3017 * some servers require RFC1001 sessinit before sending
3018 * negprot - BB check reconnection in case where second
3019 * sessinit is sent but no second negprot
3021 struct rfc1002_session_packet
*ses_init_buf
;
3022 struct smb_hdr
*smb_buf
;
3023 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
3026 ses_init_buf
->trailer
.session_req
.called_len
= 32;
3028 if (server
->server_RFC1001_name
&&
3029 server
->server_RFC1001_name
[0] != 0)
3030 rfc1002mangle(ses_init_buf
->trailer
.
3031 session_req
.called_name
,
3032 server
->server_RFC1001_name
,
3033 RFC1001_NAME_LEN_WITH_NULL
);
3035 rfc1002mangle(ses_init_buf
->trailer
.
3036 session_req
.called_name
,
3037 DEFAULT_CIFS_CALLED_NAME
,
3038 RFC1001_NAME_LEN_WITH_NULL
);
3040 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
3043 * calling name ends in null (byte 16) from old smb
3046 if (server
->workstation_RFC1001_name
&&
3047 server
->workstation_RFC1001_name
[0] != 0)
3048 rfc1002mangle(ses_init_buf
->trailer
.
3049 session_req
.calling_name
,
3050 server
->workstation_RFC1001_name
,
3051 RFC1001_NAME_LEN_WITH_NULL
);
3053 rfc1002mangle(ses_init_buf
->trailer
.
3054 session_req
.calling_name
,
3056 RFC1001_NAME_LEN_WITH_NULL
);
3058 ses_init_buf
->trailer
.session_req
.scope1
= 0;
3059 ses_init_buf
->trailer
.session_req
.scope2
= 0;
3060 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
3062 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3063 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
3064 rc
= smb_send(server
, smb_buf
, 0x44);
3065 kfree(ses_init_buf
);
3067 * RFC1001 layer in at least one server
3068 * requires very short break before negprot
3069 * presumably because not expecting negprot
3070 * to follow so fast. This is a simple
3071 * solution that works without
3072 * complicating the code and causes no
3073 * significant slowing down on mount
3076 usleep_range(1000, 2000);
3079 * else the negprot may still work without this
3080 * even though malloc failed
3087 generic_ip_connect(struct TCP_Server_Info
*server
)
3092 struct socket
*socket
= server
->ssocket
;
3093 struct sockaddr
*saddr
;
3095 saddr
= (struct sockaddr
*) &server
->dstaddr
;
3097 if (server
->dstaddr
.ss_family
== AF_INET6
) {
3098 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
3099 slen
= sizeof(struct sockaddr_in6
);
3102 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
3103 slen
= sizeof(struct sockaddr_in
);
3107 if (socket
== NULL
) {
3108 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
3109 IPPROTO_TCP
, &socket
, 1);
3111 cERROR(1, "Error %d creating socket", rc
);
3112 server
->ssocket
= NULL
;
3116 /* BB other socket options to set KEEPALIVE, NODELAY? */
3117 cFYI(1, "Socket created");
3118 server
->ssocket
= socket
;
3119 socket
->sk
->sk_allocation
= GFP_NOFS
;
3120 if (sfamily
== AF_INET6
)
3121 cifs_reclassify_socket6(socket
);
3123 cifs_reclassify_socket4(socket
);
3126 rc
= bind_socket(server
);
3131 * Eventually check for other socket options to change from
3132 * the default. sock_setsockopt not used because it expects
3135 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3136 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3138 /* make the bufsizes depend on wsize/rsize and max requests */
3139 if (server
->noautotune
) {
3140 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3141 socket
->sk
->sk_sndbuf
= 200 * 1024;
3142 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3143 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3146 if (server
->tcp_nodelay
) {
3148 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
3149 (char *)&val
, sizeof(val
));
3151 cFYI(1, "set TCP_NODELAY socket option error %d", rc
);
3154 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
3155 socket
->sk
->sk_sndbuf
,
3156 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3158 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3160 cFYI(1, "Error %d connecting to server", rc
);
3161 sock_release(socket
);
3162 server
->ssocket
= NULL
;
3166 if (sport
== htons(RFC1001_PORT
))
3167 rc
= ip_rfc1001_connect(server
);
3173 ip_connect(struct TCP_Server_Info
*server
)
3176 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3177 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3179 if (server
->dstaddr
.ss_family
== AF_INET6
)
3180 sport
= &addr6
->sin6_port
;
3182 sport
= &addr
->sin_port
;
3187 /* try with 445 port at first */
3188 *sport
= htons(CIFS_PORT
);
3190 rc
= generic_ip_connect(server
);
3194 /* if it failed, try with 139 port */
3195 *sport
= htons(RFC1001_PORT
);
3198 return generic_ip_connect(server
);
3201 void reset_cifs_unix_caps(int xid
, struct cifs_tcon
*tcon
,
3202 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3204 /* if we are reconnecting then should we check to see if
3205 * any requested capabilities changed locally e.g. via
3206 * remount but we can not do much about it here
3207 * if they have (even if we could detect it by the following)
3208 * Perhaps we could add a backpointer to array of sb from tcon
3209 * or if we change to make all sb to same share the same
3210 * sb as NFS - then we only have one backpointer to sb.
3211 * What if we wanted to mount the server share twice once with
3212 * and once without posixacls or posix paths? */
3213 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3215 if (vol_info
&& vol_info
->no_linux_ext
) {
3216 tcon
->fsUnixInfo
.Capability
= 0;
3217 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3218 cFYI(1, "Linux protocol extensions disabled");
3220 } else if (vol_info
)
3221 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3223 if (tcon
->unix_ext
== 0) {
3224 cFYI(1, "Unix extensions disabled so not set on reconnect");
3228 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3229 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3230 cFYI(1, "unix caps which server supports %lld", cap
);
3231 /* check for reconnect case in which we do not
3232 want to change the mount behavior if we can avoid it */
3233 if (vol_info
== NULL
) {
3234 /* turn off POSIX ACL and PATHNAMES if not set
3235 originally at mount time */
3236 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3237 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3238 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3239 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3240 cERROR(1, "POSIXPATH support change");
3241 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3242 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3243 cERROR(1, "possible reconnect error");
3244 cERROR(1, "server disabled POSIX path support");
3248 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3249 cERROR(1, "per-share encryption not supported yet");
3251 cap
&= CIFS_UNIX_CAP_MASK
;
3252 if (vol_info
&& vol_info
->no_psx_acl
)
3253 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3254 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3255 cFYI(1, "negotiated posix acl support");
3257 cifs_sb
->mnt_cifs_flags
|=
3258 CIFS_MOUNT_POSIXACL
;
3261 if (vol_info
&& vol_info
->posix_paths
== 0)
3262 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3263 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3264 cFYI(1, "negotiate posix pathnames");
3266 cifs_sb
->mnt_cifs_flags
|=
3267 CIFS_MOUNT_POSIX_PATHS
;
3270 cFYI(1, "Negotiate caps 0x%x", (int)cap
);
3271 #ifdef CONFIG_CIFS_DEBUG2
3272 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3273 cFYI(1, "FCNTL cap");
3274 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3275 cFYI(1, "EXTATTR cap");
3276 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3277 cFYI(1, "POSIX path cap");
3278 if (cap
& CIFS_UNIX_XATTR_CAP
)
3279 cFYI(1, "XATTR cap");
3280 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3281 cFYI(1, "POSIX ACL cap");
3282 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3283 cFYI(1, "very large read cap");
3284 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3285 cFYI(1, "very large write cap");
3286 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3287 cFYI(1, "transport encryption cap");
3288 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3289 cFYI(1, "mandatory transport encryption cap");
3290 #endif /* CIFS_DEBUG2 */
3291 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3292 if (vol_info
== NULL
) {
3293 cFYI(1, "resetting capabilities failed");
3295 cERROR(1, "Negotiating Unix capabilities "
3296 "with the server failed. Consider "
3297 "mounting with the Unix Extensions\n"
3298 "disabled, if problems are found, "
3299 "by specifying the nounix mount "
3306 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3307 struct cifs_sb_info
*cifs_sb
)
3309 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3311 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3312 cifs_sb
->tlink_tree
= RB_ROOT
;
3315 * Temporarily set r/wsize for matching superblock. If we end up using
3316 * new sb then client will later negotiate it downward if needed.
3318 cifs_sb
->rsize
= pvolume_info
->rsize
;
3319 cifs_sb
->wsize
= pvolume_info
->wsize
;
3321 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3322 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3323 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3324 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3325 cFYI(1, "file mode: 0x%hx dir mode: 0x%hx",
3326 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3328 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3329 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3331 if (pvolume_info
->noperm
)
3332 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3333 if (pvolume_info
->setuids
)
3334 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3335 if (pvolume_info
->server_ino
)
3336 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3337 if (pvolume_info
->remap
)
3338 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3339 if (pvolume_info
->no_xattr
)
3340 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3341 if (pvolume_info
->sfu_emul
)
3342 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3343 if (pvolume_info
->nobrl
)
3344 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3345 if (pvolume_info
->nostrictsync
)
3346 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3347 if (pvolume_info
->mand_lock
)
3348 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3349 if (pvolume_info
->rwpidforward
)
3350 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3351 if (pvolume_info
->cifs_acl
)
3352 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3353 if (pvolume_info
->backupuid_specified
) {
3354 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3355 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3357 if (pvolume_info
->backupgid_specified
) {
3358 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3359 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3361 if (pvolume_info
->override_uid
)
3362 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3363 if (pvolume_info
->override_gid
)
3364 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3365 if (pvolume_info
->dynperm
)
3366 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3367 if (pvolume_info
->fsc
)
3368 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3369 if (pvolume_info
->multiuser
)
3370 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3371 CIFS_MOUNT_NO_PERM
);
3372 if (pvolume_info
->strict_io
)
3373 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3374 if (pvolume_info
->direct_io
) {
3375 cFYI(1, "mounting share using direct i/o");
3376 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3378 if (pvolume_info
->mfsymlinks
) {
3379 if (pvolume_info
->sfu_emul
) {
3380 cERROR(1, "mount option mfsymlinks ignored if sfu "
3381 "mount option is used");
3383 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3387 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3388 cERROR(1, "mount option dynperm ignored if cifsacl "
3389 "mount option supported");
3393 * When the server supports very large reads and writes via POSIX extensions,
3394 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
3395 * including the RFC1001 length.
3397 * Note that this might make for "interesting" allocation problems during
3398 * writeback however as we have to allocate an array of pointers for the
3399 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
3401 * For reads, there is a similar problem as we need to allocate an array
3402 * of kvecs to handle the receive, though that should only need to be done
3405 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
3406 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
3409 * When the server doesn't allow large posix writes, only allow a rsize/wsize
3410 * of 2^17-1 minus the size of the call header. That allows for a read or
3411 * write up to the maximum size described by RFC1002.
3413 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
3414 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
3417 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
3418 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
3419 * a single wsize request with a single call.
3421 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
3424 * Windows only supports a max of 60kb reads and 65535 byte writes. Default to
3425 * those values when posix extensions aren't in force. In actuality here, we
3426 * use 65536 to allow for a write that is a multiple of 4k. Most servers seem
3427 * to be ok with the extra byte even though Windows doesn't send writes that
3432 * http://blogs.msdn.com/b/openspecification/archive/2009/04/10/smb-maximum-transmit-buffer-size-and-performance-tuning.aspx
3434 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
3435 #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536)
3438 cifs_negotiate_wsize(struct cifs_tcon
*tcon
, struct smb_vol
*pvolume_info
)
3440 __u64 unix_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3441 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
3444 /* start with specified wsize, or default */
3445 if (pvolume_info
->wsize
)
3446 wsize
= pvolume_info
->wsize
;
3447 else if (tcon
->unix_ext
&& (unix_cap
& CIFS_UNIX_LARGE_WRITE_CAP
))
3448 wsize
= CIFS_DEFAULT_IOSIZE
;
3450 wsize
= CIFS_DEFAULT_NON_POSIX_WSIZE
;
3452 /* can server support 24-bit write sizes? (via UNIX extensions) */
3453 if (!tcon
->unix_ext
|| !(unix_cap
& CIFS_UNIX_LARGE_WRITE_CAP
))
3454 wsize
= min_t(unsigned int, wsize
, CIFS_MAX_RFC1002_WSIZE
);
3457 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
3458 * Limit it to max buffer offered by the server, minus the size of the
3459 * WRITEX header, not including the 4 byte RFC1001 length.
3461 if (!(server
->capabilities
& CAP_LARGE_WRITE_X
) ||
3462 (!(server
->capabilities
& CAP_UNIX
) &&
3463 (server
->sec_mode
& (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
))))
3464 wsize
= min_t(unsigned int, wsize
,
3465 server
->maxBuf
- sizeof(WRITE_REQ
) + 4);
3467 /* hard limit of CIFS_MAX_WSIZE */
3468 wsize
= min_t(unsigned int, wsize
, CIFS_MAX_WSIZE
);
3474 cifs_negotiate_rsize(struct cifs_tcon
*tcon
, struct smb_vol
*pvolume_info
)
3476 __u64 unix_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3477 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
3478 unsigned int rsize
, defsize
;
3481 * Set default value...
3483 * HACK alert! Ancient servers have very small buffers. Even though
3484 * MS-CIFS indicates that servers are only limited by the client's
3485 * bufsize for reads, testing against win98se shows that it throws
3486 * INVALID_PARAMETER errors if you try to request too large a read.
3488 * If the server advertises a MaxBufferSize of less than one page,
3489 * assume that it also can't satisfy reads larger than that either.
3491 * FIXME: Is there a better heuristic for this?
3493 if (tcon
->unix_ext
&& (unix_cap
& CIFS_UNIX_LARGE_READ_CAP
))
3494 defsize
= CIFS_DEFAULT_IOSIZE
;
3495 else if (server
->capabilities
& CAP_LARGE_READ_X
)
3496 defsize
= CIFS_DEFAULT_NON_POSIX_RSIZE
;
3497 else if (server
->maxBuf
>= PAGE_CACHE_SIZE
)
3498 defsize
= CIFSMaxBufSize
;
3500 defsize
= server
->maxBuf
- sizeof(READ_RSP
);
3502 rsize
= pvolume_info
->rsize
? pvolume_info
->rsize
: defsize
;
3505 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
3506 * the client's MaxBufferSize.
3508 if (!(server
->capabilities
& CAP_LARGE_READ_X
))
3509 rsize
= min_t(unsigned int, CIFSMaxBufSize
, rsize
);
3511 /* hard limit of CIFS_MAX_RSIZE */
3512 rsize
= min_t(unsigned int, rsize
, CIFS_MAX_RSIZE
);
3518 is_path_accessible(int xid
, struct cifs_tcon
*tcon
,
3519 struct cifs_sb_info
*cifs_sb
, const char *full_path
)
3522 FILE_ALL_INFO
*pfile_info
;
3524 pfile_info
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
3525 if (pfile_info
== NULL
)
3528 rc
= CIFSSMBQPathInfo(xid
, tcon
, full_path
, pfile_info
,
3529 0 /* not legacy */, cifs_sb
->local_nls
,
3530 cifs_sb
->mnt_cifs_flags
&
3531 CIFS_MOUNT_MAP_SPECIAL_CHR
);
3533 if (rc
== -EOPNOTSUPP
|| rc
== -EINVAL
)
3534 rc
= SMBQueryInformation(xid
, tcon
, full_path
, pfile_info
,
3535 cifs_sb
->local_nls
, cifs_sb
->mnt_cifs_flags
&
3536 CIFS_MOUNT_MAP_SPECIAL_CHR
);
3542 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3544 kfree(volume_info
->username
);
3545 kzfree(volume_info
->password
);
3546 if (volume_info
->UNCip
!= volume_info
->UNC
+ 2)
3547 kfree(volume_info
->UNCip
);
3548 kfree(volume_info
->UNC
);
3549 kfree(volume_info
->domainname
);
3550 kfree(volume_info
->iocharset
);
3551 kfree(volume_info
->prepath
);
3555 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3559 cleanup_volume_info_contents(volume_info
);
3564 #ifdef CONFIG_CIFS_DFS_UPCALL
3565 /* build_path_to_root returns full path to root when
3566 * we do not have an exiting connection (tcon) */
3568 build_unc_path_to_root(const struct smb_vol
*vol
,
3569 const struct cifs_sb_info
*cifs_sb
)
3571 char *full_path
, *pos
;
3572 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) : 0;
3573 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3575 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3576 if (full_path
== NULL
)
3577 return ERR_PTR(-ENOMEM
);
3579 strncpy(full_path
, vol
->UNC
, unc_len
);
3580 pos
= full_path
+ unc_len
;
3583 strncpy(pos
, vol
->prepath
, pplen
);
3587 *pos
= '\0'; /* add trailing null */
3588 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3589 cFYI(1, "%s: full_path=%s", __func__
, full_path
);
3594 * Perform a dfs referral query for a share and (optionally) prefix
3596 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3597 * to a string containing updated options for the submount. Otherwise it
3598 * will be left untouched.
3600 * Returns the rc from get_dfs_path to the caller, which can be used to
3601 * determine whether there were referrals.
3604 expand_dfs_referral(int xid
, struct cifs_ses
*pSesInfo
,
3605 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3609 unsigned int num_referrals
= 0;
3610 struct dfs_info3_param
*referrals
= NULL
;
3611 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3613 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3614 if (IS_ERR(full_path
))
3615 return PTR_ERR(full_path
);
3617 /* For DFS paths, skip the first '\' of the UNC */
3618 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3620 rc
= get_dfs_path(xid
, pSesInfo
, ref_path
, cifs_sb
->local_nls
,
3621 &num_referrals
, &referrals
,
3622 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
3624 if (!rc
&& num_referrals
> 0) {
3625 char *fake_devname
= NULL
;
3627 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3628 full_path
+ 1, referrals
,
3631 free_dfs_info_array(referrals
, num_referrals
);
3633 if (IS_ERR(mdata
)) {
3634 rc
= PTR_ERR(mdata
);
3637 cleanup_volume_info_contents(volume_info
);
3638 memset(volume_info
, '\0', sizeof(*volume_info
));
3639 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3642 kfree(fake_devname
);
3643 kfree(cifs_sb
->mountdata
);
3644 cifs_sb
->mountdata
= mdata
;
3652 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3653 const char *devname
)
3657 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3661 if (volume_info
->nullauth
) {
3662 cFYI(1, "Anonymous login");
3663 kfree(volume_info
->username
);
3664 volume_info
->username
= NULL
;
3665 } else if (volume_info
->username
) {
3666 /* BB fixme parse for domain name here */
3667 cFYI(1, "Username: %s", volume_info
->username
);
3669 cifserror("No username specified");
3670 /* In userspace mount helper we can get user name from alternate
3671 locations such as env variables and files on disk */
3675 /* this is needed for ASCII cp to Unicode converts */
3676 if (volume_info
->iocharset
== NULL
) {
3677 /* load_nls_default cannot return null */
3678 volume_info
->local_nls
= load_nls_default();
3680 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3681 if (volume_info
->local_nls
== NULL
) {
3682 cERROR(1, "CIFS mount error: iocharset %s not found",
3683 volume_info
->iocharset
);
3692 cifs_get_volume_info(char *mount_data
, const char *devname
)
3695 struct smb_vol
*volume_info
;
3697 volume_info
= kzalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3699 return ERR_PTR(-ENOMEM
);
3701 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3703 cifs_cleanup_volume_info(volume_info
);
3704 volume_info
= ERR_PTR(rc
);
3711 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3715 struct cifs_ses
*pSesInfo
;
3716 struct cifs_tcon
*tcon
;
3717 struct TCP_Server_Info
*srvTcp
;
3719 struct tcon_link
*tlink
;
3720 #ifdef CONFIG_CIFS_DFS_UPCALL
3721 int referral_walks_count
= 0;
3724 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs", BDI_CAP_MAP_COPY
);
3728 #ifdef CONFIG_CIFS_DFS_UPCALL
3730 /* cleanup activities if we're chasing a referral */
3731 if (referral_walks_count
) {
3733 cifs_put_tcon(tcon
);
3735 cifs_put_smb_ses(pSesInfo
);
3749 /* get a reference to a tcp session */
3750 srvTcp
= cifs_get_tcp_session(volume_info
);
3751 if (IS_ERR(srvTcp
)) {
3752 rc
= PTR_ERR(srvTcp
);
3753 bdi_destroy(&cifs_sb
->bdi
);
3757 /* get a reference to a SMB session */
3758 pSesInfo
= cifs_get_smb_ses(srvTcp
, volume_info
);
3759 if (IS_ERR(pSesInfo
)) {
3760 rc
= PTR_ERR(pSesInfo
);
3762 goto mount_fail_check
;
3765 /* search for existing tcon to this server share */
3766 tcon
= cifs_get_tcon(pSesInfo
, volume_info
);
3770 goto remote_path_check
;
3773 /* tell server which Unix caps we support */
3774 if (tcon
->ses
->capabilities
& CAP_UNIX
) {
3775 /* reset of caps checks mount to see if unix extensions
3776 disabled for just this mount */
3777 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3778 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3779 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3780 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3782 goto mount_fail_check
;
3785 tcon
->unix_ext
= 0; /* server does not support them */
3787 /* do not care if following two calls succeed - informational */
3789 CIFSSMBQFSDeviceInfo(xid
, tcon
);
3790 CIFSSMBQFSAttributeInfo(xid
, tcon
);
3793 cifs_sb
->wsize
= cifs_negotiate_wsize(tcon
, volume_info
);
3794 cifs_sb
->rsize
= cifs_negotiate_rsize(tcon
, volume_info
);
3796 /* tune readahead according to rsize */
3797 cifs_sb
->bdi
.ra_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3800 #ifdef CONFIG_CIFS_DFS_UPCALL
3802 * Perform an unconditional check for whether there are DFS
3803 * referrals for this path without prefix, to provide support
3804 * for DFS referrals from w2k8 servers which don't seem to respond
3805 * with PATH_NOT_COVERED to requests that include the prefix.
3806 * Chase the referral if found, otherwise continue normally.
3808 if (referral_walks_count
== 0) {
3809 int refrc
= expand_dfs_referral(xid
, pSesInfo
, volume_info
,
3812 referral_walks_count
++;
3813 goto try_mount_again
;
3818 /* check if a whole path is not remote */
3820 /* build_path_to_root works only when we have a valid tcon */
3821 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3822 if (full_path
== NULL
) {
3824 goto mount_fail_check
;
3826 rc
= is_path_accessible(xid
, tcon
, cifs_sb
, full_path
);
3827 if (rc
!= 0 && rc
!= -EREMOTE
) {
3829 goto mount_fail_check
;
3834 /* get referral if needed */
3835 if (rc
== -EREMOTE
) {
3836 #ifdef CONFIG_CIFS_DFS_UPCALL
3837 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3839 * BB: when we implement proper loop detection,
3840 * we will remove this check. But now we need it
3841 * to prevent an indefinite loop if 'DFS tree' is
3842 * misconfigured (i.e. has loops).
3845 goto mount_fail_check
;
3848 rc
= expand_dfs_referral(xid
, pSesInfo
, volume_info
, cifs_sb
,
3852 referral_walks_count
++;
3853 goto try_mount_again
;
3855 goto mount_fail_check
;
3856 #else /* No DFS support, return error on mount */
3862 goto mount_fail_check
;
3864 /* now, hang the tcon off of the superblock */
3865 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3866 if (tlink
== NULL
) {
3868 goto mount_fail_check
;
3871 tlink
->tl_uid
= pSesInfo
->linux_uid
;
3872 tlink
->tl_tcon
= tcon
;
3873 tlink
->tl_time
= jiffies
;
3874 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3875 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3877 cifs_sb
->master_tlink
= tlink
;
3878 spin_lock(&cifs_sb
->tlink_tree_lock
);
3879 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3880 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3882 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3886 /* on error free sesinfo and tcon struct if needed */
3888 /* If find_unc succeeded then rc == 0 so we can not end */
3889 /* up accidentally freeing someone elses tcon struct */
3891 cifs_put_tcon(tcon
);
3893 cifs_put_smb_ses(pSesInfo
);
3895 cifs_put_tcp_session(srvTcp
);
3896 bdi_destroy(&cifs_sb
->bdi
);
3905 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3906 * pointer may be NULL.
3909 CIFSTCon(unsigned int xid
, struct cifs_ses
*ses
,
3910 const char *tree
, struct cifs_tcon
*tcon
,
3911 const struct nls_table
*nls_codepage
)
3913 struct smb_hdr
*smb_buffer
;
3914 struct smb_hdr
*smb_buffer_response
;
3917 unsigned char *bcc_ptr
;
3920 __u16 bytes_left
, count
;
3925 smb_buffer
= cifs_buf_get();
3926 if (smb_buffer
== NULL
)
3929 smb_buffer_response
= smb_buffer
;
3931 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3932 NULL
/*no tid */ , 4 /*wct */ );
3934 smb_buffer
->Mid
= GetNextMid(ses
->server
);
3935 smb_buffer
->Uid
= ses
->Suid
;
3936 pSMB
= (TCONX_REQ
*) smb_buffer
;
3937 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3939 pSMB
->AndXCommand
= 0xFF;
3940 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3941 bcc_ptr
= &pSMB
->Password
[0];
3942 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3943 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3944 *bcc_ptr
= 0; /* password is null byte */
3945 bcc_ptr
++; /* skip password */
3946 /* already aligned so no need to do it below */
3948 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3949 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3950 specified as required (when that support is added to
3951 the vfs in the future) as only NTLM or the much
3952 weaker LANMAN (which we do not send by default) is accepted
3953 by Samba (not sure whether other servers allow
3954 NTLMv2 password here) */
3955 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3956 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3957 (ses
->server
->secType
== LANMAN
))
3958 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3959 ses
->server
->sec_mode
&
3960 SECMODE_PW_ENCRYPT
? true : false,
3963 #endif /* CIFS_WEAK_PW_HASH */
3964 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3965 bcc_ptr
, nls_codepage
);
3967 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3968 if (ses
->capabilities
& CAP_UNICODE
) {
3969 /* must align unicode strings */
3970 *bcc_ptr
= 0; /* null byte password */
3975 if (ses
->server
->sec_mode
&
3976 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
3977 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3979 if (ses
->capabilities
& CAP_STATUS32
) {
3980 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3982 if (ses
->capabilities
& CAP_DFS
) {
3983 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3985 if (ses
->capabilities
& CAP_UNICODE
) {
3986 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3988 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
3989 6 /* max utf8 char length in bytes */ *
3990 (/* server len*/ + 256 /* share len */), nls_codepage
);
3991 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3992 bcc_ptr
+= 2; /* skip trailing null */
3993 } else { /* ASCII */
3994 strcpy(bcc_ptr
, tree
);
3995 bcc_ptr
+= strlen(tree
) + 1;
3997 strcpy(bcc_ptr
, "?????");
3998 bcc_ptr
+= strlen("?????");
4000 count
= bcc_ptr
- &pSMB
->Password
[0];
4001 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
4002 pSMB
->hdr
.smb_buf_length
) + count
);
4003 pSMB
->ByteCount
= cpu_to_le16(count
);
4005 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
4008 /* above now done in SendReceive */
4009 if ((rc
== 0) && (tcon
!= NULL
)) {
4012 tcon
->tidStatus
= CifsGood
;
4013 tcon
->need_reconnect
= false;
4014 tcon
->tid
= smb_buffer_response
->Tid
;
4015 bcc_ptr
= pByteArea(smb_buffer_response
);
4016 bytes_left
= get_bcc(smb_buffer_response
);
4017 length
= strnlen(bcc_ptr
, bytes_left
- 2);
4018 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
4024 /* skip service field (NB: this field is always ASCII) */
4026 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
4027 (bcc_ptr
[2] == 'C')) {
4028 cFYI(1, "IPC connection");
4031 } else if (length
== 2) {
4032 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
4033 /* the most common case */
4034 cFYI(1, "disk share connection");
4037 bcc_ptr
+= length
+ 1;
4038 bytes_left
-= (length
+ 1);
4039 strncpy(tcon
->treeName
, tree
, MAX_TREE_SIZE
);
4041 /* mostly informational -- no need to fail on error here */
4042 kfree(tcon
->nativeFileSystem
);
4043 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
4044 bytes_left
, is_unicode
,
4047 cFYI(1, "nativeFileSystem=%s", tcon
->nativeFileSystem
);
4049 if ((smb_buffer_response
->WordCount
== 3) ||
4050 (smb_buffer_response
->WordCount
== 7))
4051 /* field is in same location */
4052 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
4055 cFYI(1, "Tcon flags: 0x%x ", tcon
->Flags
);
4056 } else if ((rc
== 0) && tcon
== NULL
) {
4057 /* all we need to save for IPC$ connection */
4058 ses
->ipc_tid
= smb_buffer_response
->Tid
;
4061 cifs_buf_release(smb_buffer
);
4066 cifs_umount(struct cifs_sb_info
*cifs_sb
)
4068 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4069 struct rb_node
*node
;
4070 struct tcon_link
*tlink
;
4072 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
4074 spin_lock(&cifs_sb
->tlink_tree_lock
);
4075 while ((node
= rb_first(root
))) {
4076 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4077 cifs_get_tlink(tlink
);
4078 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4079 rb_erase(node
, root
);
4081 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4082 cifs_put_tlink(tlink
);
4083 spin_lock(&cifs_sb
->tlink_tree_lock
);
4085 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4087 bdi_destroy(&cifs_sb
->bdi
);
4088 kfree(cifs_sb
->mountdata
);
4089 unload_nls(cifs_sb
->local_nls
);
4093 int cifs_negotiate_protocol(unsigned int xid
, struct cifs_ses
*ses
)
4096 struct TCP_Server_Info
*server
= ses
->server
;
4098 /* only send once per connect */
4099 if (server
->maxBuf
!= 0)
4102 set_credits(server
, 1);
4103 rc
= CIFSSMBNegotiate(xid
, ses
);
4104 if (rc
== -EAGAIN
) {
4105 /* retry only once on 1st time connection */
4106 set_credits(server
, 1);
4107 rc
= CIFSSMBNegotiate(xid
, ses
);
4112 spin_lock(&GlobalMid_Lock
);
4113 if (server
->tcpStatus
== CifsNeedNegotiate
)
4114 server
->tcpStatus
= CifsGood
;
4117 spin_unlock(&GlobalMid_Lock
);
4125 int cifs_setup_session(unsigned int xid
, struct cifs_ses
*ses
,
4126 struct nls_table
*nls_info
)
4129 struct TCP_Server_Info
*server
= ses
->server
;
4132 ses
->capabilities
= server
->capabilities
;
4133 if (linuxExtEnabled
== 0)
4134 ses
->capabilities
&= (~CAP_UNIX
);
4136 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
4137 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
4139 rc
= CIFS_SessSetup(xid
, ses
, nls_info
);
4141 cERROR(1, "Send error in SessSetup = %d", rc
);
4143 mutex_lock(&ses
->server
->srv_mutex
);
4144 if (!server
->session_estab
) {
4145 server
->session_key
.response
= ses
->auth_key
.response
;
4146 server
->session_key
.len
= ses
->auth_key
.len
;
4147 server
->sequence_number
= 0x2;
4148 server
->session_estab
= true;
4149 ses
->auth_key
.response
= NULL
;
4151 mutex_unlock(&server
->srv_mutex
);
4153 cFYI(1, "CIFS Session Established successfully");
4154 spin_lock(&GlobalMid_Lock
);
4155 ses
->status
= CifsGood
;
4156 ses
->need_reconnect
= false;
4157 spin_unlock(&GlobalMid_Lock
);
4160 kfree(ses
->auth_key
.response
);
4161 ses
->auth_key
.response
= NULL
;
4162 ses
->auth_key
.len
= 0;
4163 kfree(ses
->ntlmssp
);
4164 ses
->ntlmssp
= NULL
;
4170 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
4172 switch (ses
->server
->secType
) {
4174 vol
->secFlg
= CIFSSEC_MUST_KRB5
;
4177 vol
->secFlg
= CIFSSEC_MUST_NTLMV2
;
4180 vol
->secFlg
= CIFSSEC_MUST_NTLM
;
4183 vol
->secFlg
= CIFSSEC_MUST_NTLMSSP
;
4186 vol
->secFlg
= CIFSSEC_MUST_LANMAN
;
4190 return cifs_set_cifscreds(vol
, ses
);
4193 static struct cifs_tcon
*
4194 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, uid_t fsuid
)
4197 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
4198 struct cifs_ses
*ses
;
4199 struct cifs_tcon
*tcon
= NULL
;
4200 struct smb_vol
*vol_info
;
4202 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
4203 if (vol_info
== NULL
)
4204 return ERR_PTR(-ENOMEM
);
4206 vol_info
->local_nls
= cifs_sb
->local_nls
;
4207 vol_info
->linux_uid
= fsuid
;
4208 vol_info
->cred_uid
= fsuid
;
4209 vol_info
->UNC
= master_tcon
->treeName
;
4210 vol_info
->retry
= master_tcon
->retry
;
4211 vol_info
->nocase
= master_tcon
->nocase
;
4212 vol_info
->local_lease
= master_tcon
->local_lease
;
4213 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
4215 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
4221 /* get a reference for the same TCP session */
4222 spin_lock(&cifs_tcp_ses_lock
);
4223 ++master_tcon
->ses
->server
->srv_count
;
4224 spin_unlock(&cifs_tcp_ses_lock
);
4226 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
4228 tcon
= (struct cifs_tcon
*)ses
;
4229 cifs_put_tcp_session(master_tcon
->ses
->server
);
4233 tcon
= cifs_get_tcon(ses
, vol_info
);
4235 cifs_put_smb_ses(ses
);
4239 if (ses
->capabilities
& CAP_UNIX
)
4240 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
4242 kfree(vol_info
->username
);
4243 kfree(vol_info
->password
);
4250 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
4252 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
4256 cifs_sb_tcon_pending_wait(void *unused
)
4259 return signal_pending(current
) ? -ERESTARTSYS
: 0;
4262 /* find and return a tlink with given uid */
4263 static struct tcon_link
*
4264 tlink_rb_search(struct rb_root
*root
, uid_t uid
)
4266 struct rb_node
*node
= root
->rb_node
;
4267 struct tcon_link
*tlink
;
4270 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4272 if (tlink
->tl_uid
> uid
)
4273 node
= node
->rb_left
;
4274 else if (tlink
->tl_uid
< uid
)
4275 node
= node
->rb_right
;
4282 /* insert a tcon_link into the tree */
4284 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
4286 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
4287 struct tcon_link
*tlink
;
4290 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
4293 if (tlink
->tl_uid
> new_tlink
->tl_uid
)
4294 new = &((*new)->rb_left
);
4296 new = &((*new)->rb_right
);
4299 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
4300 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
4304 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4307 * If the superblock doesn't refer to a multiuser mount, then just return
4308 * the master tcon for the mount.
4310 * First, search the rbtree for an existing tcon for this fsuid. If one
4311 * exists, then check to see if it's pending construction. If it is then wait
4312 * for construction to complete. Once it's no longer pending, check to see if
4313 * it failed and either return an error or retry construction, depending on
4316 * If one doesn't exist then insert a new tcon_link struct into the tree and
4317 * try to construct a new one.
4320 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4323 uid_t fsuid
= current_fsuid();
4324 struct tcon_link
*tlink
, *newtlink
;
4326 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4327 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4329 spin_lock(&cifs_sb
->tlink_tree_lock
);
4330 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4332 cifs_get_tlink(tlink
);
4333 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4335 if (tlink
== NULL
) {
4336 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4337 if (newtlink
== NULL
)
4338 return ERR_PTR(-ENOMEM
);
4339 newtlink
->tl_uid
= fsuid
;
4340 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4341 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4342 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4343 cifs_get_tlink(newtlink
);
4345 spin_lock(&cifs_sb
->tlink_tree_lock
);
4346 /* was one inserted after previous search? */
4347 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4349 cifs_get_tlink(tlink
);
4350 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4352 goto wait_for_construction
;
4355 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4356 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4358 wait_for_construction
:
4359 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4360 cifs_sb_tcon_pending_wait
,
4361 TASK_INTERRUPTIBLE
);
4363 cifs_put_tlink(tlink
);
4364 return ERR_PTR(ret
);
4367 /* if it's good, return it */
4368 if (!IS_ERR(tlink
->tl_tcon
))
4371 /* return error if we tried this already recently */
4372 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4373 cifs_put_tlink(tlink
);
4374 return ERR_PTR(-EACCES
);
4377 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4378 goto wait_for_construction
;
4381 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4382 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4383 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4385 if (IS_ERR(tlink
->tl_tcon
)) {
4386 cifs_put_tlink(tlink
);
4387 return ERR_PTR(-EACCES
);
4394 * periodic workqueue job that scans tcon_tree for a superblock and closes
4398 cifs_prune_tlinks(struct work_struct
*work
)
4400 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4402 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4403 struct rb_node
*node
= rb_first(root
);
4404 struct rb_node
*tmp
;
4405 struct tcon_link
*tlink
;
4408 * Because we drop the spinlock in the loop in order to put the tlink
4409 * it's not guarded against removal of links from the tree. The only
4410 * places that remove entries from the tree are this function and
4411 * umounts. Because this function is non-reentrant and is canceled
4412 * before umount can proceed, this is safe.
4414 spin_lock(&cifs_sb
->tlink_tree_lock
);
4415 node
= rb_first(root
);
4416 while (node
!= NULL
) {
4418 node
= rb_next(tmp
);
4419 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4421 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4422 atomic_read(&tlink
->tl_count
) != 0 ||
4423 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4426 cifs_get_tlink(tlink
);
4427 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4428 rb_erase(tmp
, root
);
4430 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4431 cifs_put_tlink(tlink
);
4432 spin_lock(&cifs_sb
->tlink_tree_lock
);
4434 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4436 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,