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
},
279 { Smb_302
, SMB302_VERSION_STRING
},
282 static int ip_connect(struct TCP_Server_Info
*server
);
283 static int generic_ip_connect(struct TCP_Server_Info
*server
);
284 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
285 static void cifs_prune_tlinks(struct work_struct
*work
);
286 static int cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
287 const char *devname
);
290 * cifs tcp session reconnection
292 * mark tcp session as reconnecting so temporarily locked
293 * mark all smb sessions as reconnecting for tcp session
294 * reconnect tcp session
295 * wake up waiters on reconnection? - (not needed currently)
298 cifs_reconnect(struct TCP_Server_Info
*server
)
301 struct list_head
*tmp
, *tmp2
;
302 struct cifs_ses
*ses
;
303 struct cifs_tcon
*tcon
;
304 struct mid_q_entry
*mid_entry
;
305 struct list_head retry_list
;
307 spin_lock(&GlobalMid_Lock
);
308 if (server
->tcpStatus
== CifsExiting
) {
309 /* the demux thread will exit normally
310 next time through the loop */
311 spin_unlock(&GlobalMid_Lock
);
314 server
->tcpStatus
= CifsNeedReconnect
;
315 spin_unlock(&GlobalMid_Lock
);
317 #ifdef CONFIG_CIFS_SMB2
318 server
->max_read
= 0;
321 cifs_dbg(FYI
, "Reconnecting tcp session\n");
323 /* before reconnecting the tcp session, mark the smb session (uid)
324 and the tid bad so they are not used until reconnected */
325 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
327 spin_lock(&cifs_tcp_ses_lock
);
328 list_for_each(tmp
, &server
->smb_ses_list
) {
329 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
330 ses
->need_reconnect
= true;
332 list_for_each(tmp2
, &ses
->tcon_list
) {
333 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
334 tcon
->need_reconnect
= true;
337 spin_unlock(&cifs_tcp_ses_lock
);
339 /* do not want to be sending data on a socket we are freeing */
340 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
341 mutex_lock(&server
->srv_mutex
);
342 if (server
->ssocket
) {
343 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
344 server
->ssocket
->state
, server
->ssocket
->flags
);
345 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
346 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
347 server
->ssocket
->state
, server
->ssocket
->flags
);
348 sock_release(server
->ssocket
);
349 server
->ssocket
= NULL
;
351 server
->sequence_number
= 0;
352 server
->session_estab
= false;
353 kfree(server
->session_key
.response
);
354 server
->session_key
.response
= NULL
;
355 server
->session_key
.len
= 0;
356 server
->lstrp
= jiffies
;
357 mutex_unlock(&server
->srv_mutex
);
359 /* mark submitted MIDs for retry and issue callback */
360 INIT_LIST_HEAD(&retry_list
);
361 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
362 spin_lock(&GlobalMid_Lock
);
363 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
364 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
365 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
366 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
367 list_move(&mid_entry
->qhead
, &retry_list
);
369 spin_unlock(&GlobalMid_Lock
);
371 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
372 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
373 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
374 list_del_init(&mid_entry
->qhead
);
375 mid_entry
->callback(mid_entry
);
381 /* we should try only the port we connected to before */
382 rc
= generic_ip_connect(server
);
384 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
387 atomic_inc(&tcpSesReconnectCount
);
388 spin_lock(&GlobalMid_Lock
);
389 if (server
->tcpStatus
!= CifsExiting
)
390 server
->tcpStatus
= CifsNeedNegotiate
;
391 spin_unlock(&GlobalMid_Lock
);
393 } while (server
->tcpStatus
== CifsNeedReconnect
);
399 cifs_echo_request(struct work_struct
*work
)
402 struct TCP_Server_Info
*server
= container_of(work
,
403 struct TCP_Server_Info
, echo
.work
);
406 * We cannot send an echo if it is disabled or until the
407 * NEGOTIATE_PROTOCOL request is done, which is indicated by
408 * server->ops->need_neg() == true. Also, no need to ping if
409 * we got a response recently.
411 if (!server
->ops
->need_neg
|| server
->ops
->need_neg(server
) ||
412 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
413 time_before(jiffies
, server
->lstrp
+ SMB_ECHO_INTERVAL
- HZ
))
416 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
418 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
422 queue_delayed_work(cifsiod_wq
, &server
->echo
, SMB_ECHO_INTERVAL
);
426 allocate_buffers(struct TCP_Server_Info
*server
)
428 if (!server
->bigbuf
) {
429 server
->bigbuf
= (char *)cifs_buf_get();
430 if (!server
->bigbuf
) {
431 cifs_dbg(VFS
, "No memory for large SMB response\n");
433 /* retry will check if exiting */
436 } else if (server
->large_buf
) {
437 /* we are reusing a dirty large buf, clear its start */
438 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
441 if (!server
->smallbuf
) {
442 server
->smallbuf
= (char *)cifs_small_buf_get();
443 if (!server
->smallbuf
) {
444 cifs_dbg(VFS
, "No memory for SMB response\n");
446 /* retry will check if exiting */
449 /* beginning of smb buffer is cleared in our buf_get */
451 /* if existing small buf clear beginning */
452 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
459 server_unresponsive(struct TCP_Server_Info
*server
)
462 * We need to wait 2 echo intervals to make sure we handle such
464 * 1s client sends a normal SMB request
465 * 2s client gets a response
466 * 30s echo workqueue job pops, and decides we got a response recently
467 * and don't need to send another
469 * 65s kernel_recvmsg times out, and we see that we haven't gotten
470 * a response in >60s.
472 if (server
->tcpStatus
== CifsGood
&&
473 time_after(jiffies
, server
->lstrp
+ 2 * SMB_ECHO_INTERVAL
)) {
474 cifs_dbg(VFS
, "Server %s has not responded in %d seconds. Reconnecting...\n",
475 server
->hostname
, (2 * SMB_ECHO_INTERVAL
) / HZ
);
476 cifs_reconnect(server
);
477 wake_up(&server
->response_q
);
485 * kvec_array_init - clone a kvec array, and advance into it
486 * @new: pointer to memory for cloned array
487 * @iov: pointer to original array
488 * @nr_segs: number of members in original array
489 * @bytes: number of bytes to advance into the cloned array
491 * This function will copy the array provided in iov to a section of memory
492 * and advance the specified number of bytes into the new array. It returns
493 * the number of segments in the new array. "new" must be at least as big as
494 * the original iov array.
497 kvec_array_init(struct kvec
*new, struct kvec
*iov
, unsigned int nr_segs
,
502 while (bytes
|| !iov
->iov_len
) {
503 int copy
= min(bytes
, iov
->iov_len
);
507 if (iov
->iov_len
== base
) {
513 memcpy(new, iov
, sizeof(*iov
) * nr_segs
);
514 new->iov_base
+= base
;
515 new->iov_len
-= base
;
520 get_server_iovec(struct TCP_Server_Info
*server
, unsigned int nr_segs
)
522 struct kvec
*new_iov
;
524 if (server
->iov
&& nr_segs
<= server
->nr_iov
)
527 /* not big enough -- allocate a new one and release the old */
528 new_iov
= kmalloc(sizeof(*new_iov
) * nr_segs
, GFP_NOFS
);
531 server
->iov
= new_iov
;
532 server
->nr_iov
= nr_segs
;
538 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct kvec
*iov_orig
,
539 unsigned int nr_segs
, unsigned int to_read
)
544 struct msghdr smb_msg
;
547 iov
= get_server_iovec(server
, nr_segs
);
551 smb_msg
.msg_control
= NULL
;
552 smb_msg
.msg_controllen
= 0;
554 for (total_read
= 0; to_read
; total_read
+= length
, to_read
-= length
) {
557 if (server_unresponsive(server
)) {
558 total_read
= -EAGAIN
;
562 segs
= kvec_array_init(iov
, iov_orig
, nr_segs
, total_read
);
564 length
= kernel_recvmsg(server
->ssocket
, &smb_msg
,
565 iov
, segs
, to_read
, 0);
567 if (server
->tcpStatus
== CifsExiting
) {
568 total_read
= -ESHUTDOWN
;
570 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
571 cifs_reconnect(server
);
572 total_read
= -EAGAIN
;
574 } else if (length
== -ERESTARTSYS
||
578 * Minimum sleep to prevent looping, allowing socket
579 * to clear and app threads to set tcpStatus
580 * CifsNeedReconnect if server hung.
582 usleep_range(1000, 2000);
585 } else if (length
<= 0) {
586 cifs_dbg(FYI
, "Received no data or error: expecting %d\n"
587 "got %d", to_read
, length
);
588 cifs_reconnect(server
);
589 total_read
= -EAGAIN
;
597 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
598 unsigned int to_read
)
603 iov
.iov_len
= to_read
;
605 return cifs_readv_from_socket(server
, &iov
, 1, to_read
);
609 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
612 * The first byte big endian of the length field,
613 * is actually not part of the length but the type
614 * with the most common, zero, as regular data.
617 case RFC1002_SESSION_MESSAGE
:
618 /* Regular SMB response */
620 case RFC1002_SESSION_KEEP_ALIVE
:
621 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
623 case RFC1002_POSITIVE_SESSION_RESPONSE
:
624 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
626 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
628 * We get this from Windows 98 instead of an error on
629 * SMB negprot response.
631 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
632 /* give server a second to clean up */
635 * Always try 445 first on reconnect since we get NACK
636 * on some if we ever connected to port 139 (the NACK
637 * is since we do not begin with RFC1001 session
640 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
641 cifs_reconnect(server
);
642 wake_up(&server
->response_q
);
645 cifs_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
646 cifs_reconnect(server
);
653 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
655 #ifdef CONFIG_CIFS_STATS2
656 mid
->when_received
= jiffies
;
658 spin_lock(&GlobalMid_Lock
);
660 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
662 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
663 list_del_init(&mid
->qhead
);
664 spin_unlock(&GlobalMid_Lock
);
668 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
669 char *buf
, int malformed
)
671 if (server
->ops
->check_trans2
&&
672 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
675 mid
->large_buf
= server
->large_buf
;
676 /* Was previous buf put in mpx struct for multi-rsp? */
677 if (!mid
->multiRsp
) {
678 /* smb buffer will be freed by user thread */
679 if (server
->large_buf
)
680 server
->bigbuf
= NULL
;
682 server
->smallbuf
= NULL
;
684 dequeue_mid(mid
, malformed
);
687 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
691 /* take it off the list, if it's not already */
692 spin_lock(&cifs_tcp_ses_lock
);
693 list_del_init(&server
->tcp_ses_list
);
694 spin_unlock(&cifs_tcp_ses_lock
);
696 spin_lock(&GlobalMid_Lock
);
697 server
->tcpStatus
= CifsExiting
;
698 spin_unlock(&GlobalMid_Lock
);
699 wake_up_all(&server
->response_q
);
701 /* check if we have blocked requests that need to free */
702 spin_lock(&server
->req_lock
);
703 if (server
->credits
<= 0)
705 spin_unlock(&server
->req_lock
);
707 * Although there should not be any requests blocked on this queue it
708 * can not hurt to be paranoid and try to wake up requests that may
709 * haven been blocked when more than 50 at time were on the wire to the
710 * same server - they now will see the session is in exit state and get
711 * out of SendReceive.
713 wake_up_all(&server
->request_q
);
714 /* give those requests time to exit */
717 if (server
->ssocket
) {
718 sock_release(server
->ssocket
);
719 server
->ssocket
= NULL
;
722 if (!list_empty(&server
->pending_mid_q
)) {
723 struct list_head dispose_list
;
724 struct mid_q_entry
*mid_entry
;
725 struct list_head
*tmp
, *tmp2
;
727 INIT_LIST_HEAD(&dispose_list
);
728 spin_lock(&GlobalMid_Lock
);
729 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
730 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
731 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
732 mid_entry
->mid_state
= MID_SHUTDOWN
;
733 list_move(&mid_entry
->qhead
, &dispose_list
);
735 spin_unlock(&GlobalMid_Lock
);
737 /* now walk dispose list and issue callbacks */
738 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
739 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
740 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
741 list_del_init(&mid_entry
->qhead
);
742 mid_entry
->callback(mid_entry
);
744 /* 1/8th of sec is more than enough time for them to exit */
748 if (!list_empty(&server
->pending_mid_q
)) {
750 * mpx threads have not exited yet give them at least the smb
751 * send timeout time for long ops.
753 * Due to delays on oplock break requests, we need to wait at
754 * least 45 seconds before giving up on a request getting a
755 * response and going ahead and killing cifsd.
757 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
760 * If threads still have not exited they are probably never
761 * coming home not much else we can do but free the memory.
765 kfree(server
->hostname
);
769 length
= atomic_dec_return(&tcpSesAllocCount
);
771 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
776 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
779 char *buf
= server
->smallbuf
;
780 unsigned int pdu_length
= get_rfc1002_length(buf
);
782 /* make sure this will fit in a large buffer */
783 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) - 4) {
784 cifs_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
785 cifs_reconnect(server
);
786 wake_up(&server
->response_q
);
790 /* switch to large buffer if too big for a small one */
791 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
792 server
->large_buf
= true;
793 memcpy(server
->bigbuf
, buf
, server
->total_read
);
794 buf
= server
->bigbuf
;
797 /* now read the rest */
798 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
799 pdu_length
- HEADER_SIZE(server
) + 1 + 4);
802 server
->total_read
+= length
;
804 dump_smb(buf
, server
->total_read
);
807 * We know that we received enough to get to the MID as we
808 * checked the pdu_length earlier. Now check to see
809 * if the rest of the header is OK. We borrow the length
810 * var for the rest of the loop to avoid a new stack var.
812 * 48 bytes is enough to display the header and a little bit
813 * into the payload for debugging purposes.
815 length
= server
->ops
->check_message(buf
, server
->total_read
);
817 cifs_dump_mem("Bad SMB: ", buf
,
818 min_t(unsigned int, server
->total_read
, 48));
820 if (server
->ops
->is_status_pending
&&
821 server
->ops
->is_status_pending(buf
, server
, length
))
827 handle_mid(mid
, server
, buf
, length
);
832 cifs_demultiplex_thread(void *p
)
835 struct TCP_Server_Info
*server
= p
;
836 unsigned int pdu_length
;
838 struct task_struct
*task_to_wake
= NULL
;
839 struct mid_q_entry
*mid_entry
;
841 current
->flags
|= PF_MEMALLOC
;
842 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
844 length
= atomic_inc_return(&tcpSesAllocCount
);
846 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
850 while (server
->tcpStatus
!= CifsExiting
) {
854 if (!allocate_buffers(server
))
857 server
->large_buf
= false;
858 buf
= server
->smallbuf
;
859 pdu_length
= 4; /* enough to get RFC1001 header */
861 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
864 server
->total_read
= length
;
867 * The right amount was read from socket - 4 bytes,
868 * so we can now interpret the length field.
870 pdu_length
= get_rfc1002_length(buf
);
872 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
873 if (!is_smb_response(server
, buf
[0]))
876 /* make sure we have enough to get to the MID */
877 if (pdu_length
< HEADER_SIZE(server
) - 1 - 4) {
878 cifs_dbg(VFS
, "SMB response too short (%u bytes)\n",
880 cifs_reconnect(server
);
881 wake_up(&server
->response_q
);
885 /* read down to the MID */
886 length
= cifs_read_from_socket(server
, buf
+ 4,
887 HEADER_SIZE(server
) - 1 - 4);
890 server
->total_read
+= length
;
892 mid_entry
= server
->ops
->find_mid(server
, buf
);
894 if (!mid_entry
|| !mid_entry
->receive
)
895 length
= standard_receive3(server
, mid_entry
);
897 length
= mid_entry
->receive(server
, mid_entry
);
902 if (server
->large_buf
)
903 buf
= server
->bigbuf
;
905 server
->lstrp
= jiffies
;
906 if (mid_entry
!= NULL
) {
907 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
908 mid_entry
->callback(mid_entry
);
909 } else if (!server
->ops
->is_oplock_break
||
910 !server
->ops
->is_oplock_break(buf
, server
)) {
911 cifs_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
912 atomic_read(&midCount
));
913 cifs_dump_mem("Received Data is: ", buf
,
914 HEADER_SIZE(server
));
915 #ifdef CONFIG_CIFS_DEBUG2
916 if (server
->ops
->dump_detail
)
917 server
->ops
->dump_detail(buf
);
918 cifs_dump_mids(server
);
919 #endif /* CIFS_DEBUG2 */
922 } /* end while !EXITING */
924 /* buffer usually freed in free_mid - need to free it here on exit */
925 cifs_buf_release(server
->bigbuf
);
926 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
927 cifs_small_buf_release(server
->smallbuf
);
929 task_to_wake
= xchg(&server
->tsk
, NULL
);
930 clean_demultiplex_info(server
);
932 /* if server->tsk was NULL then wait for a signal before exiting */
934 set_current_state(TASK_INTERRUPTIBLE
);
935 while (!signal_pending(current
)) {
937 set_current_state(TASK_INTERRUPTIBLE
);
939 set_current_state(TASK_RUNNING
);
942 module_put_and_exit(0);
945 /* extract the host portion of the UNC string */
947 extract_hostname(const char *unc
)
953 /* skip double chars at beginning of string */
954 /* BB: check validity of these bytes? */
957 /* delimiter between hostname and sharename is always '\\' now */
958 delim
= strchr(src
, '\\');
960 return ERR_PTR(-EINVAL
);
963 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
965 return ERR_PTR(-ENOMEM
);
967 memcpy(dst
, src
, len
);
973 static int get_option_ul(substring_t args
[], unsigned long *option
)
978 string
= match_strdup(args
);
981 rc
= kstrtoul(string
, 0, option
);
987 static int get_option_uid(substring_t args
[], kuid_t
*result
)
993 rc
= get_option_ul(args
, &value
);
997 uid
= make_kuid(current_user_ns(), value
);
1005 static int get_option_gid(substring_t args
[], kgid_t
*result
)
1007 unsigned long value
;
1011 rc
= get_option_ul(args
, &value
);
1015 gid
= make_kgid(current_user_ns(), value
);
1016 if (!gid_valid(gid
))
1023 static int cifs_parse_security_flavors(char *value
,
1024 struct smb_vol
*vol
)
1027 substring_t args
[MAX_OPT_ARGS
];
1030 * With mount options, the last one should win. Reset any existing
1031 * settings back to default.
1033 vol
->sectype
= Unspecified
;
1036 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1038 cifs_dbg(VFS
, "sec=krb5p is not supported!\n");
1044 vol
->sectype
= Kerberos
;
1046 case Opt_sec_ntlmsspi
:
1049 case Opt_sec_ntlmssp
:
1050 vol
->sectype
= RawNTLMSSP
;
1056 vol
->sectype
= NTLM
;
1058 case Opt_sec_ntlmv2i
:
1061 case Opt_sec_ntlmv2
:
1062 vol
->sectype
= NTLMv2
;
1064 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1065 case Opt_sec_lanman
:
1066 vol
->sectype
= LANMAN
;
1073 cifs_dbg(VFS
, "bad security option: %s\n", value
);
1081 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1083 substring_t args
[MAX_OPT_ARGS
];
1085 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1086 case Opt_cache_loose
:
1087 vol
->direct_io
= false;
1088 vol
->strict_io
= false;
1090 case Opt_cache_strict
:
1091 vol
->direct_io
= false;
1092 vol
->strict_io
= true;
1094 case Opt_cache_none
:
1095 vol
->direct_io
= true;
1096 vol
->strict_io
= false;
1099 cifs_dbg(VFS
, "bad cache= option: %s\n", value
);
1106 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1108 substring_t args
[MAX_OPT_ARGS
];
1110 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1112 vol
->ops
= &smb1_operations
;
1113 vol
->vals
= &smb1_values
;
1115 #ifdef CONFIG_CIFS_SMB2
1117 vol
->ops
= &smb21_operations
; /* currently identical with 2.1 */
1118 vol
->vals
= &smb20_values
;
1121 vol
->ops
= &smb21_operations
;
1122 vol
->vals
= &smb21_values
;
1125 vol
->ops
= &smb30_operations
;
1126 vol
->vals
= &smb30_values
;
1129 vol
->ops
= &smb30_operations
; /* currently identical with 3.0 */
1130 vol
->vals
= &smb302_values
;
1134 cifs_dbg(VFS
, "Unknown vers= option specified: %s\n", value
);
1141 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1142 * fields with the result. Returns 0 on success and an error otherwise.
1145 cifs_parse_devname(const char *devname
, struct smb_vol
*vol
)
1148 const char *delims
= "/\\";
1151 /* make sure we have a valid UNC double delimiter prefix */
1152 len
= strspn(devname
, delims
);
1156 /* find delimiter between host and sharename */
1157 pos
= strpbrk(devname
+ 2, delims
);
1161 /* skip past delimiter */
1164 /* now go until next delimiter or end of string */
1165 len
= strcspn(pos
, delims
);
1167 /* move "pos" up to delimiter or NULL */
1169 vol
->UNC
= kstrndup(devname
, pos
- devname
, GFP_KERNEL
);
1173 convert_delimiter(vol
->UNC
, '\\');
1175 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1176 if (!*pos
++ || !*pos
)
1179 vol
->prepath
= kstrdup(pos
, GFP_KERNEL
);
1187 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1188 struct smb_vol
*vol
)
1191 char *mountdata_copy
= NULL
, *options
;
1192 unsigned int temp_len
, i
, j
;
1194 short int override_uid
= -1;
1195 short int override_gid
= -1;
1196 bool uid_specified
= false;
1197 bool gid_specified
= false;
1198 bool sloppy
= false;
1199 char *invalid
= NULL
;
1200 char *nodename
= utsname()->nodename
;
1201 char *string
= NULL
;
1202 char *tmp_end
, *value
;
1204 bool got_ip
= false;
1205 unsigned short port
= 0;
1206 struct sockaddr
*dstaddr
= (struct sockaddr
*)&vol
->dstaddr
;
1210 delim
= separator
[0];
1212 /* ensure we always start with zeroed-out smb_vol */
1213 memset(vol
, 0, sizeof(*vol
));
1216 * does not have to be perfect mapping since field is
1217 * informational, only used for servers that do not support
1218 * port 445 and it can be overridden at mount time
1220 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1221 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1222 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1224 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1225 /* null target name indicates to use *SMBSERVR default called name
1226 if we end up sending RFC1001 session initialize */
1227 vol
->target_rfc1001_name
[0] = 0;
1228 vol
->cred_uid
= current_uid();
1229 vol
->linux_uid
= current_uid();
1230 vol
->linux_gid
= current_gid();
1232 /* default to only allowing write access to owner of the mount */
1233 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1235 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1236 /* default is always to request posix paths. */
1237 vol
->posix_paths
= 1;
1238 /* default to using server inode numbers where available */
1239 vol
->server_ino
= 1;
1241 /* default is to use strict cifs caching semantics */
1242 vol
->strict_io
= true;
1244 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1246 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1247 vol
->ops
= &smb1_operations
;
1248 vol
->vals
= &smb1_values
;
1251 goto cifs_parse_mount_err
;
1253 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1254 if (!mountdata_copy
)
1255 goto cifs_parse_mount_err
;
1257 options
= mountdata_copy
;
1258 end
= options
+ strlen(options
);
1260 if (strncmp(options
, "sep=", 4) == 0) {
1261 if (options
[4] != 0) {
1262 separator
[0] = options
[4];
1265 cifs_dbg(FYI
, "Null separator not allowed\n");
1268 vol
->backupuid_specified
= false; /* no backup intent for a user */
1269 vol
->backupgid_specified
= false; /* no backup intent for a group */
1271 switch (cifs_parse_devname(devname
, vol
)) {
1275 cifs_dbg(VFS
, "Unable to allocate memory for devname.\n");
1276 goto cifs_parse_mount_err
;
1278 cifs_dbg(VFS
, "Malformed UNC in devname.\n");
1279 goto cifs_parse_mount_err
;
1281 cifs_dbg(VFS
, "Unknown error parsing devname.\n");
1282 goto cifs_parse_mount_err
;
1285 while ((data
= strsep(&options
, separator
)) != NULL
) {
1286 substring_t args
[MAX_OPT_ARGS
];
1287 unsigned long option
;
1293 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1297 /* Ingnore the following */
1301 /* Boolean values */
1302 case Opt_user_xattr
:
1305 case Opt_nouser_xattr
:
1311 case Opt_noforceuid
:
1317 case Opt_noforcegid
:
1320 case Opt_noblocksend
:
1321 vol
->noblocksnd
= 1;
1323 case Opt_noautotune
:
1324 vol
->noautotune
= 1;
1341 case Opt_nomapchars
:
1353 case Opt_posixpaths
:
1354 vol
->posix_paths
= 1;
1356 case Opt_noposixpaths
:
1357 vol
->posix_paths
= 0;
1360 vol
->no_linux_ext
= 1;
1371 * turn off mandatory locking in mode
1372 * if remote locking is turned off since the
1373 * local vfs will do advisory
1375 if (vol
->file_mode
==
1376 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1377 vol
->file_mode
= S_IALLUGO
;
1379 case Opt_forcemandatorylock
:
1389 vol
->dynperm
= true;
1392 vol
->dynperm
= false;
1406 case Opt_nostrictsync
:
1407 vol
->nostrictsync
= 1;
1409 case Opt_strictsync
:
1410 vol
->nostrictsync
= 0;
1413 vol
->server_ino
= 1;
1415 case Opt_noserverino
:
1416 vol
->server_ino
= 0;
1418 case Opt_rwpidforward
:
1419 vol
->rwpidforward
= 1;
1428 vol
->no_psx_acl
= 0;
1431 vol
->no_psx_acl
= 1;
1433 case Opt_locallease
:
1434 vol
->local_lease
= 1;
1440 /* we do not do the following in secFlags because seal
1441 * is a per tree connection (mount) not a per socket
1442 * or per-smb connection option in the protocol
1443 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1448 printk(KERN_WARNING
"CIFS: Mount option noac not "
1449 "supported. Instead set "
1450 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1453 #ifndef CONFIG_CIFS_FSCACHE
1454 cifs_dbg(VFS
, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1455 goto cifs_parse_mount_err
;
1459 case Opt_mfsymlinks
:
1460 vol
->mfsymlinks
= true;
1463 vol
->multiuser
= true;
1468 case Opt_nosharesock
:
1469 vol
->nosharesock
= true;
1472 /* Numeric Values */
1474 if (get_option_uid(args
, &vol
->backupuid
)) {
1475 cifs_dbg(VFS
, "%s: Invalid backupuid value\n",
1477 goto cifs_parse_mount_err
;
1479 vol
->backupuid_specified
= true;
1482 if (get_option_gid(args
, &vol
->backupgid
)) {
1483 cifs_dbg(VFS
, "%s: Invalid backupgid value\n",
1485 goto cifs_parse_mount_err
;
1487 vol
->backupgid_specified
= true;
1490 if (get_option_uid(args
, &vol
->linux_uid
)) {
1491 cifs_dbg(VFS
, "%s: Invalid uid value\n",
1493 goto cifs_parse_mount_err
;
1495 uid_specified
= true;
1498 if (get_option_uid(args
, &vol
->cred_uid
)) {
1499 cifs_dbg(VFS
, "%s: Invalid cruid value\n",
1501 goto cifs_parse_mount_err
;
1505 if (get_option_gid(args
, &vol
->linux_gid
)) {
1506 cifs_dbg(VFS
, "%s: Invalid gid value\n",
1508 goto cifs_parse_mount_err
;
1510 gid_specified
= true;
1513 if (get_option_ul(args
, &option
)) {
1514 cifs_dbg(VFS
, "%s: Invalid file_mode value\n",
1516 goto cifs_parse_mount_err
;
1518 vol
->file_mode
= option
;
1521 if (get_option_ul(args
, &option
)) {
1522 cifs_dbg(VFS
, "%s: Invalid dir_mode value\n",
1524 goto cifs_parse_mount_err
;
1526 vol
->dir_mode
= option
;
1529 if (get_option_ul(args
, &option
) ||
1530 option
> USHRT_MAX
) {
1531 cifs_dbg(VFS
, "%s: Invalid port value\n",
1533 goto cifs_parse_mount_err
;
1535 port
= (unsigned short)option
;
1538 if (get_option_ul(args
, &option
)) {
1539 cifs_dbg(VFS
, "%s: Invalid rsize value\n",
1541 goto cifs_parse_mount_err
;
1543 vol
->rsize
= option
;
1546 if (get_option_ul(args
, &option
)) {
1547 cifs_dbg(VFS
, "%s: Invalid wsize value\n",
1549 goto cifs_parse_mount_err
;
1551 vol
->wsize
= option
;
1554 if (get_option_ul(args
, &option
)) {
1555 cifs_dbg(VFS
, "%s: Invalid actimeo value\n",
1557 goto cifs_parse_mount_err
;
1559 vol
->actimeo
= HZ
* option
;
1560 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1561 cifs_dbg(VFS
, "attribute cache timeout too large\n");
1562 goto cifs_parse_mount_err
;
1566 /* String Arguments */
1568 case Opt_blank_user
:
1569 /* null user, ie. anonymous authentication */
1571 vol
->username
= NULL
;
1574 string
= match_strdup(args
);
1578 if (strnlen(string
, MAX_USERNAME_SIZE
) >
1579 MAX_USERNAME_SIZE
) {
1580 printk(KERN_WARNING
"CIFS: username too long\n");
1581 goto cifs_parse_mount_err
;
1583 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1585 goto cifs_parse_mount_err
;
1587 case Opt_blank_pass
:
1588 /* passwords have to be handled differently
1589 * to allow the character used for deliminator
1590 * to be passed within them
1594 * Check if this is a case where the password
1595 * starts with a delimiter
1597 tmp_end
= strchr(data
, '=');
1599 if (!(tmp_end
< end
&& tmp_end
[1] == delim
)) {
1600 /* No it is not. Set the password to NULL */
1601 vol
->password
= NULL
;
1604 /* Yes it is. Drop down to Opt_pass below.*/
1606 /* Obtain the value string */
1607 value
= strchr(data
, '=');
1610 /* Set tmp_end to end of the string */
1611 tmp_end
= (char *) value
+ strlen(value
);
1613 /* Check if following character is the deliminator
1614 * If yes, we have encountered a double deliminator
1615 * reset the NULL character to the deliminator
1617 if (tmp_end
< end
&& tmp_end
[1] == delim
) {
1620 /* Keep iterating until we get to a single
1621 * deliminator OR the end
1623 while ((tmp_end
= strchr(tmp_end
, delim
))
1624 != NULL
&& (tmp_end
[1] == delim
)) {
1625 tmp_end
= (char *) &tmp_end
[2];
1628 /* Reset var options to point to next element */
1631 options
= (char *) &tmp_end
[1];
1633 /* Reached the end of the mount option
1638 /* Now build new password string */
1639 temp_len
= strlen(value
);
1640 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1641 if (vol
->password
== NULL
) {
1642 printk(KERN_WARNING
"CIFS: no memory "
1644 goto cifs_parse_mount_err
;
1647 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1648 vol
->password
[j
] = value
[i
];
1649 if ((value
[i
] == delim
) &&
1650 value
[i
+1] == delim
)
1651 /* skip the second deliminator */
1654 vol
->password
[j
] = '\0';
1657 /* FIXME: should this be an error instead? */
1661 string
= match_strdup(args
);
1665 if (!cifs_convert_address(dstaddr
, string
,
1667 printk(KERN_ERR
"CIFS: bad ip= option (%s).\n",
1669 goto cifs_parse_mount_err
;
1674 string
= match_strdup(args
);
1678 if (strnlen(string
, 256) == 256) {
1679 printk(KERN_WARNING
"CIFS: domain name too"
1681 goto cifs_parse_mount_err
;
1684 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1685 if (!vol
->domainname
) {
1686 printk(KERN_WARNING
"CIFS: no memory "
1687 "for domainname\n");
1688 goto cifs_parse_mount_err
;
1690 cifs_dbg(FYI
, "Domain name set\n");
1693 string
= match_strdup(args
);
1697 if (!cifs_convert_address(
1698 (struct sockaddr
*)&vol
->srcaddr
,
1699 string
, strlen(string
))) {
1700 printk(KERN_WARNING
"CIFS: Could not parse"
1701 " srcaddr: %s\n", string
);
1702 goto cifs_parse_mount_err
;
1706 string
= match_strdup(args
);
1710 if (strnlen(string
, 1024) >= 65) {
1711 printk(KERN_WARNING
"CIFS: iocharset name "
1713 goto cifs_parse_mount_err
;
1716 if (strnicmp(string
, "default", 7) != 0) {
1717 vol
->iocharset
= kstrdup(string
,
1719 if (!vol
->iocharset
) {
1720 printk(KERN_WARNING
"CIFS: no memory"
1722 goto cifs_parse_mount_err
;
1725 /* if iocharset not set then load_nls_default
1728 cifs_dbg(FYI
, "iocharset set to %s\n", string
);
1730 case Opt_netbiosname
:
1731 string
= match_strdup(args
);
1735 memset(vol
->source_rfc1001_name
, 0x20,
1738 * FIXME: are there cases in which a comma can
1739 * be valid in workstation netbios name (and
1740 * need special handling)?
1742 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1743 /* don't ucase netbiosname for user */
1746 vol
->source_rfc1001_name
[i
] = string
[i
];
1748 /* The string has 16th byte zero still from
1749 * set at top of the function
1751 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1752 printk(KERN_WARNING
"CIFS: netbiosname"
1753 " longer than 15 truncated.\n");
1757 /* servernetbiosname specified override *SMBSERVER */
1758 string
= match_strdup(args
);
1762 /* last byte, type, is 0x20 for servr type */
1763 memset(vol
->target_rfc1001_name
, 0x20,
1764 RFC1001_NAME_LEN_WITH_NULL
);
1766 /* BB are there cases in which a comma can be
1767 valid in this workstation netbios name
1768 (and need special handling)? */
1770 /* user or mount helper must uppercase the
1772 for (i
= 0; i
< 15; i
++) {
1775 vol
->target_rfc1001_name
[i
] = string
[i
];
1777 /* The string has 16th byte zero still from
1778 set at top of the function */
1779 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1780 printk(KERN_WARNING
"CIFS: server net"
1781 "biosname longer than 15 truncated.\n");
1784 string
= match_strdup(args
);
1788 if (strnicmp(string
, "1", 1) == 0) {
1789 /* This is the default */
1792 /* For all other value, error */
1793 printk(KERN_WARNING
"CIFS: Invalid version"
1795 goto cifs_parse_mount_err
;
1797 string
= match_strdup(args
);
1801 if (cifs_parse_smb_version(string
, vol
) != 0)
1802 goto cifs_parse_mount_err
;
1805 string
= match_strdup(args
);
1809 if (cifs_parse_security_flavors(string
, vol
) != 0)
1810 goto cifs_parse_mount_err
;
1813 string
= match_strdup(args
);
1817 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1818 goto cifs_parse_mount_err
;
1822 * An option we don't recognize. Save it off for later
1823 * if we haven't already found one
1829 /* Free up any allocated string */
1834 if (!sloppy
&& invalid
) {
1835 printk(KERN_ERR
"CIFS: Unknown mount option \"%s\"\n", invalid
);
1836 goto cifs_parse_mount_err
;
1840 /* Muliuser mounts require CONFIG_KEYS support */
1841 if (vol
->multiuser
) {
1842 cifs_dbg(VFS
, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1843 goto cifs_parse_mount_err
;
1847 cifs_dbg(VFS
, "CIFS mount error: No usable UNC path provided in device string!\n");
1848 goto cifs_parse_mount_err
;
1851 /* make sure UNC has a share name */
1852 if (!strchr(vol
->UNC
+ 3, '\\')) {
1853 cifs_dbg(VFS
, "Malformed UNC. Unable to find share name.\n");
1854 goto cifs_parse_mount_err
;
1858 /* No ip= option specified? Try to get it from UNC */
1859 if (!cifs_convert_address(dstaddr
, &vol
->UNC
[2],
1860 strlen(&vol
->UNC
[2]))) {
1861 printk(KERN_ERR
"Unable to determine destination "
1863 goto cifs_parse_mount_err
;
1867 /* set the port that we got earlier */
1868 cifs_set_port(dstaddr
, port
);
1871 vol
->override_uid
= override_uid
;
1872 else if (override_uid
== 1)
1873 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1874 "specified with no uid= option.\n");
1877 vol
->override_gid
= override_gid
;
1878 else if (override_gid
== 1)
1879 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1880 "specified with no gid= option.\n");
1882 kfree(mountdata_copy
);
1886 printk(KERN_WARNING
"Could not allocate temporary buffer\n");
1887 cifs_parse_mount_err
:
1889 kfree(mountdata_copy
);
1893 /** Returns true if srcaddr isn't specified and rhs isn't
1894 * specified, or if srcaddr is specified and
1895 * matches the IP address of the rhs argument.
1898 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1900 switch (srcaddr
->sa_family
) {
1902 return (rhs
->sa_family
== AF_UNSPEC
);
1904 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1905 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1906 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1909 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1910 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
1911 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1915 return false; /* don't expect to be here */
1920 * If no port is specified in addr structure, we try to match with 445 port
1921 * and if it fails - with 139 ports. It should be called only if address
1922 * families of server and addr are equal.
1925 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1927 __be16 port
, *sport
;
1929 switch (addr
->sa_family
) {
1931 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1932 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1935 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1936 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
1944 port
= htons(CIFS_PORT
);
1948 port
= htons(RFC1001_PORT
);
1951 return port
== *sport
;
1955 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1956 struct sockaddr
*srcaddr
)
1958 switch (addr
->sa_family
) {
1960 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
1961 struct sockaddr_in
*srv_addr4
=
1962 (struct sockaddr_in
*)&server
->dstaddr
;
1964 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
1969 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
1970 struct sockaddr_in6
*srv_addr6
=
1971 (struct sockaddr_in6
*)&server
->dstaddr
;
1973 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
1974 &srv_addr6
->sin6_addr
))
1976 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
1982 return false; /* don't expect to be here */
1985 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
1992 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
1995 * The select_sectype function should either return the vol->sectype
1996 * that was specified, or "Unspecified" if that sectype was not
1997 * compatible with the given NEGOTIATE request.
1999 if (select_sectype(server
, vol
->sectype
) == Unspecified
)
2003 * Now check if signing mode is acceptable. No need to check
2004 * global_secflags at this point since if MUST_SIGN is set then
2005 * the server->sign had better be too.
2007 if (vol
->sign
&& !server
->sign
)
2013 static int match_server(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2015 struct sockaddr
*addr
= (struct sockaddr
*)&vol
->dstaddr
;
2017 if (vol
->nosharesock
)
2020 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2023 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2026 if (!match_address(server
, addr
,
2027 (struct sockaddr
*)&vol
->srcaddr
))
2030 if (!match_port(server
, addr
))
2033 if (!match_security(server
, vol
))
2039 static struct TCP_Server_Info
*
2040 cifs_find_tcp_session(struct smb_vol
*vol
)
2042 struct TCP_Server_Info
*server
;
2044 spin_lock(&cifs_tcp_ses_lock
);
2045 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2046 if (!match_server(server
, vol
))
2049 ++server
->srv_count
;
2050 spin_unlock(&cifs_tcp_ses_lock
);
2051 cifs_dbg(FYI
, "Existing tcp session with server found\n");
2054 spin_unlock(&cifs_tcp_ses_lock
);
2059 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
2061 struct task_struct
*task
;
2063 spin_lock(&cifs_tcp_ses_lock
);
2064 if (--server
->srv_count
> 0) {
2065 spin_unlock(&cifs_tcp_ses_lock
);
2069 put_net(cifs_net_ns(server
));
2071 list_del_init(&server
->tcp_ses_list
);
2072 spin_unlock(&cifs_tcp_ses_lock
);
2074 cancel_delayed_work_sync(&server
->echo
);
2076 spin_lock(&GlobalMid_Lock
);
2077 server
->tcpStatus
= CifsExiting
;
2078 spin_unlock(&GlobalMid_Lock
);
2080 cifs_crypto_shash_release(server
);
2081 cifs_fscache_release_client_cookie(server
);
2083 kfree(server
->session_key
.response
);
2084 server
->session_key
.response
= NULL
;
2085 server
->session_key
.len
= 0;
2087 task
= xchg(&server
->tsk
, NULL
);
2089 force_sig(SIGKILL
, task
);
2092 static struct TCP_Server_Info
*
2093 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2095 struct TCP_Server_Info
*tcp_ses
= NULL
;
2098 cifs_dbg(FYI
, "UNC: %s\n", volume_info
->UNC
);
2100 /* see if we already have a matching tcp_ses */
2101 tcp_ses
= cifs_find_tcp_session(volume_info
);
2105 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2111 tcp_ses
->ops
= volume_info
->ops
;
2112 tcp_ses
->vals
= volume_info
->vals
;
2113 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2114 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2115 if (IS_ERR(tcp_ses
->hostname
)) {
2116 rc
= PTR_ERR(tcp_ses
->hostname
);
2117 goto out_err_crypto_release
;
2120 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2121 tcp_ses
->noautotune
= volume_info
->noautotune
;
2122 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2123 tcp_ses
->in_flight
= 0;
2124 tcp_ses
->credits
= 1;
2125 init_waitqueue_head(&tcp_ses
->response_q
);
2126 init_waitqueue_head(&tcp_ses
->request_q
);
2127 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2128 mutex_init(&tcp_ses
->srv_mutex
);
2129 memcpy(tcp_ses
->workstation_RFC1001_name
,
2130 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2131 memcpy(tcp_ses
->server_RFC1001_name
,
2132 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2133 tcp_ses
->session_estab
= false;
2134 tcp_ses
->sequence_number
= 0;
2135 tcp_ses
->lstrp
= jiffies
;
2136 spin_lock_init(&tcp_ses
->req_lock
);
2137 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2138 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2139 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2140 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2141 sizeof(tcp_ses
->srcaddr
));
2142 memcpy(&tcp_ses
->dstaddr
, &volume_info
->dstaddr
,
2143 sizeof(tcp_ses
->dstaddr
));
2145 * at this point we are the only ones with the pointer
2146 * to the struct since the kernel thread not created yet
2147 * no need to spinlock this init of tcpStatus or srv_count
2149 tcp_ses
->tcpStatus
= CifsNew
;
2150 ++tcp_ses
->srv_count
;
2152 rc
= ip_connect(tcp_ses
);
2154 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
2155 goto out_err_crypto_release
;
2159 * since we're in a cifs function already, we know that
2160 * this will succeed. No need for try_module_get().
2162 __module_get(THIS_MODULE
);
2163 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2165 if (IS_ERR(tcp_ses
->tsk
)) {
2166 rc
= PTR_ERR(tcp_ses
->tsk
);
2167 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
2168 module_put(THIS_MODULE
);
2169 goto out_err_crypto_release
;
2171 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2173 /* thread spawned, put it on the list */
2174 spin_lock(&cifs_tcp_ses_lock
);
2175 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2176 spin_unlock(&cifs_tcp_ses_lock
);
2178 cifs_fscache_get_client_cookie(tcp_ses
);
2180 /* queue echo request delayed work */
2181 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
2185 out_err_crypto_release
:
2186 cifs_crypto_shash_release(tcp_ses
);
2188 put_net(cifs_net_ns(tcp_ses
));
2192 if (!IS_ERR(tcp_ses
->hostname
))
2193 kfree(tcp_ses
->hostname
);
2194 if (tcp_ses
->ssocket
)
2195 sock_release(tcp_ses
->ssocket
);
2201 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2203 if (vol
->sectype
!= Unspecified
&&
2204 vol
->sectype
!= ses
->sectype
)
2207 switch (ses
->sectype
) {
2209 if (!uid_eq(vol
->cred_uid
, ses
->cred_uid
))
2213 /* NULL username means anonymous session */
2214 if (ses
->user_name
== NULL
) {
2220 /* anything else takes username/password */
2221 if (strncmp(ses
->user_name
,
2222 vol
->username
? vol
->username
: "",
2225 if (strlen(vol
->username
) != 0 &&
2226 ses
->password
!= NULL
&&
2227 strncmp(ses
->password
,
2228 vol
->password
? vol
->password
: "",
2235 static struct cifs_ses
*
2236 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2238 struct cifs_ses
*ses
;
2240 spin_lock(&cifs_tcp_ses_lock
);
2241 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2242 if (!match_session(ses
, vol
))
2245 spin_unlock(&cifs_tcp_ses_lock
);
2248 spin_unlock(&cifs_tcp_ses_lock
);
2253 cifs_put_smb_ses(struct cifs_ses
*ses
)
2256 struct TCP_Server_Info
*server
= ses
->server
;
2258 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2259 spin_lock(&cifs_tcp_ses_lock
);
2260 if (--ses
->ses_count
> 0) {
2261 spin_unlock(&cifs_tcp_ses_lock
);
2265 list_del_init(&ses
->smb_ses_list
);
2266 spin_unlock(&cifs_tcp_ses_lock
);
2268 if (ses
->status
== CifsGood
&& server
->ops
->logoff
) {
2270 server
->ops
->logoff(xid
, ses
);
2274 cifs_put_tcp_session(server
);
2279 /* strlen("cifs:a:") + INET6_ADDRSTRLEN + 1 */
2280 #define CIFSCREDS_DESC_SIZE (7 + INET6_ADDRSTRLEN + 1)
2282 /* Populate username and pw fields from keyring if possible */
2284 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2287 char *desc
, *delim
, *payload
;
2290 struct TCP_Server_Info
*server
= ses
->server
;
2291 struct sockaddr_in
*sa
;
2292 struct sockaddr_in6
*sa6
;
2293 struct user_key_payload
*upayload
;
2295 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2299 /* try to find an address key first */
2300 switch (server
->dstaddr
.ss_family
) {
2302 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2303 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2306 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2307 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2310 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
2311 server
->dstaddr
.ss_family
);
2316 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2317 key
= request_key(&key_type_logon
, desc
, "");
2319 if (!ses
->domainName
) {
2320 cifs_dbg(FYI
, "domainName is NULL\n");
2325 /* didn't work, try to find a domain key */
2326 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2327 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2328 key
= request_key(&key_type_logon
, desc
, "");
2335 down_read(&key
->sem
);
2336 upayload
= key
->payload
.data
;
2337 if (IS_ERR_OR_NULL(upayload
)) {
2338 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2342 /* find first : in payload */
2343 payload
= (char *)upayload
->data
;
2344 delim
= strnchr(payload
, upayload
->datalen
, ':');
2345 cifs_dbg(FYI
, "payload=%s\n", payload
);
2347 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
2353 len
= delim
- payload
;
2354 if (len
> MAX_USERNAME_SIZE
|| len
<= 0) {
2355 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
2361 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2362 if (!vol
->username
) {
2363 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
2368 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, vol
->username
);
2370 len
= key
->datalen
- (len
+ 1);
2371 if (len
> MAX_PASSWORD_SIZE
|| len
<= 0) {
2372 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
2374 kfree(vol
->username
);
2375 vol
->username
= NULL
;
2380 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2381 if (!vol
->password
) {
2382 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
2385 kfree(vol
->username
);
2386 vol
->username
= NULL
;
2395 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
2398 #else /* ! CONFIG_KEYS */
2400 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2401 struct cifs_ses
*ses
__attribute__((unused
)))
2405 #endif /* CONFIG_KEYS */
2407 static struct cifs_ses
*
2408 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2412 struct cifs_ses
*ses
;
2413 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2414 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2418 ses
= cifs_find_smb_ses(server
, volume_info
);
2420 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
2423 mutex_lock(&ses
->session_mutex
);
2424 rc
= cifs_negotiate_protocol(xid
, ses
);
2426 mutex_unlock(&ses
->session_mutex
);
2427 /* problem -- put our ses reference */
2428 cifs_put_smb_ses(ses
);
2432 if (ses
->need_reconnect
) {
2433 cifs_dbg(FYI
, "Session needs reconnect\n");
2434 rc
= cifs_setup_session(xid
, ses
,
2435 volume_info
->local_nls
);
2437 mutex_unlock(&ses
->session_mutex
);
2438 /* problem -- put our reference */
2439 cifs_put_smb_ses(ses
);
2444 mutex_unlock(&ses
->session_mutex
);
2446 /* existing SMB ses has a server reference already */
2447 cifs_put_tcp_session(server
);
2452 cifs_dbg(FYI
, "Existing smb sess not found\n");
2453 ses
= sesInfoAlloc();
2457 /* new SMB session uses our server ref */
2458 ses
->server
= server
;
2459 if (server
->dstaddr
.ss_family
== AF_INET6
)
2460 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2462 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2464 if (volume_info
->username
) {
2465 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2466 if (!ses
->user_name
)
2470 /* volume_info->password freed at unmount */
2471 if (volume_info
->password
) {
2472 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2476 if (volume_info
->domainname
) {
2477 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2478 if (!ses
->domainName
)
2481 ses
->cred_uid
= volume_info
->cred_uid
;
2482 ses
->linux_uid
= volume_info
->linux_uid
;
2484 ses
->sectype
= volume_info
->sectype
;
2485 ses
->sign
= volume_info
->sign
;
2487 mutex_lock(&ses
->session_mutex
);
2488 rc
= cifs_negotiate_protocol(xid
, ses
);
2490 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2491 mutex_unlock(&ses
->session_mutex
);
2495 /* success, put it on the list */
2496 spin_lock(&cifs_tcp_ses_lock
);
2497 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2498 spin_unlock(&cifs_tcp_ses_lock
);
2509 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2511 if (tcon
->tidStatus
== CifsExiting
)
2513 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2518 static struct cifs_tcon
*
2519 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2521 struct list_head
*tmp
;
2522 struct cifs_tcon
*tcon
;
2524 spin_lock(&cifs_tcp_ses_lock
);
2525 list_for_each(tmp
, &ses
->tcon_list
) {
2526 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2527 if (!match_tcon(tcon
, unc
))
2530 spin_unlock(&cifs_tcp_ses_lock
);
2533 spin_unlock(&cifs_tcp_ses_lock
);
2538 cifs_put_tcon(struct cifs_tcon
*tcon
)
2541 struct cifs_ses
*ses
= tcon
->ses
;
2543 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2544 spin_lock(&cifs_tcp_ses_lock
);
2545 if (--tcon
->tc_count
> 0) {
2546 spin_unlock(&cifs_tcp_ses_lock
);
2550 list_del_init(&tcon
->tcon_list
);
2551 spin_unlock(&cifs_tcp_ses_lock
);
2554 if (ses
->server
->ops
->tree_disconnect
)
2555 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
2558 cifs_fscache_release_super_cookie(tcon
);
2560 cifs_put_smb_ses(ses
);
2563 static struct cifs_tcon
*
2564 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2567 struct cifs_tcon
*tcon
;
2569 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2571 cifs_dbg(FYI
, "Found match on UNC path\n");
2572 /* existing tcon already has a reference */
2573 cifs_put_smb_ses(ses
);
2574 if (tcon
->seal
!= volume_info
->seal
)
2575 cifs_dbg(VFS
, "transport encryption setting conflicts with existing tid\n");
2579 if (!ses
->server
->ops
->tree_connect
) {
2584 tcon
= tconInfoAlloc();
2591 if (volume_info
->password
) {
2592 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2593 if (!tcon
->password
) {
2600 * BB Do we need to wrap session_mutex around this TCon call and Unix
2601 * SetFS as we do on SessSetup and reconnect?
2604 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, volume_info
->UNC
, tcon
,
2605 volume_info
->local_nls
);
2607 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
2611 if (volume_info
->nodfs
) {
2612 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2613 cifs_dbg(FYI
, "DFS disabled (%d)\n", tcon
->Flags
);
2615 tcon
->seal
= volume_info
->seal
;
2617 * We can have only one retry value for a connection to a share so for
2618 * resources mounted more than once to the same server share the last
2619 * value passed in for the retry flag is used.
2621 tcon
->retry
= volume_info
->retry
;
2622 tcon
->nocase
= volume_info
->nocase
;
2623 tcon
->local_lease
= volume_info
->local_lease
;
2624 INIT_LIST_HEAD(&tcon
->pending_opens
);
2626 spin_lock(&cifs_tcp_ses_lock
);
2627 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2628 spin_unlock(&cifs_tcp_ses_lock
);
2630 cifs_fscache_get_super_cookie(tcon
);
2640 cifs_put_tlink(struct tcon_link
*tlink
)
2642 if (!tlink
|| IS_ERR(tlink
))
2645 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2646 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2647 tlink
->tl_time
= jiffies
;
2651 if (!IS_ERR(tlink_tcon(tlink
)))
2652 cifs_put_tcon(tlink_tcon(tlink
));
2657 static inline struct tcon_link
*
2658 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2660 return cifs_sb
->master_tlink
;
2664 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2666 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2667 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2669 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2672 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2673 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2677 * We want to share sb only if we don't specify an r/wsize or
2678 * specified r/wsize is greater than or equal to existing one.
2680 if (new->wsize
&& new->wsize
< old
->wsize
)
2683 if (new->rsize
&& new->rsize
< old
->rsize
)
2686 if (!uid_eq(old
->mnt_uid
, new->mnt_uid
) || !gid_eq(old
->mnt_gid
, new->mnt_gid
))
2689 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2690 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2693 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2696 if (old
->actimeo
!= new->actimeo
)
2703 cifs_match_super(struct super_block
*sb
, void *data
)
2705 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2706 struct smb_vol
*volume_info
;
2707 struct cifs_sb_info
*cifs_sb
;
2708 struct TCP_Server_Info
*tcp_srv
;
2709 struct cifs_ses
*ses
;
2710 struct cifs_tcon
*tcon
;
2711 struct tcon_link
*tlink
;
2714 spin_lock(&cifs_tcp_ses_lock
);
2715 cifs_sb
= CIFS_SB(sb
);
2716 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2717 if (IS_ERR(tlink
)) {
2718 spin_unlock(&cifs_tcp_ses_lock
);
2721 tcon
= tlink_tcon(tlink
);
2723 tcp_srv
= ses
->server
;
2725 volume_info
= mnt_data
->vol
;
2727 if (!match_server(tcp_srv
, volume_info
) ||
2728 !match_session(ses
, volume_info
) ||
2729 !match_tcon(tcon
, volume_info
->UNC
)) {
2734 rc
= compare_mount_options(sb
, mnt_data
);
2736 spin_unlock(&cifs_tcp_ses_lock
);
2737 cifs_put_tlink(tlink
);
2742 get_dfs_path(const unsigned int xid
, struct cifs_ses
*ses
, const char *old_path
,
2743 const struct nls_table
*nls_codepage
, unsigned int *num_referrals
,
2744 struct dfs_info3_param
**referrals
, int remap
)
2749 if (!ses
->server
->ops
->tree_connect
|| !ses
->server
->ops
->get_dfs_refer
)
2755 if (ses
->ipc_tid
== 0) {
2756 temp_unc
= kmalloc(2 /* for slashes */ +
2757 strnlen(ses
->serverName
, SERVER_NAME_LEN_WITH_NULL
* 2)
2758 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL
);
2759 if (temp_unc
== NULL
)
2763 strcpy(temp_unc
+ 2, ses
->serverName
);
2764 strcpy(temp_unc
+ 2 + strlen(ses
->serverName
), "\\IPC$");
2765 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, temp_unc
, NULL
,
2767 cifs_dbg(FYI
, "Tcon rc = %d ipc_tid = %d\n", rc
, ses
->ipc_tid
);
2771 rc
= ses
->server
->ops
->get_dfs_refer(xid
, ses
, old_path
,
2772 referrals
, num_referrals
,
2773 nls_codepage
, remap
);
2775 * BB - map targetUNCs to dfs_info3 structures, here or in
2776 * ses->server->ops->get_dfs_refer.
2782 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2783 static struct lock_class_key cifs_key
[2];
2784 static struct lock_class_key cifs_slock_key
[2];
2787 cifs_reclassify_socket4(struct socket
*sock
)
2789 struct sock
*sk
= sock
->sk
;
2790 BUG_ON(sock_owned_by_user(sk
));
2791 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2792 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2796 cifs_reclassify_socket6(struct socket
*sock
)
2798 struct sock
*sk
= sock
->sk
;
2799 BUG_ON(sock_owned_by_user(sk
));
2800 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2801 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2805 cifs_reclassify_socket4(struct socket
*sock
)
2810 cifs_reclassify_socket6(struct socket
*sock
)
2815 /* See RFC1001 section 14 on representation of Netbios names */
2816 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2820 for (i
= 0, j
= 0; i
< (length
); i
++) {
2821 /* mask a nibble at a time and encode */
2822 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2823 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2830 bind_socket(struct TCP_Server_Info
*server
)
2833 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2834 /* Bind to the specified local IP address */
2835 struct socket
*socket
= server
->ssocket
;
2836 rc
= socket
->ops
->bind(socket
,
2837 (struct sockaddr
*) &server
->srcaddr
,
2838 sizeof(server
->srcaddr
));
2840 struct sockaddr_in
*saddr4
;
2841 struct sockaddr_in6
*saddr6
;
2842 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2843 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2844 if (saddr6
->sin6_family
== AF_INET6
)
2845 cifs_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
2846 &saddr6
->sin6_addr
, rc
);
2848 cifs_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
2849 &saddr4
->sin_addr
.s_addr
, rc
);
2856 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2860 * some servers require RFC1001 sessinit before sending
2861 * negprot - BB check reconnection in case where second
2862 * sessinit is sent but no second negprot
2864 struct rfc1002_session_packet
*ses_init_buf
;
2865 struct smb_hdr
*smb_buf
;
2866 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2869 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2871 if (server
->server_RFC1001_name
&&
2872 server
->server_RFC1001_name
[0] != 0)
2873 rfc1002mangle(ses_init_buf
->trailer
.
2874 session_req
.called_name
,
2875 server
->server_RFC1001_name
,
2876 RFC1001_NAME_LEN_WITH_NULL
);
2878 rfc1002mangle(ses_init_buf
->trailer
.
2879 session_req
.called_name
,
2880 DEFAULT_CIFS_CALLED_NAME
,
2881 RFC1001_NAME_LEN_WITH_NULL
);
2883 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2886 * calling name ends in null (byte 16) from old smb
2889 if (server
->workstation_RFC1001_name
&&
2890 server
->workstation_RFC1001_name
[0] != 0)
2891 rfc1002mangle(ses_init_buf
->trailer
.
2892 session_req
.calling_name
,
2893 server
->workstation_RFC1001_name
,
2894 RFC1001_NAME_LEN_WITH_NULL
);
2896 rfc1002mangle(ses_init_buf
->trailer
.
2897 session_req
.calling_name
,
2899 RFC1001_NAME_LEN_WITH_NULL
);
2901 ses_init_buf
->trailer
.session_req
.scope1
= 0;
2902 ses_init_buf
->trailer
.session_req
.scope2
= 0;
2903 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
2905 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2906 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
2907 rc
= smb_send(server
, smb_buf
, 0x44);
2908 kfree(ses_init_buf
);
2910 * RFC1001 layer in at least one server
2911 * requires very short break before negprot
2912 * presumably because not expecting negprot
2913 * to follow so fast. This is a simple
2914 * solution that works without
2915 * complicating the code and causes no
2916 * significant slowing down on mount
2919 usleep_range(1000, 2000);
2922 * else the negprot may still work without this
2923 * even though malloc failed
2930 generic_ip_connect(struct TCP_Server_Info
*server
)
2935 struct socket
*socket
= server
->ssocket
;
2936 struct sockaddr
*saddr
;
2938 saddr
= (struct sockaddr
*) &server
->dstaddr
;
2940 if (server
->dstaddr
.ss_family
== AF_INET6
) {
2941 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
2942 slen
= sizeof(struct sockaddr_in6
);
2945 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
2946 slen
= sizeof(struct sockaddr_in
);
2950 if (socket
== NULL
) {
2951 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
2952 IPPROTO_TCP
, &socket
, 1);
2954 cifs_dbg(VFS
, "Error %d creating socket\n", rc
);
2955 server
->ssocket
= NULL
;
2959 /* BB other socket options to set KEEPALIVE, NODELAY? */
2960 cifs_dbg(FYI
, "Socket created\n");
2961 server
->ssocket
= socket
;
2962 socket
->sk
->sk_allocation
= GFP_NOFS
;
2963 if (sfamily
== AF_INET6
)
2964 cifs_reclassify_socket6(socket
);
2966 cifs_reclassify_socket4(socket
);
2969 rc
= bind_socket(server
);
2974 * Eventually check for other socket options to change from
2975 * the default. sock_setsockopt not used because it expects
2978 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
2979 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
2981 /* make the bufsizes depend on wsize/rsize and max requests */
2982 if (server
->noautotune
) {
2983 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
2984 socket
->sk
->sk_sndbuf
= 200 * 1024;
2985 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
2986 socket
->sk
->sk_rcvbuf
= 140 * 1024;
2989 if (server
->tcp_nodelay
) {
2991 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
2992 (char *)&val
, sizeof(val
));
2994 cifs_dbg(FYI
, "set TCP_NODELAY socket option error %d\n",
2998 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2999 socket
->sk
->sk_sndbuf
,
3000 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3002 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3004 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
3005 sock_release(socket
);
3006 server
->ssocket
= NULL
;
3010 if (sport
== htons(RFC1001_PORT
))
3011 rc
= ip_rfc1001_connect(server
);
3017 ip_connect(struct TCP_Server_Info
*server
)
3020 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3021 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3023 if (server
->dstaddr
.ss_family
== AF_INET6
)
3024 sport
= &addr6
->sin6_port
;
3026 sport
= &addr
->sin_port
;
3031 /* try with 445 port at first */
3032 *sport
= htons(CIFS_PORT
);
3034 rc
= generic_ip_connect(server
);
3038 /* if it failed, try with 139 port */
3039 *sport
= htons(RFC1001_PORT
);
3042 return generic_ip_connect(server
);
3045 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
3046 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3048 /* if we are reconnecting then should we check to see if
3049 * any requested capabilities changed locally e.g. via
3050 * remount but we can not do much about it here
3051 * if they have (even if we could detect it by the following)
3052 * Perhaps we could add a backpointer to array of sb from tcon
3053 * or if we change to make all sb to same share the same
3054 * sb as NFS - then we only have one backpointer to sb.
3055 * What if we wanted to mount the server share twice once with
3056 * and once without posixacls or posix paths? */
3057 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3059 if (vol_info
&& vol_info
->no_linux_ext
) {
3060 tcon
->fsUnixInfo
.Capability
= 0;
3061 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3062 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
3064 } else if (vol_info
)
3065 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3067 if (tcon
->unix_ext
== 0) {
3068 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
3072 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3073 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3074 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
3075 /* check for reconnect case in which we do not
3076 want to change the mount behavior if we can avoid it */
3077 if (vol_info
== NULL
) {
3078 /* turn off POSIX ACL and PATHNAMES if not set
3079 originally at mount time */
3080 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3081 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3082 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3083 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3084 cifs_dbg(VFS
, "POSIXPATH support change\n");
3085 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3086 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3087 cifs_dbg(VFS
, "possible reconnect error\n");
3088 cifs_dbg(VFS
, "server disabled POSIX path support\n");
3092 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3093 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
3095 cap
&= CIFS_UNIX_CAP_MASK
;
3096 if (vol_info
&& vol_info
->no_psx_acl
)
3097 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3098 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3099 cifs_dbg(FYI
, "negotiated posix acl support\n");
3101 cifs_sb
->mnt_cifs_flags
|=
3102 CIFS_MOUNT_POSIXACL
;
3105 if (vol_info
&& vol_info
->posix_paths
== 0)
3106 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3107 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3108 cifs_dbg(FYI
, "negotiate posix pathnames\n");
3110 cifs_sb
->mnt_cifs_flags
|=
3111 CIFS_MOUNT_POSIX_PATHS
;
3114 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
3115 #ifdef CONFIG_CIFS_DEBUG2
3116 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3117 cifs_dbg(FYI
, "FCNTL cap\n");
3118 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3119 cifs_dbg(FYI
, "EXTATTR cap\n");
3120 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3121 cifs_dbg(FYI
, "POSIX path cap\n");
3122 if (cap
& CIFS_UNIX_XATTR_CAP
)
3123 cifs_dbg(FYI
, "XATTR cap\n");
3124 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3125 cifs_dbg(FYI
, "POSIX ACL cap\n");
3126 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3127 cifs_dbg(FYI
, "very large read cap\n");
3128 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3129 cifs_dbg(FYI
, "very large write cap\n");
3130 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3131 cifs_dbg(FYI
, "transport encryption cap\n");
3132 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3133 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
3134 #endif /* CIFS_DEBUG2 */
3135 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3136 if (vol_info
== NULL
) {
3137 cifs_dbg(FYI
, "resetting capabilities failed\n");
3139 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");
3145 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3146 struct cifs_sb_info
*cifs_sb
)
3148 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3150 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3151 cifs_sb
->tlink_tree
= RB_ROOT
;
3154 * Temporarily set r/wsize for matching superblock. If we end up using
3155 * new sb then client will later negotiate it downward if needed.
3157 cifs_sb
->rsize
= pvolume_info
->rsize
;
3158 cifs_sb
->wsize
= pvolume_info
->wsize
;
3160 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3161 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3162 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3163 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3164 cifs_dbg(FYI
, "file mode: 0x%hx dir mode: 0x%hx\n",
3165 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3167 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3168 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3170 if (pvolume_info
->noperm
)
3171 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3172 if (pvolume_info
->setuids
)
3173 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3174 if (pvolume_info
->server_ino
)
3175 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3176 if (pvolume_info
->remap
)
3177 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3178 if (pvolume_info
->no_xattr
)
3179 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3180 if (pvolume_info
->sfu_emul
)
3181 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3182 if (pvolume_info
->nobrl
)
3183 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3184 if (pvolume_info
->nostrictsync
)
3185 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3186 if (pvolume_info
->mand_lock
)
3187 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3188 if (pvolume_info
->rwpidforward
)
3189 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3190 if (pvolume_info
->cifs_acl
)
3191 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3192 if (pvolume_info
->backupuid_specified
) {
3193 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3194 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3196 if (pvolume_info
->backupgid_specified
) {
3197 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3198 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3200 if (pvolume_info
->override_uid
)
3201 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3202 if (pvolume_info
->override_gid
)
3203 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3204 if (pvolume_info
->dynperm
)
3205 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3206 if (pvolume_info
->fsc
)
3207 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3208 if (pvolume_info
->multiuser
)
3209 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3210 CIFS_MOUNT_NO_PERM
);
3211 if (pvolume_info
->strict_io
)
3212 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3213 if (pvolume_info
->direct_io
) {
3214 cifs_dbg(FYI
, "mounting share using direct i/o\n");
3215 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3217 if (pvolume_info
->mfsymlinks
) {
3218 if (pvolume_info
->sfu_emul
) {
3219 cifs_dbg(VFS
, "mount option mfsymlinks ignored if sfu mount option is used\n");
3221 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3225 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3226 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
3230 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3232 kfree(volume_info
->username
);
3233 kzfree(volume_info
->password
);
3234 kfree(volume_info
->UNC
);
3235 kfree(volume_info
->domainname
);
3236 kfree(volume_info
->iocharset
);
3237 kfree(volume_info
->prepath
);
3241 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3245 cleanup_volume_info_contents(volume_info
);
3250 #ifdef CONFIG_CIFS_DFS_UPCALL
3252 * cifs_build_path_to_root returns full path to root when we do not have an
3253 * exiting connection (tcon)
3256 build_unc_path_to_root(const struct smb_vol
*vol
,
3257 const struct cifs_sb_info
*cifs_sb
)
3259 char *full_path
, *pos
;
3260 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) + 1 : 0;
3261 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3263 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3264 if (full_path
== NULL
)
3265 return ERR_PTR(-ENOMEM
);
3267 strncpy(full_path
, vol
->UNC
, unc_len
);
3268 pos
= full_path
+ unc_len
;
3271 *pos
= CIFS_DIR_SEP(cifs_sb
);
3272 strncpy(pos
+ 1, vol
->prepath
, pplen
);
3276 *pos
= '\0'; /* add trailing null */
3277 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3278 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
3283 * Perform a dfs referral query for a share and (optionally) prefix
3285 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3286 * to a string containing updated options for the submount. Otherwise it
3287 * will be left untouched.
3289 * Returns the rc from get_dfs_path to the caller, which can be used to
3290 * determine whether there were referrals.
3293 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
3294 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3298 unsigned int num_referrals
= 0;
3299 struct dfs_info3_param
*referrals
= NULL
;
3300 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3302 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3303 if (IS_ERR(full_path
))
3304 return PTR_ERR(full_path
);
3306 /* For DFS paths, skip the first '\' of the UNC */
3307 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3309 rc
= get_dfs_path(xid
, ses
, ref_path
, cifs_sb
->local_nls
,
3310 &num_referrals
, &referrals
,
3311 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
3313 if (!rc
&& num_referrals
> 0) {
3314 char *fake_devname
= NULL
;
3316 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3317 full_path
+ 1, referrals
,
3320 free_dfs_info_array(referrals
, num_referrals
);
3322 if (IS_ERR(mdata
)) {
3323 rc
= PTR_ERR(mdata
);
3326 cleanup_volume_info_contents(volume_info
);
3327 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3330 kfree(fake_devname
);
3331 kfree(cifs_sb
->mountdata
);
3332 cifs_sb
->mountdata
= mdata
;
3340 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3341 const char *devname
)
3345 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3348 if (volume_info
->nullauth
) {
3349 cifs_dbg(FYI
, "Anonymous login\n");
3350 kfree(volume_info
->username
);
3351 volume_info
->username
= NULL
;
3352 } else if (volume_info
->username
) {
3353 /* BB fixme parse for domain name here */
3354 cifs_dbg(FYI
, "Username: %s\n", volume_info
->username
);
3356 cifs_dbg(VFS
, "No username specified\n");
3357 /* In userspace mount helper we can get user name from alternate
3358 locations such as env variables and files on disk */
3362 /* this is needed for ASCII cp to Unicode converts */
3363 if (volume_info
->iocharset
== NULL
) {
3364 /* load_nls_default cannot return null */
3365 volume_info
->local_nls
= load_nls_default();
3367 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3368 if (volume_info
->local_nls
== NULL
) {
3369 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
3370 volume_info
->iocharset
);
3379 cifs_get_volume_info(char *mount_data
, const char *devname
)
3382 struct smb_vol
*volume_info
;
3384 volume_info
= kmalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3386 return ERR_PTR(-ENOMEM
);
3388 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3390 cifs_cleanup_volume_info(volume_info
);
3391 volume_info
= ERR_PTR(rc
);
3398 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3402 struct cifs_ses
*ses
;
3403 struct cifs_tcon
*tcon
;
3404 struct TCP_Server_Info
*server
;
3406 struct tcon_link
*tlink
;
3407 #ifdef CONFIG_CIFS_DFS_UPCALL
3408 int referral_walks_count
= 0;
3411 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs", BDI_CAP_MAP_COPY
);
3415 #ifdef CONFIG_CIFS_DFS_UPCALL
3417 /* cleanup activities if we're chasing a referral */
3418 if (referral_walks_count
) {
3420 cifs_put_tcon(tcon
);
3422 cifs_put_smb_ses(ses
);
3436 /* get a reference to a tcp session */
3437 server
= cifs_get_tcp_session(volume_info
);
3438 if (IS_ERR(server
)) {
3439 rc
= PTR_ERR(server
);
3440 bdi_destroy(&cifs_sb
->bdi
);
3444 /* get a reference to a SMB session */
3445 ses
= cifs_get_smb_ses(server
, volume_info
);
3449 goto mount_fail_check
;
3452 /* search for existing tcon to this server share */
3453 tcon
= cifs_get_tcon(ses
, volume_info
);
3457 goto remote_path_check
;
3460 /* tell server which Unix caps we support */
3461 if (cap_unix(tcon
->ses
)) {
3462 /* reset of caps checks mount to see if unix extensions
3463 disabled for just this mount */
3464 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3465 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3466 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3467 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3469 goto mount_fail_check
;
3472 tcon
->unix_ext
= 0; /* server does not support them */
3474 /* do not care if a following call succeed - informational */
3475 if (!tcon
->ipc
&& server
->ops
->qfs_tcon
)
3476 server
->ops
->qfs_tcon(xid
, tcon
);
3478 cifs_sb
->wsize
= server
->ops
->negotiate_wsize(tcon
, volume_info
);
3479 cifs_sb
->rsize
= server
->ops
->negotiate_rsize(tcon
, volume_info
);
3481 /* tune readahead according to rsize */
3482 cifs_sb
->bdi
.ra_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3485 #ifdef CONFIG_CIFS_DFS_UPCALL
3487 * Perform an unconditional check for whether there are DFS
3488 * referrals for this path without prefix, to provide support
3489 * for DFS referrals from w2k8 servers which don't seem to respond
3490 * with PATH_NOT_COVERED to requests that include the prefix.
3491 * Chase the referral if found, otherwise continue normally.
3493 if (referral_walks_count
== 0) {
3494 int refrc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
,
3497 referral_walks_count
++;
3498 goto try_mount_again
;
3503 /* check if a whole path is not remote */
3505 if (!server
->ops
->is_path_accessible
) {
3507 goto mount_fail_check
;
3510 * cifs_build_path_to_root works only when we have a valid tcon
3512 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3513 if (full_path
== NULL
) {
3515 goto mount_fail_check
;
3517 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3519 if (rc
!= 0 && rc
!= -EREMOTE
) {
3521 goto mount_fail_check
;
3526 /* get referral if needed */
3527 if (rc
== -EREMOTE
) {
3528 #ifdef CONFIG_CIFS_DFS_UPCALL
3529 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3531 * BB: when we implement proper loop detection,
3532 * we will remove this check. But now we need it
3533 * to prevent an indefinite loop if 'DFS tree' is
3534 * misconfigured (i.e. has loops).
3537 goto mount_fail_check
;
3540 rc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
, true);
3543 referral_walks_count
++;
3544 goto try_mount_again
;
3546 goto mount_fail_check
;
3547 #else /* No DFS support, return error on mount */
3553 goto mount_fail_check
;
3555 /* now, hang the tcon off of the superblock */
3556 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3557 if (tlink
== NULL
) {
3559 goto mount_fail_check
;
3562 tlink
->tl_uid
= ses
->linux_uid
;
3563 tlink
->tl_tcon
= tcon
;
3564 tlink
->tl_time
= jiffies
;
3565 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3566 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3568 cifs_sb
->master_tlink
= tlink
;
3569 spin_lock(&cifs_sb
->tlink_tree_lock
);
3570 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3571 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3573 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3577 /* on error free sesinfo and tcon struct if needed */
3579 /* If find_unc succeeded then rc == 0 so we can not end */
3580 /* up accidentally freeing someone elses tcon struct */
3582 cifs_put_tcon(tcon
);
3584 cifs_put_smb_ses(ses
);
3586 cifs_put_tcp_session(server
);
3587 bdi_destroy(&cifs_sb
->bdi
);
3596 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3597 * pointer may be NULL.
3600 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
3601 const char *tree
, struct cifs_tcon
*tcon
,
3602 const struct nls_table
*nls_codepage
)
3604 struct smb_hdr
*smb_buffer
;
3605 struct smb_hdr
*smb_buffer_response
;
3608 unsigned char *bcc_ptr
;
3611 __u16 bytes_left
, count
;
3616 smb_buffer
= cifs_buf_get();
3617 if (smb_buffer
== NULL
)
3620 smb_buffer_response
= smb_buffer
;
3622 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3623 NULL
/*no tid */ , 4 /*wct */ );
3625 smb_buffer
->Mid
= get_next_mid(ses
->server
);
3626 smb_buffer
->Uid
= ses
->Suid
;
3627 pSMB
= (TCONX_REQ
*) smb_buffer
;
3628 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3630 pSMB
->AndXCommand
= 0xFF;
3631 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3632 bcc_ptr
= &pSMB
->Password
[0];
3633 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3634 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3635 *bcc_ptr
= 0; /* password is null byte */
3636 bcc_ptr
++; /* skip password */
3637 /* already aligned so no need to do it below */
3639 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3640 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3641 specified as required (when that support is added to
3642 the vfs in the future) as only NTLM or the much
3643 weaker LANMAN (which we do not send by default) is accepted
3644 by Samba (not sure whether other servers allow
3645 NTLMv2 password here) */
3646 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3647 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3648 (ses
->sectype
== LANMAN
))
3649 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3650 ses
->server
->sec_mode
&
3651 SECMODE_PW_ENCRYPT
? true : false,
3654 #endif /* CIFS_WEAK_PW_HASH */
3655 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3656 bcc_ptr
, nls_codepage
);
3658 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3659 if (ses
->capabilities
& CAP_UNICODE
) {
3660 /* must align unicode strings */
3661 *bcc_ptr
= 0; /* null byte password */
3666 if (ses
->server
->sign
)
3667 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3669 if (ses
->capabilities
& CAP_STATUS32
) {
3670 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3672 if (ses
->capabilities
& CAP_DFS
) {
3673 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3675 if (ses
->capabilities
& CAP_UNICODE
) {
3676 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3678 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
3679 6 /* max utf8 char length in bytes */ *
3680 (/* server len*/ + 256 /* share len */), nls_codepage
);
3681 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3682 bcc_ptr
+= 2; /* skip trailing null */
3683 } else { /* ASCII */
3684 strcpy(bcc_ptr
, tree
);
3685 bcc_ptr
+= strlen(tree
) + 1;
3687 strcpy(bcc_ptr
, "?????");
3688 bcc_ptr
+= strlen("?????");
3690 count
= bcc_ptr
- &pSMB
->Password
[0];
3691 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
3692 pSMB
->hdr
.smb_buf_length
) + count
);
3693 pSMB
->ByteCount
= cpu_to_le16(count
);
3695 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3698 /* above now done in SendReceive */
3699 if ((rc
== 0) && (tcon
!= NULL
)) {
3702 tcon
->tidStatus
= CifsGood
;
3703 tcon
->need_reconnect
= false;
3704 tcon
->tid
= smb_buffer_response
->Tid
;
3705 bcc_ptr
= pByteArea(smb_buffer_response
);
3706 bytes_left
= get_bcc(smb_buffer_response
);
3707 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3708 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3714 /* skip service field (NB: this field is always ASCII) */
3716 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3717 (bcc_ptr
[2] == 'C')) {
3718 cifs_dbg(FYI
, "IPC connection\n");
3721 } else if (length
== 2) {
3722 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3723 /* the most common case */
3724 cifs_dbg(FYI
, "disk share connection\n");
3727 bcc_ptr
+= length
+ 1;
3728 bytes_left
-= (length
+ 1);
3729 strlcpy(tcon
->treeName
, tree
, sizeof(tcon
->treeName
));
3731 /* mostly informational -- no need to fail on error here */
3732 kfree(tcon
->nativeFileSystem
);
3733 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
3734 bytes_left
, is_unicode
,
3737 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
3739 if ((smb_buffer_response
->WordCount
== 3) ||
3740 (smb_buffer_response
->WordCount
== 7))
3741 /* field is in same location */
3742 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3745 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
3746 } else if ((rc
== 0) && tcon
== NULL
) {
3747 /* all we need to save for IPC$ connection */
3748 ses
->ipc_tid
= smb_buffer_response
->Tid
;
3751 cifs_buf_release(smb_buffer
);
3756 cifs_umount(struct cifs_sb_info
*cifs_sb
)
3758 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3759 struct rb_node
*node
;
3760 struct tcon_link
*tlink
;
3762 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3764 spin_lock(&cifs_sb
->tlink_tree_lock
);
3765 while ((node
= rb_first(root
))) {
3766 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3767 cifs_get_tlink(tlink
);
3768 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3769 rb_erase(node
, root
);
3771 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3772 cifs_put_tlink(tlink
);
3773 spin_lock(&cifs_sb
->tlink_tree_lock
);
3775 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3777 bdi_destroy(&cifs_sb
->bdi
);
3778 kfree(cifs_sb
->mountdata
);
3779 unload_nls(cifs_sb
->local_nls
);
3784 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
3787 struct TCP_Server_Info
*server
= ses
->server
;
3789 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
3792 /* only send once per connect */
3793 if (!server
->ops
->need_neg(server
))
3796 set_credits(server
, 1);
3798 rc
= server
->ops
->negotiate(xid
, ses
);
3800 spin_lock(&GlobalMid_Lock
);
3801 if (server
->tcpStatus
== CifsNeedNegotiate
)
3802 server
->tcpStatus
= CifsGood
;
3805 spin_unlock(&GlobalMid_Lock
);
3812 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
3813 struct nls_table
*nls_info
)
3816 struct TCP_Server_Info
*server
= ses
->server
;
3818 ses
->capabilities
= server
->capabilities
;
3819 if (linuxExtEnabled
== 0)
3820 ses
->capabilities
&= (~server
->vals
->cap_unix
);
3822 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3823 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
3825 if (server
->ops
->sess_setup
)
3826 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
3829 cifs_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
3831 mutex_lock(&server
->srv_mutex
);
3832 if (!server
->session_estab
) {
3833 server
->session_key
.response
= ses
->auth_key
.response
;
3834 server
->session_key
.len
= ses
->auth_key
.len
;
3835 server
->sequence_number
= 0x2;
3836 server
->session_estab
= true;
3837 ses
->auth_key
.response
= NULL
;
3838 if (server
->ops
->generate_signingkey
)
3839 server
->ops
->generate_signingkey(server
);
3841 mutex_unlock(&server
->srv_mutex
);
3843 cifs_dbg(FYI
, "CIFS Session Established successfully\n");
3844 spin_lock(&GlobalMid_Lock
);
3845 ses
->status
= CifsGood
;
3846 ses
->need_reconnect
= false;
3847 spin_unlock(&GlobalMid_Lock
);
3850 kfree(ses
->auth_key
.response
);
3851 ses
->auth_key
.response
= NULL
;
3852 ses
->auth_key
.len
= 0;
3853 kfree(ses
->ntlmssp
);
3854 ses
->ntlmssp
= NULL
;
3860 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
3862 vol
->sectype
= ses
->sectype
;
3864 /* krb5 is special, since we don't need username or pw */
3865 if (vol
->sectype
== Kerberos
)
3868 return cifs_set_cifscreds(vol
, ses
);
3871 static struct cifs_tcon
*
3872 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
3875 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3876 struct cifs_ses
*ses
;
3877 struct cifs_tcon
*tcon
= NULL
;
3878 struct smb_vol
*vol_info
;
3880 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
3881 if (vol_info
== NULL
)
3882 return ERR_PTR(-ENOMEM
);
3884 vol_info
->local_nls
= cifs_sb
->local_nls
;
3885 vol_info
->linux_uid
= fsuid
;
3886 vol_info
->cred_uid
= fsuid
;
3887 vol_info
->UNC
= master_tcon
->treeName
;
3888 vol_info
->retry
= master_tcon
->retry
;
3889 vol_info
->nocase
= master_tcon
->nocase
;
3890 vol_info
->local_lease
= master_tcon
->local_lease
;
3891 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
3892 vol_info
->sectype
= master_tcon
->ses
->sectype
;
3893 vol_info
->sign
= master_tcon
->ses
->sign
;
3895 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
3901 /* get a reference for the same TCP session */
3902 spin_lock(&cifs_tcp_ses_lock
);
3903 ++master_tcon
->ses
->server
->srv_count
;
3904 spin_unlock(&cifs_tcp_ses_lock
);
3906 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
3908 tcon
= (struct cifs_tcon
*)ses
;
3909 cifs_put_tcp_session(master_tcon
->ses
->server
);
3913 tcon
= cifs_get_tcon(ses
, vol_info
);
3915 cifs_put_smb_ses(ses
);
3920 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
3922 kfree(vol_info
->username
);
3923 kfree(vol_info
->password
);
3930 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
3932 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
3936 cifs_sb_tcon_pending_wait(void *unused
)
3939 return signal_pending(current
) ? -ERESTARTSYS
: 0;
3942 /* find and return a tlink with given uid */
3943 static struct tcon_link
*
3944 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
3946 struct rb_node
*node
= root
->rb_node
;
3947 struct tcon_link
*tlink
;
3950 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3952 if (uid_gt(tlink
->tl_uid
, uid
))
3953 node
= node
->rb_left
;
3954 else if (uid_lt(tlink
->tl_uid
, uid
))
3955 node
= node
->rb_right
;
3962 /* insert a tcon_link into the tree */
3964 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
3966 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
3967 struct tcon_link
*tlink
;
3970 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
3973 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
3974 new = &((*new)->rb_left
);
3976 new = &((*new)->rb_right
);
3979 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
3980 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
3984 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3987 * If the superblock doesn't refer to a multiuser mount, then just return
3988 * the master tcon for the mount.
3990 * First, search the rbtree for an existing tcon for this fsuid. If one
3991 * exists, then check to see if it's pending construction. If it is then wait
3992 * for construction to complete. Once it's no longer pending, check to see if
3993 * it failed and either return an error or retry construction, depending on
3996 * If one doesn't exist then insert a new tcon_link struct into the tree and
3997 * try to construct a new one.
4000 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4003 kuid_t fsuid
= current_fsuid();
4004 struct tcon_link
*tlink
, *newtlink
;
4006 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4007 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4009 spin_lock(&cifs_sb
->tlink_tree_lock
);
4010 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4012 cifs_get_tlink(tlink
);
4013 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4015 if (tlink
== NULL
) {
4016 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4017 if (newtlink
== NULL
)
4018 return ERR_PTR(-ENOMEM
);
4019 newtlink
->tl_uid
= fsuid
;
4020 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4021 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4022 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4023 cifs_get_tlink(newtlink
);
4025 spin_lock(&cifs_sb
->tlink_tree_lock
);
4026 /* was one inserted after previous search? */
4027 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4029 cifs_get_tlink(tlink
);
4030 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4032 goto wait_for_construction
;
4035 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4036 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4038 wait_for_construction
:
4039 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4040 cifs_sb_tcon_pending_wait
,
4041 TASK_INTERRUPTIBLE
);
4043 cifs_put_tlink(tlink
);
4044 return ERR_PTR(ret
);
4047 /* if it's good, return it */
4048 if (!IS_ERR(tlink
->tl_tcon
))
4051 /* return error if we tried this already recently */
4052 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4053 cifs_put_tlink(tlink
);
4054 return ERR_PTR(-EACCES
);
4057 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4058 goto wait_for_construction
;
4061 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4062 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4063 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4065 if (IS_ERR(tlink
->tl_tcon
)) {
4066 cifs_put_tlink(tlink
);
4067 return ERR_PTR(-EACCES
);
4074 * periodic workqueue job that scans tcon_tree for a superblock and closes
4078 cifs_prune_tlinks(struct work_struct
*work
)
4080 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4082 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4083 struct rb_node
*node
= rb_first(root
);
4084 struct rb_node
*tmp
;
4085 struct tcon_link
*tlink
;
4088 * Because we drop the spinlock in the loop in order to put the tlink
4089 * it's not guarded against removal of links from the tree. The only
4090 * places that remove entries from the tree are this function and
4091 * umounts. Because this function is non-reentrant and is canceled
4092 * before umount can proceed, this is safe.
4094 spin_lock(&cifs_sb
->tlink_tree_lock
);
4095 node
= rb_first(root
);
4096 while (node
!= NULL
) {
4098 node
= rb_next(tmp
);
4099 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4101 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4102 atomic_read(&tlink
->tl_count
) != 0 ||
4103 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4106 cifs_get_tlink(tlink
);
4107 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4108 rb_erase(tmp
, root
);
4110 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4111 cifs_put_tlink(tlink
);
4112 spin_lock(&cifs_sb
->tlink_tree_lock
);
4114 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4116 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,