4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/list.h>
25 #include <linux/wait.h>
26 #include <linux/slab.h>
27 #include <linux/pagemap.h>
28 #include <linux/ctype.h>
29 #include <linux/utsname.h>
30 #include <linux/mempool.h>
31 #include <linux/delay.h>
32 #include <linux/completion.h>
33 #include <linux/kthread.h>
34 #include <linux/pagevec.h>
35 #include <linux/freezer.h>
36 #include <linux/namei.h>
37 #include <asm/uaccess.h>
38 #include <asm/processor.h>
39 #include <linux/inet.h>
40 #include <linux/module.h>
41 #include <keys/user-type.h>
43 #include <linux/parser.h>
47 #include "cifsproto.h"
48 #include "cifs_unicode.h"
49 #include "cifs_debug.h"
50 #include "cifs_fs_sb.h"
53 #include "rfc1002pdu.h"
57 #define RFC1001_PORT 139
59 extern mempool_t
*cifs_req_poolp
;
61 /* FIXME: should these be tunable? */
62 #define TLINK_ERROR_EXPIRE (1 * HZ)
63 #define TLINK_IDLE_EXPIRE (600 * HZ)
67 /* Mount options that take no arguments */
68 Opt_user_xattr
, Opt_nouser_xattr
,
69 Opt_forceuid
, Opt_noforceuid
,
70 Opt_forcegid
, Opt_noforcegid
,
71 Opt_noblocksend
, Opt_noautotune
,
72 Opt_hard
, Opt_soft
, Opt_perm
, Opt_noperm
,
73 Opt_mapchars
, Opt_nomapchars
, Opt_sfu
,
74 Opt_nosfu
, Opt_nodfs
, Opt_posixpaths
,
75 Opt_noposixpaths
, Opt_nounix
,
78 Opt_forcemandatorylock
, Opt_setuids
,
79 Opt_nosetuids
, Opt_dynperm
, Opt_nodynperm
,
80 Opt_nohard
, Opt_nosoft
,
82 Opt_nostrictsync
, Opt_strictsync
,
83 Opt_serverino
, Opt_noserverino
,
84 Opt_rwpidforward
, Opt_cifsacl
, Opt_nocifsacl
,
85 Opt_acl
, Opt_noacl
, Opt_locallease
,
86 Opt_sign
, Opt_seal
, Opt_noac
,
87 Opt_fsc
, Opt_mfsymlinks
,
88 Opt_multiuser
, Opt_sloppy
, Opt_nosharesock
,
90 /* Mount options which take numeric value */
91 Opt_backupuid
, Opt_backupgid
, Opt_uid
,
92 Opt_cruid
, Opt_gid
, Opt_file_mode
,
93 Opt_dirmode
, Opt_port
,
94 Opt_rsize
, Opt_wsize
, Opt_actimeo
,
96 /* Mount options which take string value */
97 Opt_user
, Opt_pass
, Opt_ip
,
98 Opt_domain
, Opt_srcaddr
, Opt_iocharset
,
99 Opt_netbiosname
, Opt_servern
,
100 Opt_ver
, Opt_vers
, Opt_sec
, Opt_cache
,
102 /* Mount options to be ignored */
105 /* Options which could be blank */
113 static const match_table_t cifs_mount_option_tokens
= {
115 { Opt_user_xattr
, "user_xattr" },
116 { Opt_nouser_xattr
, "nouser_xattr" },
117 { Opt_forceuid
, "forceuid" },
118 { Opt_noforceuid
, "noforceuid" },
119 { Opt_forcegid
, "forcegid" },
120 { Opt_noforcegid
, "noforcegid" },
121 { Opt_noblocksend
, "noblocksend" },
122 { Opt_noautotune
, "noautotune" },
123 { Opt_hard
, "hard" },
124 { Opt_soft
, "soft" },
125 { Opt_perm
, "perm" },
126 { Opt_noperm
, "noperm" },
127 { Opt_mapchars
, "mapchars" },
128 { Opt_nomapchars
, "nomapchars" },
130 { Opt_nosfu
, "nosfu" },
131 { Opt_nodfs
, "nodfs" },
132 { Opt_posixpaths
, "posixpaths" },
133 { Opt_noposixpaths
, "noposixpaths" },
134 { Opt_nounix
, "nounix" },
135 { Opt_nounix
, "nolinux" },
136 { Opt_nocase
, "nocase" },
137 { Opt_nocase
, "ignorecase" },
139 { Opt_nobrl
, "nobrl" },
140 { Opt_nobrl
, "nolock" },
141 { Opt_forcemandatorylock
, "forcemandatorylock" },
142 { Opt_forcemandatorylock
, "forcemand" },
143 { Opt_setuids
, "setuids" },
144 { Opt_nosetuids
, "nosetuids" },
145 { Opt_dynperm
, "dynperm" },
146 { Opt_nodynperm
, "nodynperm" },
147 { Opt_nohard
, "nohard" },
148 { Opt_nosoft
, "nosoft" },
149 { Opt_nointr
, "nointr" },
150 { Opt_intr
, "intr" },
151 { Opt_nostrictsync
, "nostrictsync" },
152 { Opt_strictsync
, "strictsync" },
153 { Opt_serverino
, "serverino" },
154 { Opt_noserverino
, "noserverino" },
155 { Opt_rwpidforward
, "rwpidforward" },
156 { Opt_cifsacl
, "cifsacl" },
157 { Opt_nocifsacl
, "nocifsacl" },
159 { Opt_noacl
, "noacl" },
160 { Opt_locallease
, "locallease" },
161 { Opt_sign
, "sign" },
162 { Opt_seal
, "seal" },
163 { Opt_noac
, "noac" },
165 { Opt_mfsymlinks
, "mfsymlinks" },
166 { Opt_multiuser
, "multiuser" },
167 { Opt_sloppy
, "sloppy" },
168 { Opt_nosharesock
, "nosharesock" },
170 { Opt_backupuid
, "backupuid=%s" },
171 { Opt_backupgid
, "backupgid=%s" },
172 { Opt_uid
, "uid=%s" },
173 { Opt_cruid
, "cruid=%s" },
174 { Opt_gid
, "gid=%s" },
175 { Opt_file_mode
, "file_mode=%s" },
176 { Opt_dirmode
, "dirmode=%s" },
177 { Opt_dirmode
, "dir_mode=%s" },
178 { Opt_port
, "port=%s" },
179 { Opt_rsize
, "rsize=%s" },
180 { Opt_wsize
, "wsize=%s" },
181 { Opt_actimeo
, "actimeo=%s" },
183 { Opt_blank_user
, "user=" },
184 { Opt_blank_user
, "username=" },
185 { Opt_user
, "user=%s" },
186 { Opt_user
, "username=%s" },
187 { Opt_blank_pass
, "pass=" },
188 { Opt_blank_pass
, "password=" },
189 { Opt_pass
, "pass=%s" },
190 { Opt_pass
, "password=%s" },
191 { Opt_blank_ip
, "ip=" },
192 { Opt_blank_ip
, "addr=" },
194 { Opt_ip
, "addr=%s" },
195 { Opt_ignore
, "unc=%s" },
196 { Opt_ignore
, "target=%s" },
197 { Opt_ignore
, "path=%s" },
198 { Opt_domain
, "dom=%s" },
199 { Opt_domain
, "domain=%s" },
200 { Opt_domain
, "workgroup=%s" },
201 { Opt_srcaddr
, "srcaddr=%s" },
202 { Opt_ignore
, "prefixpath=%s" },
203 { Opt_iocharset
, "iocharset=%s" },
204 { Opt_netbiosname
, "netbiosname=%s" },
205 { Opt_servern
, "servern=%s" },
206 { Opt_ver
, "ver=%s" },
207 { Opt_vers
, "vers=%s" },
208 { Opt_sec
, "sec=%s" },
209 { Opt_cache
, "cache=%s" },
211 { Opt_ignore
, "cred" },
212 { Opt_ignore
, "credentials" },
213 { Opt_ignore
, "cred=%s" },
214 { Opt_ignore
, "credentials=%s" },
215 { Opt_ignore
, "guest" },
216 { Opt_ignore
, "rw" },
217 { Opt_ignore
, "ro" },
218 { Opt_ignore
, "suid" },
219 { Opt_ignore
, "nosuid" },
220 { Opt_ignore
, "exec" },
221 { Opt_ignore
, "noexec" },
222 { Opt_ignore
, "nodev" },
223 { Opt_ignore
, "noauto" },
224 { Opt_ignore
, "dev" },
225 { Opt_ignore
, "mand" },
226 { Opt_ignore
, "nomand" },
227 { Opt_ignore
, "_netdev" },
233 Opt_sec_krb5
, Opt_sec_krb5i
, Opt_sec_krb5p
,
234 Opt_sec_ntlmsspi
, Opt_sec_ntlmssp
,
235 Opt_ntlm
, Opt_sec_ntlmi
, Opt_sec_ntlmv2
,
236 Opt_sec_ntlmv2i
, Opt_sec_lanman
,
242 static const match_table_t cifs_secflavor_tokens
= {
243 { Opt_sec_krb5
, "krb5" },
244 { Opt_sec_krb5i
, "krb5i" },
245 { Opt_sec_krb5p
, "krb5p" },
246 { Opt_sec_ntlmsspi
, "ntlmsspi" },
247 { Opt_sec_ntlmssp
, "ntlmssp" },
248 { Opt_ntlm
, "ntlm" },
249 { Opt_sec_ntlmi
, "ntlmi" },
250 { Opt_sec_ntlmv2
, "nontlm" },
251 { Opt_sec_ntlmv2
, "ntlmv2" },
252 { Opt_sec_ntlmv2i
, "ntlmv2i" },
253 { Opt_sec_lanman
, "lanman" },
254 { Opt_sec_none
, "none" },
256 { Opt_sec_err
, NULL
}
267 static const match_table_t cifs_cacheflavor_tokens
= {
268 { Opt_cache_loose
, "loose" },
269 { Opt_cache_strict
, "strict" },
270 { Opt_cache_none
, "none" },
271 { Opt_cache_err
, NULL
}
274 static const match_table_t cifs_smb_version_tokens
= {
275 { Smb_1
, SMB1_VERSION_STRING
},
276 { Smb_20
, SMB20_VERSION_STRING
},
277 { Smb_21
, SMB21_VERSION_STRING
},
278 { Smb_30
, SMB30_VERSION_STRING
},
281 static int ip_connect(struct TCP_Server_Info
*server
);
282 static int generic_ip_connect(struct TCP_Server_Info
*server
);
283 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
284 static void cifs_prune_tlinks(struct work_struct
*work
);
285 static int cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
286 const char *devname
);
289 * cifs tcp session reconnection
291 * mark tcp session as reconnecting so temporarily locked
292 * mark all smb sessions as reconnecting for tcp session
293 * reconnect tcp session
294 * wake up waiters on reconnection? - (not needed currently)
297 cifs_reconnect(struct TCP_Server_Info
*server
)
300 struct list_head
*tmp
, *tmp2
;
301 struct cifs_ses
*ses
;
302 struct cifs_tcon
*tcon
;
303 struct mid_q_entry
*mid_entry
;
304 struct list_head retry_list
;
306 spin_lock(&GlobalMid_Lock
);
307 if (server
->tcpStatus
== CifsExiting
) {
308 /* the demux thread will exit normally
309 next time through the loop */
310 spin_unlock(&GlobalMid_Lock
);
313 server
->tcpStatus
= CifsNeedReconnect
;
314 spin_unlock(&GlobalMid_Lock
);
316 #ifdef CONFIG_CIFS_SMB2
317 server
->max_read
= 0;
320 cifs_dbg(FYI
, "Reconnecting tcp session\n");
322 /* before reconnecting the tcp session, mark the smb session (uid)
323 and the tid bad so they are not used until reconnected */
324 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
326 spin_lock(&cifs_tcp_ses_lock
);
327 list_for_each(tmp
, &server
->smb_ses_list
) {
328 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
329 ses
->need_reconnect
= true;
331 list_for_each(tmp2
, &ses
->tcon_list
) {
332 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
333 tcon
->need_reconnect
= true;
336 spin_unlock(&cifs_tcp_ses_lock
);
338 /* do not want to be sending data on a socket we are freeing */
339 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
340 mutex_lock(&server
->srv_mutex
);
341 if (server
->ssocket
) {
342 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
343 server
->ssocket
->state
, server
->ssocket
->flags
);
344 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
345 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
346 server
->ssocket
->state
, server
->ssocket
->flags
);
347 sock_release(server
->ssocket
);
348 server
->ssocket
= NULL
;
350 server
->sequence_number
= 0;
351 server
->session_estab
= false;
352 kfree(server
->session_key
.response
);
353 server
->session_key
.response
= NULL
;
354 server
->session_key
.len
= 0;
355 server
->lstrp
= jiffies
;
356 mutex_unlock(&server
->srv_mutex
);
358 /* mark submitted MIDs for retry and issue callback */
359 INIT_LIST_HEAD(&retry_list
);
360 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
361 spin_lock(&GlobalMid_Lock
);
362 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
363 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
364 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
365 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
366 list_move(&mid_entry
->qhead
, &retry_list
);
368 spin_unlock(&GlobalMid_Lock
);
370 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
371 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
372 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
373 list_del_init(&mid_entry
->qhead
);
374 mid_entry
->callback(mid_entry
);
380 /* we should try only the port we connected to before */
381 rc
= generic_ip_connect(server
);
383 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
386 atomic_inc(&tcpSesReconnectCount
);
387 spin_lock(&GlobalMid_Lock
);
388 if (server
->tcpStatus
!= CifsExiting
)
389 server
->tcpStatus
= CifsNeedNegotiate
;
390 spin_unlock(&GlobalMid_Lock
);
392 } while (server
->tcpStatus
== CifsNeedReconnect
);
398 cifs_echo_request(struct work_struct
*work
)
401 struct TCP_Server_Info
*server
= container_of(work
,
402 struct TCP_Server_Info
, echo
.work
);
405 * We cannot send an echo if it is disabled or until the
406 * NEGOTIATE_PROTOCOL request is done, which is indicated by
407 * server->ops->need_neg() == true. Also, no need to ping if
408 * we got a response recently.
410 if (!server
->ops
->need_neg
|| server
->ops
->need_neg(server
) ||
411 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
412 time_before(jiffies
, server
->lstrp
+ SMB_ECHO_INTERVAL
- HZ
))
415 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
417 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
421 queue_delayed_work(cifsiod_wq
, &server
->echo
, SMB_ECHO_INTERVAL
);
425 allocate_buffers(struct TCP_Server_Info
*server
)
427 if (!server
->bigbuf
) {
428 server
->bigbuf
= (char *)cifs_buf_get();
429 if (!server
->bigbuf
) {
430 cifs_dbg(VFS
, "No memory for large SMB response\n");
432 /* retry will check if exiting */
435 } else if (server
->large_buf
) {
436 /* we are reusing a dirty large buf, clear its start */
437 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
440 if (!server
->smallbuf
) {
441 server
->smallbuf
= (char *)cifs_small_buf_get();
442 if (!server
->smallbuf
) {
443 cifs_dbg(VFS
, "No memory for SMB response\n");
445 /* retry will check if exiting */
448 /* beginning of smb buffer is cleared in our buf_get */
450 /* if existing small buf clear beginning */
451 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
458 server_unresponsive(struct TCP_Server_Info
*server
)
461 * We need to wait 2 echo intervals to make sure we handle such
463 * 1s client sends a normal SMB request
464 * 2s client gets a response
465 * 30s echo workqueue job pops, and decides we got a response recently
466 * and don't need to send another
468 * 65s kernel_recvmsg times out, and we see that we haven't gotten
469 * a response in >60s.
471 if (server
->tcpStatus
== CifsGood
&&
472 time_after(jiffies
, server
->lstrp
+ 2 * SMB_ECHO_INTERVAL
)) {
473 cifs_dbg(VFS
, "Server %s has not responded in %d seconds. Reconnecting...\n",
474 server
->hostname
, (2 * SMB_ECHO_INTERVAL
) / HZ
);
475 cifs_reconnect(server
);
476 wake_up(&server
->response_q
);
484 * kvec_array_init - clone a kvec array, and advance into it
485 * @new: pointer to memory for cloned array
486 * @iov: pointer to original array
487 * @nr_segs: number of members in original array
488 * @bytes: number of bytes to advance into the cloned array
490 * This function will copy the array provided in iov to a section of memory
491 * and advance the specified number of bytes into the new array. It returns
492 * the number of segments in the new array. "new" must be at least as big as
493 * the original iov array.
496 kvec_array_init(struct kvec
*new, struct kvec
*iov
, unsigned int nr_segs
,
501 while (bytes
|| !iov
->iov_len
) {
502 int copy
= min(bytes
, iov
->iov_len
);
506 if (iov
->iov_len
== base
) {
512 memcpy(new, iov
, sizeof(*iov
) * nr_segs
);
513 new->iov_base
+= base
;
514 new->iov_len
-= base
;
519 get_server_iovec(struct TCP_Server_Info
*server
, unsigned int nr_segs
)
521 struct kvec
*new_iov
;
523 if (server
->iov
&& nr_segs
<= server
->nr_iov
)
526 /* not big enough -- allocate a new one and release the old */
527 new_iov
= kmalloc(sizeof(*new_iov
) * nr_segs
, GFP_NOFS
);
530 server
->iov
= new_iov
;
531 server
->nr_iov
= nr_segs
;
537 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct kvec
*iov_orig
,
538 unsigned int nr_segs
, unsigned int to_read
)
543 struct msghdr smb_msg
;
546 iov
= get_server_iovec(server
, nr_segs
);
550 smb_msg
.msg_control
= NULL
;
551 smb_msg
.msg_controllen
= 0;
553 for (total_read
= 0; to_read
; total_read
+= length
, to_read
-= length
) {
556 if (server_unresponsive(server
)) {
557 total_read
= -EAGAIN
;
561 segs
= kvec_array_init(iov
, iov_orig
, nr_segs
, total_read
);
563 length
= kernel_recvmsg(server
->ssocket
, &smb_msg
,
564 iov
, segs
, to_read
, 0);
566 if (server
->tcpStatus
== CifsExiting
) {
567 total_read
= -ESHUTDOWN
;
569 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
570 cifs_reconnect(server
);
571 total_read
= -EAGAIN
;
573 } else if (length
== -ERESTARTSYS
||
577 * Minimum sleep to prevent looping, allowing socket
578 * to clear and app threads to set tcpStatus
579 * CifsNeedReconnect if server hung.
581 usleep_range(1000, 2000);
584 } else if (length
<= 0) {
585 cifs_dbg(FYI
, "Received no data or error: expecting %d\n"
586 "got %d", to_read
, length
);
587 cifs_reconnect(server
);
588 total_read
= -EAGAIN
;
596 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
597 unsigned int to_read
)
602 iov
.iov_len
= to_read
;
604 return cifs_readv_from_socket(server
, &iov
, 1, to_read
);
608 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
611 * The first byte big endian of the length field,
612 * is actually not part of the length but the type
613 * with the most common, zero, as regular data.
616 case RFC1002_SESSION_MESSAGE
:
617 /* Regular SMB response */
619 case RFC1002_SESSION_KEEP_ALIVE
:
620 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
622 case RFC1002_POSITIVE_SESSION_RESPONSE
:
623 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
625 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
627 * We get this from Windows 98 instead of an error on
628 * SMB negprot response.
630 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
631 /* give server a second to clean up */
634 * Always try 445 first on reconnect since we get NACK
635 * on some if we ever connected to port 139 (the NACK
636 * is since we do not begin with RFC1001 session
639 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
640 cifs_reconnect(server
);
641 wake_up(&server
->response_q
);
644 cifs_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
645 cifs_reconnect(server
);
652 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
654 #ifdef CONFIG_CIFS_STATS2
655 mid
->when_received
= jiffies
;
657 spin_lock(&GlobalMid_Lock
);
659 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
661 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
662 list_del_init(&mid
->qhead
);
663 spin_unlock(&GlobalMid_Lock
);
667 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
668 char *buf
, int malformed
)
670 if (server
->ops
->check_trans2
&&
671 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
674 mid
->large_buf
= server
->large_buf
;
675 /* Was previous buf put in mpx struct for multi-rsp? */
676 if (!mid
->multiRsp
) {
677 /* smb buffer will be freed by user thread */
678 if (server
->large_buf
)
679 server
->bigbuf
= NULL
;
681 server
->smallbuf
= NULL
;
683 dequeue_mid(mid
, malformed
);
686 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
690 /* take it off the list, if it's not already */
691 spin_lock(&cifs_tcp_ses_lock
);
692 list_del_init(&server
->tcp_ses_list
);
693 spin_unlock(&cifs_tcp_ses_lock
);
695 spin_lock(&GlobalMid_Lock
);
696 server
->tcpStatus
= CifsExiting
;
697 spin_unlock(&GlobalMid_Lock
);
698 wake_up_all(&server
->response_q
);
700 /* check if we have blocked requests that need to free */
701 spin_lock(&server
->req_lock
);
702 if (server
->credits
<= 0)
704 spin_unlock(&server
->req_lock
);
706 * Although there should not be any requests blocked on this queue it
707 * can not hurt to be paranoid and try to wake up requests that may
708 * haven been blocked when more than 50 at time were on the wire to the
709 * same server - they now will see the session is in exit state and get
710 * out of SendReceive.
712 wake_up_all(&server
->request_q
);
713 /* give those requests time to exit */
716 if (server
->ssocket
) {
717 sock_release(server
->ssocket
);
718 server
->ssocket
= NULL
;
721 if (!list_empty(&server
->pending_mid_q
)) {
722 struct list_head dispose_list
;
723 struct mid_q_entry
*mid_entry
;
724 struct list_head
*tmp
, *tmp2
;
726 INIT_LIST_HEAD(&dispose_list
);
727 spin_lock(&GlobalMid_Lock
);
728 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
729 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
730 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
731 mid_entry
->mid_state
= MID_SHUTDOWN
;
732 list_move(&mid_entry
->qhead
, &dispose_list
);
734 spin_unlock(&GlobalMid_Lock
);
736 /* now walk dispose list and issue callbacks */
737 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
738 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
739 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
740 list_del_init(&mid_entry
->qhead
);
741 mid_entry
->callback(mid_entry
);
743 /* 1/8th of sec is more than enough time for them to exit */
747 if (!list_empty(&server
->pending_mid_q
)) {
749 * mpx threads have not exited yet give them at least the smb
750 * send timeout time for long ops.
752 * Due to delays on oplock break requests, we need to wait at
753 * least 45 seconds before giving up on a request getting a
754 * response and going ahead and killing cifsd.
756 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
759 * If threads still have not exited they are probably never
760 * coming home not much else we can do but free the memory.
764 kfree(server
->hostname
);
768 length
= atomic_dec_return(&tcpSesAllocCount
);
770 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
775 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
778 char *buf
= server
->smallbuf
;
779 unsigned int pdu_length
= get_rfc1002_length(buf
);
781 /* make sure this will fit in a large buffer */
782 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) - 4) {
783 cifs_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
784 cifs_reconnect(server
);
785 wake_up(&server
->response_q
);
789 /* switch to large buffer if too big for a small one */
790 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
791 server
->large_buf
= true;
792 memcpy(server
->bigbuf
, buf
, server
->total_read
);
793 buf
= server
->bigbuf
;
796 /* now read the rest */
797 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
798 pdu_length
- HEADER_SIZE(server
) + 1 + 4);
801 server
->total_read
+= length
;
803 dump_smb(buf
, server
->total_read
);
806 * We know that we received enough to get to the MID as we
807 * checked the pdu_length earlier. Now check to see
808 * if the rest of the header is OK. We borrow the length
809 * var for the rest of the loop to avoid a new stack var.
811 * 48 bytes is enough to display the header and a little bit
812 * into the payload for debugging purposes.
814 length
= server
->ops
->check_message(buf
, server
->total_read
);
816 cifs_dump_mem("Bad SMB: ", buf
,
817 min_t(unsigned int, server
->total_read
, 48));
819 if (server
->ops
->is_status_pending
&&
820 server
->ops
->is_status_pending(buf
, server
, length
))
826 handle_mid(mid
, server
, buf
, length
);
831 cifs_demultiplex_thread(void *p
)
834 struct TCP_Server_Info
*server
= p
;
835 unsigned int pdu_length
;
837 struct task_struct
*task_to_wake
= NULL
;
838 struct mid_q_entry
*mid_entry
;
840 current
->flags
|= PF_MEMALLOC
;
841 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
843 length
= atomic_inc_return(&tcpSesAllocCount
);
845 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
849 while (server
->tcpStatus
!= CifsExiting
) {
853 if (!allocate_buffers(server
))
856 server
->large_buf
= false;
857 buf
= server
->smallbuf
;
858 pdu_length
= 4; /* enough to get RFC1001 header */
860 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
863 server
->total_read
= length
;
866 * The right amount was read from socket - 4 bytes,
867 * so we can now interpret the length field.
869 pdu_length
= get_rfc1002_length(buf
);
871 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
872 if (!is_smb_response(server
, buf
[0]))
875 /* make sure we have enough to get to the MID */
876 if (pdu_length
< HEADER_SIZE(server
) - 1 - 4) {
877 cifs_dbg(VFS
, "SMB response too short (%u bytes)\n",
879 cifs_reconnect(server
);
880 wake_up(&server
->response_q
);
884 /* read down to the MID */
885 length
= cifs_read_from_socket(server
, buf
+ 4,
886 HEADER_SIZE(server
) - 1 - 4);
889 server
->total_read
+= length
;
891 mid_entry
= server
->ops
->find_mid(server
, buf
);
893 if (!mid_entry
|| !mid_entry
->receive
)
894 length
= standard_receive3(server
, mid_entry
);
896 length
= mid_entry
->receive(server
, mid_entry
);
901 if (server
->large_buf
)
902 buf
= server
->bigbuf
;
904 server
->lstrp
= jiffies
;
905 if (mid_entry
!= NULL
) {
906 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
907 mid_entry
->callback(mid_entry
);
908 } else if (!server
->ops
->is_oplock_break
||
909 !server
->ops
->is_oplock_break(buf
, server
)) {
910 cifs_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
911 atomic_read(&midCount
));
912 cifs_dump_mem("Received Data is: ", buf
,
913 HEADER_SIZE(server
));
914 #ifdef CONFIG_CIFS_DEBUG2
915 if (server
->ops
->dump_detail
)
916 server
->ops
->dump_detail(buf
);
917 cifs_dump_mids(server
);
918 #endif /* CIFS_DEBUG2 */
921 } /* end while !EXITING */
923 /* buffer usually freed in free_mid - need to free it here on exit */
924 cifs_buf_release(server
->bigbuf
);
925 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
926 cifs_small_buf_release(server
->smallbuf
);
928 task_to_wake
= xchg(&server
->tsk
, NULL
);
929 clean_demultiplex_info(server
);
931 /* if server->tsk was NULL then wait for a signal before exiting */
933 set_current_state(TASK_INTERRUPTIBLE
);
934 while (!signal_pending(current
)) {
936 set_current_state(TASK_INTERRUPTIBLE
);
938 set_current_state(TASK_RUNNING
);
941 module_put_and_exit(0);
944 /* extract the host portion of the UNC string */
946 extract_hostname(const char *unc
)
952 /* skip double chars at beginning of string */
953 /* BB: check validity of these bytes? */
956 /* delimiter between hostname and sharename is always '\\' now */
957 delim
= strchr(src
, '\\');
959 return ERR_PTR(-EINVAL
);
962 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
964 return ERR_PTR(-ENOMEM
);
966 memcpy(dst
, src
, len
);
972 static int get_option_ul(substring_t args
[], unsigned long *option
)
977 string
= match_strdup(args
);
980 rc
= kstrtoul(string
, 0, option
);
986 static int get_option_uid(substring_t args
[], kuid_t
*result
)
992 rc
= get_option_ul(args
, &value
);
996 uid
= make_kuid(current_user_ns(), value
);
1004 static int get_option_gid(substring_t args
[], kgid_t
*result
)
1006 unsigned long value
;
1010 rc
= get_option_ul(args
, &value
);
1014 gid
= make_kgid(current_user_ns(), value
);
1015 if (!gid_valid(gid
))
1022 static int cifs_parse_security_flavors(char *value
,
1023 struct smb_vol
*vol
)
1026 substring_t args
[MAX_OPT_ARGS
];
1029 * With mount options, the last one should win. Reset any existing
1030 * settings back to default.
1032 vol
->sectype
= Unspecified
;
1035 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1037 vol
->sectype
= Kerberos
;
1038 vol
->secFlg
|= CIFSSEC_MAY_KRB5
| CIFSSEC_MAY_SIGN
;
1041 vol
->sectype
= Kerberos
;
1043 vol
->secFlg
|= CIFSSEC_MAY_KRB5
| CIFSSEC_MUST_SIGN
;
1046 /* vol->secFlg |= CIFSSEC_MUST_SEAL | CIFSSEC_MAY_KRB5; */
1047 cifs_dbg(VFS
, "Krb5 cifs privacy not supported\n");
1049 case Opt_sec_ntlmssp
:
1050 vol
->sectype
= RawNTLMSSP
;
1051 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
;
1053 case Opt_sec_ntlmsspi
:
1054 vol
->sectype
= RawNTLMSSP
;
1056 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
| CIFSSEC_MUST_SIGN
;
1059 /* ntlm is default so can be turned off too */
1060 vol
->sectype
= NTLM
;
1061 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1064 vol
->sectype
= NTLM
;
1066 vol
->secFlg
|= CIFSSEC_MAY_NTLM
| CIFSSEC_MUST_SIGN
;
1068 case Opt_sec_ntlmv2
:
1069 vol
->sectype
= NTLMv2
;
1070 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1072 case Opt_sec_ntlmv2i
:
1073 vol
->sectype
= NTLMv2
;
1075 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
| CIFSSEC_MUST_SIGN
;
1077 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1078 case Opt_sec_lanman
:
1079 vol
->sectype
= LANMAN
;
1080 vol
->secFlg
|= CIFSSEC_MAY_LANMAN
;
1085 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1088 cifs_dbg(VFS
, "bad security option: %s\n", value
);
1096 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1098 substring_t args
[MAX_OPT_ARGS
];
1100 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1101 case Opt_cache_loose
:
1102 vol
->direct_io
= false;
1103 vol
->strict_io
= false;
1105 case Opt_cache_strict
:
1106 vol
->direct_io
= false;
1107 vol
->strict_io
= true;
1109 case Opt_cache_none
:
1110 vol
->direct_io
= true;
1111 vol
->strict_io
= false;
1114 cifs_dbg(VFS
, "bad cache= option: %s\n", value
);
1121 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1123 substring_t args
[MAX_OPT_ARGS
];
1125 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1127 vol
->ops
= &smb1_operations
;
1128 vol
->vals
= &smb1_values
;
1130 #ifdef CONFIG_CIFS_SMB2
1132 vol
->ops
= &smb21_operations
; /* currently identical with 2.1 */
1133 vol
->vals
= &smb20_values
;
1136 vol
->ops
= &smb21_operations
;
1137 vol
->vals
= &smb21_values
;
1140 vol
->ops
= &smb30_operations
;
1141 vol
->vals
= &smb30_values
;
1145 cifs_dbg(VFS
, "Unknown vers= option specified: %s\n", value
);
1152 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1153 * fields with the result. Returns 0 on success and an error otherwise.
1156 cifs_parse_devname(const char *devname
, struct smb_vol
*vol
)
1159 const char *delims
= "/\\";
1162 /* make sure we have a valid UNC double delimiter prefix */
1163 len
= strspn(devname
, delims
);
1167 /* find delimiter between host and sharename */
1168 pos
= strpbrk(devname
+ 2, delims
);
1172 /* skip past delimiter */
1175 /* now go until next delimiter or end of string */
1176 len
= strcspn(pos
, delims
);
1178 /* move "pos" up to delimiter or NULL */
1180 vol
->UNC
= kstrndup(devname
, pos
- devname
, GFP_KERNEL
);
1184 convert_delimiter(vol
->UNC
, '\\');
1186 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1187 if (!*pos
++ || !*pos
)
1190 vol
->prepath
= kstrdup(pos
, GFP_KERNEL
);
1198 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1199 struct smb_vol
*vol
)
1202 char *mountdata_copy
= NULL
, *options
;
1203 unsigned int temp_len
, i
, j
;
1205 short int override_uid
= -1;
1206 short int override_gid
= -1;
1207 bool uid_specified
= false;
1208 bool gid_specified
= false;
1209 bool sloppy
= false;
1210 char *invalid
= NULL
;
1211 char *nodename
= utsname()->nodename
;
1212 char *string
= NULL
;
1213 char *tmp_end
, *value
;
1215 bool got_ip
= false;
1216 unsigned short port
= 0;
1217 struct sockaddr
*dstaddr
= (struct sockaddr
*)&vol
->dstaddr
;
1221 delim
= separator
[0];
1223 /* ensure we always start with zeroed-out smb_vol */
1224 memset(vol
, 0, sizeof(*vol
));
1227 * does not have to be perfect mapping since field is
1228 * informational, only used for servers that do not support
1229 * port 445 and it can be overridden at mount time
1231 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1232 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1233 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1235 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1236 /* null target name indicates to use *SMBSERVR default called name
1237 if we end up sending RFC1001 session initialize */
1238 vol
->target_rfc1001_name
[0] = 0;
1239 vol
->cred_uid
= current_uid();
1240 vol
->linux_uid
= current_uid();
1241 vol
->linux_gid
= current_gid();
1243 /* default to only allowing write access to owner of the mount */
1244 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1246 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1247 /* default is always to request posix paths. */
1248 vol
->posix_paths
= 1;
1249 /* default to using server inode numbers where available */
1250 vol
->server_ino
= 1;
1252 /* default is to use strict cifs caching semantics */
1253 vol
->strict_io
= true;
1255 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1257 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1258 vol
->ops
= &smb1_operations
;
1259 vol
->vals
= &smb1_values
;
1262 goto cifs_parse_mount_err
;
1264 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1265 if (!mountdata_copy
)
1266 goto cifs_parse_mount_err
;
1268 options
= mountdata_copy
;
1269 end
= options
+ strlen(options
);
1271 if (strncmp(options
, "sep=", 4) == 0) {
1272 if (options
[4] != 0) {
1273 separator
[0] = options
[4];
1276 cifs_dbg(FYI
, "Null separator not allowed\n");
1279 vol
->backupuid_specified
= false; /* no backup intent for a user */
1280 vol
->backupgid_specified
= false; /* no backup intent for a group */
1282 switch (cifs_parse_devname(devname
, vol
)) {
1286 cifs_dbg(VFS
, "Unable to allocate memory for devname.\n");
1287 goto cifs_parse_mount_err
;
1289 cifs_dbg(VFS
, "Malformed UNC in devname.\n");
1290 goto cifs_parse_mount_err
;
1292 cifs_dbg(VFS
, "Unknown error parsing devname.\n");
1293 goto cifs_parse_mount_err
;
1296 while ((data
= strsep(&options
, separator
)) != NULL
) {
1297 substring_t args
[MAX_OPT_ARGS
];
1298 unsigned long option
;
1304 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1308 /* Ingnore the following */
1312 /* Boolean values */
1313 case Opt_user_xattr
:
1316 case Opt_nouser_xattr
:
1322 case Opt_noforceuid
:
1328 case Opt_noforcegid
:
1331 case Opt_noblocksend
:
1332 vol
->noblocksnd
= 1;
1334 case Opt_noautotune
:
1335 vol
->noautotune
= 1;
1352 case Opt_nomapchars
:
1364 case Opt_posixpaths
:
1365 vol
->posix_paths
= 1;
1367 case Opt_noposixpaths
:
1368 vol
->posix_paths
= 0;
1371 vol
->no_linux_ext
= 1;
1382 * turn off mandatory locking in mode
1383 * if remote locking is turned off since the
1384 * local vfs will do advisory
1386 if (vol
->file_mode
==
1387 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1388 vol
->file_mode
= S_IALLUGO
;
1390 case Opt_forcemandatorylock
:
1400 vol
->dynperm
= true;
1403 vol
->dynperm
= false;
1417 case Opt_nostrictsync
:
1418 vol
->nostrictsync
= 1;
1420 case Opt_strictsync
:
1421 vol
->nostrictsync
= 0;
1424 vol
->server_ino
= 1;
1426 case Opt_noserverino
:
1427 vol
->server_ino
= 0;
1429 case Opt_rwpidforward
:
1430 vol
->rwpidforward
= 1;
1439 vol
->no_psx_acl
= 0;
1442 vol
->no_psx_acl
= 1;
1444 case Opt_locallease
:
1445 vol
->local_lease
= 1;
1448 vol
->secFlg
|= CIFSSEC_MUST_SIGN
;
1452 /* we do not do the following in secFlags because seal
1453 * is a per tree connection (mount) not a per socket
1454 * or per-smb connection option in the protocol
1455 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1460 printk(KERN_WARNING
"CIFS: Mount option noac not "
1461 "supported. Instead set "
1462 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1465 #ifndef CONFIG_CIFS_FSCACHE
1466 cifs_dbg(VFS
, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1467 goto cifs_parse_mount_err
;
1471 case Opt_mfsymlinks
:
1472 vol
->mfsymlinks
= true;
1475 vol
->multiuser
= true;
1480 case Opt_nosharesock
:
1481 vol
->nosharesock
= true;
1484 /* Numeric Values */
1486 if (get_option_uid(args
, &vol
->backupuid
)) {
1487 cifs_dbg(VFS
, "%s: Invalid backupuid value\n",
1489 goto cifs_parse_mount_err
;
1491 vol
->backupuid_specified
= true;
1494 if (get_option_gid(args
, &vol
->backupgid
)) {
1495 cifs_dbg(VFS
, "%s: Invalid backupgid value\n",
1497 goto cifs_parse_mount_err
;
1499 vol
->backupgid_specified
= true;
1502 if (get_option_uid(args
, &vol
->linux_uid
)) {
1503 cifs_dbg(VFS
, "%s: Invalid uid value\n",
1505 goto cifs_parse_mount_err
;
1507 uid_specified
= true;
1510 if (get_option_uid(args
, &vol
->cred_uid
)) {
1511 cifs_dbg(VFS
, "%s: Invalid cruid value\n",
1513 goto cifs_parse_mount_err
;
1517 if (get_option_gid(args
, &vol
->linux_gid
)) {
1518 cifs_dbg(VFS
, "%s: Invalid gid value\n",
1520 goto cifs_parse_mount_err
;
1522 gid_specified
= true;
1525 if (get_option_ul(args
, &option
)) {
1526 cifs_dbg(VFS
, "%s: Invalid file_mode value\n",
1528 goto cifs_parse_mount_err
;
1530 vol
->file_mode
= option
;
1533 if (get_option_ul(args
, &option
)) {
1534 cifs_dbg(VFS
, "%s: Invalid dir_mode value\n",
1536 goto cifs_parse_mount_err
;
1538 vol
->dir_mode
= option
;
1541 if (get_option_ul(args
, &option
) ||
1542 option
> USHRT_MAX
) {
1543 cifs_dbg(VFS
, "%s: Invalid port value\n",
1545 goto cifs_parse_mount_err
;
1547 port
= (unsigned short)option
;
1550 if (get_option_ul(args
, &option
)) {
1551 cifs_dbg(VFS
, "%s: Invalid rsize value\n",
1553 goto cifs_parse_mount_err
;
1555 vol
->rsize
= option
;
1558 if (get_option_ul(args
, &option
)) {
1559 cifs_dbg(VFS
, "%s: Invalid wsize value\n",
1561 goto cifs_parse_mount_err
;
1563 vol
->wsize
= option
;
1566 if (get_option_ul(args
, &option
)) {
1567 cifs_dbg(VFS
, "%s: Invalid actimeo value\n",
1569 goto cifs_parse_mount_err
;
1571 vol
->actimeo
= HZ
* option
;
1572 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1573 cifs_dbg(VFS
, "attribute cache timeout too large\n");
1574 goto cifs_parse_mount_err
;
1578 /* String Arguments */
1580 case Opt_blank_user
:
1581 /* null user, ie. anonymous authentication */
1583 vol
->username
= NULL
;
1586 string
= match_strdup(args
);
1590 if (strnlen(string
, MAX_USERNAME_SIZE
) >
1591 MAX_USERNAME_SIZE
) {
1592 printk(KERN_WARNING
"CIFS: username too long\n");
1593 goto cifs_parse_mount_err
;
1595 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1597 goto cifs_parse_mount_err
;
1599 case Opt_blank_pass
:
1600 /* passwords have to be handled differently
1601 * to allow the character used for deliminator
1602 * to be passed within them
1606 * Check if this is a case where the password
1607 * starts with a delimiter
1609 tmp_end
= strchr(data
, '=');
1611 if (!(tmp_end
< end
&& tmp_end
[1] == delim
)) {
1612 /* No it is not. Set the password to NULL */
1613 vol
->password
= NULL
;
1616 /* Yes it is. Drop down to Opt_pass below.*/
1618 /* Obtain the value string */
1619 value
= strchr(data
, '=');
1622 /* Set tmp_end to end of the string */
1623 tmp_end
= (char *) value
+ strlen(value
);
1625 /* Check if following character is the deliminator
1626 * If yes, we have encountered a double deliminator
1627 * reset the NULL character to the deliminator
1629 if (tmp_end
< end
&& tmp_end
[1] == delim
) {
1632 /* Keep iterating until we get to a single
1633 * deliminator OR the end
1635 while ((tmp_end
= strchr(tmp_end
, delim
))
1636 != NULL
&& (tmp_end
[1] == delim
)) {
1637 tmp_end
= (char *) &tmp_end
[2];
1640 /* Reset var options to point to next element */
1643 options
= (char *) &tmp_end
[1];
1645 /* Reached the end of the mount option
1650 /* Now build new password string */
1651 temp_len
= strlen(value
);
1652 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1653 if (vol
->password
== NULL
) {
1654 printk(KERN_WARNING
"CIFS: no memory "
1656 goto cifs_parse_mount_err
;
1659 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1660 vol
->password
[j
] = value
[i
];
1661 if ((value
[i
] == delim
) &&
1662 value
[i
+1] == delim
)
1663 /* skip the second deliminator */
1666 vol
->password
[j
] = '\0';
1669 /* FIXME: should this be an error instead? */
1673 string
= match_strdup(args
);
1677 if (!cifs_convert_address(dstaddr
, string
,
1679 printk(KERN_ERR
"CIFS: bad ip= option (%s).\n",
1681 goto cifs_parse_mount_err
;
1686 string
= match_strdup(args
);
1690 if (strnlen(string
, 256) == 256) {
1691 printk(KERN_WARNING
"CIFS: domain name too"
1693 goto cifs_parse_mount_err
;
1696 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1697 if (!vol
->domainname
) {
1698 printk(KERN_WARNING
"CIFS: no memory "
1699 "for domainname\n");
1700 goto cifs_parse_mount_err
;
1702 cifs_dbg(FYI
, "Domain name set\n");
1705 string
= match_strdup(args
);
1709 if (!cifs_convert_address(
1710 (struct sockaddr
*)&vol
->srcaddr
,
1711 string
, strlen(string
))) {
1712 printk(KERN_WARNING
"CIFS: Could not parse"
1713 " srcaddr: %s\n", string
);
1714 goto cifs_parse_mount_err
;
1718 string
= match_strdup(args
);
1722 if (strnlen(string
, 1024) >= 65) {
1723 printk(KERN_WARNING
"CIFS: iocharset name "
1725 goto cifs_parse_mount_err
;
1728 if (strnicmp(string
, "default", 7) != 0) {
1729 vol
->iocharset
= kstrdup(string
,
1731 if (!vol
->iocharset
) {
1732 printk(KERN_WARNING
"CIFS: no memory"
1734 goto cifs_parse_mount_err
;
1737 /* if iocharset not set then load_nls_default
1740 cifs_dbg(FYI
, "iocharset set to %s\n", string
);
1742 case Opt_netbiosname
:
1743 string
= match_strdup(args
);
1747 memset(vol
->source_rfc1001_name
, 0x20,
1750 * FIXME: are there cases in which a comma can
1751 * be valid in workstation netbios name (and
1752 * need special handling)?
1754 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1755 /* don't ucase netbiosname for user */
1758 vol
->source_rfc1001_name
[i
] = string
[i
];
1760 /* The string has 16th byte zero still from
1761 * set at top of the function
1763 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1764 printk(KERN_WARNING
"CIFS: netbiosname"
1765 " longer than 15 truncated.\n");
1769 /* servernetbiosname specified override *SMBSERVER */
1770 string
= match_strdup(args
);
1774 /* last byte, type, is 0x20 for servr type */
1775 memset(vol
->target_rfc1001_name
, 0x20,
1776 RFC1001_NAME_LEN_WITH_NULL
);
1778 /* BB are there cases in which a comma can be
1779 valid in this workstation netbios name
1780 (and need special handling)? */
1782 /* user or mount helper must uppercase the
1784 for (i
= 0; i
< 15; i
++) {
1787 vol
->target_rfc1001_name
[i
] = string
[i
];
1789 /* The string has 16th byte zero still from
1790 set at top of the function */
1791 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1792 printk(KERN_WARNING
"CIFS: server net"
1793 "biosname longer than 15 truncated.\n");
1796 string
= match_strdup(args
);
1800 if (strnicmp(string
, "1", 1) == 0) {
1801 /* This is the default */
1804 /* For all other value, error */
1805 printk(KERN_WARNING
"CIFS: Invalid version"
1807 goto cifs_parse_mount_err
;
1809 string
= match_strdup(args
);
1813 if (cifs_parse_smb_version(string
, vol
) != 0)
1814 goto cifs_parse_mount_err
;
1817 string
= match_strdup(args
);
1821 if (cifs_parse_security_flavors(string
, vol
) != 0)
1822 goto cifs_parse_mount_err
;
1825 string
= match_strdup(args
);
1829 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1830 goto cifs_parse_mount_err
;
1834 * An option we don't recognize. Save it off for later
1835 * if we haven't already found one
1841 /* Free up any allocated string */
1846 if (!sloppy
&& invalid
) {
1847 printk(KERN_ERR
"CIFS: Unknown mount option \"%s\"\n", invalid
);
1848 goto cifs_parse_mount_err
;
1852 /* Muliuser mounts require CONFIG_KEYS support */
1853 if (vol
->multiuser
) {
1854 cifs_dbg(VFS
, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1855 goto cifs_parse_mount_err
;
1859 cifs_dbg(VFS
, "CIFS mount error: No usable UNC path provided in device string!\n");
1860 goto cifs_parse_mount_err
;
1863 /* make sure UNC has a share name */
1864 if (!strchr(vol
->UNC
+ 3, '\\')) {
1865 cifs_dbg(VFS
, "Malformed UNC. Unable to find share name.\n");
1866 goto cifs_parse_mount_err
;
1870 /* No ip= option specified? Try to get it from UNC */
1871 if (!cifs_convert_address(dstaddr
, &vol
->UNC
[2],
1872 strlen(&vol
->UNC
[2]))) {
1873 printk(KERN_ERR
"Unable to determine destination "
1875 goto cifs_parse_mount_err
;
1879 /* set the port that we got earlier */
1880 cifs_set_port(dstaddr
, port
);
1883 vol
->override_uid
= override_uid
;
1884 else if (override_uid
== 1)
1885 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1886 "specified with no uid= option.\n");
1889 vol
->override_gid
= override_gid
;
1890 else if (override_gid
== 1)
1891 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1892 "specified with no gid= option.\n");
1894 kfree(mountdata_copy
);
1898 printk(KERN_WARNING
"Could not allocate temporary buffer\n");
1899 cifs_parse_mount_err
:
1901 kfree(mountdata_copy
);
1905 /** Returns true if srcaddr isn't specified and rhs isn't
1906 * specified, or if srcaddr is specified and
1907 * matches the IP address of the rhs argument.
1910 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1912 switch (srcaddr
->sa_family
) {
1914 return (rhs
->sa_family
== AF_UNSPEC
);
1916 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1917 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1918 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1921 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1922 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
1923 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1927 return false; /* don't expect to be here */
1932 * If no port is specified in addr structure, we try to match with 445 port
1933 * and if it fails - with 139 ports. It should be called only if address
1934 * families of server and addr are equal.
1937 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1939 __be16 port
, *sport
;
1941 switch (addr
->sa_family
) {
1943 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1944 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1947 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1948 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
1956 port
= htons(CIFS_PORT
);
1960 port
= htons(RFC1001_PORT
);
1963 return port
== *sport
;
1967 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1968 struct sockaddr
*srcaddr
)
1970 switch (addr
->sa_family
) {
1972 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
1973 struct sockaddr_in
*srv_addr4
=
1974 (struct sockaddr_in
*)&server
->dstaddr
;
1976 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
1981 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
1982 struct sockaddr_in6
*srv_addr6
=
1983 (struct sockaddr_in6
*)&server
->dstaddr
;
1985 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
1986 &srv_addr6
->sin6_addr
))
1988 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
1994 return false; /* don't expect to be here */
1997 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2004 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2006 unsigned int secFlags
;
2008 if (vol
->secFlg
& (~(CIFSSEC_MUST_SIGN
| CIFSSEC_MUST_SEAL
)))
2009 secFlags
= vol
->secFlg
;
2011 secFlags
= global_secflags
| vol
->secFlg
;
2013 switch (server
->secType
) {
2015 if (!(secFlags
& (CIFSSEC_MAY_LANMAN
|CIFSSEC_MAY_PLNTXT
)))
2019 if (!(secFlags
& CIFSSEC_MAY_NTLMV2
))
2023 if (!(secFlags
& CIFSSEC_MAY_NTLM
))
2027 if (!(secFlags
& CIFSSEC_MAY_KRB5
))
2031 if (!(secFlags
& CIFSSEC_MAY_NTLMSSP
))
2035 /* shouldn't happen */
2039 /* now check if signing mode is acceptable */
2040 if (vol
->sign
&& !server
->sign
)
2046 static int match_server(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2048 struct sockaddr
*addr
= (struct sockaddr
*)&vol
->dstaddr
;
2050 if (vol
->nosharesock
)
2053 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2056 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2059 if (!match_address(server
, addr
,
2060 (struct sockaddr
*)&vol
->srcaddr
))
2063 if (!match_port(server
, addr
))
2066 if (!match_security(server
, vol
))
2072 static struct TCP_Server_Info
*
2073 cifs_find_tcp_session(struct smb_vol
*vol
)
2075 struct TCP_Server_Info
*server
;
2077 spin_lock(&cifs_tcp_ses_lock
);
2078 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2079 if (!match_server(server
, vol
))
2082 ++server
->srv_count
;
2083 spin_unlock(&cifs_tcp_ses_lock
);
2084 cifs_dbg(FYI
, "Existing tcp session with server found\n");
2087 spin_unlock(&cifs_tcp_ses_lock
);
2092 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
2094 struct task_struct
*task
;
2096 spin_lock(&cifs_tcp_ses_lock
);
2097 if (--server
->srv_count
> 0) {
2098 spin_unlock(&cifs_tcp_ses_lock
);
2102 put_net(cifs_net_ns(server
));
2104 list_del_init(&server
->tcp_ses_list
);
2105 spin_unlock(&cifs_tcp_ses_lock
);
2107 cancel_delayed_work_sync(&server
->echo
);
2109 spin_lock(&GlobalMid_Lock
);
2110 server
->tcpStatus
= CifsExiting
;
2111 spin_unlock(&GlobalMid_Lock
);
2113 cifs_crypto_shash_release(server
);
2114 cifs_fscache_release_client_cookie(server
);
2116 kfree(server
->session_key
.response
);
2117 server
->session_key
.response
= NULL
;
2118 server
->session_key
.len
= 0;
2120 task
= xchg(&server
->tsk
, NULL
);
2122 force_sig(SIGKILL
, task
);
2125 static struct TCP_Server_Info
*
2126 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2128 struct TCP_Server_Info
*tcp_ses
= NULL
;
2131 cifs_dbg(FYI
, "UNC: %s\n", volume_info
->UNC
);
2133 /* see if we already have a matching tcp_ses */
2134 tcp_ses
= cifs_find_tcp_session(volume_info
);
2138 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2144 rc
= cifs_crypto_shash_allocate(tcp_ses
);
2146 cifs_dbg(VFS
, "could not setup hash structures rc %d\n", rc
);
2150 tcp_ses
->ops
= volume_info
->ops
;
2151 tcp_ses
->vals
= volume_info
->vals
;
2152 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2153 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2154 if (IS_ERR(tcp_ses
->hostname
)) {
2155 rc
= PTR_ERR(tcp_ses
->hostname
);
2156 goto out_err_crypto_release
;
2159 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2160 tcp_ses
->noautotune
= volume_info
->noautotune
;
2161 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2162 tcp_ses
->in_flight
= 0;
2163 tcp_ses
->credits
= 1;
2164 init_waitqueue_head(&tcp_ses
->response_q
);
2165 init_waitqueue_head(&tcp_ses
->request_q
);
2166 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2167 mutex_init(&tcp_ses
->srv_mutex
);
2168 memcpy(tcp_ses
->workstation_RFC1001_name
,
2169 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2170 memcpy(tcp_ses
->server_RFC1001_name
,
2171 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2172 tcp_ses
->session_estab
= false;
2173 tcp_ses
->sequence_number
= 0;
2174 tcp_ses
->lstrp
= jiffies
;
2175 spin_lock_init(&tcp_ses
->req_lock
);
2176 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2177 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2178 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2179 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2180 sizeof(tcp_ses
->srcaddr
));
2181 memcpy(&tcp_ses
->dstaddr
, &volume_info
->dstaddr
,
2182 sizeof(tcp_ses
->dstaddr
));
2184 * at this point we are the only ones with the pointer
2185 * to the struct since the kernel thread not created yet
2186 * no need to spinlock this init of tcpStatus or srv_count
2188 tcp_ses
->tcpStatus
= CifsNew
;
2189 ++tcp_ses
->srv_count
;
2191 rc
= ip_connect(tcp_ses
);
2193 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
2194 goto out_err_crypto_release
;
2198 * since we're in a cifs function already, we know that
2199 * this will succeed. No need for try_module_get().
2201 __module_get(THIS_MODULE
);
2202 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2204 if (IS_ERR(tcp_ses
->tsk
)) {
2205 rc
= PTR_ERR(tcp_ses
->tsk
);
2206 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
2207 module_put(THIS_MODULE
);
2208 goto out_err_crypto_release
;
2210 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2212 /* thread spawned, put it on the list */
2213 spin_lock(&cifs_tcp_ses_lock
);
2214 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2215 spin_unlock(&cifs_tcp_ses_lock
);
2217 cifs_fscache_get_client_cookie(tcp_ses
);
2219 /* queue echo request delayed work */
2220 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
2224 out_err_crypto_release
:
2225 cifs_crypto_shash_release(tcp_ses
);
2227 put_net(cifs_net_ns(tcp_ses
));
2231 if (!IS_ERR(tcp_ses
->hostname
))
2232 kfree(tcp_ses
->hostname
);
2233 if (tcp_ses
->ssocket
)
2234 sock_release(tcp_ses
->ssocket
);
2240 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2242 switch (ses
->server
->secType
) {
2244 if (!uid_eq(vol
->cred_uid
, ses
->cred_uid
))
2248 /* NULL username means anonymous session */
2249 if (ses
->user_name
== NULL
) {
2255 /* anything else takes username/password */
2256 if (strncmp(ses
->user_name
,
2257 vol
->username
? vol
->username
: "",
2260 if (strlen(vol
->username
) != 0 &&
2261 ses
->password
!= NULL
&&
2262 strncmp(ses
->password
,
2263 vol
->password
? vol
->password
: "",
2270 static struct cifs_ses
*
2271 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2273 struct cifs_ses
*ses
;
2275 spin_lock(&cifs_tcp_ses_lock
);
2276 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2277 if (!match_session(ses
, vol
))
2280 spin_unlock(&cifs_tcp_ses_lock
);
2283 spin_unlock(&cifs_tcp_ses_lock
);
2288 cifs_put_smb_ses(struct cifs_ses
*ses
)
2291 struct TCP_Server_Info
*server
= ses
->server
;
2293 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2294 spin_lock(&cifs_tcp_ses_lock
);
2295 if (--ses
->ses_count
> 0) {
2296 spin_unlock(&cifs_tcp_ses_lock
);
2300 list_del_init(&ses
->smb_ses_list
);
2301 spin_unlock(&cifs_tcp_ses_lock
);
2303 if (ses
->status
== CifsGood
&& server
->ops
->logoff
) {
2305 server
->ops
->logoff(xid
, ses
);
2309 cifs_put_tcp_session(server
);
2314 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2315 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2317 /* Populate username and pw fields from keyring if possible */
2319 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2322 char *desc
, *delim
, *payload
;
2325 struct TCP_Server_Info
*server
= ses
->server
;
2326 struct sockaddr_in
*sa
;
2327 struct sockaddr_in6
*sa6
;
2328 struct user_key_payload
*upayload
;
2330 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2334 /* try to find an address key first */
2335 switch (server
->dstaddr
.ss_family
) {
2337 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2338 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2341 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2342 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2345 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
2346 server
->dstaddr
.ss_family
);
2351 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2352 key
= request_key(&key_type_logon
, desc
, "");
2354 if (!ses
->domainName
) {
2355 cifs_dbg(FYI
, "domainName is NULL\n");
2360 /* didn't work, try to find a domain key */
2361 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2362 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2363 key
= request_key(&key_type_logon
, desc
, "");
2370 down_read(&key
->sem
);
2371 upayload
= key
->payload
.data
;
2372 if (IS_ERR_OR_NULL(upayload
)) {
2373 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2377 /* find first : in payload */
2378 payload
= (char *)upayload
->data
;
2379 delim
= strnchr(payload
, upayload
->datalen
, ':');
2380 cifs_dbg(FYI
, "payload=%s\n", payload
);
2382 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
2388 len
= delim
- payload
;
2389 if (len
> MAX_USERNAME_SIZE
|| len
<= 0) {
2390 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
2396 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2397 if (!vol
->username
) {
2398 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
2403 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, vol
->username
);
2405 len
= key
->datalen
- (len
+ 1);
2406 if (len
> MAX_PASSWORD_SIZE
|| len
<= 0) {
2407 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
2409 kfree(vol
->username
);
2410 vol
->username
= NULL
;
2415 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2416 if (!vol
->password
) {
2417 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
2420 kfree(vol
->username
);
2421 vol
->username
= NULL
;
2430 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
2433 #else /* ! CONFIG_KEYS */
2435 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2436 struct cifs_ses
*ses
__attribute__((unused
)))
2440 #endif /* CONFIG_KEYS */
2442 static struct cifs_ses
*
2443 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2447 struct cifs_ses
*ses
;
2448 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2449 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2453 ses
= cifs_find_smb_ses(server
, volume_info
);
2455 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
2458 mutex_lock(&ses
->session_mutex
);
2459 rc
= cifs_negotiate_protocol(xid
, ses
);
2461 mutex_unlock(&ses
->session_mutex
);
2462 /* problem -- put our ses reference */
2463 cifs_put_smb_ses(ses
);
2467 if (ses
->need_reconnect
) {
2468 cifs_dbg(FYI
, "Session needs reconnect\n");
2469 rc
= cifs_setup_session(xid
, ses
,
2470 volume_info
->local_nls
);
2472 mutex_unlock(&ses
->session_mutex
);
2473 /* problem -- put our reference */
2474 cifs_put_smb_ses(ses
);
2479 mutex_unlock(&ses
->session_mutex
);
2481 /* existing SMB ses has a server reference already */
2482 cifs_put_tcp_session(server
);
2487 cifs_dbg(FYI
, "Existing smb sess not found\n");
2488 ses
= sesInfoAlloc();
2492 /* new SMB session uses our server ref */
2493 ses
->server
= server
;
2494 if (server
->dstaddr
.ss_family
== AF_INET6
)
2495 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2497 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2499 if (volume_info
->username
) {
2500 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2501 if (!ses
->user_name
)
2505 /* volume_info->password freed at unmount */
2506 if (volume_info
->password
) {
2507 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2511 if (volume_info
->domainname
) {
2512 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2513 if (!ses
->domainName
)
2516 ses
->cred_uid
= volume_info
->cred_uid
;
2517 ses
->linux_uid
= volume_info
->linux_uid
;
2519 ses
->overrideSecFlg
= volume_info
->secFlg
;
2520 ses
->sectype
= volume_info
->sectype
;
2521 ses
->sign
= volume_info
->sign
;
2523 mutex_lock(&ses
->session_mutex
);
2524 rc
= cifs_negotiate_protocol(xid
, ses
);
2526 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2527 mutex_unlock(&ses
->session_mutex
);
2531 /* success, put it on the list */
2532 spin_lock(&cifs_tcp_ses_lock
);
2533 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2534 spin_unlock(&cifs_tcp_ses_lock
);
2545 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2547 if (tcon
->tidStatus
== CifsExiting
)
2549 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2554 static struct cifs_tcon
*
2555 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2557 struct list_head
*tmp
;
2558 struct cifs_tcon
*tcon
;
2560 spin_lock(&cifs_tcp_ses_lock
);
2561 list_for_each(tmp
, &ses
->tcon_list
) {
2562 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2563 if (!match_tcon(tcon
, unc
))
2566 spin_unlock(&cifs_tcp_ses_lock
);
2569 spin_unlock(&cifs_tcp_ses_lock
);
2574 cifs_put_tcon(struct cifs_tcon
*tcon
)
2577 struct cifs_ses
*ses
= tcon
->ses
;
2579 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2580 spin_lock(&cifs_tcp_ses_lock
);
2581 if (--tcon
->tc_count
> 0) {
2582 spin_unlock(&cifs_tcp_ses_lock
);
2586 list_del_init(&tcon
->tcon_list
);
2587 spin_unlock(&cifs_tcp_ses_lock
);
2590 if (ses
->server
->ops
->tree_disconnect
)
2591 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
2594 cifs_fscache_release_super_cookie(tcon
);
2596 cifs_put_smb_ses(ses
);
2599 static struct cifs_tcon
*
2600 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2603 struct cifs_tcon
*tcon
;
2605 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2607 cifs_dbg(FYI
, "Found match on UNC path\n");
2608 /* existing tcon already has a reference */
2609 cifs_put_smb_ses(ses
);
2610 if (tcon
->seal
!= volume_info
->seal
)
2611 cifs_dbg(VFS
, "transport encryption setting conflicts with existing tid\n");
2615 if (!ses
->server
->ops
->tree_connect
) {
2620 tcon
= tconInfoAlloc();
2627 if (volume_info
->password
) {
2628 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2629 if (!tcon
->password
) {
2636 * BB Do we need to wrap session_mutex around this TCon call and Unix
2637 * SetFS as we do on SessSetup and reconnect?
2640 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, volume_info
->UNC
, tcon
,
2641 volume_info
->local_nls
);
2643 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
2647 if (volume_info
->nodfs
) {
2648 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2649 cifs_dbg(FYI
, "DFS disabled (%d)\n", tcon
->Flags
);
2651 tcon
->seal
= volume_info
->seal
;
2653 * We can have only one retry value for a connection to a share so for
2654 * resources mounted more than once to the same server share the last
2655 * value passed in for the retry flag is used.
2657 tcon
->retry
= volume_info
->retry
;
2658 tcon
->nocase
= volume_info
->nocase
;
2659 tcon
->local_lease
= volume_info
->local_lease
;
2660 INIT_LIST_HEAD(&tcon
->pending_opens
);
2662 spin_lock(&cifs_tcp_ses_lock
);
2663 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2664 spin_unlock(&cifs_tcp_ses_lock
);
2666 cifs_fscache_get_super_cookie(tcon
);
2676 cifs_put_tlink(struct tcon_link
*tlink
)
2678 if (!tlink
|| IS_ERR(tlink
))
2681 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2682 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2683 tlink
->tl_time
= jiffies
;
2687 if (!IS_ERR(tlink_tcon(tlink
)))
2688 cifs_put_tcon(tlink_tcon(tlink
));
2693 static inline struct tcon_link
*
2694 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2696 return cifs_sb
->master_tlink
;
2700 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2702 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2703 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2705 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2708 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2709 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2713 * We want to share sb only if we don't specify an r/wsize or
2714 * specified r/wsize is greater than or equal to existing one.
2716 if (new->wsize
&& new->wsize
< old
->wsize
)
2719 if (new->rsize
&& new->rsize
< old
->rsize
)
2722 if (!uid_eq(old
->mnt_uid
, new->mnt_uid
) || !gid_eq(old
->mnt_gid
, new->mnt_gid
))
2725 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2726 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2729 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2732 if (old
->actimeo
!= new->actimeo
)
2739 cifs_match_super(struct super_block
*sb
, void *data
)
2741 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2742 struct smb_vol
*volume_info
;
2743 struct cifs_sb_info
*cifs_sb
;
2744 struct TCP_Server_Info
*tcp_srv
;
2745 struct cifs_ses
*ses
;
2746 struct cifs_tcon
*tcon
;
2747 struct tcon_link
*tlink
;
2750 spin_lock(&cifs_tcp_ses_lock
);
2751 cifs_sb
= CIFS_SB(sb
);
2752 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2753 if (IS_ERR(tlink
)) {
2754 spin_unlock(&cifs_tcp_ses_lock
);
2757 tcon
= tlink_tcon(tlink
);
2759 tcp_srv
= ses
->server
;
2761 volume_info
= mnt_data
->vol
;
2763 if (!match_server(tcp_srv
, volume_info
) ||
2764 !match_session(ses
, volume_info
) ||
2765 !match_tcon(tcon
, volume_info
->UNC
)) {
2770 rc
= compare_mount_options(sb
, mnt_data
);
2772 spin_unlock(&cifs_tcp_ses_lock
);
2773 cifs_put_tlink(tlink
);
2778 get_dfs_path(const unsigned int xid
, struct cifs_ses
*ses
, const char *old_path
,
2779 const struct nls_table
*nls_codepage
, unsigned int *num_referrals
,
2780 struct dfs_info3_param
**referrals
, int remap
)
2785 if (!ses
->server
->ops
->tree_connect
|| !ses
->server
->ops
->get_dfs_refer
)
2791 if (ses
->ipc_tid
== 0) {
2792 temp_unc
= kmalloc(2 /* for slashes */ +
2793 strnlen(ses
->serverName
, SERVER_NAME_LEN_WITH_NULL
* 2)
2794 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL
);
2795 if (temp_unc
== NULL
)
2799 strcpy(temp_unc
+ 2, ses
->serverName
);
2800 strcpy(temp_unc
+ 2 + strlen(ses
->serverName
), "\\IPC$");
2801 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, temp_unc
, NULL
,
2803 cifs_dbg(FYI
, "Tcon rc = %d ipc_tid = %d\n", rc
, ses
->ipc_tid
);
2807 rc
= ses
->server
->ops
->get_dfs_refer(xid
, ses
, old_path
,
2808 referrals
, num_referrals
,
2809 nls_codepage
, remap
);
2811 * BB - map targetUNCs to dfs_info3 structures, here or in
2812 * ses->server->ops->get_dfs_refer.
2818 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2819 static struct lock_class_key cifs_key
[2];
2820 static struct lock_class_key cifs_slock_key
[2];
2823 cifs_reclassify_socket4(struct socket
*sock
)
2825 struct sock
*sk
= sock
->sk
;
2826 BUG_ON(sock_owned_by_user(sk
));
2827 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2828 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2832 cifs_reclassify_socket6(struct socket
*sock
)
2834 struct sock
*sk
= sock
->sk
;
2835 BUG_ON(sock_owned_by_user(sk
));
2836 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2837 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2841 cifs_reclassify_socket4(struct socket
*sock
)
2846 cifs_reclassify_socket6(struct socket
*sock
)
2851 /* See RFC1001 section 14 on representation of Netbios names */
2852 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2856 for (i
= 0, j
= 0; i
< (length
); i
++) {
2857 /* mask a nibble at a time and encode */
2858 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2859 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2866 bind_socket(struct TCP_Server_Info
*server
)
2869 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2870 /* Bind to the specified local IP address */
2871 struct socket
*socket
= server
->ssocket
;
2872 rc
= socket
->ops
->bind(socket
,
2873 (struct sockaddr
*) &server
->srcaddr
,
2874 sizeof(server
->srcaddr
));
2876 struct sockaddr_in
*saddr4
;
2877 struct sockaddr_in6
*saddr6
;
2878 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2879 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2880 if (saddr6
->sin6_family
== AF_INET6
)
2881 cifs_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
2882 &saddr6
->sin6_addr
, rc
);
2884 cifs_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
2885 &saddr4
->sin_addr
.s_addr
, rc
);
2892 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2896 * some servers require RFC1001 sessinit before sending
2897 * negprot - BB check reconnection in case where second
2898 * sessinit is sent but no second negprot
2900 struct rfc1002_session_packet
*ses_init_buf
;
2901 struct smb_hdr
*smb_buf
;
2902 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2905 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2907 if (server
->server_RFC1001_name
&&
2908 server
->server_RFC1001_name
[0] != 0)
2909 rfc1002mangle(ses_init_buf
->trailer
.
2910 session_req
.called_name
,
2911 server
->server_RFC1001_name
,
2912 RFC1001_NAME_LEN_WITH_NULL
);
2914 rfc1002mangle(ses_init_buf
->trailer
.
2915 session_req
.called_name
,
2916 DEFAULT_CIFS_CALLED_NAME
,
2917 RFC1001_NAME_LEN_WITH_NULL
);
2919 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2922 * calling name ends in null (byte 16) from old smb
2925 if (server
->workstation_RFC1001_name
&&
2926 server
->workstation_RFC1001_name
[0] != 0)
2927 rfc1002mangle(ses_init_buf
->trailer
.
2928 session_req
.calling_name
,
2929 server
->workstation_RFC1001_name
,
2930 RFC1001_NAME_LEN_WITH_NULL
);
2932 rfc1002mangle(ses_init_buf
->trailer
.
2933 session_req
.calling_name
,
2935 RFC1001_NAME_LEN_WITH_NULL
);
2937 ses_init_buf
->trailer
.session_req
.scope1
= 0;
2938 ses_init_buf
->trailer
.session_req
.scope2
= 0;
2939 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
2941 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2942 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
2943 rc
= smb_send(server
, smb_buf
, 0x44);
2944 kfree(ses_init_buf
);
2946 * RFC1001 layer in at least one server
2947 * requires very short break before negprot
2948 * presumably because not expecting negprot
2949 * to follow so fast. This is a simple
2950 * solution that works without
2951 * complicating the code and causes no
2952 * significant slowing down on mount
2955 usleep_range(1000, 2000);
2958 * else the negprot may still work without this
2959 * even though malloc failed
2966 generic_ip_connect(struct TCP_Server_Info
*server
)
2971 struct socket
*socket
= server
->ssocket
;
2972 struct sockaddr
*saddr
;
2974 saddr
= (struct sockaddr
*) &server
->dstaddr
;
2976 if (server
->dstaddr
.ss_family
== AF_INET6
) {
2977 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
2978 slen
= sizeof(struct sockaddr_in6
);
2981 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
2982 slen
= sizeof(struct sockaddr_in
);
2986 if (socket
== NULL
) {
2987 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
2988 IPPROTO_TCP
, &socket
, 1);
2990 cifs_dbg(VFS
, "Error %d creating socket\n", rc
);
2991 server
->ssocket
= NULL
;
2995 /* BB other socket options to set KEEPALIVE, NODELAY? */
2996 cifs_dbg(FYI
, "Socket created\n");
2997 server
->ssocket
= socket
;
2998 socket
->sk
->sk_allocation
= GFP_NOFS
;
2999 if (sfamily
== AF_INET6
)
3000 cifs_reclassify_socket6(socket
);
3002 cifs_reclassify_socket4(socket
);
3005 rc
= bind_socket(server
);
3010 * Eventually check for other socket options to change from
3011 * the default. sock_setsockopt not used because it expects
3014 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3015 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3017 /* make the bufsizes depend on wsize/rsize and max requests */
3018 if (server
->noautotune
) {
3019 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3020 socket
->sk
->sk_sndbuf
= 200 * 1024;
3021 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3022 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3025 if (server
->tcp_nodelay
) {
3027 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
3028 (char *)&val
, sizeof(val
));
3030 cifs_dbg(FYI
, "set TCP_NODELAY socket option error %d\n",
3034 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3035 socket
->sk
->sk_sndbuf
,
3036 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3038 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3040 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
3041 sock_release(socket
);
3042 server
->ssocket
= NULL
;
3046 if (sport
== htons(RFC1001_PORT
))
3047 rc
= ip_rfc1001_connect(server
);
3053 ip_connect(struct TCP_Server_Info
*server
)
3056 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3057 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3059 if (server
->dstaddr
.ss_family
== AF_INET6
)
3060 sport
= &addr6
->sin6_port
;
3062 sport
= &addr
->sin_port
;
3067 /* try with 445 port at first */
3068 *sport
= htons(CIFS_PORT
);
3070 rc
= generic_ip_connect(server
);
3074 /* if it failed, try with 139 port */
3075 *sport
= htons(RFC1001_PORT
);
3078 return generic_ip_connect(server
);
3081 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
3082 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3084 /* if we are reconnecting then should we check to see if
3085 * any requested capabilities changed locally e.g. via
3086 * remount but we can not do much about it here
3087 * if they have (even if we could detect it by the following)
3088 * Perhaps we could add a backpointer to array of sb from tcon
3089 * or if we change to make all sb to same share the same
3090 * sb as NFS - then we only have one backpointer to sb.
3091 * What if we wanted to mount the server share twice once with
3092 * and once without posixacls or posix paths? */
3093 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3095 if (vol_info
&& vol_info
->no_linux_ext
) {
3096 tcon
->fsUnixInfo
.Capability
= 0;
3097 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3098 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
3100 } else if (vol_info
)
3101 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3103 if (tcon
->unix_ext
== 0) {
3104 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
3108 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3109 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3110 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
3111 /* check for reconnect case in which we do not
3112 want to change the mount behavior if we can avoid it */
3113 if (vol_info
== NULL
) {
3114 /* turn off POSIX ACL and PATHNAMES if not set
3115 originally at mount time */
3116 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3117 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3118 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3119 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3120 cifs_dbg(VFS
, "POSIXPATH support change\n");
3121 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3122 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3123 cifs_dbg(VFS
, "possible reconnect error\n");
3124 cifs_dbg(VFS
, "server disabled POSIX path support\n");
3128 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3129 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
3131 cap
&= CIFS_UNIX_CAP_MASK
;
3132 if (vol_info
&& vol_info
->no_psx_acl
)
3133 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3134 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3135 cifs_dbg(FYI
, "negotiated posix acl support\n");
3137 cifs_sb
->mnt_cifs_flags
|=
3138 CIFS_MOUNT_POSIXACL
;
3141 if (vol_info
&& vol_info
->posix_paths
== 0)
3142 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3143 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3144 cifs_dbg(FYI
, "negotiate posix pathnames\n");
3146 cifs_sb
->mnt_cifs_flags
|=
3147 CIFS_MOUNT_POSIX_PATHS
;
3150 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
3151 #ifdef CONFIG_CIFS_DEBUG2
3152 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3153 cifs_dbg(FYI
, "FCNTL cap\n");
3154 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3155 cifs_dbg(FYI
, "EXTATTR cap\n");
3156 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3157 cifs_dbg(FYI
, "POSIX path cap\n");
3158 if (cap
& CIFS_UNIX_XATTR_CAP
)
3159 cifs_dbg(FYI
, "XATTR cap\n");
3160 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3161 cifs_dbg(FYI
, "POSIX ACL cap\n");
3162 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3163 cifs_dbg(FYI
, "very large read cap\n");
3164 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3165 cifs_dbg(FYI
, "very large write cap\n");
3166 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3167 cifs_dbg(FYI
, "transport encryption cap\n");
3168 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3169 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
3170 #endif /* CIFS_DEBUG2 */
3171 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3172 if (vol_info
== NULL
) {
3173 cifs_dbg(FYI
, "resetting capabilities failed\n");
3175 cifs_dbg(VFS
, "Negotiating Unix capabilities with the server failed. Consider mounting with the Unix Extensions disabled if problems are found by specifying the nounix mount option.\n");
3181 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3182 struct cifs_sb_info
*cifs_sb
)
3184 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3186 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3187 cifs_sb
->tlink_tree
= RB_ROOT
;
3190 * Temporarily set r/wsize for matching superblock. If we end up using
3191 * new sb then client will later negotiate it downward if needed.
3193 cifs_sb
->rsize
= pvolume_info
->rsize
;
3194 cifs_sb
->wsize
= pvolume_info
->wsize
;
3196 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3197 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3198 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3199 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3200 cifs_dbg(FYI
, "file mode: 0x%hx dir mode: 0x%hx\n",
3201 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3203 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3204 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3206 if (pvolume_info
->noperm
)
3207 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3208 if (pvolume_info
->setuids
)
3209 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3210 if (pvolume_info
->server_ino
)
3211 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3212 if (pvolume_info
->remap
)
3213 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3214 if (pvolume_info
->no_xattr
)
3215 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3216 if (pvolume_info
->sfu_emul
)
3217 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3218 if (pvolume_info
->nobrl
)
3219 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3220 if (pvolume_info
->nostrictsync
)
3221 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3222 if (pvolume_info
->mand_lock
)
3223 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3224 if (pvolume_info
->rwpidforward
)
3225 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3226 if (pvolume_info
->cifs_acl
)
3227 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3228 if (pvolume_info
->backupuid_specified
) {
3229 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3230 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3232 if (pvolume_info
->backupgid_specified
) {
3233 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3234 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3236 if (pvolume_info
->override_uid
)
3237 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3238 if (pvolume_info
->override_gid
)
3239 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3240 if (pvolume_info
->dynperm
)
3241 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3242 if (pvolume_info
->fsc
)
3243 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3244 if (pvolume_info
->multiuser
)
3245 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3246 CIFS_MOUNT_NO_PERM
);
3247 if (pvolume_info
->strict_io
)
3248 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3249 if (pvolume_info
->direct_io
) {
3250 cifs_dbg(FYI
, "mounting share using direct i/o\n");
3251 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3253 if (pvolume_info
->mfsymlinks
) {
3254 if (pvolume_info
->sfu_emul
) {
3255 cifs_dbg(VFS
, "mount option mfsymlinks ignored if sfu mount option is used\n");
3257 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3261 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3262 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
3266 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3268 kfree(volume_info
->username
);
3269 kzfree(volume_info
->password
);
3270 kfree(volume_info
->UNC
);
3271 kfree(volume_info
->domainname
);
3272 kfree(volume_info
->iocharset
);
3273 kfree(volume_info
->prepath
);
3277 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3281 cleanup_volume_info_contents(volume_info
);
3286 #ifdef CONFIG_CIFS_DFS_UPCALL
3288 * cifs_build_path_to_root returns full path to root when we do not have an
3289 * exiting connection (tcon)
3292 build_unc_path_to_root(const struct smb_vol
*vol
,
3293 const struct cifs_sb_info
*cifs_sb
)
3295 char *full_path
, *pos
;
3296 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) + 1 : 0;
3297 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3299 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3300 if (full_path
== NULL
)
3301 return ERR_PTR(-ENOMEM
);
3303 strncpy(full_path
, vol
->UNC
, unc_len
);
3304 pos
= full_path
+ unc_len
;
3307 *pos
= CIFS_DIR_SEP(cifs_sb
);
3308 strncpy(pos
+ 1, vol
->prepath
, pplen
);
3312 *pos
= '\0'; /* add trailing null */
3313 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3314 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
3319 * Perform a dfs referral query for a share and (optionally) prefix
3321 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3322 * to a string containing updated options for the submount. Otherwise it
3323 * will be left untouched.
3325 * Returns the rc from get_dfs_path to the caller, which can be used to
3326 * determine whether there were referrals.
3329 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
3330 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3334 unsigned int num_referrals
= 0;
3335 struct dfs_info3_param
*referrals
= NULL
;
3336 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3338 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3339 if (IS_ERR(full_path
))
3340 return PTR_ERR(full_path
);
3342 /* For DFS paths, skip the first '\' of the UNC */
3343 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3345 rc
= get_dfs_path(xid
, ses
, ref_path
, cifs_sb
->local_nls
,
3346 &num_referrals
, &referrals
,
3347 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
3349 if (!rc
&& num_referrals
> 0) {
3350 char *fake_devname
= NULL
;
3352 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3353 full_path
+ 1, referrals
,
3356 free_dfs_info_array(referrals
, num_referrals
);
3358 if (IS_ERR(mdata
)) {
3359 rc
= PTR_ERR(mdata
);
3362 cleanup_volume_info_contents(volume_info
);
3363 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3366 kfree(fake_devname
);
3367 kfree(cifs_sb
->mountdata
);
3368 cifs_sb
->mountdata
= mdata
;
3376 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3377 const char *devname
)
3381 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3384 if (volume_info
->nullauth
) {
3385 cifs_dbg(FYI
, "Anonymous login\n");
3386 kfree(volume_info
->username
);
3387 volume_info
->username
= NULL
;
3388 } else if (volume_info
->username
) {
3389 /* BB fixme parse for domain name here */
3390 cifs_dbg(FYI
, "Username: %s\n", volume_info
->username
);
3392 cifs_dbg(VFS
, "No username specified\n");
3393 /* In userspace mount helper we can get user name from alternate
3394 locations such as env variables and files on disk */
3398 /* this is needed for ASCII cp to Unicode converts */
3399 if (volume_info
->iocharset
== NULL
) {
3400 /* load_nls_default cannot return null */
3401 volume_info
->local_nls
= load_nls_default();
3403 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3404 if (volume_info
->local_nls
== NULL
) {
3405 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
3406 volume_info
->iocharset
);
3415 cifs_get_volume_info(char *mount_data
, const char *devname
)
3418 struct smb_vol
*volume_info
;
3420 volume_info
= kmalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3422 return ERR_PTR(-ENOMEM
);
3424 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3426 cifs_cleanup_volume_info(volume_info
);
3427 volume_info
= ERR_PTR(rc
);
3434 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3438 struct cifs_ses
*ses
;
3439 struct cifs_tcon
*tcon
;
3440 struct TCP_Server_Info
*server
;
3442 struct tcon_link
*tlink
;
3443 #ifdef CONFIG_CIFS_DFS_UPCALL
3444 int referral_walks_count
= 0;
3447 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs", BDI_CAP_MAP_COPY
);
3451 #ifdef CONFIG_CIFS_DFS_UPCALL
3453 /* cleanup activities if we're chasing a referral */
3454 if (referral_walks_count
) {
3456 cifs_put_tcon(tcon
);
3458 cifs_put_smb_ses(ses
);
3472 /* get a reference to a tcp session */
3473 server
= cifs_get_tcp_session(volume_info
);
3474 if (IS_ERR(server
)) {
3475 rc
= PTR_ERR(server
);
3476 bdi_destroy(&cifs_sb
->bdi
);
3480 /* get a reference to a SMB session */
3481 ses
= cifs_get_smb_ses(server
, volume_info
);
3485 goto mount_fail_check
;
3488 /* search for existing tcon to this server share */
3489 tcon
= cifs_get_tcon(ses
, volume_info
);
3493 goto remote_path_check
;
3496 /* tell server which Unix caps we support */
3497 if (cap_unix(tcon
->ses
)) {
3498 /* reset of caps checks mount to see if unix extensions
3499 disabled for just this mount */
3500 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3501 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3502 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3503 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3505 goto mount_fail_check
;
3508 tcon
->unix_ext
= 0; /* server does not support them */
3510 /* do not care if a following call succeed - informational */
3511 if (!tcon
->ipc
&& server
->ops
->qfs_tcon
)
3512 server
->ops
->qfs_tcon(xid
, tcon
);
3514 cifs_sb
->wsize
= server
->ops
->negotiate_wsize(tcon
, volume_info
);
3515 cifs_sb
->rsize
= server
->ops
->negotiate_rsize(tcon
, volume_info
);
3517 /* tune readahead according to rsize */
3518 cifs_sb
->bdi
.ra_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3521 #ifdef CONFIG_CIFS_DFS_UPCALL
3523 * Perform an unconditional check for whether there are DFS
3524 * referrals for this path without prefix, to provide support
3525 * for DFS referrals from w2k8 servers which don't seem to respond
3526 * with PATH_NOT_COVERED to requests that include the prefix.
3527 * Chase the referral if found, otherwise continue normally.
3529 if (referral_walks_count
== 0) {
3530 int refrc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
,
3533 referral_walks_count
++;
3534 goto try_mount_again
;
3539 /* check if a whole path is not remote */
3541 if (!server
->ops
->is_path_accessible
) {
3543 goto mount_fail_check
;
3546 * cifs_build_path_to_root works only when we have a valid tcon
3548 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3549 if (full_path
== NULL
) {
3551 goto mount_fail_check
;
3553 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3555 if (rc
!= 0 && rc
!= -EREMOTE
) {
3557 goto mount_fail_check
;
3562 /* get referral if needed */
3563 if (rc
== -EREMOTE
) {
3564 #ifdef CONFIG_CIFS_DFS_UPCALL
3565 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3567 * BB: when we implement proper loop detection,
3568 * we will remove this check. But now we need it
3569 * to prevent an indefinite loop if 'DFS tree' is
3570 * misconfigured (i.e. has loops).
3573 goto mount_fail_check
;
3576 rc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
, true);
3579 referral_walks_count
++;
3580 goto try_mount_again
;
3582 goto mount_fail_check
;
3583 #else /* No DFS support, return error on mount */
3589 goto mount_fail_check
;
3591 /* now, hang the tcon off of the superblock */
3592 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3593 if (tlink
== NULL
) {
3595 goto mount_fail_check
;
3598 tlink
->tl_uid
= ses
->linux_uid
;
3599 tlink
->tl_tcon
= tcon
;
3600 tlink
->tl_time
= jiffies
;
3601 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3602 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3604 cifs_sb
->master_tlink
= tlink
;
3605 spin_lock(&cifs_sb
->tlink_tree_lock
);
3606 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3607 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3609 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3613 /* on error free sesinfo and tcon struct if needed */
3615 /* If find_unc succeeded then rc == 0 so we can not end */
3616 /* up accidentally freeing someone elses tcon struct */
3618 cifs_put_tcon(tcon
);
3620 cifs_put_smb_ses(ses
);
3622 cifs_put_tcp_session(server
);
3623 bdi_destroy(&cifs_sb
->bdi
);
3632 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3633 * pointer may be NULL.
3636 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
3637 const char *tree
, struct cifs_tcon
*tcon
,
3638 const struct nls_table
*nls_codepage
)
3640 struct smb_hdr
*smb_buffer
;
3641 struct smb_hdr
*smb_buffer_response
;
3644 unsigned char *bcc_ptr
;
3647 __u16 bytes_left
, count
;
3652 smb_buffer
= cifs_buf_get();
3653 if (smb_buffer
== NULL
)
3656 smb_buffer_response
= smb_buffer
;
3658 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3659 NULL
/*no tid */ , 4 /*wct */ );
3661 smb_buffer
->Mid
= get_next_mid(ses
->server
);
3662 smb_buffer
->Uid
= ses
->Suid
;
3663 pSMB
= (TCONX_REQ
*) smb_buffer
;
3664 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3666 pSMB
->AndXCommand
= 0xFF;
3667 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3668 bcc_ptr
= &pSMB
->Password
[0];
3669 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3670 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3671 *bcc_ptr
= 0; /* password is null byte */
3672 bcc_ptr
++; /* skip password */
3673 /* already aligned so no need to do it below */
3675 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3676 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3677 specified as required (when that support is added to
3678 the vfs in the future) as only NTLM or the much
3679 weaker LANMAN (which we do not send by default) is accepted
3680 by Samba (not sure whether other servers allow
3681 NTLMv2 password here) */
3682 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3683 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3684 (ses
->server
->secType
== LANMAN
))
3685 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3686 ses
->server
->sec_mode
&
3687 SECMODE_PW_ENCRYPT
? true : false,
3690 #endif /* CIFS_WEAK_PW_HASH */
3691 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3692 bcc_ptr
, nls_codepage
);
3694 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3695 if (ses
->capabilities
& CAP_UNICODE
) {
3696 /* must align unicode strings */
3697 *bcc_ptr
= 0; /* null byte password */
3702 if (ses
->server
->sign
)
3703 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3705 if (ses
->capabilities
& CAP_STATUS32
) {
3706 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3708 if (ses
->capabilities
& CAP_DFS
) {
3709 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3711 if (ses
->capabilities
& CAP_UNICODE
) {
3712 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3714 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
3715 6 /* max utf8 char length in bytes */ *
3716 (/* server len*/ + 256 /* share len */), nls_codepage
);
3717 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3718 bcc_ptr
+= 2; /* skip trailing null */
3719 } else { /* ASCII */
3720 strcpy(bcc_ptr
, tree
);
3721 bcc_ptr
+= strlen(tree
) + 1;
3723 strcpy(bcc_ptr
, "?????");
3724 bcc_ptr
+= strlen("?????");
3726 count
= bcc_ptr
- &pSMB
->Password
[0];
3727 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
3728 pSMB
->hdr
.smb_buf_length
) + count
);
3729 pSMB
->ByteCount
= cpu_to_le16(count
);
3731 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3734 /* above now done in SendReceive */
3735 if ((rc
== 0) && (tcon
!= NULL
)) {
3738 tcon
->tidStatus
= CifsGood
;
3739 tcon
->need_reconnect
= false;
3740 tcon
->tid
= smb_buffer_response
->Tid
;
3741 bcc_ptr
= pByteArea(smb_buffer_response
);
3742 bytes_left
= get_bcc(smb_buffer_response
);
3743 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3744 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3750 /* skip service field (NB: this field is always ASCII) */
3752 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3753 (bcc_ptr
[2] == 'C')) {
3754 cifs_dbg(FYI
, "IPC connection\n");
3757 } else if (length
== 2) {
3758 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3759 /* the most common case */
3760 cifs_dbg(FYI
, "disk share connection\n");
3763 bcc_ptr
+= length
+ 1;
3764 bytes_left
-= (length
+ 1);
3765 strncpy(tcon
->treeName
, tree
, MAX_TREE_SIZE
);
3767 /* mostly informational -- no need to fail on error here */
3768 kfree(tcon
->nativeFileSystem
);
3769 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
3770 bytes_left
, is_unicode
,
3773 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
3775 if ((smb_buffer_response
->WordCount
== 3) ||
3776 (smb_buffer_response
->WordCount
== 7))
3777 /* field is in same location */
3778 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3781 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
3782 } else if ((rc
== 0) && tcon
== NULL
) {
3783 /* all we need to save for IPC$ connection */
3784 ses
->ipc_tid
= smb_buffer_response
->Tid
;
3787 cifs_buf_release(smb_buffer
);
3792 cifs_umount(struct cifs_sb_info
*cifs_sb
)
3794 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3795 struct rb_node
*node
;
3796 struct tcon_link
*tlink
;
3798 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3800 spin_lock(&cifs_sb
->tlink_tree_lock
);
3801 while ((node
= rb_first(root
))) {
3802 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3803 cifs_get_tlink(tlink
);
3804 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3805 rb_erase(node
, root
);
3807 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3808 cifs_put_tlink(tlink
);
3809 spin_lock(&cifs_sb
->tlink_tree_lock
);
3811 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3813 bdi_destroy(&cifs_sb
->bdi
);
3814 kfree(cifs_sb
->mountdata
);
3815 unload_nls(cifs_sb
->local_nls
);
3820 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
3823 struct TCP_Server_Info
*server
= ses
->server
;
3825 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
3828 /* only send once per connect */
3829 if (!server
->ops
->need_neg(server
))
3832 set_credits(server
, 1);
3834 rc
= server
->ops
->negotiate(xid
, ses
);
3836 spin_lock(&GlobalMid_Lock
);
3837 if (server
->tcpStatus
== CifsNeedNegotiate
)
3838 server
->tcpStatus
= CifsGood
;
3841 spin_unlock(&GlobalMid_Lock
);
3848 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
3849 struct nls_table
*nls_info
)
3852 struct TCP_Server_Info
*server
= ses
->server
;
3854 ses
->capabilities
= server
->capabilities
;
3855 if (linuxExtEnabled
== 0)
3856 ses
->capabilities
&= (~server
->vals
->cap_unix
);
3858 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3859 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
3861 if (server
->ops
->sess_setup
)
3862 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
3865 cifs_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
3867 mutex_lock(&server
->srv_mutex
);
3868 if (!server
->session_estab
) {
3869 server
->session_key
.response
= ses
->auth_key
.response
;
3870 server
->session_key
.len
= ses
->auth_key
.len
;
3871 server
->sequence_number
= 0x2;
3872 server
->session_estab
= true;
3873 ses
->auth_key
.response
= NULL
;
3875 mutex_unlock(&server
->srv_mutex
);
3877 cifs_dbg(FYI
, "CIFS Session Established successfully\n");
3878 spin_lock(&GlobalMid_Lock
);
3879 ses
->status
= CifsGood
;
3880 ses
->need_reconnect
= false;
3881 spin_unlock(&GlobalMid_Lock
);
3884 kfree(ses
->auth_key
.response
);
3885 ses
->auth_key
.response
= NULL
;
3886 ses
->auth_key
.len
= 0;
3887 kfree(ses
->ntlmssp
);
3888 ses
->ntlmssp
= NULL
;
3894 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
3896 switch (ses
->server
->secType
) {
3898 vol
->secFlg
= CIFSSEC_MUST_KRB5
;
3901 vol
->secFlg
= CIFSSEC_MUST_NTLMV2
;
3904 vol
->secFlg
= CIFSSEC_MUST_NTLM
;
3907 vol
->secFlg
= CIFSSEC_MUST_NTLMSSP
;
3910 vol
->secFlg
= CIFSSEC_MUST_LANMAN
;
3913 /* should never happen */
3918 return cifs_set_cifscreds(vol
, ses
);
3921 static struct cifs_tcon
*
3922 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
3925 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3926 struct cifs_ses
*ses
;
3927 struct cifs_tcon
*tcon
= NULL
;
3928 struct smb_vol
*vol_info
;
3930 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
3931 if (vol_info
== NULL
)
3932 return ERR_PTR(-ENOMEM
);
3934 vol_info
->local_nls
= cifs_sb
->local_nls
;
3935 vol_info
->linux_uid
= fsuid
;
3936 vol_info
->cred_uid
= fsuid
;
3937 vol_info
->UNC
= master_tcon
->treeName
;
3938 vol_info
->retry
= master_tcon
->retry
;
3939 vol_info
->nocase
= master_tcon
->nocase
;
3940 vol_info
->local_lease
= master_tcon
->local_lease
;
3941 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
3942 vol_info
->sectype
= master_tcon
->ses
->sectype
;
3943 vol_info
->sign
= master_tcon
->ses
->sign
;
3945 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
3951 /* get a reference for the same TCP session */
3952 spin_lock(&cifs_tcp_ses_lock
);
3953 ++master_tcon
->ses
->server
->srv_count
;
3954 spin_unlock(&cifs_tcp_ses_lock
);
3956 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
3958 tcon
= (struct cifs_tcon
*)ses
;
3959 cifs_put_tcp_session(master_tcon
->ses
->server
);
3963 tcon
= cifs_get_tcon(ses
, vol_info
);
3965 cifs_put_smb_ses(ses
);
3970 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
3972 kfree(vol_info
->username
);
3973 kfree(vol_info
->password
);
3980 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
3982 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
3986 cifs_sb_tcon_pending_wait(void *unused
)
3989 return signal_pending(current
) ? -ERESTARTSYS
: 0;
3992 /* find and return a tlink with given uid */
3993 static struct tcon_link
*
3994 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
3996 struct rb_node
*node
= root
->rb_node
;
3997 struct tcon_link
*tlink
;
4000 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4002 if (uid_gt(tlink
->tl_uid
, uid
))
4003 node
= node
->rb_left
;
4004 else if (uid_lt(tlink
->tl_uid
, uid
))
4005 node
= node
->rb_right
;
4012 /* insert a tcon_link into the tree */
4014 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
4016 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
4017 struct tcon_link
*tlink
;
4020 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
4023 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
4024 new = &((*new)->rb_left
);
4026 new = &((*new)->rb_right
);
4029 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
4030 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
4034 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4037 * If the superblock doesn't refer to a multiuser mount, then just return
4038 * the master tcon for the mount.
4040 * First, search the rbtree for an existing tcon for this fsuid. If one
4041 * exists, then check to see if it's pending construction. If it is then wait
4042 * for construction to complete. Once it's no longer pending, check to see if
4043 * it failed and either return an error or retry construction, depending on
4046 * If one doesn't exist then insert a new tcon_link struct into the tree and
4047 * try to construct a new one.
4050 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4053 kuid_t fsuid
= current_fsuid();
4054 struct tcon_link
*tlink
, *newtlink
;
4056 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4057 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4059 spin_lock(&cifs_sb
->tlink_tree_lock
);
4060 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4062 cifs_get_tlink(tlink
);
4063 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4065 if (tlink
== NULL
) {
4066 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4067 if (newtlink
== NULL
)
4068 return ERR_PTR(-ENOMEM
);
4069 newtlink
->tl_uid
= fsuid
;
4070 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4071 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4072 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4073 cifs_get_tlink(newtlink
);
4075 spin_lock(&cifs_sb
->tlink_tree_lock
);
4076 /* was one inserted after previous search? */
4077 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4079 cifs_get_tlink(tlink
);
4080 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4082 goto wait_for_construction
;
4085 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4086 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4088 wait_for_construction
:
4089 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4090 cifs_sb_tcon_pending_wait
,
4091 TASK_INTERRUPTIBLE
);
4093 cifs_put_tlink(tlink
);
4094 return ERR_PTR(ret
);
4097 /* if it's good, return it */
4098 if (!IS_ERR(tlink
->tl_tcon
))
4101 /* return error if we tried this already recently */
4102 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4103 cifs_put_tlink(tlink
);
4104 return ERR_PTR(-EACCES
);
4107 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4108 goto wait_for_construction
;
4111 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4112 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4113 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4115 if (IS_ERR(tlink
->tl_tcon
)) {
4116 cifs_put_tlink(tlink
);
4117 return ERR_PTR(-EACCES
);
4124 * periodic workqueue job that scans tcon_tree for a superblock and closes
4128 cifs_prune_tlinks(struct work_struct
*work
)
4130 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4132 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4133 struct rb_node
*node
= rb_first(root
);
4134 struct rb_node
*tmp
;
4135 struct tcon_link
*tlink
;
4138 * Because we drop the spinlock in the loop in order to put the tlink
4139 * it's not guarded against removal of links from the tree. The only
4140 * places that remove entries from the tree are this function and
4141 * umounts. Because this function is non-reentrant and is canceled
4142 * before umount can proceed, this is safe.
4144 spin_lock(&cifs_sb
->tlink_tree_lock
);
4145 node
= rb_first(root
);
4146 while (node
!= NULL
) {
4148 node
= rb_next(tmp
);
4149 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4151 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4152 atomic_read(&tlink
->tl_count
) != 0 ||
4153 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4156 cifs_get_tlink(tlink
);
4157 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4158 rb_erase(tmp
, root
);
4160 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4161 cifs_put_tlink(tlink
);
4162 spin_lock(&cifs_sb
->tlink_tree_lock
);
4164 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4166 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,