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"
51 #include "dns_resolve.h"
54 #include "rfc1002pdu.h"
56 #ifdef CONFIG_CIFS_SMB2
57 #include "smb2proto.h"
61 #define RFC1001_PORT 139
63 extern mempool_t
*cifs_req_poolp
;
65 /* FIXME: should these be tunable? */
66 #define TLINK_ERROR_EXPIRE (1 * HZ)
67 #define TLINK_IDLE_EXPIRE (600 * HZ)
71 /* Mount options that take no arguments */
72 Opt_user_xattr
, Opt_nouser_xattr
,
73 Opt_forceuid
, Opt_noforceuid
,
74 Opt_forcegid
, Opt_noforcegid
,
75 Opt_noblocksend
, Opt_noautotune
,
76 Opt_hard
, Opt_soft
, Opt_perm
, Opt_noperm
,
77 Opt_mapposix
, Opt_nomapposix
,
78 Opt_mapchars
, Opt_nomapchars
, Opt_sfu
,
79 Opt_nosfu
, Opt_nodfs
, Opt_posixpaths
,
80 Opt_noposixpaths
, Opt_nounix
,
83 Opt_forcemandatorylock
, Opt_setuids
,
84 Opt_nosetuids
, Opt_dynperm
, Opt_nodynperm
,
85 Opt_nohard
, Opt_nosoft
,
87 Opt_nostrictsync
, Opt_strictsync
,
88 Opt_serverino
, Opt_noserverino
,
89 Opt_rwpidforward
, Opt_cifsacl
, Opt_nocifsacl
,
90 Opt_acl
, Opt_noacl
, Opt_locallease
,
91 Opt_sign
, Opt_seal
, Opt_noac
,
92 Opt_fsc
, Opt_mfsymlinks
,
93 Opt_multiuser
, Opt_sloppy
, Opt_nosharesock
,
94 Opt_persistent
, Opt_nopersistent
,
95 Opt_resilient
, Opt_noresilient
,
97 /* Mount options which take numeric value */
98 Opt_backupuid
, Opt_backupgid
, Opt_uid
,
99 Opt_cruid
, Opt_gid
, Opt_file_mode
,
100 Opt_dirmode
, Opt_port
,
101 Opt_rsize
, Opt_wsize
, Opt_actimeo
,
103 /* Mount options which take string value */
104 Opt_user
, Opt_pass
, Opt_ip
,
105 Opt_domain
, Opt_srcaddr
, Opt_iocharset
,
106 Opt_netbiosname
, Opt_servern
,
107 Opt_ver
, Opt_vers
, Opt_sec
, Opt_cache
,
109 /* Mount options to be ignored */
112 /* Options which could be blank */
120 static const match_table_t cifs_mount_option_tokens
= {
122 { Opt_user_xattr
, "user_xattr" },
123 { Opt_nouser_xattr
, "nouser_xattr" },
124 { Opt_forceuid
, "forceuid" },
125 { Opt_noforceuid
, "noforceuid" },
126 { Opt_forcegid
, "forcegid" },
127 { Opt_noforcegid
, "noforcegid" },
128 { Opt_noblocksend
, "noblocksend" },
129 { Opt_noautotune
, "noautotune" },
130 { Opt_hard
, "hard" },
131 { Opt_soft
, "soft" },
132 { Opt_perm
, "perm" },
133 { Opt_noperm
, "noperm" },
134 { Opt_mapchars
, "mapchars" }, /* SFU style */
135 { Opt_nomapchars
, "nomapchars" },
136 { Opt_mapposix
, "mapposix" }, /* SFM style */
137 { Opt_nomapposix
, "nomapposix" },
139 { Opt_nosfu
, "nosfu" },
140 { Opt_nodfs
, "nodfs" },
141 { Opt_posixpaths
, "posixpaths" },
142 { Opt_noposixpaths
, "noposixpaths" },
143 { Opt_nounix
, "nounix" },
144 { Opt_nounix
, "nolinux" },
145 { Opt_nocase
, "nocase" },
146 { Opt_nocase
, "ignorecase" },
148 { Opt_nobrl
, "nobrl" },
149 { Opt_nobrl
, "nolock" },
150 { Opt_forcemandatorylock
, "forcemandatorylock" },
151 { Opt_forcemandatorylock
, "forcemand" },
152 { Opt_setuids
, "setuids" },
153 { Opt_nosetuids
, "nosetuids" },
154 { Opt_dynperm
, "dynperm" },
155 { Opt_nodynperm
, "nodynperm" },
156 { Opt_nohard
, "nohard" },
157 { Opt_nosoft
, "nosoft" },
158 { Opt_nointr
, "nointr" },
159 { Opt_intr
, "intr" },
160 { Opt_nostrictsync
, "nostrictsync" },
161 { Opt_strictsync
, "strictsync" },
162 { Opt_serverino
, "serverino" },
163 { Opt_noserverino
, "noserverino" },
164 { Opt_rwpidforward
, "rwpidforward" },
165 { Opt_cifsacl
, "cifsacl" },
166 { Opt_nocifsacl
, "nocifsacl" },
168 { Opt_noacl
, "noacl" },
169 { Opt_locallease
, "locallease" },
170 { Opt_sign
, "sign" },
171 { Opt_seal
, "seal" },
172 { Opt_noac
, "noac" },
174 { Opt_mfsymlinks
, "mfsymlinks" },
175 { Opt_multiuser
, "multiuser" },
176 { Opt_sloppy
, "sloppy" },
177 { Opt_nosharesock
, "nosharesock" },
178 { Opt_persistent
, "persistenthandles"},
179 { Opt_nopersistent
, "nopersistenthandles"},
180 { Opt_resilient
, "resilienthandles"},
181 { Opt_noresilient
, "noresilienthandles"},
183 { Opt_backupuid
, "backupuid=%s" },
184 { Opt_backupgid
, "backupgid=%s" },
185 { Opt_uid
, "uid=%s" },
186 { Opt_cruid
, "cruid=%s" },
187 { Opt_gid
, "gid=%s" },
188 { Opt_file_mode
, "file_mode=%s" },
189 { Opt_dirmode
, "dirmode=%s" },
190 { Opt_dirmode
, "dir_mode=%s" },
191 { Opt_port
, "port=%s" },
192 { Opt_rsize
, "rsize=%s" },
193 { Opt_wsize
, "wsize=%s" },
194 { Opt_actimeo
, "actimeo=%s" },
196 { Opt_blank_user
, "user=" },
197 { Opt_blank_user
, "username=" },
198 { Opt_user
, "user=%s" },
199 { Opt_user
, "username=%s" },
200 { Opt_blank_pass
, "pass=" },
201 { Opt_blank_pass
, "password=" },
202 { Opt_pass
, "pass=%s" },
203 { Opt_pass
, "password=%s" },
204 { Opt_blank_ip
, "ip=" },
205 { Opt_blank_ip
, "addr=" },
207 { Opt_ip
, "addr=%s" },
208 { Opt_ignore
, "unc=%s" },
209 { Opt_ignore
, "target=%s" },
210 { Opt_ignore
, "path=%s" },
211 { Opt_domain
, "dom=%s" },
212 { Opt_domain
, "domain=%s" },
213 { Opt_domain
, "workgroup=%s" },
214 { Opt_srcaddr
, "srcaddr=%s" },
215 { Opt_ignore
, "prefixpath=%s" },
216 { Opt_iocharset
, "iocharset=%s" },
217 { Opt_netbiosname
, "netbiosname=%s" },
218 { Opt_servern
, "servern=%s" },
219 { Opt_ver
, "ver=%s" },
220 { Opt_vers
, "vers=%s" },
221 { Opt_sec
, "sec=%s" },
222 { Opt_cache
, "cache=%s" },
224 { Opt_ignore
, "cred" },
225 { Opt_ignore
, "credentials" },
226 { Opt_ignore
, "cred=%s" },
227 { Opt_ignore
, "credentials=%s" },
228 { Opt_ignore
, "guest" },
229 { Opt_ignore
, "rw" },
230 { Opt_ignore
, "ro" },
231 { Opt_ignore
, "suid" },
232 { Opt_ignore
, "nosuid" },
233 { Opt_ignore
, "exec" },
234 { Opt_ignore
, "noexec" },
235 { Opt_ignore
, "nodev" },
236 { Opt_ignore
, "noauto" },
237 { Opt_ignore
, "dev" },
238 { Opt_ignore
, "mand" },
239 { Opt_ignore
, "nomand" },
240 { Opt_ignore
, "_netdev" },
246 Opt_sec_krb5
, Opt_sec_krb5i
, Opt_sec_krb5p
,
247 Opt_sec_ntlmsspi
, Opt_sec_ntlmssp
,
248 Opt_ntlm
, Opt_sec_ntlmi
, Opt_sec_ntlmv2
,
249 Opt_sec_ntlmv2i
, Opt_sec_lanman
,
255 static const match_table_t cifs_secflavor_tokens
= {
256 { Opt_sec_krb5
, "krb5" },
257 { Opt_sec_krb5i
, "krb5i" },
258 { Opt_sec_krb5p
, "krb5p" },
259 { Opt_sec_ntlmsspi
, "ntlmsspi" },
260 { Opt_sec_ntlmssp
, "ntlmssp" },
261 { Opt_ntlm
, "ntlm" },
262 { Opt_sec_ntlmi
, "ntlmi" },
263 { Opt_sec_ntlmv2
, "nontlm" },
264 { Opt_sec_ntlmv2
, "ntlmv2" },
265 { Opt_sec_ntlmv2i
, "ntlmv2i" },
266 { Opt_sec_lanman
, "lanman" },
267 { Opt_sec_none
, "none" },
269 { Opt_sec_err
, NULL
}
280 static const match_table_t cifs_cacheflavor_tokens
= {
281 { Opt_cache_loose
, "loose" },
282 { Opt_cache_strict
, "strict" },
283 { Opt_cache_none
, "none" },
284 { Opt_cache_err
, NULL
}
287 static const match_table_t cifs_smb_version_tokens
= {
288 { Smb_1
, SMB1_VERSION_STRING
},
289 { Smb_20
, SMB20_VERSION_STRING
},
290 { Smb_21
, SMB21_VERSION_STRING
},
291 { Smb_30
, SMB30_VERSION_STRING
},
292 { Smb_302
, SMB302_VERSION_STRING
},
293 #ifdef CONFIG_CIFS_SMB311
294 { Smb_311
, SMB311_VERSION_STRING
},
295 { Smb_311
, ALT_SMB311_VERSION_STRING
},
297 { Smb_version_err
, NULL
}
300 static int ip_connect(struct TCP_Server_Info
*server
);
301 static int generic_ip_connect(struct TCP_Server_Info
*server
);
302 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
303 static void cifs_prune_tlinks(struct work_struct
*work
);
304 static int cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
305 const char *devname
);
308 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
309 * get their ip addresses changed at some point.
311 * This should be called with server->srv_mutex held.
313 #ifdef CONFIG_CIFS_DFS_UPCALL
314 static int reconn_set_ipaddr(struct TCP_Server_Info
*server
)
318 char *unc
, *ipaddr
= NULL
;
320 if (!server
->hostname
)
323 len
= strlen(server
->hostname
) + 3;
325 unc
= kmalloc(len
, GFP_KERNEL
);
327 cifs_dbg(FYI
, "%s: failed to create UNC path\n", __func__
);
330 snprintf(unc
, len
, "\\\\%s", server
->hostname
);
332 rc
= dns_resolve_server_name_to_ip(unc
, &ipaddr
);
336 cifs_dbg(FYI
, "%s: failed to resolve server part of %s to IP: %d\n",
337 __func__
, server
->hostname
, rc
);
341 spin_lock(&cifs_tcp_ses_lock
);
342 rc
= cifs_convert_address((struct sockaddr
*)&server
->dstaddr
, ipaddr
,
344 spin_unlock(&cifs_tcp_ses_lock
);
350 static inline int reconn_set_ipaddr(struct TCP_Server_Info
*server
)
357 * cifs tcp session reconnection
359 * mark tcp session as reconnecting so temporarily locked
360 * mark all smb sessions as reconnecting for tcp session
361 * reconnect tcp session
362 * wake up waiters on reconnection? - (not needed currently)
365 cifs_reconnect(struct TCP_Server_Info
*server
)
368 struct list_head
*tmp
, *tmp2
;
369 struct cifs_ses
*ses
;
370 struct cifs_tcon
*tcon
;
371 struct mid_q_entry
*mid_entry
;
372 struct list_head retry_list
;
374 spin_lock(&GlobalMid_Lock
);
375 if (server
->tcpStatus
== CifsExiting
) {
376 /* the demux thread will exit normally
377 next time through the loop */
378 spin_unlock(&GlobalMid_Lock
);
381 server
->tcpStatus
= CifsNeedReconnect
;
382 spin_unlock(&GlobalMid_Lock
);
384 #ifdef CONFIG_CIFS_SMB2
385 server
->max_read
= 0;
388 cifs_dbg(FYI
, "Reconnecting tcp session\n");
390 /* before reconnecting the tcp session, mark the smb session (uid)
391 and the tid bad so they are not used until reconnected */
392 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
394 spin_lock(&cifs_tcp_ses_lock
);
395 list_for_each(tmp
, &server
->smb_ses_list
) {
396 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
397 ses
->need_reconnect
= true;
399 list_for_each(tmp2
, &ses
->tcon_list
) {
400 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
401 tcon
->need_reconnect
= true;
404 spin_unlock(&cifs_tcp_ses_lock
);
406 /* do not want to be sending data on a socket we are freeing */
407 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
408 mutex_lock(&server
->srv_mutex
);
409 if (server
->ssocket
) {
410 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
411 server
->ssocket
->state
, server
->ssocket
->flags
);
412 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
413 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
414 server
->ssocket
->state
, server
->ssocket
->flags
);
415 sock_release(server
->ssocket
);
416 server
->ssocket
= NULL
;
418 server
->sequence_number
= 0;
419 server
->session_estab
= false;
420 kfree(server
->session_key
.response
);
421 server
->session_key
.response
= NULL
;
422 server
->session_key
.len
= 0;
423 server
->lstrp
= jiffies
;
425 /* mark submitted MIDs for retry and issue callback */
426 INIT_LIST_HEAD(&retry_list
);
427 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
428 spin_lock(&GlobalMid_Lock
);
429 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
430 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
431 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
432 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
433 list_move(&mid_entry
->qhead
, &retry_list
);
435 spin_unlock(&GlobalMid_Lock
);
436 mutex_unlock(&server
->srv_mutex
);
438 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
439 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
440 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
441 list_del_init(&mid_entry
->qhead
);
442 mid_entry
->callback(mid_entry
);
448 /* we should try only the port we connected to before */
449 mutex_lock(&server
->srv_mutex
);
450 rc
= generic_ip_connect(server
);
452 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
453 rc
= reconn_set_ipaddr(server
);
455 cifs_dbg(FYI
, "%s: failed to resolve hostname: %d\n",
458 mutex_unlock(&server
->srv_mutex
);
461 atomic_inc(&tcpSesReconnectCount
);
462 spin_lock(&GlobalMid_Lock
);
463 if (server
->tcpStatus
!= CifsExiting
)
464 server
->tcpStatus
= CifsNeedNegotiate
;
465 spin_unlock(&GlobalMid_Lock
);
466 mutex_unlock(&server
->srv_mutex
);
468 } while (server
->tcpStatus
== CifsNeedReconnect
);
470 if (server
->tcpStatus
== CifsNeedNegotiate
)
471 mod_delayed_work(cifsiod_wq
, &server
->echo
, 0);
477 cifs_echo_request(struct work_struct
*work
)
480 struct TCP_Server_Info
*server
= container_of(work
,
481 struct TCP_Server_Info
, echo
.work
);
482 unsigned long echo_interval
;
485 * If we need to renegotiate, set echo interval to zero to
486 * immediately call echo service where we can renegotiate.
488 if (server
->tcpStatus
== CifsNeedNegotiate
)
491 echo_interval
= SMB_ECHO_INTERVAL
;
494 * We cannot send an echo if it is disabled.
495 * Also, no need to ping if we got a response recently.
498 if (server
->tcpStatus
== CifsNeedReconnect
||
499 server
->tcpStatus
== CifsExiting
||
500 server
->tcpStatus
== CifsNew
||
501 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
502 time_before(jiffies
, server
->lstrp
+ echo_interval
- HZ
))
505 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
507 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
511 queue_delayed_work(cifsiod_wq
, &server
->echo
, SMB_ECHO_INTERVAL
);
515 allocate_buffers(struct TCP_Server_Info
*server
)
517 if (!server
->bigbuf
) {
518 server
->bigbuf
= (char *)cifs_buf_get();
519 if (!server
->bigbuf
) {
520 cifs_dbg(VFS
, "No memory for large SMB response\n");
522 /* retry will check if exiting */
525 } else if (server
->large_buf
) {
526 /* we are reusing a dirty large buf, clear its start */
527 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
530 if (!server
->smallbuf
) {
531 server
->smallbuf
= (char *)cifs_small_buf_get();
532 if (!server
->smallbuf
) {
533 cifs_dbg(VFS
, "No memory for SMB response\n");
535 /* retry will check if exiting */
538 /* beginning of smb buffer is cleared in our buf_get */
540 /* if existing small buf clear beginning */
541 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
548 server_unresponsive(struct TCP_Server_Info
*server
)
551 * We need to wait 3 echo intervals to make sure we handle such
553 * 1s client sends a normal SMB request
554 * 3s client gets a response
555 * 30s echo workqueue job pops, and decides we got a response recently
556 * and don't need to send another
558 * 65s kernel_recvmsg times out, and we see that we haven't gotten
559 * a response in >60s.
561 if ((server
->tcpStatus
== CifsGood
||
562 server
->tcpStatus
== CifsNeedNegotiate
) &&
563 time_after(jiffies
, server
->lstrp
+ 3 * SMB_ECHO_INTERVAL
)) {
564 cifs_dbg(VFS
, "Server %s has not responded in %d seconds. Reconnecting...\n",
565 server
->hostname
, (3 * SMB_ECHO_INTERVAL
) / HZ
);
566 cifs_reconnect(server
);
567 wake_up(&server
->response_q
);
575 * kvec_array_init - clone a kvec array, and advance into it
576 * @new: pointer to memory for cloned array
577 * @iov: pointer to original array
578 * @nr_segs: number of members in original array
579 * @bytes: number of bytes to advance into the cloned array
581 * This function will copy the array provided in iov to a section of memory
582 * and advance the specified number of bytes into the new array. It returns
583 * the number of segments in the new array. "new" must be at least as big as
584 * the original iov array.
587 kvec_array_init(struct kvec
*new, struct kvec
*iov
, unsigned int nr_segs
,
592 while (bytes
|| !iov
->iov_len
) {
593 int copy
= min(bytes
, iov
->iov_len
);
597 if (iov
->iov_len
== base
) {
603 memcpy(new, iov
, sizeof(*iov
) * nr_segs
);
604 new->iov_base
+= base
;
605 new->iov_len
-= base
;
610 get_server_iovec(struct TCP_Server_Info
*server
, unsigned int nr_segs
)
612 struct kvec
*new_iov
;
614 if (server
->iov
&& nr_segs
<= server
->nr_iov
)
617 /* not big enough -- allocate a new one and release the old */
618 new_iov
= kmalloc(sizeof(*new_iov
) * nr_segs
, GFP_NOFS
);
621 server
->iov
= new_iov
;
622 server
->nr_iov
= nr_segs
;
628 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct kvec
*iov_orig
,
629 unsigned int nr_segs
, unsigned int to_read
)
634 struct msghdr smb_msg
;
637 iov
= get_server_iovec(server
, nr_segs
);
641 smb_msg
.msg_control
= NULL
;
642 smb_msg
.msg_controllen
= 0;
644 for (total_read
= 0; to_read
; total_read
+= length
, to_read
-= length
) {
647 if (server_unresponsive(server
)) {
648 total_read
= -ECONNABORTED
;
652 segs
= kvec_array_init(iov
, iov_orig
, nr_segs
, total_read
);
654 length
= kernel_recvmsg(server
->ssocket
, &smb_msg
,
655 iov
, segs
, to_read
, 0);
657 if (server
->tcpStatus
== CifsExiting
) {
658 total_read
= -ESHUTDOWN
;
660 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
661 cifs_reconnect(server
);
662 total_read
= -ECONNABORTED
;
664 } else if (length
== -ERESTARTSYS
||
668 * Minimum sleep to prevent looping, allowing socket
669 * to clear and app threads to set tcpStatus
670 * CifsNeedReconnect if server hung.
672 usleep_range(1000, 2000);
675 } else if (length
<= 0) {
676 cifs_dbg(FYI
, "Received no data or error: expecting %d\n"
677 "got %d", to_read
, length
);
678 cifs_reconnect(server
);
679 total_read
= -ECONNABORTED
;
687 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
688 unsigned int to_read
)
693 iov
.iov_len
= to_read
;
695 return cifs_readv_from_socket(server
, &iov
, 1, to_read
);
699 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
702 * The first byte big endian of the length field,
703 * is actually not part of the length but the type
704 * with the most common, zero, as regular data.
707 case RFC1002_SESSION_MESSAGE
:
708 /* Regular SMB response */
710 case RFC1002_SESSION_KEEP_ALIVE
:
711 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
713 case RFC1002_POSITIVE_SESSION_RESPONSE
:
714 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
716 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
718 * We get this from Windows 98 instead of an error on
719 * SMB negprot response.
721 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
722 /* give server a second to clean up */
725 * Always try 445 first on reconnect since we get NACK
726 * on some if we ever connected to port 139 (the NACK
727 * is since we do not begin with RFC1001 session
730 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
731 cifs_reconnect(server
);
732 wake_up(&server
->response_q
);
735 cifs_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
736 cifs_reconnect(server
);
743 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
745 #ifdef CONFIG_CIFS_STATS2
746 mid
->when_received
= jiffies
;
748 spin_lock(&GlobalMid_Lock
);
750 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
752 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
753 list_del_init(&mid
->qhead
);
754 spin_unlock(&GlobalMid_Lock
);
758 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
759 char *buf
, int malformed
)
761 if (server
->ops
->check_trans2
&&
762 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
765 mid
->large_buf
= server
->large_buf
;
766 /* Was previous buf put in mpx struct for multi-rsp? */
767 if (!mid
->multiRsp
) {
768 /* smb buffer will be freed by user thread */
769 if (server
->large_buf
)
770 server
->bigbuf
= NULL
;
772 server
->smallbuf
= NULL
;
774 dequeue_mid(mid
, malformed
);
777 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
781 /* take it off the list, if it's not already */
782 spin_lock(&cifs_tcp_ses_lock
);
783 list_del_init(&server
->tcp_ses_list
);
784 spin_unlock(&cifs_tcp_ses_lock
);
786 spin_lock(&GlobalMid_Lock
);
787 server
->tcpStatus
= CifsExiting
;
788 spin_unlock(&GlobalMid_Lock
);
789 wake_up_all(&server
->response_q
);
791 /* check if we have blocked requests that need to free */
792 spin_lock(&server
->req_lock
);
793 if (server
->credits
<= 0)
795 spin_unlock(&server
->req_lock
);
797 * Although there should not be any requests blocked on this queue it
798 * can not hurt to be paranoid and try to wake up requests that may
799 * haven been blocked when more than 50 at time were on the wire to the
800 * same server - they now will see the session is in exit state and get
801 * out of SendReceive.
803 wake_up_all(&server
->request_q
);
804 /* give those requests time to exit */
807 if (server
->ssocket
) {
808 sock_release(server
->ssocket
);
809 server
->ssocket
= NULL
;
812 if (!list_empty(&server
->pending_mid_q
)) {
813 struct list_head dispose_list
;
814 struct mid_q_entry
*mid_entry
;
815 struct list_head
*tmp
, *tmp2
;
817 INIT_LIST_HEAD(&dispose_list
);
818 spin_lock(&GlobalMid_Lock
);
819 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
820 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
821 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
822 mid_entry
->mid_state
= MID_SHUTDOWN
;
823 list_move(&mid_entry
->qhead
, &dispose_list
);
825 spin_unlock(&GlobalMid_Lock
);
827 /* now walk dispose list and issue callbacks */
828 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
829 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
830 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
831 list_del_init(&mid_entry
->qhead
);
832 mid_entry
->callback(mid_entry
);
834 /* 1/8th of sec is more than enough time for them to exit */
838 if (!list_empty(&server
->pending_mid_q
)) {
840 * mpx threads have not exited yet give them at least the smb
841 * send timeout time for long ops.
843 * Due to delays on oplock break requests, we need to wait at
844 * least 45 seconds before giving up on a request getting a
845 * response and going ahead and killing cifsd.
847 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
850 * If threads still have not exited they are probably never
851 * coming home not much else we can do but free the memory.
855 kfree(server
->hostname
);
859 length
= atomic_dec_return(&tcpSesAllocCount
);
861 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
865 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
868 char *buf
= server
->smallbuf
;
869 unsigned int pdu_length
= get_rfc1002_length(buf
);
871 /* make sure this will fit in a large buffer */
872 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) - 4) {
873 cifs_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
874 cifs_reconnect(server
);
875 wake_up(&server
->response_q
);
876 return -ECONNABORTED
;
879 /* switch to large buffer if too big for a small one */
880 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
881 server
->large_buf
= true;
882 memcpy(server
->bigbuf
, buf
, server
->total_read
);
883 buf
= server
->bigbuf
;
886 /* now read the rest */
887 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
888 pdu_length
- HEADER_SIZE(server
) + 1 + 4);
891 server
->total_read
+= length
;
893 dump_smb(buf
, server
->total_read
);
896 * We know that we received enough to get to the MID as we
897 * checked the pdu_length earlier. Now check to see
898 * if the rest of the header is OK. We borrow the length
899 * var for the rest of the loop to avoid a new stack var.
901 * 48 bytes is enough to display the header and a little bit
902 * into the payload for debugging purposes.
904 length
= server
->ops
->check_message(buf
, server
->total_read
);
906 cifs_dump_mem("Bad SMB: ", buf
,
907 min_t(unsigned int, server
->total_read
, 48));
909 if (server
->ops
->is_session_expired
&&
910 server
->ops
->is_session_expired(buf
)) {
911 cifs_reconnect(server
);
912 wake_up(&server
->response_q
);
916 if (server
->ops
->is_status_pending
&&
917 server
->ops
->is_status_pending(buf
, server
, length
))
923 handle_mid(mid
, server
, buf
, length
);
928 cifs_demultiplex_thread(void *p
)
931 struct TCP_Server_Info
*server
= p
;
932 unsigned int pdu_length
;
934 struct task_struct
*task_to_wake
= NULL
;
935 struct mid_q_entry
*mid_entry
;
937 current
->flags
|= PF_MEMALLOC
;
938 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
940 length
= atomic_inc_return(&tcpSesAllocCount
);
942 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
945 allow_kernel_signal(SIGKILL
);
946 while (server
->tcpStatus
!= CifsExiting
) {
950 if (!allocate_buffers(server
))
953 server
->large_buf
= false;
954 buf
= server
->smallbuf
;
955 pdu_length
= 4; /* enough to get RFC1001 header */
957 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
960 server
->total_read
= length
;
963 * The right amount was read from socket - 4 bytes,
964 * so we can now interpret the length field.
966 pdu_length
= get_rfc1002_length(buf
);
968 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
969 if (!is_smb_response(server
, buf
[0]))
972 /* make sure we have enough to get to the MID */
973 if (pdu_length
< HEADER_SIZE(server
) - 1 - 4) {
974 cifs_dbg(VFS
, "SMB response too short (%u bytes)\n",
976 cifs_reconnect(server
);
977 wake_up(&server
->response_q
);
981 /* read down to the MID */
982 length
= cifs_read_from_socket(server
, buf
+ 4,
983 HEADER_SIZE(server
) - 1 - 4);
986 server
->total_read
+= length
;
988 mid_entry
= server
->ops
->find_mid(server
, buf
);
990 if (!mid_entry
|| !mid_entry
->receive
)
991 length
= standard_receive3(server
, mid_entry
);
993 length
= mid_entry
->receive(server
, mid_entry
);
998 if (server
->large_buf
)
999 buf
= server
->bigbuf
;
1001 server
->lstrp
= jiffies
;
1002 if (mid_entry
!= NULL
) {
1003 if ((mid_entry
->mid_flags
& MID_WAIT_CANCELLED
) &&
1004 mid_entry
->mid_state
== MID_RESPONSE_RECEIVED
&&
1005 server
->ops
->handle_cancelled_mid
)
1006 server
->ops
->handle_cancelled_mid(
1007 mid_entry
->resp_buf
,
1010 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
1011 mid_entry
->callback(mid_entry
);
1012 } else if (server
->ops
->is_oplock_break
&&
1013 server
->ops
->is_oplock_break(buf
, server
)) {
1014 cifs_dbg(FYI
, "Received oplock break\n");
1016 cifs_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
1017 atomic_read(&midCount
));
1018 cifs_dump_mem("Received Data is: ", buf
,
1019 HEADER_SIZE(server
));
1020 #ifdef CONFIG_CIFS_DEBUG2
1021 if (server
->ops
->dump_detail
)
1022 server
->ops
->dump_detail(buf
);
1023 cifs_dump_mids(server
);
1024 #endif /* CIFS_DEBUG2 */
1027 } /* end while !EXITING */
1029 /* buffer usually freed in free_mid - need to free it here on exit */
1030 cifs_buf_release(server
->bigbuf
);
1031 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
1032 cifs_small_buf_release(server
->smallbuf
);
1034 task_to_wake
= xchg(&server
->tsk
, NULL
);
1035 clean_demultiplex_info(server
);
1037 /* if server->tsk was NULL then wait for a signal before exiting */
1038 if (!task_to_wake
) {
1039 set_current_state(TASK_INTERRUPTIBLE
);
1040 while (!signal_pending(current
)) {
1042 set_current_state(TASK_INTERRUPTIBLE
);
1044 set_current_state(TASK_RUNNING
);
1047 module_put_and_exit(0);
1050 /* extract the host portion of the UNC string */
1052 extract_hostname(const char *unc
)
1058 /* skip double chars at beginning of string */
1059 /* BB: check validity of these bytes? */
1062 /* delimiter between hostname and sharename is always '\\' now */
1063 delim
= strchr(src
, '\\');
1065 return ERR_PTR(-EINVAL
);
1068 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
1070 return ERR_PTR(-ENOMEM
);
1072 memcpy(dst
, src
, len
);
1078 static int get_option_ul(substring_t args
[], unsigned long *option
)
1083 string
= match_strdup(args
);
1086 rc
= kstrtoul(string
, 0, option
);
1092 static int get_option_uid(substring_t args
[], kuid_t
*result
)
1094 unsigned long value
;
1098 rc
= get_option_ul(args
, &value
);
1102 uid
= make_kuid(current_user_ns(), value
);
1103 if (!uid_valid(uid
))
1110 static int get_option_gid(substring_t args
[], kgid_t
*result
)
1112 unsigned long value
;
1116 rc
= get_option_ul(args
, &value
);
1120 gid
= make_kgid(current_user_ns(), value
);
1121 if (!gid_valid(gid
))
1128 static int cifs_parse_security_flavors(char *value
,
1129 struct smb_vol
*vol
)
1132 substring_t args
[MAX_OPT_ARGS
];
1135 * With mount options, the last one should win. Reset any existing
1136 * settings back to default.
1138 vol
->sectype
= Unspecified
;
1141 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1143 cifs_dbg(VFS
, "sec=krb5p is not supported!\n");
1149 vol
->sectype
= Kerberos
;
1151 case Opt_sec_ntlmsspi
:
1154 case Opt_sec_ntlmssp
:
1155 vol
->sectype
= RawNTLMSSP
;
1161 vol
->sectype
= NTLM
;
1163 case Opt_sec_ntlmv2i
:
1166 case Opt_sec_ntlmv2
:
1167 vol
->sectype
= NTLMv2
;
1169 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1170 case Opt_sec_lanman
:
1171 vol
->sectype
= LANMAN
;
1178 cifs_dbg(VFS
, "bad security option: %s\n", value
);
1186 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1188 substring_t args
[MAX_OPT_ARGS
];
1190 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1191 case Opt_cache_loose
:
1192 vol
->direct_io
= false;
1193 vol
->strict_io
= false;
1195 case Opt_cache_strict
:
1196 vol
->direct_io
= false;
1197 vol
->strict_io
= true;
1199 case Opt_cache_none
:
1200 vol
->direct_io
= true;
1201 vol
->strict_io
= false;
1204 cifs_dbg(VFS
, "bad cache= option: %s\n", value
);
1211 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1213 substring_t args
[MAX_OPT_ARGS
];
1215 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1217 vol
->ops
= &smb1_operations
;
1218 vol
->vals
= &smb1_values
;
1220 #ifdef CONFIG_CIFS_SMB2
1222 vol
->ops
= &smb20_operations
;
1223 vol
->vals
= &smb20_values
;
1226 vol
->ops
= &smb21_operations
;
1227 vol
->vals
= &smb21_values
;
1230 vol
->ops
= &smb30_operations
;
1231 vol
->vals
= &smb30_values
;
1234 vol
->ops
= &smb30_operations
; /* currently identical with 3.0 */
1235 vol
->vals
= &smb302_values
;
1237 #ifdef CONFIG_CIFS_SMB311
1239 vol
->ops
= &smb311_operations
;
1240 vol
->vals
= &smb311_values
;
1245 cifs_dbg(VFS
, "Unknown vers= option specified: %s\n", value
);
1252 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1253 * fields with the result. Returns 0 on success and an error otherwise.
1256 cifs_parse_devname(const char *devname
, struct smb_vol
*vol
)
1259 const char *delims
= "/\\";
1262 if (unlikely(!devname
|| !*devname
)) {
1263 cifs_dbg(VFS
, "Device name not specified.\n");
1267 /* make sure we have a valid UNC double delimiter prefix */
1268 len
= strspn(devname
, delims
);
1272 /* find delimiter between host and sharename */
1273 pos
= strpbrk(devname
+ 2, delims
);
1277 /* skip past delimiter */
1280 /* now go until next delimiter or end of string */
1281 len
= strcspn(pos
, delims
);
1283 /* move "pos" up to delimiter or NULL */
1285 vol
->UNC
= kstrndup(devname
, pos
- devname
, GFP_KERNEL
);
1289 convert_delimiter(vol
->UNC
, '\\');
1291 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1292 if (!*pos
++ || !*pos
)
1295 vol
->prepath
= kstrdup(pos
, GFP_KERNEL
);
1303 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1304 struct smb_vol
*vol
)
1307 char *mountdata_copy
= NULL
, *options
;
1308 unsigned int temp_len
, i
, j
;
1310 short int override_uid
= -1;
1311 short int override_gid
= -1;
1312 bool uid_specified
= false;
1313 bool gid_specified
= false;
1314 bool sloppy
= false;
1315 char *invalid
= NULL
;
1316 char *nodename
= utsname()->nodename
;
1317 char *string
= NULL
;
1318 char *tmp_end
, *value
;
1320 bool got_ip
= false;
1321 unsigned short port
= 0;
1322 struct sockaddr
*dstaddr
= (struct sockaddr
*)&vol
->dstaddr
;
1326 delim
= separator
[0];
1328 /* ensure we always start with zeroed-out smb_vol */
1329 memset(vol
, 0, sizeof(*vol
));
1332 * does not have to be perfect mapping since field is
1333 * informational, only used for servers that do not support
1334 * port 445 and it can be overridden at mount time
1336 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1337 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1338 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1340 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1341 /* null target name indicates to use *SMBSERVR default called name
1342 if we end up sending RFC1001 session initialize */
1343 vol
->target_rfc1001_name
[0] = 0;
1344 vol
->cred_uid
= current_uid();
1345 vol
->linux_uid
= current_uid();
1346 vol
->linux_gid
= current_gid();
1349 * default to SFM style remapping of seven reserved characters
1350 * unless user overrides it or we negotiate CIFS POSIX where
1351 * it is unnecessary. Can not simultaneously use more than one mapping
1352 * since then readdir could list files that open could not open
1356 /* default to only allowing write access to owner of the mount */
1357 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1359 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1360 /* default is always to request posix paths. */
1361 vol
->posix_paths
= 1;
1362 /* default to using server inode numbers where available */
1363 vol
->server_ino
= 1;
1365 /* default is to use strict cifs caching semantics */
1366 vol
->strict_io
= true;
1368 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1370 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1371 vol
->ops
= &smb1_operations
;
1372 vol
->vals
= &smb1_values
;
1375 goto cifs_parse_mount_err
;
1377 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1378 if (!mountdata_copy
)
1379 goto cifs_parse_mount_err
;
1381 options
= mountdata_copy
;
1382 end
= options
+ strlen(options
);
1384 if (strncmp(options
, "sep=", 4) == 0) {
1385 if (options
[4] != 0) {
1386 separator
[0] = options
[4];
1389 cifs_dbg(FYI
, "Null separator not allowed\n");
1392 vol
->backupuid_specified
= false; /* no backup intent for a user */
1393 vol
->backupgid_specified
= false; /* no backup intent for a group */
1395 switch (cifs_parse_devname(devname
, vol
)) {
1399 cifs_dbg(VFS
, "Unable to allocate memory for devname.\n");
1400 goto cifs_parse_mount_err
;
1402 cifs_dbg(VFS
, "Malformed UNC in devname.\n");
1403 goto cifs_parse_mount_err
;
1405 cifs_dbg(VFS
, "Unknown error parsing devname.\n");
1406 goto cifs_parse_mount_err
;
1409 while ((data
= strsep(&options
, separator
)) != NULL
) {
1410 substring_t args
[MAX_OPT_ARGS
];
1411 unsigned long option
;
1417 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1421 /* Ingnore the following */
1425 /* Boolean values */
1426 case Opt_user_xattr
:
1429 case Opt_nouser_xattr
:
1435 case Opt_noforceuid
:
1441 case Opt_noforcegid
:
1444 case Opt_noblocksend
:
1445 vol
->noblocksnd
= 1;
1447 case Opt_noautotune
:
1448 vol
->noautotune
= 1;
1463 vol
->sfu_remap
= true;
1464 vol
->remap
= false; /* disable SFM mapping */
1466 case Opt_nomapchars
:
1467 vol
->sfu_remap
= false;
1471 vol
->sfu_remap
= false; /* disable SFU mapping */
1473 case Opt_nomapposix
:
1485 case Opt_posixpaths
:
1486 vol
->posix_paths
= 1;
1488 case Opt_noposixpaths
:
1489 vol
->posix_paths
= 0;
1492 vol
->no_linux_ext
= 1;
1503 * turn off mandatory locking in mode
1504 * if remote locking is turned off since the
1505 * local vfs will do advisory
1507 if (vol
->file_mode
==
1508 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1509 vol
->file_mode
= S_IALLUGO
;
1511 case Opt_forcemandatorylock
:
1521 vol
->dynperm
= true;
1524 vol
->dynperm
= false;
1538 case Opt_nostrictsync
:
1539 vol
->nostrictsync
= 1;
1541 case Opt_strictsync
:
1542 vol
->nostrictsync
= 0;
1545 vol
->server_ino
= 1;
1547 case Opt_noserverino
:
1548 vol
->server_ino
= 0;
1550 case Opt_rwpidforward
:
1551 vol
->rwpidforward
= 1;
1560 vol
->no_psx_acl
= 0;
1563 vol
->no_psx_acl
= 1;
1565 case Opt_locallease
:
1566 vol
->local_lease
= 1;
1572 /* we do not do the following in secFlags because seal
1573 * is a per tree connection (mount) not a per socket
1574 * or per-smb connection option in the protocol
1575 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1580 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1583 #ifndef CONFIG_CIFS_FSCACHE
1584 cifs_dbg(VFS
, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1585 goto cifs_parse_mount_err
;
1589 case Opt_mfsymlinks
:
1590 vol
->mfsymlinks
= true;
1593 vol
->multiuser
= true;
1598 case Opt_nosharesock
:
1599 vol
->nosharesock
= true;
1601 case Opt_nopersistent
:
1602 vol
->nopersistent
= true;
1603 if (vol
->persistent
) {
1605 "persistenthandles mount options conflict\n");
1606 goto cifs_parse_mount_err
;
1609 case Opt_persistent
:
1610 vol
->persistent
= true;
1611 if ((vol
->nopersistent
) || (vol
->resilient
)) {
1613 "persistenthandles mount options conflict\n");
1614 goto cifs_parse_mount_err
;
1618 vol
->resilient
= true;
1619 if (vol
->persistent
) {
1621 "persistenthandles mount options conflict\n");
1622 goto cifs_parse_mount_err
;
1625 case Opt_noresilient
:
1626 vol
->resilient
= false; /* already the default */
1629 /* Numeric Values */
1631 if (get_option_uid(args
, &vol
->backupuid
)) {
1632 cifs_dbg(VFS
, "%s: Invalid backupuid value\n",
1634 goto cifs_parse_mount_err
;
1636 vol
->backupuid_specified
= true;
1639 if (get_option_gid(args
, &vol
->backupgid
)) {
1640 cifs_dbg(VFS
, "%s: Invalid backupgid value\n",
1642 goto cifs_parse_mount_err
;
1644 vol
->backupgid_specified
= true;
1647 if (get_option_uid(args
, &vol
->linux_uid
)) {
1648 cifs_dbg(VFS
, "%s: Invalid uid value\n",
1650 goto cifs_parse_mount_err
;
1652 uid_specified
= true;
1655 if (get_option_uid(args
, &vol
->cred_uid
)) {
1656 cifs_dbg(VFS
, "%s: Invalid cruid value\n",
1658 goto cifs_parse_mount_err
;
1662 if (get_option_gid(args
, &vol
->linux_gid
)) {
1663 cifs_dbg(VFS
, "%s: Invalid gid value\n",
1665 goto cifs_parse_mount_err
;
1667 gid_specified
= true;
1670 if (get_option_ul(args
, &option
)) {
1671 cifs_dbg(VFS
, "%s: Invalid file_mode value\n",
1673 goto cifs_parse_mount_err
;
1675 vol
->file_mode
= option
;
1678 if (get_option_ul(args
, &option
)) {
1679 cifs_dbg(VFS
, "%s: Invalid dir_mode value\n",
1681 goto cifs_parse_mount_err
;
1683 vol
->dir_mode
= option
;
1686 if (get_option_ul(args
, &option
) ||
1687 option
> USHRT_MAX
) {
1688 cifs_dbg(VFS
, "%s: Invalid port value\n",
1690 goto cifs_parse_mount_err
;
1692 port
= (unsigned short)option
;
1695 if (get_option_ul(args
, &option
)) {
1696 cifs_dbg(VFS
, "%s: Invalid rsize value\n",
1698 goto cifs_parse_mount_err
;
1700 vol
->rsize
= option
;
1703 if (get_option_ul(args
, &option
)) {
1704 cifs_dbg(VFS
, "%s: Invalid wsize value\n",
1706 goto cifs_parse_mount_err
;
1708 vol
->wsize
= option
;
1711 if (get_option_ul(args
, &option
)) {
1712 cifs_dbg(VFS
, "%s: Invalid actimeo value\n",
1714 goto cifs_parse_mount_err
;
1716 vol
->actimeo
= HZ
* option
;
1717 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1718 cifs_dbg(VFS
, "attribute cache timeout too large\n");
1719 goto cifs_parse_mount_err
;
1723 /* String Arguments */
1725 case Opt_blank_user
:
1726 /* null user, ie. anonymous authentication */
1728 vol
->username
= NULL
;
1731 string
= match_strdup(args
);
1735 if (strnlen(string
, CIFS_MAX_USERNAME_LEN
) >
1736 CIFS_MAX_USERNAME_LEN
) {
1737 pr_warn("CIFS: username too long\n");
1738 goto cifs_parse_mount_err
;
1741 kfree(vol
->username
);
1742 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1744 goto cifs_parse_mount_err
;
1746 case Opt_blank_pass
:
1747 /* passwords have to be handled differently
1748 * to allow the character used for deliminator
1749 * to be passed within them
1753 * Check if this is a case where the password
1754 * starts with a delimiter
1756 tmp_end
= strchr(data
, '=');
1758 if (!(tmp_end
< end
&& tmp_end
[1] == delim
)) {
1759 /* No it is not. Set the password to NULL */
1760 kzfree(vol
->password
);
1761 vol
->password
= NULL
;
1764 /* Yes it is. Drop down to Opt_pass below.*/
1766 /* Obtain the value string */
1767 value
= strchr(data
, '=');
1770 /* Set tmp_end to end of the string */
1771 tmp_end
= (char *) value
+ strlen(value
);
1773 /* Check if following character is the deliminator
1774 * If yes, we have encountered a double deliminator
1775 * reset the NULL character to the deliminator
1777 if (tmp_end
< end
&& tmp_end
[1] == delim
) {
1780 /* Keep iterating until we get to a single
1781 * deliminator OR the end
1783 while ((tmp_end
= strchr(tmp_end
, delim
))
1784 != NULL
&& (tmp_end
[1] == delim
)) {
1785 tmp_end
= (char *) &tmp_end
[2];
1788 /* Reset var options to point to next element */
1791 options
= (char *) &tmp_end
[1];
1793 /* Reached the end of the mount option
1798 kzfree(vol
->password
);
1799 /* Now build new password string */
1800 temp_len
= strlen(value
);
1801 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1802 if (vol
->password
== NULL
) {
1803 pr_warn("CIFS: no memory for password\n");
1804 goto cifs_parse_mount_err
;
1807 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1808 vol
->password
[j
] = value
[i
];
1809 if ((value
[i
] == delim
) &&
1810 value
[i
+1] == delim
)
1811 /* skip the second deliminator */
1814 vol
->password
[j
] = '\0';
1817 /* FIXME: should this be an error instead? */
1821 string
= match_strdup(args
);
1825 if (!cifs_convert_address(dstaddr
, string
,
1827 pr_err("CIFS: bad ip= option (%s).\n", string
);
1828 goto cifs_parse_mount_err
;
1833 string
= match_strdup(args
);
1837 if (strnlen(string
, CIFS_MAX_DOMAINNAME_LEN
)
1838 == CIFS_MAX_DOMAINNAME_LEN
) {
1839 pr_warn("CIFS: domain name too long\n");
1840 goto cifs_parse_mount_err
;
1843 kfree(vol
->domainname
);
1844 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1845 if (!vol
->domainname
) {
1846 pr_warn("CIFS: no memory for domainname\n");
1847 goto cifs_parse_mount_err
;
1849 cifs_dbg(FYI
, "Domain name set\n");
1852 string
= match_strdup(args
);
1856 if (!cifs_convert_address(
1857 (struct sockaddr
*)&vol
->srcaddr
,
1858 string
, strlen(string
))) {
1859 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1861 goto cifs_parse_mount_err
;
1865 string
= match_strdup(args
);
1869 if (strnlen(string
, 1024) >= 65) {
1870 pr_warn("CIFS: iocharset name too long.\n");
1871 goto cifs_parse_mount_err
;
1874 if (strncasecmp(string
, "default", 7) != 0) {
1875 kfree(vol
->iocharset
);
1876 vol
->iocharset
= kstrdup(string
,
1878 if (!vol
->iocharset
) {
1879 pr_warn("CIFS: no memory for charset\n");
1880 goto cifs_parse_mount_err
;
1883 /* if iocharset not set then load_nls_default
1886 cifs_dbg(FYI
, "iocharset set to %s\n", string
);
1888 case Opt_netbiosname
:
1889 string
= match_strdup(args
);
1893 memset(vol
->source_rfc1001_name
, 0x20,
1896 * FIXME: are there cases in which a comma can
1897 * be valid in workstation netbios name (and
1898 * need special handling)?
1900 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1901 /* don't ucase netbiosname for user */
1904 vol
->source_rfc1001_name
[i
] = string
[i
];
1906 /* The string has 16th byte zero still from
1907 * set at top of the function
1909 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1910 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1913 /* servernetbiosname specified override *SMBSERVER */
1914 string
= match_strdup(args
);
1918 /* last byte, type, is 0x20 for servr type */
1919 memset(vol
->target_rfc1001_name
, 0x20,
1920 RFC1001_NAME_LEN_WITH_NULL
);
1922 /* BB are there cases in which a comma can be
1923 valid in this workstation netbios name
1924 (and need special handling)? */
1926 /* user or mount helper must uppercase the
1928 for (i
= 0; i
< 15; i
++) {
1931 vol
->target_rfc1001_name
[i
] = string
[i
];
1933 /* The string has 16th byte zero still from
1934 set at top of the function */
1935 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1936 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1939 string
= match_strdup(args
);
1943 if (strncasecmp(string
, "1", 1) == 0) {
1944 /* This is the default */
1947 /* For all other value, error */
1948 pr_warn("CIFS: Invalid version specified\n");
1949 goto cifs_parse_mount_err
;
1951 string
= match_strdup(args
);
1955 if (cifs_parse_smb_version(string
, vol
) != 0)
1956 goto cifs_parse_mount_err
;
1959 string
= match_strdup(args
);
1963 if (cifs_parse_security_flavors(string
, vol
) != 0)
1964 goto cifs_parse_mount_err
;
1967 string
= match_strdup(args
);
1971 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1972 goto cifs_parse_mount_err
;
1976 * An option we don't recognize. Save it off for later
1977 * if we haven't already found one
1983 /* Free up any allocated string */
1988 if (!sloppy
&& invalid
) {
1989 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid
);
1990 goto cifs_parse_mount_err
;
1994 /* Muliuser mounts require CONFIG_KEYS support */
1995 if (vol
->multiuser
) {
1996 cifs_dbg(VFS
, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1997 goto cifs_parse_mount_err
;
2001 cifs_dbg(VFS
, "CIFS mount error: No usable UNC path provided in device string!\n");
2002 goto cifs_parse_mount_err
;
2005 /* make sure UNC has a share name */
2006 if (!strchr(vol
->UNC
+ 3, '\\')) {
2007 cifs_dbg(VFS
, "Malformed UNC. Unable to find share name.\n");
2008 goto cifs_parse_mount_err
;
2012 /* No ip= option specified? Try to get it from UNC */
2013 if (!cifs_convert_address(dstaddr
, &vol
->UNC
[2],
2014 strlen(&vol
->UNC
[2]))) {
2015 pr_err("Unable to determine destination address.\n");
2016 goto cifs_parse_mount_err
;
2020 /* set the port that we got earlier */
2021 cifs_set_port(dstaddr
, port
);
2024 vol
->override_uid
= override_uid
;
2025 else if (override_uid
== 1)
2026 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2029 vol
->override_gid
= override_gid
;
2030 else if (override_gid
== 1)
2031 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2033 kfree(mountdata_copy
);
2037 pr_warn("Could not allocate temporary buffer\n");
2038 cifs_parse_mount_err
:
2040 kfree(mountdata_copy
);
2044 /** Returns true if srcaddr isn't specified and rhs isn't
2045 * specified, or if srcaddr is specified and
2046 * matches the IP address of the rhs argument.
2049 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
2051 switch (srcaddr
->sa_family
) {
2053 return (rhs
->sa_family
== AF_UNSPEC
);
2055 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
2056 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
2057 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
2060 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
2061 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
2062 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
2066 return false; /* don't expect to be here */
2071 * If no port is specified in addr structure, we try to match with 445 port
2072 * and if it fails - with 139 ports. It should be called only if address
2073 * families of server and addr are equal.
2076 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
2078 __be16 port
, *sport
;
2080 switch (addr
->sa_family
) {
2082 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
2083 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
2086 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
2087 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
2095 port
= htons(CIFS_PORT
);
2099 port
= htons(RFC1001_PORT
);
2102 return port
== *sport
;
2106 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2107 struct sockaddr
*srcaddr
)
2109 switch (addr
->sa_family
) {
2111 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
2112 struct sockaddr_in
*srv_addr4
=
2113 (struct sockaddr_in
*)&server
->dstaddr
;
2115 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
2120 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
2121 struct sockaddr_in6
*srv_addr6
=
2122 (struct sockaddr_in6
*)&server
->dstaddr
;
2124 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
2125 &srv_addr6
->sin6_addr
))
2127 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
2133 return false; /* don't expect to be here */
2136 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2143 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2146 * The select_sectype function should either return the vol->sectype
2147 * that was specified, or "Unspecified" if that sectype was not
2148 * compatible with the given NEGOTIATE request.
2150 if (select_sectype(server
, vol
->sectype
) == Unspecified
)
2154 * Now check if signing mode is acceptable. No need to check
2155 * global_secflags at this point since if MUST_SIGN is set then
2156 * the server->sign had better be too.
2158 if (vol
->sign
&& !server
->sign
)
2164 static int match_server(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2166 struct sockaddr
*addr
= (struct sockaddr
*)&vol
->dstaddr
;
2168 if (vol
->nosharesock
)
2171 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2174 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2177 if (!match_address(server
, addr
,
2178 (struct sockaddr
*)&vol
->srcaddr
))
2181 if (!match_port(server
, addr
))
2184 if (!match_security(server
, vol
))
2190 static struct TCP_Server_Info
*
2191 cifs_find_tcp_session(struct smb_vol
*vol
)
2193 struct TCP_Server_Info
*server
;
2195 spin_lock(&cifs_tcp_ses_lock
);
2196 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2197 if (!match_server(server
, vol
))
2200 ++server
->srv_count
;
2201 spin_unlock(&cifs_tcp_ses_lock
);
2202 cifs_dbg(FYI
, "Existing tcp session with server found\n");
2205 spin_unlock(&cifs_tcp_ses_lock
);
2210 cifs_put_tcp_session(struct TCP_Server_Info
*server
, int from_reconnect
)
2212 struct task_struct
*task
;
2214 spin_lock(&cifs_tcp_ses_lock
);
2215 if (--server
->srv_count
> 0) {
2216 spin_unlock(&cifs_tcp_ses_lock
);
2220 put_net(cifs_net_ns(server
));
2222 list_del_init(&server
->tcp_ses_list
);
2223 spin_unlock(&cifs_tcp_ses_lock
);
2225 cancel_delayed_work_sync(&server
->echo
);
2227 #ifdef CONFIG_CIFS_SMB2
2230 * Avoid deadlock here: reconnect work calls
2231 * cifs_put_tcp_session() at its end. Need to be sure
2232 * that reconnect work does nothing with server pointer after
2235 cancel_delayed_work(&server
->reconnect
);
2237 cancel_delayed_work_sync(&server
->reconnect
);
2240 spin_lock(&GlobalMid_Lock
);
2241 server
->tcpStatus
= CifsExiting
;
2242 spin_unlock(&GlobalMid_Lock
);
2244 cifs_crypto_shash_release(server
);
2245 cifs_fscache_release_client_cookie(server
);
2247 kfree(server
->session_key
.response
);
2248 server
->session_key
.response
= NULL
;
2249 server
->session_key
.len
= 0;
2251 task
= xchg(&server
->tsk
, NULL
);
2253 send_sig(SIGKILL
, task
, 1);
2256 static struct TCP_Server_Info
*
2257 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2259 struct TCP_Server_Info
*tcp_ses
= NULL
;
2262 cifs_dbg(FYI
, "UNC: %s\n", volume_info
->UNC
);
2264 /* see if we already have a matching tcp_ses */
2265 tcp_ses
= cifs_find_tcp_session(volume_info
);
2269 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2275 tcp_ses
->ops
= volume_info
->ops
;
2276 tcp_ses
->vals
= volume_info
->vals
;
2277 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2278 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2279 if (IS_ERR(tcp_ses
->hostname
)) {
2280 rc
= PTR_ERR(tcp_ses
->hostname
);
2281 goto out_err_crypto_release
;
2284 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2285 tcp_ses
->noautotune
= volume_info
->noautotune
;
2286 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2287 tcp_ses
->in_flight
= 0;
2288 tcp_ses
->credits
= 1;
2289 init_waitqueue_head(&tcp_ses
->response_q
);
2290 init_waitqueue_head(&tcp_ses
->request_q
);
2291 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2292 mutex_init(&tcp_ses
->srv_mutex
);
2293 memcpy(tcp_ses
->workstation_RFC1001_name
,
2294 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2295 memcpy(tcp_ses
->server_RFC1001_name
,
2296 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2297 tcp_ses
->session_estab
= false;
2298 tcp_ses
->sequence_number
= 0;
2299 tcp_ses
->lstrp
= jiffies
;
2300 spin_lock_init(&tcp_ses
->req_lock
);
2301 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2302 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2303 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2304 #ifdef CONFIG_CIFS_SMB2
2305 INIT_DELAYED_WORK(&tcp_ses
->reconnect
, smb2_reconnect_server
);
2306 mutex_init(&tcp_ses
->reconnect_mutex
);
2308 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2309 sizeof(tcp_ses
->srcaddr
));
2310 memcpy(&tcp_ses
->dstaddr
, &volume_info
->dstaddr
,
2311 sizeof(tcp_ses
->dstaddr
));
2312 #ifdef CONFIG_CIFS_SMB2
2313 generate_random_uuid(tcp_ses
->client_guid
);
2316 * at this point we are the only ones with the pointer
2317 * to the struct since the kernel thread not created yet
2318 * no need to spinlock this init of tcpStatus or srv_count
2320 tcp_ses
->tcpStatus
= CifsNew
;
2321 ++tcp_ses
->srv_count
;
2323 rc
= ip_connect(tcp_ses
);
2325 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
2326 goto out_err_crypto_release
;
2330 * since we're in a cifs function already, we know that
2331 * this will succeed. No need for try_module_get().
2333 __module_get(THIS_MODULE
);
2334 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2336 if (IS_ERR(tcp_ses
->tsk
)) {
2337 rc
= PTR_ERR(tcp_ses
->tsk
);
2338 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
2339 module_put(THIS_MODULE
);
2340 goto out_err_crypto_release
;
2342 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2344 /* thread spawned, put it on the list */
2345 spin_lock(&cifs_tcp_ses_lock
);
2346 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2347 spin_unlock(&cifs_tcp_ses_lock
);
2349 cifs_fscache_get_client_cookie(tcp_ses
);
2351 /* queue echo request delayed work */
2352 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
2356 out_err_crypto_release
:
2357 cifs_crypto_shash_release(tcp_ses
);
2359 put_net(cifs_net_ns(tcp_ses
));
2363 if (!IS_ERR(tcp_ses
->hostname
))
2364 kfree(tcp_ses
->hostname
);
2365 if (tcp_ses
->ssocket
)
2366 sock_release(tcp_ses
->ssocket
);
2372 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2374 if (vol
->sectype
!= Unspecified
&&
2375 vol
->sectype
!= ses
->sectype
)
2378 switch (ses
->sectype
) {
2380 if (!uid_eq(vol
->cred_uid
, ses
->cred_uid
))
2384 /* NULL username means anonymous session */
2385 if (ses
->user_name
== NULL
) {
2391 /* anything else takes username/password */
2392 if (strncmp(ses
->user_name
,
2393 vol
->username
? vol
->username
: "",
2394 CIFS_MAX_USERNAME_LEN
))
2396 if ((vol
->username
&& strlen(vol
->username
) != 0) &&
2397 ses
->password
!= NULL
&&
2398 strncmp(ses
->password
,
2399 vol
->password
? vol
->password
: "",
2400 CIFS_MAX_PASSWORD_LEN
))
2406 static struct cifs_ses
*
2407 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2409 struct cifs_ses
*ses
;
2411 spin_lock(&cifs_tcp_ses_lock
);
2412 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2413 if (ses
->status
== CifsExiting
)
2415 if (!match_session(ses
, vol
))
2418 spin_unlock(&cifs_tcp_ses_lock
);
2421 spin_unlock(&cifs_tcp_ses_lock
);
2426 cifs_put_smb_ses(struct cifs_ses
*ses
)
2428 unsigned int rc
, xid
;
2429 struct TCP_Server_Info
*server
= ses
->server
;
2431 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2433 spin_lock(&cifs_tcp_ses_lock
);
2434 if (ses
->status
== CifsExiting
) {
2435 spin_unlock(&cifs_tcp_ses_lock
);
2438 if (--ses
->ses_count
> 0) {
2439 spin_unlock(&cifs_tcp_ses_lock
);
2442 if (ses
->status
== CifsGood
)
2443 ses
->status
= CifsExiting
;
2444 spin_unlock(&cifs_tcp_ses_lock
);
2446 if (ses
->status
== CifsExiting
&& server
->ops
->logoff
) {
2448 rc
= server
->ops
->logoff(xid
, ses
);
2450 cifs_dbg(VFS
, "%s: Session Logoff failure rc=%d\n",
2455 spin_lock(&cifs_tcp_ses_lock
);
2456 list_del_init(&ses
->smb_ses_list
);
2457 spin_unlock(&cifs_tcp_ses_lock
);
2460 cifs_put_tcp_session(server
, 0);
2465 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2466 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2468 /* Populate username and pw fields from keyring if possible */
2470 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2474 const char *delim
, *payload
;
2478 struct TCP_Server_Info
*server
= ses
->server
;
2479 struct sockaddr_in
*sa
;
2480 struct sockaddr_in6
*sa6
;
2481 const struct user_key_payload
*upayload
;
2483 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2487 /* try to find an address key first */
2488 switch (server
->dstaddr
.ss_family
) {
2490 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2491 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2494 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2495 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2498 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
2499 server
->dstaddr
.ss_family
);
2504 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2505 key
= request_key(&key_type_logon
, desc
, "");
2507 if (!ses
->domainName
) {
2508 cifs_dbg(FYI
, "domainName is NULL\n");
2513 /* didn't work, try to find a domain key */
2514 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2515 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2516 key
= request_key(&key_type_logon
, desc
, "");
2524 down_read(&key
->sem
);
2525 upayload
= user_key_payload(key
);
2526 if (IS_ERR_OR_NULL(upayload
)) {
2527 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2531 /* find first : in payload */
2532 payload
= upayload
->data
;
2533 delim
= strnchr(payload
, upayload
->datalen
, ':');
2534 cifs_dbg(FYI
, "payload=%s\n", payload
);
2536 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
2542 len
= delim
- payload
;
2543 if (len
> CIFS_MAX_USERNAME_LEN
|| len
<= 0) {
2544 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
2550 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2551 if (!vol
->username
) {
2552 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
2557 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, vol
->username
);
2559 len
= key
->datalen
- (len
+ 1);
2560 if (len
> CIFS_MAX_PASSWORD_LEN
|| len
<= 0) {
2561 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
2563 kfree(vol
->username
);
2564 vol
->username
= NULL
;
2569 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2570 if (!vol
->password
) {
2571 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
2574 kfree(vol
->username
);
2575 vol
->username
= NULL
;
2580 * If we have a domain key then we must set the domainName in the
2583 if (is_domain
&& ses
->domainName
) {
2584 vol
->domainname
= kstrndup(ses
->domainName
,
2585 strlen(ses
->domainName
),
2587 if (!vol
->domainname
) {
2588 cifs_dbg(FYI
, "Unable to allocate %zd bytes for "
2591 kfree(vol
->username
);
2592 vol
->username
= NULL
;
2593 kzfree(vol
->password
);
2594 vol
->password
= NULL
;
2604 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
2607 #else /* ! CONFIG_KEYS */
2609 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2610 struct cifs_ses
*ses
__attribute__((unused
)))
2614 #endif /* CONFIG_KEYS */
2616 static struct cifs_ses
*
2617 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2621 struct cifs_ses
*ses
;
2622 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2623 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2627 ses
= cifs_find_smb_ses(server
, volume_info
);
2629 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
2632 mutex_lock(&ses
->session_mutex
);
2633 rc
= cifs_negotiate_protocol(xid
, ses
);
2635 mutex_unlock(&ses
->session_mutex
);
2636 /* problem -- put our ses reference */
2637 cifs_put_smb_ses(ses
);
2641 if (ses
->need_reconnect
) {
2642 cifs_dbg(FYI
, "Session needs reconnect\n");
2643 rc
= cifs_setup_session(xid
, ses
,
2644 volume_info
->local_nls
);
2646 mutex_unlock(&ses
->session_mutex
);
2647 /* problem -- put our reference */
2648 cifs_put_smb_ses(ses
);
2653 mutex_unlock(&ses
->session_mutex
);
2655 /* existing SMB ses has a server reference already */
2656 cifs_put_tcp_session(server
, 0);
2661 cifs_dbg(FYI
, "Existing smb sess not found\n");
2662 ses
= sesInfoAlloc();
2666 /* new SMB session uses our server ref */
2667 ses
->server
= server
;
2668 if (server
->dstaddr
.ss_family
== AF_INET6
)
2669 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2671 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2673 if (volume_info
->username
) {
2674 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2675 if (!ses
->user_name
)
2679 /* volume_info->password freed at unmount */
2680 if (volume_info
->password
) {
2681 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2685 if (volume_info
->domainname
) {
2686 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2687 if (!ses
->domainName
)
2690 ses
->cred_uid
= volume_info
->cred_uid
;
2691 ses
->linux_uid
= volume_info
->linux_uid
;
2693 ses
->sectype
= volume_info
->sectype
;
2694 ses
->sign
= volume_info
->sign
;
2696 mutex_lock(&ses
->session_mutex
);
2697 rc
= cifs_negotiate_protocol(xid
, ses
);
2699 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2700 mutex_unlock(&ses
->session_mutex
);
2704 /* success, put it on the list */
2705 spin_lock(&cifs_tcp_ses_lock
);
2706 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2707 spin_unlock(&cifs_tcp_ses_lock
);
2718 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2720 if (tcon
->tidStatus
== CifsExiting
)
2722 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2727 static struct cifs_tcon
*
2728 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2730 struct list_head
*tmp
;
2731 struct cifs_tcon
*tcon
;
2733 spin_lock(&cifs_tcp_ses_lock
);
2734 list_for_each(tmp
, &ses
->tcon_list
) {
2735 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2736 if (!match_tcon(tcon
, unc
))
2739 spin_unlock(&cifs_tcp_ses_lock
);
2742 spin_unlock(&cifs_tcp_ses_lock
);
2747 cifs_put_tcon(struct cifs_tcon
*tcon
)
2750 struct cifs_ses
*ses
= tcon
->ses
;
2752 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2753 spin_lock(&cifs_tcp_ses_lock
);
2754 if (--tcon
->tc_count
> 0) {
2755 spin_unlock(&cifs_tcp_ses_lock
);
2759 list_del_init(&tcon
->tcon_list
);
2760 spin_unlock(&cifs_tcp_ses_lock
);
2763 if (ses
->server
->ops
->tree_disconnect
)
2764 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
2767 cifs_fscache_release_super_cookie(tcon
);
2769 cifs_put_smb_ses(ses
);
2772 static struct cifs_tcon
*
2773 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2776 struct cifs_tcon
*tcon
;
2778 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2780 cifs_dbg(FYI
, "Found match on UNC path\n");
2781 /* existing tcon already has a reference */
2782 cifs_put_smb_ses(ses
);
2783 if (tcon
->seal
!= volume_info
->seal
)
2784 cifs_dbg(VFS
, "transport encryption setting conflicts with existing tid\n");
2788 if (!ses
->server
->ops
->tree_connect
) {
2793 tcon
= tconInfoAlloc();
2800 if (volume_info
->password
) {
2801 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2802 if (!tcon
->password
) {
2809 * BB Do we need to wrap session_mutex around this TCon call and Unix
2810 * SetFS as we do on SessSetup and reconnect?
2813 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, volume_info
->UNC
, tcon
,
2814 volume_info
->local_nls
);
2816 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
2820 if (volume_info
->nodfs
) {
2821 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2822 cifs_dbg(FYI
, "DFS disabled (%d)\n", tcon
->Flags
);
2824 tcon
->seal
= volume_info
->seal
;
2825 tcon
->use_persistent
= false;
2826 /* check if SMB2 or later, CIFS does not support persistent handles */
2827 if (volume_info
->persistent
) {
2828 if (ses
->server
->vals
->protocol_id
== 0) {
2830 "SMB3 or later required for persistent handles\n");
2833 #ifdef CONFIG_CIFS_SMB2
2834 } else if (ses
->server
->capabilities
&
2835 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2836 tcon
->use_persistent
= true;
2837 else /* persistent handles requested but not supported */ {
2839 "Persistent handles not supported on share\n");
2842 #endif /* CONFIG_CIFS_SMB2 */
2844 #ifdef CONFIG_CIFS_SMB2
2845 } else if ((tcon
->capabilities
& SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY
)
2846 && (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2847 && (volume_info
->nopersistent
== false)) {
2848 cifs_dbg(FYI
, "enabling persistent handles\n");
2849 tcon
->use_persistent
= true;
2850 #endif /* CONFIG_CIFS_SMB2 */
2851 } else if (volume_info
->resilient
) {
2852 if (ses
->server
->vals
->protocol_id
== 0) {
2854 "SMB2.1 or later required for resilient handles\n");
2858 tcon
->use_resilient
= true;
2862 * We can have only one retry value for a connection to a share so for
2863 * resources mounted more than once to the same server share the last
2864 * value passed in for the retry flag is used.
2866 tcon
->retry
= volume_info
->retry
;
2867 tcon
->nocase
= volume_info
->nocase
;
2868 tcon
->local_lease
= volume_info
->local_lease
;
2869 INIT_LIST_HEAD(&tcon
->pending_opens
);
2871 spin_lock(&cifs_tcp_ses_lock
);
2872 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2873 spin_unlock(&cifs_tcp_ses_lock
);
2875 cifs_fscache_get_super_cookie(tcon
);
2885 cifs_put_tlink(struct tcon_link
*tlink
)
2887 if (!tlink
|| IS_ERR(tlink
))
2890 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2891 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2892 tlink
->tl_time
= jiffies
;
2896 if (!IS_ERR(tlink_tcon(tlink
)))
2897 cifs_put_tcon(tlink_tcon(tlink
));
2902 static inline struct tcon_link
*
2903 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2905 return cifs_sb
->master_tlink
;
2909 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2911 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2912 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2914 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2917 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2918 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2922 * We want to share sb only if we don't specify an r/wsize or
2923 * specified r/wsize is greater than or equal to existing one.
2925 if (new->wsize
&& new->wsize
< old
->wsize
)
2928 if (new->rsize
&& new->rsize
< old
->rsize
)
2931 if (!uid_eq(old
->mnt_uid
, new->mnt_uid
) || !gid_eq(old
->mnt_gid
, new->mnt_gid
))
2934 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2935 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2938 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2941 if (old
->actimeo
!= new->actimeo
)
2948 cifs_match_super(struct super_block
*sb
, void *data
)
2950 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2951 struct smb_vol
*volume_info
;
2952 struct cifs_sb_info
*cifs_sb
;
2953 struct TCP_Server_Info
*tcp_srv
;
2954 struct cifs_ses
*ses
;
2955 struct cifs_tcon
*tcon
;
2956 struct tcon_link
*tlink
;
2959 spin_lock(&cifs_tcp_ses_lock
);
2960 cifs_sb
= CIFS_SB(sb
);
2961 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2962 if (IS_ERR(tlink
)) {
2963 spin_unlock(&cifs_tcp_ses_lock
);
2966 tcon
= tlink_tcon(tlink
);
2968 tcp_srv
= ses
->server
;
2970 volume_info
= mnt_data
->vol
;
2972 if (!match_server(tcp_srv
, volume_info
) ||
2973 !match_session(ses
, volume_info
) ||
2974 !match_tcon(tcon
, volume_info
->UNC
)) {
2979 rc
= compare_mount_options(sb
, mnt_data
);
2981 spin_unlock(&cifs_tcp_ses_lock
);
2982 cifs_put_tlink(tlink
);
2987 get_dfs_path(const unsigned int xid
, struct cifs_ses
*ses
, const char *old_path
,
2988 const struct nls_table
*nls_codepage
, unsigned int *num_referrals
,
2989 struct dfs_info3_param
**referrals
, int remap
)
2994 if (!ses
->server
->ops
->tree_connect
|| !ses
->server
->ops
->get_dfs_refer
)
3000 if (ses
->ipc_tid
== 0) {
3001 temp_unc
= kmalloc(2 /* for slashes */ +
3002 strnlen(ses
->serverName
, SERVER_NAME_LEN_WITH_NULL
* 2)
3003 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL
);
3004 if (temp_unc
== NULL
)
3008 strcpy(temp_unc
+ 2, ses
->serverName
);
3009 strcpy(temp_unc
+ 2 + strlen(ses
->serverName
), "\\IPC$");
3010 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, temp_unc
, NULL
,
3012 cifs_dbg(FYI
, "Tcon rc = %d ipc_tid = %d\n", rc
, ses
->ipc_tid
);
3016 rc
= ses
->server
->ops
->get_dfs_refer(xid
, ses
, old_path
,
3017 referrals
, num_referrals
,
3018 nls_codepage
, remap
);
3020 * BB - map targetUNCs to dfs_info3 structures, here or in
3021 * ses->server->ops->get_dfs_refer.
3027 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3028 static struct lock_class_key cifs_key
[2];
3029 static struct lock_class_key cifs_slock_key
[2];
3032 cifs_reclassify_socket4(struct socket
*sock
)
3034 struct sock
*sk
= sock
->sk
;
3035 BUG_ON(sock_owned_by_user(sk
));
3036 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
3037 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
3041 cifs_reclassify_socket6(struct socket
*sock
)
3043 struct sock
*sk
= sock
->sk
;
3044 BUG_ON(sock_owned_by_user(sk
));
3045 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
3046 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
3050 cifs_reclassify_socket4(struct socket
*sock
)
3055 cifs_reclassify_socket6(struct socket
*sock
)
3060 /* See RFC1001 section 14 on representation of Netbios names */
3061 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
3065 for (i
= 0, j
= 0; i
< (length
); i
++) {
3066 /* mask a nibble at a time and encode */
3067 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
3068 target
[j
+1] = 'A' + (0x0F & source
[i
]);
3075 bind_socket(struct TCP_Server_Info
*server
)
3078 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
3079 /* Bind to the specified local IP address */
3080 struct socket
*socket
= server
->ssocket
;
3081 rc
= socket
->ops
->bind(socket
,
3082 (struct sockaddr
*) &server
->srcaddr
,
3083 sizeof(server
->srcaddr
));
3085 struct sockaddr_in
*saddr4
;
3086 struct sockaddr_in6
*saddr6
;
3087 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
3088 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
3089 if (saddr6
->sin6_family
== AF_INET6
)
3090 cifs_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
3091 &saddr6
->sin6_addr
, rc
);
3093 cifs_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
3094 &saddr4
->sin_addr
.s_addr
, rc
);
3101 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
3105 * some servers require RFC1001 sessinit before sending
3106 * negprot - BB check reconnection in case where second
3107 * sessinit is sent but no second negprot
3109 struct rfc1002_session_packet
*ses_init_buf
;
3110 struct smb_hdr
*smb_buf
;
3111 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
3114 ses_init_buf
->trailer
.session_req
.called_len
= 32;
3116 if (server
->server_RFC1001_name
&&
3117 server
->server_RFC1001_name
[0] != 0)
3118 rfc1002mangle(ses_init_buf
->trailer
.
3119 session_req
.called_name
,
3120 server
->server_RFC1001_name
,
3121 RFC1001_NAME_LEN_WITH_NULL
);
3123 rfc1002mangle(ses_init_buf
->trailer
.
3124 session_req
.called_name
,
3125 DEFAULT_CIFS_CALLED_NAME
,
3126 RFC1001_NAME_LEN_WITH_NULL
);
3128 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
3131 * calling name ends in null (byte 16) from old smb
3134 if (server
->workstation_RFC1001_name
[0] != 0)
3135 rfc1002mangle(ses_init_buf
->trailer
.
3136 session_req
.calling_name
,
3137 server
->workstation_RFC1001_name
,
3138 RFC1001_NAME_LEN_WITH_NULL
);
3140 rfc1002mangle(ses_init_buf
->trailer
.
3141 session_req
.calling_name
,
3143 RFC1001_NAME_LEN_WITH_NULL
);
3145 ses_init_buf
->trailer
.session_req
.scope1
= 0;
3146 ses_init_buf
->trailer
.session_req
.scope2
= 0;
3147 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
3149 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3150 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
3151 rc
= smb_send(server
, smb_buf
, 0x44);
3152 kfree(ses_init_buf
);
3154 * RFC1001 layer in at least one server
3155 * requires very short break before negprot
3156 * presumably because not expecting negprot
3157 * to follow so fast. This is a simple
3158 * solution that works without
3159 * complicating the code and causes no
3160 * significant slowing down on mount
3163 usleep_range(1000, 2000);
3166 * else the negprot may still work without this
3167 * even though malloc failed
3174 generic_ip_connect(struct TCP_Server_Info
*server
)
3179 struct socket
*socket
= server
->ssocket
;
3180 struct sockaddr
*saddr
;
3182 saddr
= (struct sockaddr
*) &server
->dstaddr
;
3184 if (server
->dstaddr
.ss_family
== AF_INET6
) {
3185 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
3186 slen
= sizeof(struct sockaddr_in6
);
3189 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
3190 slen
= sizeof(struct sockaddr_in
);
3194 if (socket
== NULL
) {
3195 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
3196 IPPROTO_TCP
, &socket
, 1);
3198 cifs_dbg(VFS
, "Error %d creating socket\n", rc
);
3199 server
->ssocket
= NULL
;
3203 /* BB other socket options to set KEEPALIVE, NODELAY? */
3204 cifs_dbg(FYI
, "Socket created\n");
3205 server
->ssocket
= socket
;
3206 socket
->sk
->sk_allocation
= GFP_NOFS
;
3207 if (sfamily
== AF_INET6
)
3208 cifs_reclassify_socket6(socket
);
3210 cifs_reclassify_socket4(socket
);
3213 rc
= bind_socket(server
);
3218 * Eventually check for other socket options to change from
3219 * the default. sock_setsockopt not used because it expects
3222 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3223 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3225 /* make the bufsizes depend on wsize/rsize and max requests */
3226 if (server
->noautotune
) {
3227 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3228 socket
->sk
->sk_sndbuf
= 200 * 1024;
3229 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3230 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3233 if (server
->tcp_nodelay
) {
3235 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
3236 (char *)&val
, sizeof(val
));
3238 cifs_dbg(FYI
, "set TCP_NODELAY socket option error %d\n",
3242 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3243 socket
->sk
->sk_sndbuf
,
3244 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3246 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3248 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
3249 sock_release(socket
);
3250 server
->ssocket
= NULL
;
3254 if (sport
== htons(RFC1001_PORT
))
3255 rc
= ip_rfc1001_connect(server
);
3261 ip_connect(struct TCP_Server_Info
*server
)
3264 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3265 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3267 if (server
->dstaddr
.ss_family
== AF_INET6
)
3268 sport
= &addr6
->sin6_port
;
3270 sport
= &addr
->sin_port
;
3275 /* try with 445 port at first */
3276 *sport
= htons(CIFS_PORT
);
3278 rc
= generic_ip_connect(server
);
3282 /* if it failed, try with 139 port */
3283 *sport
= htons(RFC1001_PORT
);
3286 return generic_ip_connect(server
);
3289 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
3290 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3292 /* if we are reconnecting then should we check to see if
3293 * any requested capabilities changed locally e.g. via
3294 * remount but we can not do much about it here
3295 * if they have (even if we could detect it by the following)
3296 * Perhaps we could add a backpointer to array of sb from tcon
3297 * or if we change to make all sb to same share the same
3298 * sb as NFS - then we only have one backpointer to sb.
3299 * What if we wanted to mount the server share twice once with
3300 * and once without posixacls or posix paths? */
3301 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3303 if (vol_info
&& vol_info
->no_linux_ext
) {
3304 tcon
->fsUnixInfo
.Capability
= 0;
3305 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3306 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
3308 } else if (vol_info
)
3309 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3311 if (tcon
->unix_ext
== 0) {
3312 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
3316 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3317 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3318 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
3319 /* check for reconnect case in which we do not
3320 want to change the mount behavior if we can avoid it */
3321 if (vol_info
== NULL
) {
3322 /* turn off POSIX ACL and PATHNAMES if not set
3323 originally at mount time */
3324 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3325 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3326 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3327 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3328 cifs_dbg(VFS
, "POSIXPATH support change\n");
3329 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3330 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3331 cifs_dbg(VFS
, "possible reconnect error\n");
3332 cifs_dbg(VFS
, "server disabled POSIX path support\n");
3336 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3337 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
3339 cap
&= CIFS_UNIX_CAP_MASK
;
3340 if (vol_info
&& vol_info
->no_psx_acl
)
3341 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3342 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3343 cifs_dbg(FYI
, "negotiated posix acl support\n");
3345 cifs_sb
->mnt_cifs_flags
|=
3346 CIFS_MOUNT_POSIXACL
;
3349 if (vol_info
&& vol_info
->posix_paths
== 0)
3350 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3351 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3352 cifs_dbg(FYI
, "negotiate posix pathnames\n");
3354 cifs_sb
->mnt_cifs_flags
|=
3355 CIFS_MOUNT_POSIX_PATHS
;
3358 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
3359 #ifdef CONFIG_CIFS_DEBUG2
3360 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3361 cifs_dbg(FYI
, "FCNTL cap\n");
3362 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3363 cifs_dbg(FYI
, "EXTATTR cap\n");
3364 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3365 cifs_dbg(FYI
, "POSIX path cap\n");
3366 if (cap
& CIFS_UNIX_XATTR_CAP
)
3367 cifs_dbg(FYI
, "XATTR cap\n");
3368 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3369 cifs_dbg(FYI
, "POSIX ACL cap\n");
3370 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3371 cifs_dbg(FYI
, "very large read cap\n");
3372 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3373 cifs_dbg(FYI
, "very large write cap\n");
3374 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3375 cifs_dbg(FYI
, "transport encryption cap\n");
3376 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3377 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
3378 #endif /* CIFS_DEBUG2 */
3379 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3380 if (vol_info
== NULL
) {
3381 cifs_dbg(FYI
, "resetting capabilities failed\n");
3383 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");
3389 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3390 struct cifs_sb_info
*cifs_sb
)
3392 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3394 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3395 cifs_sb
->tlink_tree
= RB_ROOT
;
3398 * Temporarily set r/wsize for matching superblock. If we end up using
3399 * new sb then client will later negotiate it downward if needed.
3401 cifs_sb
->rsize
= pvolume_info
->rsize
;
3402 cifs_sb
->wsize
= pvolume_info
->wsize
;
3404 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3405 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3406 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3407 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3408 cifs_dbg(FYI
, "file mode: %04ho dir mode: %04ho\n",
3409 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3411 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3412 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3414 if (pvolume_info
->noperm
)
3415 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3416 if (pvolume_info
->setuids
)
3417 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3418 if (pvolume_info
->server_ino
)
3419 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3420 if (pvolume_info
->remap
)
3421 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SFM_CHR
;
3422 if (pvolume_info
->sfu_remap
)
3423 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3424 if (pvolume_info
->no_xattr
)
3425 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3426 if (pvolume_info
->sfu_emul
)
3427 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3428 if (pvolume_info
->nobrl
)
3429 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3430 if (pvolume_info
->nostrictsync
)
3431 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3432 if (pvolume_info
->mand_lock
)
3433 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3434 if (pvolume_info
->rwpidforward
)
3435 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3436 if (pvolume_info
->cifs_acl
)
3437 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3438 if (pvolume_info
->backupuid_specified
) {
3439 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3440 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3442 if (pvolume_info
->backupgid_specified
) {
3443 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3444 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3446 if (pvolume_info
->override_uid
)
3447 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3448 if (pvolume_info
->override_gid
)
3449 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3450 if (pvolume_info
->dynperm
)
3451 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3452 if (pvolume_info
->fsc
)
3453 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3454 if (pvolume_info
->multiuser
)
3455 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3456 CIFS_MOUNT_NO_PERM
);
3457 if (pvolume_info
->strict_io
)
3458 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3459 if (pvolume_info
->direct_io
) {
3460 cifs_dbg(FYI
, "mounting share using direct i/o\n");
3461 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3463 if (pvolume_info
->mfsymlinks
) {
3464 if (pvolume_info
->sfu_emul
) {
3466 * Our SFU ("Services for Unix" emulation does not allow
3467 * creating symlinks but does allow reading existing SFU
3468 * symlinks (it does allow both creating and reading SFU
3469 * style mknod and FIFOs though). When "mfsymlinks" and
3470 * "sfu" are both enabled at the same time, it allows
3471 * reading both types of symlinks, but will only create
3472 * them with mfsymlinks format. This allows better
3473 * Apple compatibility (probably better for Samba too)
3474 * while still recognizing old Windows style symlinks.
3476 cifs_dbg(VFS
, "mount options mfsymlinks and sfu both enabled\n");
3478 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3481 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3482 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
3486 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3488 kfree(volume_info
->username
);
3489 kzfree(volume_info
->password
);
3490 kfree(volume_info
->UNC
);
3491 kfree(volume_info
->domainname
);
3492 kfree(volume_info
->iocharset
);
3493 kfree(volume_info
->prepath
);
3497 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3501 cleanup_volume_info_contents(volume_info
);
3506 #ifdef CONFIG_CIFS_DFS_UPCALL
3508 * cifs_build_path_to_root returns full path to root when we do not have an
3509 * exiting connection (tcon)
3512 build_unc_path_to_root(const struct smb_vol
*vol
,
3513 const struct cifs_sb_info
*cifs_sb
)
3515 char *full_path
, *pos
;
3516 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) + 1 : 0;
3517 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3519 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3520 if (full_path
== NULL
)
3521 return ERR_PTR(-ENOMEM
);
3523 strncpy(full_path
, vol
->UNC
, unc_len
);
3524 pos
= full_path
+ unc_len
;
3527 *pos
= CIFS_DIR_SEP(cifs_sb
);
3528 strncpy(pos
+ 1, vol
->prepath
, pplen
);
3532 *pos
= '\0'; /* add trailing null */
3533 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3534 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
3539 * Perform a dfs referral query for a share and (optionally) prefix
3541 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3542 * to a string containing updated options for the submount. Otherwise it
3543 * will be left untouched.
3545 * Returns the rc from get_dfs_path to the caller, which can be used to
3546 * determine whether there were referrals.
3549 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
3550 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3554 unsigned int num_referrals
= 0;
3555 struct dfs_info3_param
*referrals
= NULL
;
3556 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3558 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3559 if (IS_ERR(full_path
))
3560 return PTR_ERR(full_path
);
3562 /* For DFS paths, skip the first '\' of the UNC */
3563 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3565 rc
= get_dfs_path(xid
, ses
, ref_path
, cifs_sb
->local_nls
,
3566 &num_referrals
, &referrals
, cifs_remap(cifs_sb
));
3568 if (!rc
&& num_referrals
> 0) {
3569 char *fake_devname
= NULL
;
3571 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3572 full_path
+ 1, referrals
,
3575 free_dfs_info_array(referrals
, num_referrals
);
3577 if (IS_ERR(mdata
)) {
3578 rc
= PTR_ERR(mdata
);
3581 cleanup_volume_info_contents(volume_info
);
3582 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3585 kfree(fake_devname
);
3586 kfree(cifs_sb
->mountdata
);
3587 cifs_sb
->mountdata
= mdata
;
3595 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3596 const char *devname
)
3600 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3603 if (volume_info
->nullauth
) {
3604 cifs_dbg(FYI
, "Anonymous login\n");
3605 kfree(volume_info
->username
);
3606 volume_info
->username
= NULL
;
3607 } else if (volume_info
->username
) {
3608 /* BB fixme parse for domain name here */
3609 cifs_dbg(FYI
, "Username: %s\n", volume_info
->username
);
3611 cifs_dbg(VFS
, "No username specified\n");
3612 /* In userspace mount helper we can get user name from alternate
3613 locations such as env variables and files on disk */
3617 /* this is needed for ASCII cp to Unicode converts */
3618 if (volume_info
->iocharset
== NULL
) {
3619 /* load_nls_default cannot return null */
3620 volume_info
->local_nls
= load_nls_default();
3622 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3623 if (volume_info
->local_nls
== NULL
) {
3624 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
3625 volume_info
->iocharset
);
3634 cifs_get_volume_info(char *mount_data
, const char *devname
)
3637 struct smb_vol
*volume_info
;
3639 volume_info
= kmalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3641 return ERR_PTR(-ENOMEM
);
3643 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3645 cifs_cleanup_volume_info(volume_info
);
3646 volume_info
= ERR_PTR(rc
);
3653 cifs_are_all_path_components_accessible(struct TCP_Server_Info
*server
,
3655 struct cifs_tcon
*tcon
,
3656 struct cifs_sb_info
*cifs_sb
,
3663 sep
= CIFS_DIR_SEP(cifs_sb
);
3666 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
, "");
3668 /* skip separators */
3673 /* next separator */
3674 while (*s
&& *s
!= sep
)
3678 * temporarily null-terminate the path at the end of
3679 * the current component
3683 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3691 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3695 struct cifs_ses
*ses
;
3696 struct cifs_tcon
*tcon
;
3697 struct TCP_Server_Info
*server
;
3699 struct tcon_link
*tlink
;
3700 #ifdef CONFIG_CIFS_DFS_UPCALL
3701 int referral_walks_count
= 0;
3704 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs");
3708 #ifdef CONFIG_CIFS_DFS_UPCALL
3710 /* cleanup activities if we're chasing a referral */
3711 if (referral_walks_count
) {
3713 cifs_put_tcon(tcon
);
3715 cifs_put_smb_ses(ses
);
3717 cifs_sb
->mnt_cifs_flags
&= ~CIFS_MOUNT_POSIX_PATHS
;
3731 /* get a reference to a tcp session */
3732 server
= cifs_get_tcp_session(volume_info
);
3733 if (IS_ERR(server
)) {
3734 rc
= PTR_ERR(server
);
3735 bdi_destroy(&cifs_sb
->bdi
);
3739 /* get a reference to a SMB session */
3740 ses
= cifs_get_smb_ses(server
, volume_info
);
3744 goto mount_fail_check
;
3747 #ifdef CONFIG_CIFS_SMB2
3748 if ((volume_info
->persistent
== true) && ((ses
->server
->capabilities
&
3749 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
) == 0)) {
3750 cifs_dbg(VFS
, "persistent handles not supported by server\n");
3752 goto mount_fail_check
;
3754 #endif /* CONFIG_CIFS_SMB2*/
3756 /* search for existing tcon to this server share */
3757 tcon
= cifs_get_tcon(ses
, volume_info
);
3762 goto mount_fail_check
;
3764 goto remote_path_check
;
3767 /* tell server which Unix caps we support */
3768 if (cap_unix(tcon
->ses
)) {
3769 /* reset of caps checks mount to see if unix extensions
3770 disabled for just this mount */
3771 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3772 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3773 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3774 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3776 goto mount_fail_check
;
3779 tcon
->unix_ext
= 0; /* server does not support them */
3781 /* do not care if a following call succeed - informational */
3782 if (!tcon
->ipc
&& server
->ops
->qfs_tcon
)
3783 server
->ops
->qfs_tcon(xid
, tcon
);
3785 cifs_sb
->wsize
= server
->ops
->negotiate_wsize(tcon
, volume_info
);
3786 cifs_sb
->rsize
= server
->ops
->negotiate_rsize(tcon
, volume_info
);
3788 /* tune readahead according to rsize */
3789 cifs_sb
->bdi
.ra_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3792 #ifdef CONFIG_CIFS_DFS_UPCALL
3794 * Perform an unconditional check for whether there are DFS
3795 * referrals for this path without prefix, to provide support
3796 * for DFS referrals from w2k8 servers which don't seem to respond
3797 * with PATH_NOT_COVERED to requests that include the prefix.
3798 * Chase the referral if found, otherwise continue normally.
3800 if (referral_walks_count
== 0) {
3801 int refrc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
,
3804 referral_walks_count
++;
3805 goto try_mount_again
;
3810 /* check if a whole path is not remote */
3812 if (!server
->ops
->is_path_accessible
) {
3814 goto mount_fail_check
;
3817 * cifs_build_path_to_root works only when we have a valid tcon
3819 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3820 if (full_path
== NULL
) {
3822 goto mount_fail_check
;
3824 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3826 if (rc
!= 0 && rc
!= -EREMOTE
) {
3828 goto mount_fail_check
;
3831 if (rc
!= -EREMOTE
) {
3832 rc
= cifs_are_all_path_components_accessible(server
,
3836 cifs_dbg(VFS
, "cannot query dirs between root and final path, "
3837 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3838 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_USE_PREFIX_PATH
;
3845 /* get referral if needed */
3846 if (rc
== -EREMOTE
) {
3847 #ifdef CONFIG_CIFS_DFS_UPCALL
3848 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3850 * BB: when we implement proper loop detection,
3851 * we will remove this check. But now we need it
3852 * to prevent an indefinite loop if 'DFS tree' is
3853 * misconfigured (i.e. has loops).
3856 goto mount_fail_check
;
3859 rc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
, true);
3862 referral_walks_count
++;
3863 goto try_mount_again
;
3865 goto mount_fail_check
;
3866 #else /* No DFS support, return error on mount */
3872 goto mount_fail_check
;
3874 /* now, hang the tcon off of the superblock */
3875 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3876 if (tlink
== NULL
) {
3878 goto mount_fail_check
;
3881 tlink
->tl_uid
= ses
->linux_uid
;
3882 tlink
->tl_tcon
= tcon
;
3883 tlink
->tl_time
= jiffies
;
3884 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3885 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3887 cifs_sb
->master_tlink
= tlink
;
3888 spin_lock(&cifs_sb
->tlink_tree_lock
);
3889 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3890 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3892 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3896 /* on error free sesinfo and tcon struct if needed */
3898 /* If find_unc succeeded then rc == 0 so we can not end */
3899 /* up accidentally freeing someone elses tcon struct */
3901 cifs_put_tcon(tcon
);
3903 cifs_put_smb_ses(ses
);
3905 cifs_put_tcp_session(server
, 0);
3906 bdi_destroy(&cifs_sb
->bdi
);
3915 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3916 * pointer may be NULL.
3919 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
3920 const char *tree
, struct cifs_tcon
*tcon
,
3921 const struct nls_table
*nls_codepage
)
3923 struct smb_hdr
*smb_buffer
;
3924 struct smb_hdr
*smb_buffer_response
;
3927 unsigned char *bcc_ptr
;
3930 __u16 bytes_left
, count
;
3935 smb_buffer
= cifs_buf_get();
3936 if (smb_buffer
== NULL
)
3939 smb_buffer_response
= smb_buffer
;
3941 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3942 NULL
/*no tid */ , 4 /*wct */ );
3944 smb_buffer
->Mid
= get_next_mid(ses
->server
);
3945 smb_buffer
->Uid
= ses
->Suid
;
3946 pSMB
= (TCONX_REQ
*) smb_buffer
;
3947 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3949 pSMB
->AndXCommand
= 0xFF;
3950 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3951 bcc_ptr
= &pSMB
->Password
[0];
3952 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3953 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3954 *bcc_ptr
= 0; /* password is null byte */
3955 bcc_ptr
++; /* skip password */
3956 /* already aligned so no need to do it below */
3958 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3959 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3960 specified as required (when that support is added to
3961 the vfs in the future) as only NTLM or the much
3962 weaker LANMAN (which we do not send by default) is accepted
3963 by Samba (not sure whether other servers allow
3964 NTLMv2 password here) */
3965 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3966 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3967 (ses
->sectype
== LANMAN
))
3968 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3969 ses
->server
->sec_mode
&
3970 SECMODE_PW_ENCRYPT
? true : false,
3973 #endif /* CIFS_WEAK_PW_HASH */
3974 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3975 bcc_ptr
, nls_codepage
);
3977 cifs_dbg(FYI
, "%s Can't generate NTLM rsp. Error: %d\n",
3979 cifs_buf_release(smb_buffer
);
3983 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3984 if (ses
->capabilities
& CAP_UNICODE
) {
3985 /* must align unicode strings */
3986 *bcc_ptr
= 0; /* null byte password */
3991 if (ses
->server
->sign
)
3992 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3994 if (ses
->capabilities
& CAP_STATUS32
) {
3995 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3997 if (ses
->capabilities
& CAP_DFS
) {
3998 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
4000 if (ses
->capabilities
& CAP_UNICODE
) {
4001 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
4003 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
4004 6 /* max utf8 char length in bytes */ *
4005 (/* server len*/ + 256 /* share len */), nls_codepage
);
4006 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
4007 bcc_ptr
+= 2; /* skip trailing null */
4008 } else { /* ASCII */
4009 strcpy(bcc_ptr
, tree
);
4010 bcc_ptr
+= strlen(tree
) + 1;
4012 strcpy(bcc_ptr
, "?????");
4013 bcc_ptr
+= strlen("?????");
4015 count
= bcc_ptr
- &pSMB
->Password
[0];
4016 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
4017 pSMB
->hdr
.smb_buf_length
) + count
);
4018 pSMB
->ByteCount
= cpu_to_le16(count
);
4020 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
4023 /* above now done in SendReceive */
4024 if ((rc
== 0) && (tcon
!= NULL
)) {
4027 tcon
->tidStatus
= CifsGood
;
4028 tcon
->need_reconnect
= false;
4029 tcon
->tid
= smb_buffer_response
->Tid
;
4030 bcc_ptr
= pByteArea(smb_buffer_response
);
4031 bytes_left
= get_bcc(smb_buffer_response
);
4032 length
= strnlen(bcc_ptr
, bytes_left
- 2);
4033 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
4039 /* skip service field (NB: this field is always ASCII) */
4041 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
4042 (bcc_ptr
[2] == 'C')) {
4043 cifs_dbg(FYI
, "IPC connection\n");
4046 } else if (length
== 2) {
4047 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
4048 /* the most common case */
4049 cifs_dbg(FYI
, "disk share connection\n");
4052 bcc_ptr
+= length
+ 1;
4053 bytes_left
-= (length
+ 1);
4054 strlcpy(tcon
->treeName
, tree
, sizeof(tcon
->treeName
));
4056 /* mostly informational -- no need to fail on error here */
4057 kfree(tcon
->nativeFileSystem
);
4058 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
4059 bytes_left
, is_unicode
,
4062 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
4064 if ((smb_buffer_response
->WordCount
== 3) ||
4065 (smb_buffer_response
->WordCount
== 7))
4066 /* field is in same location */
4067 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
4070 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
4071 } else if ((rc
== 0) && tcon
== NULL
) {
4072 /* all we need to save for IPC$ connection */
4073 ses
->ipc_tid
= smb_buffer_response
->Tid
;
4076 cifs_buf_release(smb_buffer
);
4080 static void delayed_free(struct rcu_head
*p
)
4082 struct cifs_sb_info
*sbi
= container_of(p
, struct cifs_sb_info
, rcu
);
4083 unload_nls(sbi
->local_nls
);
4088 cifs_umount(struct cifs_sb_info
*cifs_sb
)
4090 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4091 struct rb_node
*node
;
4092 struct tcon_link
*tlink
;
4094 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
4096 spin_lock(&cifs_sb
->tlink_tree_lock
);
4097 while ((node
= rb_first(root
))) {
4098 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4099 cifs_get_tlink(tlink
);
4100 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4101 rb_erase(node
, root
);
4103 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4104 cifs_put_tlink(tlink
);
4105 spin_lock(&cifs_sb
->tlink_tree_lock
);
4107 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4109 bdi_destroy(&cifs_sb
->bdi
);
4110 kfree(cifs_sb
->mountdata
);
4111 kfree(cifs_sb
->prepath
);
4112 call_rcu(&cifs_sb
->rcu
, delayed_free
);
4116 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
4119 struct TCP_Server_Info
*server
= ses
->server
;
4121 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
4124 /* only send once per connect */
4125 if (!server
->ops
->need_neg(server
))
4128 set_credits(server
, 1);
4130 rc
= server
->ops
->negotiate(xid
, ses
);
4132 spin_lock(&GlobalMid_Lock
);
4133 if (server
->tcpStatus
== CifsNeedNegotiate
)
4134 server
->tcpStatus
= CifsGood
;
4137 spin_unlock(&GlobalMid_Lock
);
4144 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
4145 struct nls_table
*nls_info
)
4148 struct TCP_Server_Info
*server
= ses
->server
;
4150 ses
->capabilities
= server
->capabilities
;
4151 if (linuxExtEnabled
== 0)
4152 ses
->capabilities
&= (~server
->vals
->cap_unix
);
4154 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4155 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
4157 if (ses
->auth_key
.response
) {
4158 cifs_dbg(VFS
, "Free previous auth_key.response = %p\n",
4159 ses
->auth_key
.response
);
4160 kfree(ses
->auth_key
.response
);
4161 ses
->auth_key
.response
= NULL
;
4162 ses
->auth_key
.len
= 0;
4165 if (server
->ops
->sess_setup
)
4166 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
4169 cifs_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
4175 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
4177 vol
->sectype
= ses
->sectype
;
4179 /* krb5 is special, since we don't need username or pw */
4180 if (vol
->sectype
== Kerberos
)
4183 return cifs_set_cifscreds(vol
, ses
);
4186 static struct cifs_tcon
*
4187 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
4190 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
4191 struct cifs_ses
*ses
;
4192 struct cifs_tcon
*tcon
= NULL
;
4193 struct smb_vol
*vol_info
;
4195 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
4196 if (vol_info
== NULL
)
4197 return ERR_PTR(-ENOMEM
);
4199 vol_info
->local_nls
= cifs_sb
->local_nls
;
4200 vol_info
->linux_uid
= fsuid
;
4201 vol_info
->cred_uid
= fsuid
;
4202 vol_info
->UNC
= master_tcon
->treeName
;
4203 vol_info
->retry
= master_tcon
->retry
;
4204 vol_info
->nocase
= master_tcon
->nocase
;
4205 vol_info
->local_lease
= master_tcon
->local_lease
;
4206 vol_info
->resilient
= master_tcon
->use_resilient
;
4207 vol_info
->persistent
= master_tcon
->use_persistent
;
4208 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
4209 vol_info
->sectype
= master_tcon
->ses
->sectype
;
4210 vol_info
->sign
= master_tcon
->ses
->sign
;
4211 vol_info
->seal
= master_tcon
->seal
;
4213 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
4219 /* get a reference for the same TCP session */
4220 spin_lock(&cifs_tcp_ses_lock
);
4221 ++master_tcon
->ses
->server
->srv_count
;
4222 spin_unlock(&cifs_tcp_ses_lock
);
4224 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
4226 tcon
= (struct cifs_tcon
*)ses
;
4227 cifs_put_tcp_session(master_tcon
->ses
->server
, 0);
4231 tcon
= cifs_get_tcon(ses
, vol_info
);
4233 cifs_put_smb_ses(ses
);
4238 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
4240 kfree(vol_info
->username
);
4241 kzfree(vol_info
->password
);
4248 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
4250 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
4253 /* find and return a tlink with given uid */
4254 static struct tcon_link
*
4255 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
4257 struct rb_node
*node
= root
->rb_node
;
4258 struct tcon_link
*tlink
;
4261 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4263 if (uid_gt(tlink
->tl_uid
, uid
))
4264 node
= node
->rb_left
;
4265 else if (uid_lt(tlink
->tl_uid
, uid
))
4266 node
= node
->rb_right
;
4273 /* insert a tcon_link into the tree */
4275 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
4277 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
4278 struct tcon_link
*tlink
;
4281 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
4284 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
4285 new = &((*new)->rb_left
);
4287 new = &((*new)->rb_right
);
4290 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
4291 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
4295 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4298 * If the superblock doesn't refer to a multiuser mount, then just return
4299 * the master tcon for the mount.
4301 * First, search the rbtree for an existing tcon for this fsuid. If one
4302 * exists, then check to see if it's pending construction. If it is then wait
4303 * for construction to complete. Once it's no longer pending, check to see if
4304 * it failed and either return an error or retry construction, depending on
4307 * If one doesn't exist then insert a new tcon_link struct into the tree and
4308 * try to construct a new one.
4311 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4314 kuid_t fsuid
= current_fsuid();
4315 struct tcon_link
*tlink
, *newtlink
;
4317 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4318 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4320 spin_lock(&cifs_sb
->tlink_tree_lock
);
4321 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4323 cifs_get_tlink(tlink
);
4324 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4326 if (tlink
== NULL
) {
4327 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4328 if (newtlink
== NULL
)
4329 return ERR_PTR(-ENOMEM
);
4330 newtlink
->tl_uid
= fsuid
;
4331 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4332 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4333 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4334 cifs_get_tlink(newtlink
);
4336 spin_lock(&cifs_sb
->tlink_tree_lock
);
4337 /* was one inserted after previous search? */
4338 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4340 cifs_get_tlink(tlink
);
4341 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4343 goto wait_for_construction
;
4346 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4347 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4349 wait_for_construction
:
4350 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4351 TASK_INTERRUPTIBLE
);
4353 cifs_put_tlink(tlink
);
4354 return ERR_PTR(-ERESTARTSYS
);
4357 /* if it's good, return it */
4358 if (!IS_ERR(tlink
->tl_tcon
))
4361 /* return error if we tried this already recently */
4362 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4363 cifs_put_tlink(tlink
);
4364 return ERR_PTR(-EACCES
);
4367 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4368 goto wait_for_construction
;
4371 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4372 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4373 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4375 if (IS_ERR(tlink
->tl_tcon
)) {
4376 cifs_put_tlink(tlink
);
4377 return ERR_PTR(-EACCES
);
4384 * periodic workqueue job that scans tcon_tree for a superblock and closes
4388 cifs_prune_tlinks(struct work_struct
*work
)
4390 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4392 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4393 struct rb_node
*node
= rb_first(root
);
4394 struct rb_node
*tmp
;
4395 struct tcon_link
*tlink
;
4398 * Because we drop the spinlock in the loop in order to put the tlink
4399 * it's not guarded against removal of links from the tree. The only
4400 * places that remove entries from the tree are this function and
4401 * umounts. Because this function is non-reentrant and is canceled
4402 * before umount can proceed, this is safe.
4404 spin_lock(&cifs_sb
->tlink_tree_lock
);
4405 node
= rb_first(root
);
4406 while (node
!= NULL
) {
4408 node
= rb_next(tmp
);
4409 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4411 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4412 atomic_read(&tlink
->tl_count
) != 0 ||
4413 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4416 cifs_get_tlink(tlink
);
4417 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4418 rb_erase(tmp
, root
);
4420 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4421 cifs_put_tlink(tlink
);
4422 spin_lock(&cifs_sb
->tlink_tree_lock
);
4424 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4426 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,