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/sched/mm.h>
25 #include <linux/sched/signal.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/slab.h>
29 #include <linux/pagemap.h>
30 #include <linux/ctype.h>
31 #include <linux/utsname.h>
32 #include <linux/mempool.h>
33 #include <linux/delay.h>
34 #include <linux/completion.h>
35 #include <linux/kthread.h>
36 #include <linux/pagevec.h>
37 #include <linux/freezer.h>
38 #include <linux/namei.h>
39 #include <linux/uuid.h>
40 #include <linux/uaccess.h>
41 #include <asm/processor.h>
42 #include <linux/inet.h>
43 #include <linux/module.h>
44 #include <keys/user-type.h>
46 #include <linux/parser.h>
47 #include <linux/bvec.h>
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
56 #include "rfc1002pdu.h"
58 #include "smb2proto.h"
59 #include "smbdirect.h"
60 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
64 #include "fs_context.h"
66 extern mempool_t
*cifs_req_poolp
;
67 extern bool disable_legacy_dialects
;
69 /* FIXME: should these be tunable? */
70 #define TLINK_ERROR_EXPIRE (1 * HZ)
71 #define TLINK_IDLE_EXPIRE (600 * HZ)
73 /* Drop the connection to not overload the server */
74 #define NUM_STATUS_IO_TIMEOUT 5
77 /* Mount options that take no arguments */
78 Opt_user_xattr
, Opt_nouser_xattr
,
79 Opt_forceuid
, Opt_noforceuid
,
80 Opt_forcegid
, Opt_noforcegid
,
81 Opt_noblocksend
, Opt_noautotune
, Opt_nolease
,
82 Opt_hard
, Opt_soft
, Opt_perm
, Opt_noperm
, Opt_nodelete
,
83 Opt_mapposix
, Opt_nomapposix
,
84 Opt_mapchars
, Opt_nomapchars
, Opt_sfu
,
85 Opt_nosfu
, Opt_nodfs
, Opt_posixpaths
,
86 Opt_noposixpaths
, Opt_nounix
, Opt_unix
,
89 Opt_handlecache
, Opt_nohandlecache
,
90 Opt_forcemandatorylock
, Opt_setuidfromacl
, Opt_setuids
,
91 Opt_nosetuids
, Opt_dynperm
, Opt_nodynperm
,
92 Opt_nohard
, Opt_nosoft
,
94 Opt_nostrictsync
, Opt_strictsync
,
95 Opt_serverino
, Opt_noserverino
,
96 Opt_rwpidforward
, Opt_cifsacl
, Opt_nocifsacl
,
97 Opt_acl
, Opt_noacl
, Opt_locallease
,
98 Opt_sign
, Opt_ignore_signature
, Opt_seal
, Opt_noac
,
99 Opt_fsc
, Opt_mfsymlinks
,
100 Opt_multiuser
, Opt_sloppy
, Opt_nosharesock
,
101 Opt_persistent
, Opt_nopersistent
,
102 Opt_resilient
, Opt_noresilient
,
103 Opt_domainauto
, Opt_rdma
, Opt_modesid
, Opt_rootfs
,
104 Opt_multichannel
, Opt_nomultichannel
,
107 /* Mount options which take numeric value */
108 Opt_backupuid
, Opt_backupgid
, Opt_uid
,
109 Opt_cruid
, Opt_gid
, Opt_file_mode
,
110 Opt_dirmode
, Opt_port
,
112 Opt_blocksize
, Opt_rsize
, Opt_wsize
, Opt_actimeo
,
113 Opt_echo_interval
, Opt_max_credits
, Opt_handletimeout
,
114 Opt_snapshot
, Opt_max_channels
,
116 /* Mount options which take string value */
117 Opt_user
, Opt_pass
, Opt_ip
,
118 Opt_domain
, Opt_srcaddr
, Opt_iocharset
,
119 Opt_netbiosname
, Opt_servern
,
120 Opt_ver
, Opt_vers
, Opt_sec
, Opt_cache
,
122 /* Mount options to be ignored */
125 /* Options which could be blank */
133 static const match_table_t cifs_mount_option_tokens
= {
135 { Opt_user_xattr
, "user_xattr" },
136 { Opt_nouser_xattr
, "nouser_xattr" },
137 { Opt_forceuid
, "forceuid" },
138 { Opt_noforceuid
, "noforceuid" },
139 { Opt_forcegid
, "forcegid" },
140 { Opt_noforcegid
, "noforcegid" },
141 { Opt_noblocksend
, "noblocksend" },
142 { Opt_noautotune
, "noautotune" },
143 { Opt_nolease
, "nolease" },
144 { Opt_hard
, "hard" },
145 { Opt_soft
, "soft" },
146 { Opt_perm
, "perm" },
147 { Opt_noperm
, "noperm" },
148 { Opt_nodelete
, "nodelete" },
149 { Opt_mapchars
, "mapchars" }, /* SFU style */
150 { Opt_nomapchars
, "nomapchars" },
151 { Opt_mapposix
, "mapposix" }, /* SFM style */
152 { Opt_nomapposix
, "nomapposix" },
154 { Opt_nosfu
, "nosfu" },
155 { Opt_nodfs
, "nodfs" },
156 { Opt_posixpaths
, "posixpaths" },
157 { Opt_noposixpaths
, "noposixpaths" },
158 { Opt_nounix
, "nounix" },
159 { Opt_nounix
, "nolinux" },
160 { Opt_nounix
, "noposix" },
161 { Opt_unix
, "unix" },
162 { Opt_unix
, "linux" },
163 { Opt_unix
, "posix" },
164 { Opt_nocase
, "nocase" },
165 { Opt_nocase
, "ignorecase" },
167 { Opt_nobrl
, "nobrl" },
168 { Opt_handlecache
, "handlecache" },
169 { Opt_nohandlecache
, "nohandlecache" },
170 { Opt_nobrl
, "nolock" },
171 { Opt_forcemandatorylock
, "forcemandatorylock" },
172 { Opt_forcemandatorylock
, "forcemand" },
173 { Opt_setuids
, "setuids" },
174 { Opt_nosetuids
, "nosetuids" },
175 { Opt_setuidfromacl
, "idsfromsid" },
176 { Opt_dynperm
, "dynperm" },
177 { Opt_nodynperm
, "nodynperm" },
178 { Opt_nohard
, "nohard" },
179 { Opt_nosoft
, "nosoft" },
180 { Opt_nointr
, "nointr" },
181 { Opt_intr
, "intr" },
182 { Opt_nostrictsync
, "nostrictsync" },
183 { Opt_strictsync
, "strictsync" },
184 { Opt_serverino
, "serverino" },
185 { Opt_noserverino
, "noserverino" },
186 { Opt_rwpidforward
, "rwpidforward" },
187 { Opt_modesid
, "modefromsid" },
188 { Opt_cifsacl
, "cifsacl" },
189 { Opt_nocifsacl
, "nocifsacl" },
191 { Opt_noacl
, "noacl" },
192 { Opt_locallease
, "locallease" },
193 { Opt_sign
, "sign" },
194 { Opt_ignore_signature
, "signloosely" },
195 { Opt_seal
, "seal" },
196 { Opt_noac
, "noac" },
198 { Opt_mfsymlinks
, "mfsymlinks" },
199 { Opt_multiuser
, "multiuser" },
200 { Opt_sloppy
, "sloppy" },
201 { Opt_nosharesock
, "nosharesock" },
202 { Opt_persistent
, "persistenthandles"},
203 { Opt_nopersistent
, "nopersistenthandles"},
204 { Opt_resilient
, "resilienthandles"},
205 { Opt_noresilient
, "noresilienthandles"},
206 { Opt_domainauto
, "domainauto"},
208 { Opt_multichannel
, "multichannel" },
209 { Opt_nomultichannel
, "nomultichannel" },
211 { Opt_backupuid
, "backupuid=%s" },
212 { Opt_backupgid
, "backupgid=%s" },
213 { Opt_uid
, "uid=%s" },
214 { Opt_cruid
, "cruid=%s" },
215 { Opt_gid
, "gid=%s" },
216 { Opt_file_mode
, "file_mode=%s" },
217 { Opt_dirmode
, "dirmode=%s" },
218 { Opt_dirmode
, "dir_mode=%s" },
219 { Opt_port
, "port=%s" },
220 { Opt_min_enc_offload
, "esize=%s" },
221 { Opt_blocksize
, "bsize=%s" },
222 { Opt_rsize
, "rsize=%s" },
223 { Opt_wsize
, "wsize=%s" },
224 { Opt_actimeo
, "actimeo=%s" },
225 { Opt_handletimeout
, "handletimeout=%s" },
226 { Opt_echo_interval
, "echo_interval=%s" },
227 { Opt_max_credits
, "max_credits=%s" },
228 { Opt_snapshot
, "snapshot=%s" },
229 { Opt_max_channels
, "max_channels=%s" },
230 { Opt_compress
, "compress=%s" },
232 { Opt_blank_user
, "user=" },
233 { Opt_blank_user
, "username=" },
234 { Opt_user
, "user=%s" },
235 { Opt_user
, "username=%s" },
236 { Opt_blank_pass
, "pass=" },
237 { Opt_blank_pass
, "password=" },
238 { Opt_pass
, "pass=%s" },
239 { Opt_pass
, "password=%s" },
240 { Opt_blank_ip
, "ip=" },
241 { Opt_blank_ip
, "addr=" },
243 { Opt_ip
, "addr=%s" },
244 { Opt_ignore
, "unc=%s" },
245 { Opt_ignore
, "target=%s" },
246 { Opt_ignore
, "path=%s" },
247 { Opt_domain
, "dom=%s" },
248 { Opt_domain
, "domain=%s" },
249 { Opt_domain
, "workgroup=%s" },
250 { Opt_srcaddr
, "srcaddr=%s" },
251 { Opt_ignore
, "prefixpath=%s" },
252 { Opt_iocharset
, "iocharset=%s" },
253 { Opt_netbiosname
, "netbiosname=%s" },
254 { Opt_servern
, "servern=%s" },
255 { Opt_ver
, "ver=%s" },
256 { Opt_vers
, "vers=%s" },
257 { Opt_sec
, "sec=%s" },
258 { Opt_cache
, "cache=%s" },
260 { Opt_ignore
, "cred" },
261 { Opt_ignore
, "credentials" },
262 { Opt_ignore
, "cred=%s" },
263 { Opt_ignore
, "credentials=%s" },
264 { Opt_ignore
, "guest" },
265 { Opt_ignore
, "rw" },
266 { Opt_ignore
, "ro" },
267 { Opt_ignore
, "suid" },
268 { Opt_ignore
, "nosuid" },
269 { Opt_ignore
, "exec" },
270 { Opt_ignore
, "noexec" },
271 { Opt_ignore
, "nodev" },
272 { Opt_ignore
, "noauto" },
273 { Opt_ignore
, "dev" },
274 { Opt_ignore
, "mand" },
275 { Opt_ignore
, "nomand" },
276 { Opt_ignore
, "relatime" },
277 { Opt_ignore
, "_netdev" },
278 { Opt_rootfs
, "rootfs" },
283 static int ip_connect(struct TCP_Server_Info
*server
);
284 static int generic_ip_connect(struct TCP_Server_Info
*server
);
285 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
286 static void cifs_prune_tlinks(struct work_struct
*work
);
287 static char *extract_hostname(const char *unc
);
290 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
291 * get their ip addresses changed at some point.
293 * This should be called with server->srv_mutex held.
295 #ifdef CONFIG_CIFS_DFS_UPCALL
296 static int reconn_set_ipaddr(struct TCP_Server_Info
*server
)
300 char *unc
, *ipaddr
= NULL
;
302 if (!server
->hostname
)
305 len
= strlen(server
->hostname
) + 3;
307 unc
= kmalloc(len
, GFP_KERNEL
);
309 cifs_dbg(FYI
, "%s: failed to create UNC path\n", __func__
);
312 scnprintf(unc
, len
, "\\\\%s", server
->hostname
);
314 rc
= dns_resolve_server_name_to_ip(unc
, &ipaddr
);
318 cifs_dbg(FYI
, "%s: failed to resolve server part of %s to IP: %d\n",
319 __func__
, server
->hostname
, rc
);
323 spin_lock(&cifs_tcp_ses_lock
);
324 rc
= cifs_convert_address((struct sockaddr
*)&server
->dstaddr
, ipaddr
,
326 spin_unlock(&cifs_tcp_ses_lock
);
332 static inline int reconn_set_ipaddr(struct TCP_Server_Info
*server
)
338 #ifdef CONFIG_CIFS_DFS_UPCALL
339 /* These functions must be called with server->srv_mutex held */
340 static void reconn_set_next_dfs_target(struct TCP_Server_Info
*server
,
341 struct cifs_sb_info
*cifs_sb
,
342 struct dfs_cache_tgt_list
*tgt_list
,
343 struct dfs_cache_tgt_iterator
**tgt_it
)
347 if (!cifs_sb
|| !cifs_sb
->origin_fullpath
)
351 *tgt_it
= dfs_cache_get_tgt_iterator(tgt_list
);
353 *tgt_it
= dfs_cache_get_next_tgt(tgt_list
, *tgt_it
);
355 *tgt_it
= dfs_cache_get_tgt_iterator(tgt_list
);
358 cifs_dbg(FYI
, "%s: UNC: %s\n", __func__
, cifs_sb
->origin_fullpath
);
360 name
= dfs_cache_get_tgt_name(*tgt_it
);
362 kfree(server
->hostname
);
364 server
->hostname
= extract_hostname(name
);
365 if (IS_ERR(server
->hostname
)) {
367 "%s: failed to extract hostname from target: %ld\n",
368 __func__
, PTR_ERR(server
->hostname
));
372 static inline int reconn_setup_dfs_targets(struct cifs_sb_info
*cifs_sb
,
373 struct dfs_cache_tgt_list
*tl
)
375 if (!cifs_sb
->origin_fullpath
)
377 return dfs_cache_noreq_find(cifs_sb
->origin_fullpath
+ 1, NULL
, tl
);
382 * cifs tcp session reconnection
384 * mark tcp session as reconnecting so temporarily locked
385 * mark all smb sessions as reconnecting for tcp session
386 * reconnect tcp session
387 * wake up waiters on reconnection? - (not needed currently)
390 cifs_reconnect(struct TCP_Server_Info
*server
)
393 struct list_head
*tmp
, *tmp2
;
394 struct cifs_ses
*ses
;
395 struct cifs_tcon
*tcon
;
396 struct mid_q_entry
*mid_entry
;
397 struct list_head retry_list
;
398 #ifdef CONFIG_CIFS_DFS_UPCALL
399 struct super_block
*sb
= NULL
;
400 struct cifs_sb_info
*cifs_sb
= NULL
;
401 struct dfs_cache_tgt_list tgt_list
= {0};
402 struct dfs_cache_tgt_iterator
*tgt_it
= NULL
;
405 spin_lock(&GlobalMid_Lock
);
406 server
->nr_targets
= 1;
407 #ifdef CONFIG_CIFS_DFS_UPCALL
408 spin_unlock(&GlobalMid_Lock
);
409 sb
= cifs_get_tcp_super(server
);
412 cifs_dbg(FYI
, "%s: will not do DFS failover: rc = %d\n",
416 cifs_sb
= CIFS_SB(sb
);
417 rc
= reconn_setup_dfs_targets(cifs_sb
, &tgt_list
);
420 if (rc
!= -EOPNOTSUPP
) {
421 cifs_server_dbg(VFS
, "%s: no target servers for DFS failover\n",
425 server
->nr_targets
= dfs_cache_get_nr_tgts(&tgt_list
);
428 cifs_dbg(FYI
, "%s: will retry %d target(s)\n", __func__
,
430 spin_lock(&GlobalMid_Lock
);
432 if (server
->tcpStatus
== CifsExiting
) {
433 /* the demux thread will exit normally
434 next time through the loop */
435 spin_unlock(&GlobalMid_Lock
);
436 #ifdef CONFIG_CIFS_DFS_UPCALL
437 dfs_cache_free_tgts(&tgt_list
);
438 cifs_put_tcp_super(sb
);
440 wake_up(&server
->response_q
);
443 server
->tcpStatus
= CifsNeedReconnect
;
444 spin_unlock(&GlobalMid_Lock
);
446 server
->max_read
= 0;
448 cifs_dbg(FYI
, "Mark tcp session as need reconnect\n");
449 trace_smb3_reconnect(server
->CurrentMid
, server
->hostname
);
451 /* before reconnecting the tcp session, mark the smb session (uid)
452 and the tid bad so they are not used until reconnected */
453 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
455 spin_lock(&cifs_tcp_ses_lock
);
456 list_for_each(tmp
, &server
->smb_ses_list
) {
457 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
458 ses
->need_reconnect
= true;
459 list_for_each(tmp2
, &ses
->tcon_list
) {
460 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
461 tcon
->need_reconnect
= true;
464 ses
->tcon_ipc
->need_reconnect
= true;
466 spin_unlock(&cifs_tcp_ses_lock
);
468 /* do not want to be sending data on a socket we are freeing */
469 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
470 mutex_lock(&server
->srv_mutex
);
471 if (server
->ssocket
) {
472 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
473 server
->ssocket
->state
, server
->ssocket
->flags
);
474 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
475 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
476 server
->ssocket
->state
, server
->ssocket
->flags
);
477 sock_release(server
->ssocket
);
478 server
->ssocket
= NULL
;
480 server
->sequence_number
= 0;
481 server
->session_estab
= false;
482 kfree(server
->session_key
.response
);
483 server
->session_key
.response
= NULL
;
484 server
->session_key
.len
= 0;
485 server
->lstrp
= jiffies
;
487 /* mark submitted MIDs for retry and issue callback */
488 INIT_LIST_HEAD(&retry_list
);
489 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
490 spin_lock(&GlobalMid_Lock
);
491 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
492 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
493 kref_get(&mid_entry
->refcount
);
494 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
495 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
496 list_move(&mid_entry
->qhead
, &retry_list
);
497 mid_entry
->mid_flags
|= MID_DELETED
;
499 spin_unlock(&GlobalMid_Lock
);
500 mutex_unlock(&server
->srv_mutex
);
502 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
503 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
504 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
505 list_del_init(&mid_entry
->qhead
);
506 mid_entry
->callback(mid_entry
);
507 cifs_mid_q_entry_release(mid_entry
);
510 if (cifs_rdma_enabled(server
)) {
511 mutex_lock(&server
->srv_mutex
);
512 smbd_destroy(server
);
513 mutex_unlock(&server
->srv_mutex
);
519 mutex_lock(&server
->srv_mutex
);
520 #ifdef CONFIG_CIFS_DFS_UPCALL
522 * Set up next DFS target server (if any) for reconnect. If DFS
523 * feature is disabled, then we will retry last server we
524 * connected to before.
526 reconn_set_next_dfs_target(server
, cifs_sb
, &tgt_list
, &tgt_it
);
528 rc
= reconn_set_ipaddr(server
);
530 cifs_dbg(FYI
, "%s: failed to resolve hostname: %d\n",
534 if (cifs_rdma_enabled(server
))
535 rc
= smbd_reconnect(server
);
537 rc
= generic_ip_connect(server
);
539 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
540 mutex_unlock(&server
->srv_mutex
);
543 atomic_inc(&tcpSesReconnectCount
);
544 set_credits(server
, 1);
545 spin_lock(&GlobalMid_Lock
);
546 if (server
->tcpStatus
!= CifsExiting
)
547 server
->tcpStatus
= CifsNeedNegotiate
;
548 spin_unlock(&GlobalMid_Lock
);
549 mutex_unlock(&server
->srv_mutex
);
551 } while (server
->tcpStatus
== CifsNeedReconnect
);
553 #ifdef CONFIG_CIFS_DFS_UPCALL
555 rc
= dfs_cache_noreq_update_tgthint(cifs_sb
->origin_fullpath
+ 1,
558 cifs_server_dbg(VFS
, "%s: failed to update DFS target hint: rc = %d\n",
561 rc
= dfs_cache_update_vol(cifs_sb
->origin_fullpath
, server
);
563 cifs_server_dbg(VFS
, "%s: failed to update vol info in DFS cache: rc = %d\n",
566 dfs_cache_free_tgts(&tgt_list
);
570 cifs_put_tcp_super(sb
);
572 if (server
->tcpStatus
== CifsNeedNegotiate
)
573 mod_delayed_work(cifsiod_wq
, &server
->echo
, 0);
575 wake_up(&server
->response_q
);
580 cifs_echo_request(struct work_struct
*work
)
583 struct TCP_Server_Info
*server
= container_of(work
,
584 struct TCP_Server_Info
, echo
.work
);
585 unsigned long echo_interval
;
588 * If we need to renegotiate, set echo interval to zero to
589 * immediately call echo service where we can renegotiate.
591 if (server
->tcpStatus
== CifsNeedNegotiate
)
594 echo_interval
= server
->echo_interval
;
597 * We cannot send an echo if it is disabled.
598 * Also, no need to ping if we got a response recently.
601 if (server
->tcpStatus
== CifsNeedReconnect
||
602 server
->tcpStatus
== CifsExiting
||
603 server
->tcpStatus
== CifsNew
||
604 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
605 time_before(jiffies
, server
->lstrp
+ echo_interval
- HZ
))
608 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
610 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
614 queue_delayed_work(cifsiod_wq
, &server
->echo
, server
->echo_interval
);
618 allocate_buffers(struct TCP_Server_Info
*server
)
620 if (!server
->bigbuf
) {
621 server
->bigbuf
= (char *)cifs_buf_get();
622 if (!server
->bigbuf
) {
623 cifs_server_dbg(VFS
, "No memory for large SMB response\n");
625 /* retry will check if exiting */
628 } else if (server
->large_buf
) {
629 /* we are reusing a dirty large buf, clear its start */
630 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
633 if (!server
->smallbuf
) {
634 server
->smallbuf
= (char *)cifs_small_buf_get();
635 if (!server
->smallbuf
) {
636 cifs_server_dbg(VFS
, "No memory for SMB response\n");
638 /* retry will check if exiting */
641 /* beginning of smb buffer is cleared in our buf_get */
643 /* if existing small buf clear beginning */
644 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
651 server_unresponsive(struct TCP_Server_Info
*server
)
654 * We need to wait 3 echo intervals to make sure we handle such
656 * 1s client sends a normal SMB request
657 * 2s client gets a response
658 * 30s echo workqueue job pops, and decides we got a response recently
659 * and don't need to send another
661 * 65s kernel_recvmsg times out, and we see that we haven't gotten
662 * a response in >60s.
664 if ((server
->tcpStatus
== CifsGood
||
665 server
->tcpStatus
== CifsNeedNegotiate
) &&
666 time_after(jiffies
, server
->lstrp
+ 3 * server
->echo_interval
)) {
667 cifs_server_dbg(VFS
, "has not responded in %lu seconds. Reconnecting...\n",
668 (3 * server
->echo_interval
) / HZ
);
669 cifs_reconnect(server
);
677 zero_credits(struct TCP_Server_Info
*server
)
681 spin_lock(&server
->req_lock
);
682 val
= server
->credits
+ server
->echo_credits
+ server
->oplock_credits
;
683 if (server
->in_flight
== 0 && val
== 0) {
684 spin_unlock(&server
->req_lock
);
687 spin_unlock(&server
->req_lock
);
692 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct msghdr
*smb_msg
)
697 smb_msg
->msg_control
= NULL
;
698 smb_msg
->msg_controllen
= 0;
700 for (total_read
= 0; msg_data_left(smb_msg
); total_read
+= length
) {
703 /* reconnect if no credits and no requests in flight */
704 if (zero_credits(server
)) {
705 cifs_reconnect(server
);
706 return -ECONNABORTED
;
709 if (server_unresponsive(server
))
710 return -ECONNABORTED
;
711 if (cifs_rdma_enabled(server
) && server
->smbd_conn
)
712 length
= smbd_recv(server
->smbd_conn
, smb_msg
);
714 length
= sock_recvmsg(server
->ssocket
, smb_msg
, 0);
716 if (server
->tcpStatus
== CifsExiting
)
719 if (server
->tcpStatus
== CifsNeedReconnect
) {
720 cifs_reconnect(server
);
721 return -ECONNABORTED
;
724 if (length
== -ERESTARTSYS
||
728 * Minimum sleep to prevent looping, allowing socket
729 * to clear and app threads to set tcpStatus
730 * CifsNeedReconnect if server hung.
732 usleep_range(1000, 2000);
738 cifs_dbg(FYI
, "Received no data or error: %d\n", length
);
739 cifs_reconnect(server
);
740 return -ECONNABORTED
;
747 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
748 unsigned int to_read
)
750 struct msghdr smb_msg
;
751 struct kvec iov
= {.iov_base
= buf
, .iov_len
= to_read
};
752 iov_iter_kvec(&smb_msg
.msg_iter
, READ
, &iov
, 1, to_read
);
754 return cifs_readv_from_socket(server
, &smb_msg
);
758 cifs_read_page_from_socket(struct TCP_Server_Info
*server
, struct page
*page
,
759 unsigned int page_offset
, unsigned int to_read
)
761 struct msghdr smb_msg
;
762 struct bio_vec bv
= {
763 .bv_page
= page
, .bv_len
= to_read
, .bv_offset
= page_offset
};
764 iov_iter_bvec(&smb_msg
.msg_iter
, READ
, &bv
, 1, to_read
);
765 return cifs_readv_from_socket(server
, &smb_msg
);
769 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
772 * The first byte big endian of the length field,
773 * is actually not part of the length but the type
774 * with the most common, zero, as regular data.
777 case RFC1002_SESSION_MESSAGE
:
778 /* Regular SMB response */
780 case RFC1002_SESSION_KEEP_ALIVE
:
781 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
783 case RFC1002_POSITIVE_SESSION_RESPONSE
:
784 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
786 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
788 * We get this from Windows 98 instead of an error on
789 * SMB negprot response.
791 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
792 /* give server a second to clean up */
795 * Always try 445 first on reconnect since we get NACK
796 * on some if we ever connected to port 139 (the NACK
797 * is since we do not begin with RFC1001 session
800 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
801 cifs_reconnect(server
);
804 cifs_server_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
805 cifs_reconnect(server
);
812 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
814 #ifdef CONFIG_CIFS_STATS2
815 mid
->when_received
= jiffies
;
817 spin_lock(&GlobalMid_Lock
);
819 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
821 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
823 * Trying to handle/dequeue a mid after the send_recv()
824 * function has finished processing it is a bug.
826 if (mid
->mid_flags
& MID_DELETED
)
827 pr_warn_once("trying to dequeue a deleted mid\n");
829 list_del_init(&mid
->qhead
);
830 mid
->mid_flags
|= MID_DELETED
;
832 spin_unlock(&GlobalMid_Lock
);
836 smb2_get_credits_from_hdr(char *buffer
, struct TCP_Server_Info
*server
)
838 struct smb2_sync_hdr
*shdr
= (struct smb2_sync_hdr
*)buffer
;
841 * SMB1 does not use credits.
843 if (server
->vals
->header_preamble_size
)
846 return le16_to_cpu(shdr
->CreditRequest
);
850 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
851 char *buf
, int malformed
)
853 if (server
->ops
->check_trans2
&&
854 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
856 mid
->credits_received
= smb2_get_credits_from_hdr(buf
, server
);
858 mid
->large_buf
= server
->large_buf
;
859 /* Was previous buf put in mpx struct for multi-rsp? */
860 if (!mid
->multiRsp
) {
861 /* smb buffer will be freed by user thread */
862 if (server
->large_buf
)
863 server
->bigbuf
= NULL
;
865 server
->smallbuf
= NULL
;
867 dequeue_mid(mid
, malformed
);
870 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
874 /* take it off the list, if it's not already */
875 spin_lock(&cifs_tcp_ses_lock
);
876 list_del_init(&server
->tcp_ses_list
);
877 spin_unlock(&cifs_tcp_ses_lock
);
879 spin_lock(&GlobalMid_Lock
);
880 server
->tcpStatus
= CifsExiting
;
881 spin_unlock(&GlobalMid_Lock
);
882 wake_up_all(&server
->response_q
);
884 /* check if we have blocked requests that need to free */
885 spin_lock(&server
->req_lock
);
886 if (server
->credits
<= 0)
888 spin_unlock(&server
->req_lock
);
890 * Although there should not be any requests blocked on this queue it
891 * can not hurt to be paranoid and try to wake up requests that may
892 * haven been blocked when more than 50 at time were on the wire to the
893 * same server - they now will see the session is in exit state and get
894 * out of SendReceive.
896 wake_up_all(&server
->request_q
);
897 /* give those requests time to exit */
899 if (cifs_rdma_enabled(server
))
900 smbd_destroy(server
);
901 if (server
->ssocket
) {
902 sock_release(server
->ssocket
);
903 server
->ssocket
= NULL
;
906 if (!list_empty(&server
->pending_mid_q
)) {
907 struct list_head dispose_list
;
908 struct mid_q_entry
*mid_entry
;
909 struct list_head
*tmp
, *tmp2
;
911 INIT_LIST_HEAD(&dispose_list
);
912 spin_lock(&GlobalMid_Lock
);
913 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
914 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
915 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
916 kref_get(&mid_entry
->refcount
);
917 mid_entry
->mid_state
= MID_SHUTDOWN
;
918 list_move(&mid_entry
->qhead
, &dispose_list
);
919 mid_entry
->mid_flags
|= MID_DELETED
;
921 spin_unlock(&GlobalMid_Lock
);
923 /* now walk dispose list and issue callbacks */
924 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
925 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
926 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
927 list_del_init(&mid_entry
->qhead
);
928 mid_entry
->callback(mid_entry
);
929 cifs_mid_q_entry_release(mid_entry
);
931 /* 1/8th of sec is more than enough time for them to exit */
935 if (!list_empty(&server
->pending_mid_q
)) {
937 * mpx threads have not exited yet give them at least the smb
938 * send timeout time for long ops.
940 * Due to delays on oplock break requests, we need to wait at
941 * least 45 seconds before giving up on a request getting a
942 * response and going ahead and killing cifsd.
944 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
947 * If threads still have not exited they are probably never
948 * coming home not much else we can do but free the memory.
952 kfree(server
->hostname
);
955 length
= atomic_dec_return(&tcpSesAllocCount
);
957 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
961 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
964 char *buf
= server
->smallbuf
;
965 unsigned int pdu_length
= server
->pdu_size
;
967 /* make sure this will fit in a large buffer */
968 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) -
969 server
->vals
->header_preamble_size
) {
970 cifs_server_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
971 cifs_reconnect(server
);
972 return -ECONNABORTED
;
975 /* switch to large buffer if too big for a small one */
976 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
977 server
->large_buf
= true;
978 memcpy(server
->bigbuf
, buf
, server
->total_read
);
979 buf
= server
->bigbuf
;
982 /* now read the rest */
983 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
984 pdu_length
- HEADER_SIZE(server
) + 1
985 + server
->vals
->header_preamble_size
);
989 server
->total_read
+= length
;
991 dump_smb(buf
, server
->total_read
);
993 return cifs_handle_standard(server
, mid
);
997 cifs_handle_standard(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
999 char *buf
= server
->large_buf
? server
->bigbuf
: server
->smallbuf
;
1003 * We know that we received enough to get to the MID as we
1004 * checked the pdu_length earlier. Now check to see
1005 * if the rest of the header is OK. We borrow the length
1006 * var for the rest of the loop to avoid a new stack var.
1008 * 48 bytes is enough to display the header and a little bit
1009 * into the payload for debugging purposes.
1011 length
= server
->ops
->check_message(buf
, server
->total_read
, server
);
1013 cifs_dump_mem("Bad SMB: ", buf
,
1014 min_t(unsigned int, server
->total_read
, 48));
1016 if (server
->ops
->is_session_expired
&&
1017 server
->ops
->is_session_expired(buf
)) {
1018 cifs_reconnect(server
);
1022 if (server
->ops
->is_status_pending
&&
1023 server
->ops
->is_status_pending(buf
, server
))
1029 handle_mid(mid
, server
, buf
, length
);
1034 smb2_add_credits_from_hdr(char *buffer
, struct TCP_Server_Info
*server
)
1036 struct smb2_sync_hdr
*shdr
= (struct smb2_sync_hdr
*)buffer
;
1039 * SMB1 does not use credits.
1041 if (server
->vals
->header_preamble_size
)
1044 if (shdr
->CreditRequest
) {
1045 spin_lock(&server
->req_lock
);
1046 server
->credits
+= le16_to_cpu(shdr
->CreditRequest
);
1047 spin_unlock(&server
->req_lock
);
1048 wake_up(&server
->request_q
);
1054 cifs_demultiplex_thread(void *p
)
1056 int i
, num_mids
, length
;
1057 struct TCP_Server_Info
*server
= p
;
1058 unsigned int pdu_length
;
1059 unsigned int next_offset
;
1061 struct task_struct
*task_to_wake
= NULL
;
1062 struct mid_q_entry
*mids
[MAX_COMPOUND
];
1063 char *bufs
[MAX_COMPOUND
];
1064 unsigned int noreclaim_flag
, num_io_timeout
= 0;
1066 noreclaim_flag
= memalloc_noreclaim_save();
1067 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
1069 length
= atomic_inc_return(&tcpSesAllocCount
);
1071 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
1074 allow_kernel_signal(SIGKILL
);
1075 while (server
->tcpStatus
!= CifsExiting
) {
1076 if (try_to_freeze())
1079 if (!allocate_buffers(server
))
1082 server
->large_buf
= false;
1083 buf
= server
->smallbuf
;
1084 pdu_length
= 4; /* enough to get RFC1001 header */
1086 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
1090 if (server
->vals
->header_preamble_size
== 0)
1091 server
->total_read
= 0;
1093 server
->total_read
= length
;
1096 * The right amount was read from socket - 4 bytes,
1097 * so we can now interpret the length field.
1099 pdu_length
= get_rfc1002_length(buf
);
1101 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
1102 if (!is_smb_response(server
, buf
[0]))
1105 server
->pdu_size
= pdu_length
;
1107 /* make sure we have enough to get to the MID */
1108 if (server
->pdu_size
< HEADER_SIZE(server
) - 1 -
1109 server
->vals
->header_preamble_size
) {
1110 cifs_server_dbg(VFS
, "SMB response too short (%u bytes)\n",
1112 cifs_reconnect(server
);
1116 /* read down to the MID */
1117 length
= cifs_read_from_socket(server
,
1118 buf
+ server
->vals
->header_preamble_size
,
1119 HEADER_SIZE(server
) - 1
1120 - server
->vals
->header_preamble_size
);
1123 server
->total_read
+= length
;
1125 if (server
->ops
->next_header
) {
1126 next_offset
= server
->ops
->next_header(buf
);
1128 server
->pdu_size
= next_offset
;
1131 memset(mids
, 0, sizeof(mids
));
1132 memset(bufs
, 0, sizeof(bufs
));
1135 if (server
->ops
->is_transform_hdr
&&
1136 server
->ops
->receive_transform
&&
1137 server
->ops
->is_transform_hdr(buf
)) {
1138 length
= server
->ops
->receive_transform(server
,
1143 mids
[0] = server
->ops
->find_mid(server
, buf
);
1147 if (!mids
[0] || !mids
[0]->receive
)
1148 length
= standard_receive3(server
, mids
[0]);
1150 length
= mids
[0]->receive(server
, mids
[0]);
1154 for (i
= 0; i
< num_mids
; i
++)
1156 cifs_mid_q_entry_release(mids
[i
]);
1160 if (server
->ops
->is_status_io_timeout
&&
1161 server
->ops
->is_status_io_timeout(buf
)) {
1163 if (num_io_timeout
> NUM_STATUS_IO_TIMEOUT
) {
1164 cifs_reconnect(server
);
1170 server
->lstrp
= jiffies
;
1172 for (i
= 0; i
< num_mids
; i
++) {
1173 if (mids
[i
] != NULL
) {
1174 mids
[i
]->resp_buf_size
= server
->pdu_size
;
1176 if (!mids
[i
]->multiRsp
|| mids
[i
]->multiEnd
)
1177 mids
[i
]->callback(mids
[i
]);
1179 cifs_mid_q_entry_release(mids
[i
]);
1180 } else if (server
->ops
->is_oplock_break
&&
1181 server
->ops
->is_oplock_break(bufs
[i
],
1183 smb2_add_credits_from_hdr(bufs
[i
], server
);
1184 cifs_dbg(FYI
, "Received oplock break\n");
1186 cifs_server_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
1187 atomic_read(&midCount
));
1188 cifs_dump_mem("Received Data is: ", bufs
[i
],
1189 HEADER_SIZE(server
));
1190 smb2_add_credits_from_hdr(bufs
[i
], server
);
1191 #ifdef CONFIG_CIFS_DEBUG2
1192 if (server
->ops
->dump_detail
)
1193 server
->ops
->dump_detail(bufs
[i
],
1195 cifs_dump_mids(server
);
1196 #endif /* CIFS_DEBUG2 */
1200 if (pdu_length
> server
->pdu_size
) {
1201 if (!allocate_buffers(server
))
1203 pdu_length
-= server
->pdu_size
;
1204 server
->total_read
= 0;
1205 server
->large_buf
= false;
1206 buf
= server
->smallbuf
;
1209 } /* end while !EXITING */
1211 /* buffer usually freed in free_mid - need to free it here on exit */
1212 cifs_buf_release(server
->bigbuf
);
1213 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
1214 cifs_small_buf_release(server
->smallbuf
);
1216 task_to_wake
= xchg(&server
->tsk
, NULL
);
1217 clean_demultiplex_info(server
);
1219 /* if server->tsk was NULL then wait for a signal before exiting */
1220 if (!task_to_wake
) {
1221 set_current_state(TASK_INTERRUPTIBLE
);
1222 while (!signal_pending(current
)) {
1224 set_current_state(TASK_INTERRUPTIBLE
);
1226 set_current_state(TASK_RUNNING
);
1229 memalloc_noreclaim_restore(noreclaim_flag
);
1230 module_put_and_exit(0);
1233 /* extract the host portion of the UNC string */
1235 extract_hostname(const char *unc
)
1241 /* skip double chars at beginning of string */
1242 /* BB: check validity of these bytes? */
1243 if (strlen(unc
) < 3)
1244 return ERR_PTR(-EINVAL
);
1245 for (src
= unc
; *src
&& *src
== '\\'; src
++)
1248 return ERR_PTR(-EINVAL
);
1250 /* delimiter between hostname and sharename is always '\\' now */
1251 delim
= strchr(src
, '\\');
1253 return ERR_PTR(-EINVAL
);
1256 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
1258 return ERR_PTR(-ENOMEM
);
1260 memcpy(dst
, src
, len
);
1266 static int get_option_ul(substring_t args
[], unsigned long *option
)
1271 string
= match_strdup(args
);
1274 rc
= kstrtoul(string
, 0, option
);
1280 static int get_option_uid(substring_t args
[], kuid_t
*result
)
1282 unsigned long value
;
1286 rc
= get_option_ul(args
, &value
);
1290 uid
= make_kuid(current_user_ns(), value
);
1291 if (!uid_valid(uid
))
1298 static int get_option_gid(substring_t args
[], kgid_t
*result
)
1300 unsigned long value
;
1304 rc
= get_option_ul(args
, &value
);
1308 gid
= make_kgid(current_user_ns(), value
);
1309 if (!gid_valid(gid
))
1317 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1318 * fields with the result. Returns 0 on success and an error otherwise.
1321 cifs_parse_devname(const char *devname
, struct smb_vol
*vol
)
1324 const char *delims
= "/\\";
1327 if (unlikely(!devname
|| !*devname
)) {
1328 cifs_dbg(VFS
, "Device name not specified\n");
1332 /* make sure we have a valid UNC double delimiter prefix */
1333 len
= strspn(devname
, delims
);
1337 /* find delimiter between host and sharename */
1338 pos
= strpbrk(devname
+ 2, delims
);
1342 /* skip past delimiter */
1345 /* now go until next delimiter or end of string */
1346 len
= strcspn(pos
, delims
);
1348 /* move "pos" up to delimiter or NULL */
1350 vol
->UNC
= kstrndup(devname
, pos
- devname
, GFP_KERNEL
);
1354 convert_delimiter(vol
->UNC
, '\\');
1356 /* skip any delimiter */
1357 if (*pos
== '/' || *pos
== '\\')
1360 /* If pos is NULL then no prepath */
1364 vol
->prepath
= kstrdup(pos
, GFP_KERNEL
);
1372 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1373 struct smb_vol
*vol
, bool is_smb3
)
1376 char *mountdata_copy
= NULL
, *options
;
1377 unsigned int temp_len
, i
, j
;
1379 short int override_uid
= -1;
1380 short int override_gid
= -1;
1381 bool uid_specified
= false;
1382 bool gid_specified
= false;
1383 bool sloppy
= false;
1384 char *invalid
= NULL
;
1385 char *nodename
= utsname()->nodename
;
1386 char *string
= NULL
;
1387 char *tmp_end
, *value
;
1389 bool got_ip
= false;
1390 bool got_version
= false;
1391 unsigned short port
= 0;
1392 struct sockaddr
*dstaddr
= (struct sockaddr
*)&vol
->dstaddr
;
1396 delim
= separator
[0];
1398 /* ensure we always start with zeroed-out smb_vol */
1399 memset(vol
, 0, sizeof(*vol
));
1402 * does not have to be perfect mapping since field is
1403 * informational, only used for servers that do not support
1404 * port 445 and it can be overridden at mount time
1406 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1407 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1408 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1410 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1411 /* null target name indicates to use *SMBSERVR default called name
1412 if we end up sending RFC1001 session initialize */
1413 vol
->target_rfc1001_name
[0] = 0;
1414 vol
->cred_uid
= current_uid();
1415 vol
->linux_uid
= current_uid();
1416 vol
->linux_gid
= current_gid();
1417 vol
->bsize
= 1024 * 1024; /* can improve cp performance significantly */
1419 * default to SFM style remapping of seven reserved characters
1420 * unless user overrides it or we negotiate CIFS POSIX where
1421 * it is unnecessary. Can not simultaneously use more than one mapping
1422 * since then readdir could list files that open could not open
1426 /* default to only allowing write access to owner of the mount */
1427 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1429 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1430 /* default is always to request posix paths. */
1431 vol
->posix_paths
= 1;
1432 /* default to using server inode numbers where available */
1433 vol
->server_ino
= 1;
1435 /* default is to use strict cifs caching semantics */
1436 vol
->strict_io
= true;
1438 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1440 /* Most clients set timeout to 0, allows server to use its default */
1441 vol
->handle_timeout
= 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1443 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1444 vol
->ops
= &smb30_operations
;
1445 vol
->vals
= &smbdefault_values
;
1447 vol
->echo_interval
= SMB_ECHO_INTERVAL_DEFAULT
;
1449 /* default to no multichannel (single server connection) */
1450 vol
->multichannel
= false;
1451 vol
->max_channels
= 1;
1454 goto cifs_parse_mount_err
;
1456 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1457 if (!mountdata_copy
)
1458 goto cifs_parse_mount_err
;
1460 options
= mountdata_copy
;
1461 end
= options
+ strlen(options
);
1463 if (strncmp(options
, "sep=", 4) == 0) {
1464 if (options
[4] != 0) {
1465 separator
[0] = options
[4];
1468 cifs_dbg(FYI
, "Null separator not allowed\n");
1471 vol
->backupuid_specified
= false; /* no backup intent for a user */
1472 vol
->backupgid_specified
= false; /* no backup intent for a group */
1474 switch (cifs_parse_devname(devname
, vol
)) {
1478 cifs_dbg(VFS
, "Unable to allocate memory for devname\n");
1479 goto cifs_parse_mount_err
;
1481 cifs_dbg(VFS
, "Malformed UNC in devname\n");
1482 goto cifs_parse_mount_err
;
1484 cifs_dbg(VFS
, "Unknown error parsing devname\n");
1485 goto cifs_parse_mount_err
;
1488 while ((data
= strsep(&options
, separator
)) != NULL
) {
1489 substring_t args
[MAX_OPT_ARGS
];
1490 unsigned long option
;
1496 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1500 /* Ingnore the following */
1504 /* Boolean values */
1505 case Opt_user_xattr
:
1508 case Opt_nouser_xattr
:
1514 case Opt_noforceuid
:
1520 case Opt_noforcegid
:
1523 case Opt_noblocksend
:
1524 vol
->noblocksnd
= 1;
1526 case Opt_noautotune
:
1527 vol
->noautotune
= 1;
1548 vol
->sfu_remap
= true;
1549 vol
->remap
= false; /* disable SFM mapping */
1551 case Opt_nomapchars
:
1552 vol
->sfu_remap
= false;
1556 vol
->sfu_remap
= false; /* disable SFU mapping */
1558 case Opt_nomapposix
:
1571 #ifdef CONFIG_CIFS_ROOT
1575 case Opt_posixpaths
:
1576 vol
->posix_paths
= 1;
1578 case Opt_noposixpaths
:
1579 vol
->posix_paths
= 0;
1584 "conflicting unix mount options\n");
1585 vol
->no_linux_ext
= 1;
1588 if (vol
->no_linux_ext
)
1590 "conflicting unix mount options\n");
1602 * turn off mandatory locking in mode
1603 * if remote locking is turned off since the
1604 * local vfs will do advisory
1606 if (vol
->file_mode
==
1607 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1608 vol
->file_mode
= S_IALLUGO
;
1610 case Opt_nohandlecache
:
1611 vol
->nohandlecache
= 1;
1613 case Opt_handlecache
:
1614 vol
->nohandlecache
= 0;
1616 case Opt_forcemandatorylock
:
1625 case Opt_setuidfromacl
:
1626 vol
->setuidfromacl
= 1;
1629 vol
->dynperm
= true;
1632 vol
->dynperm
= false;
1646 case Opt_nostrictsync
:
1647 vol
->nostrictsync
= 1;
1649 case Opt_strictsync
:
1650 vol
->nostrictsync
= 0;
1653 vol
->server_ino
= 1;
1655 case Opt_noserverino
:
1656 vol
->server_ino
= 0;
1658 case Opt_rwpidforward
:
1659 vol
->rwpidforward
= 1;
1671 vol
->no_psx_acl
= 0;
1674 vol
->no_psx_acl
= 1;
1676 case Opt_locallease
:
1677 vol
->local_lease
= 1;
1682 case Opt_ignore_signature
:
1684 vol
->ignore_signature
= true;
1687 /* we do not do the following in secFlags because seal
1688 * is a per tree connection (mount) not a per socket
1689 * or per-smb connection option in the protocol
1690 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1695 pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1698 #ifndef CONFIG_CIFS_FSCACHE
1699 cifs_dbg(VFS
, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1700 goto cifs_parse_mount_err
;
1704 case Opt_mfsymlinks
:
1705 vol
->mfsymlinks
= true;
1708 vol
->multiuser
= true;
1713 case Opt_nosharesock
:
1714 vol
->nosharesock
= true;
1716 case Opt_nopersistent
:
1717 vol
->nopersistent
= true;
1718 if (vol
->persistent
) {
1720 "persistenthandles mount options conflict\n");
1721 goto cifs_parse_mount_err
;
1724 case Opt_persistent
:
1725 vol
->persistent
= true;
1726 if ((vol
->nopersistent
) || (vol
->resilient
)) {
1728 "persistenthandles mount options conflict\n");
1729 goto cifs_parse_mount_err
;
1733 vol
->resilient
= true;
1734 if (vol
->persistent
) {
1736 "persistenthandles mount options conflict\n");
1737 goto cifs_parse_mount_err
;
1740 case Opt_noresilient
:
1741 vol
->resilient
= false; /* already the default */
1743 case Opt_domainauto
:
1744 vol
->domainauto
= true;
1749 case Opt_multichannel
:
1750 vol
->multichannel
= true;
1751 /* if number of channels not specified, default to 2 */
1752 if (vol
->max_channels
< 2)
1753 vol
->max_channels
= 2;
1755 case Opt_nomultichannel
:
1756 vol
->multichannel
= false;
1757 vol
->max_channels
= 1;
1760 vol
->compression
= UNKNOWN_TYPE
;
1762 "SMB3 compression support is experimental\n");
1765 /* Numeric Values */
1767 if (get_option_uid(args
, &vol
->backupuid
)) {
1768 cifs_dbg(VFS
, "%s: Invalid backupuid value\n",
1770 goto cifs_parse_mount_err
;
1772 vol
->backupuid_specified
= true;
1775 if (get_option_gid(args
, &vol
->backupgid
)) {
1776 cifs_dbg(VFS
, "%s: Invalid backupgid value\n",
1778 goto cifs_parse_mount_err
;
1780 vol
->backupgid_specified
= true;
1783 if (get_option_uid(args
, &vol
->linux_uid
)) {
1784 cifs_dbg(VFS
, "%s: Invalid uid value\n",
1786 goto cifs_parse_mount_err
;
1788 uid_specified
= true;
1791 if (get_option_uid(args
, &vol
->cred_uid
)) {
1792 cifs_dbg(VFS
, "%s: Invalid cruid value\n",
1794 goto cifs_parse_mount_err
;
1798 if (get_option_gid(args
, &vol
->linux_gid
)) {
1799 cifs_dbg(VFS
, "%s: Invalid gid value\n",
1801 goto cifs_parse_mount_err
;
1803 gid_specified
= true;
1806 if (get_option_ul(args
, &option
)) {
1807 cifs_dbg(VFS
, "%s: Invalid file_mode value\n",
1809 goto cifs_parse_mount_err
;
1811 vol
->file_mode
= option
;
1814 if (get_option_ul(args
, &option
)) {
1815 cifs_dbg(VFS
, "%s: Invalid dir_mode value\n",
1817 goto cifs_parse_mount_err
;
1819 vol
->dir_mode
= option
;
1822 if (get_option_ul(args
, &option
) ||
1823 option
> USHRT_MAX
) {
1824 cifs_dbg(VFS
, "%s: Invalid port value\n",
1826 goto cifs_parse_mount_err
;
1828 port
= (unsigned short)option
;
1830 case Opt_min_enc_offload
:
1831 if (get_option_ul(args
, &option
)) {
1832 cifs_dbg(VFS
, "Invalid minimum encrypted read offload size (esize)\n");
1833 goto cifs_parse_mount_err
;
1835 vol
->min_offload
= option
;
1838 if (get_option_ul(args
, &option
)) {
1839 cifs_dbg(VFS
, "%s: Invalid blocksize value\n",
1841 goto cifs_parse_mount_err
;
1844 * inode blocksize realistically should never need to be
1845 * less than 16K or greater than 16M and default is 1MB.
1846 * Note that small inode block sizes (e.g. 64K) can lead
1847 * to very poor performance of common tools like cp and scp
1849 if ((option
< CIFS_MAX_MSGSIZE
) ||
1850 (option
> (4 * SMB3_DEFAULT_IOSIZE
))) {
1851 cifs_dbg(VFS
, "%s: Invalid blocksize\n",
1853 goto cifs_parse_mount_err
;
1855 vol
->bsize
= option
;
1858 if (get_option_ul(args
, &option
)) {
1859 cifs_dbg(VFS
, "%s: Invalid rsize value\n",
1861 goto cifs_parse_mount_err
;
1863 vol
->rsize
= option
;
1866 if (get_option_ul(args
, &option
)) {
1867 cifs_dbg(VFS
, "%s: Invalid wsize value\n",
1869 goto cifs_parse_mount_err
;
1871 vol
->wsize
= option
;
1874 if (get_option_ul(args
, &option
)) {
1875 cifs_dbg(VFS
, "%s: Invalid actimeo value\n",
1877 goto cifs_parse_mount_err
;
1879 vol
->actimeo
= HZ
* option
;
1880 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1881 cifs_dbg(VFS
, "attribute cache timeout too large\n");
1882 goto cifs_parse_mount_err
;
1885 case Opt_handletimeout
:
1886 if (get_option_ul(args
, &option
)) {
1887 cifs_dbg(VFS
, "%s: Invalid handletimeout value\n",
1889 goto cifs_parse_mount_err
;
1891 vol
->handle_timeout
= option
;
1892 if (vol
->handle_timeout
> SMB3_MAX_HANDLE_TIMEOUT
) {
1893 cifs_dbg(VFS
, "Invalid handle cache timeout, longer than 16 minutes\n");
1894 goto cifs_parse_mount_err
;
1897 case Opt_echo_interval
:
1898 if (get_option_ul(args
, &option
)) {
1899 cifs_dbg(VFS
, "%s: Invalid echo interval value\n",
1901 goto cifs_parse_mount_err
;
1903 vol
->echo_interval
= option
;
1906 if (get_option_ul(args
, &option
)) {
1907 cifs_dbg(VFS
, "%s: Invalid snapshot time\n",
1909 goto cifs_parse_mount_err
;
1911 vol
->snapshot_time
= option
;
1913 case Opt_max_credits
:
1914 if (get_option_ul(args
, &option
) || (option
< 20) ||
1916 cifs_dbg(VFS
, "%s: Invalid max_credits value\n",
1918 goto cifs_parse_mount_err
;
1920 vol
->max_credits
= option
;
1922 case Opt_max_channels
:
1923 if (get_option_ul(args
, &option
) || option
< 1 ||
1924 option
> CIFS_MAX_CHANNELS
) {
1925 cifs_dbg(VFS
, "%s: Invalid max_channels value, needs to be 1-%d\n",
1926 __func__
, CIFS_MAX_CHANNELS
);
1927 goto cifs_parse_mount_err
;
1929 vol
->max_channels
= option
;
1932 /* String Arguments */
1934 case Opt_blank_user
:
1935 /* null user, ie. anonymous authentication */
1937 vol
->username
= NULL
;
1940 string
= match_strdup(args
);
1944 if (strnlen(string
, CIFS_MAX_USERNAME_LEN
) >
1945 CIFS_MAX_USERNAME_LEN
) {
1946 pr_warn("username too long\n");
1947 goto cifs_parse_mount_err
;
1950 kfree(vol
->username
);
1951 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1953 goto cifs_parse_mount_err
;
1955 case Opt_blank_pass
:
1956 /* passwords have to be handled differently
1957 * to allow the character used for deliminator
1958 * to be passed within them
1962 * Check if this is a case where the password
1963 * starts with a delimiter
1965 tmp_end
= strchr(data
, '=');
1967 if (!(tmp_end
< end
&& tmp_end
[1] == delim
)) {
1968 /* No it is not. Set the password to NULL */
1969 kfree_sensitive(vol
->password
);
1970 vol
->password
= NULL
;
1973 fallthrough
; /* to Opt_pass below */
1975 /* Obtain the value string */
1976 value
= strchr(data
, '=');
1979 /* Set tmp_end to end of the string */
1980 tmp_end
= (char *) value
+ strlen(value
);
1982 /* Check if following character is the deliminator
1983 * If yes, we have encountered a double deliminator
1984 * reset the NULL character to the deliminator
1986 if (tmp_end
< end
&& tmp_end
[1] == delim
) {
1989 /* Keep iterating until we get to a single
1990 * deliminator OR the end
1992 while ((tmp_end
= strchr(tmp_end
, delim
))
1993 != NULL
&& (tmp_end
[1] == delim
)) {
1994 tmp_end
= (char *) &tmp_end
[2];
1997 /* Reset var options to point to next element */
2000 options
= (char *) &tmp_end
[1];
2002 /* Reached the end of the mount option
2007 kfree_sensitive(vol
->password
);
2008 /* Now build new password string */
2009 temp_len
= strlen(value
);
2010 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
2011 if (vol
->password
== NULL
) {
2012 pr_warn("no memory for password\n");
2013 goto cifs_parse_mount_err
;
2016 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
2017 vol
->password
[j
] = value
[i
];
2018 if ((value
[i
] == delim
) &&
2019 value
[i
+1] == delim
)
2020 /* skip the second deliminator */
2023 vol
->password
[j
] = '\0';
2026 /* FIXME: should this be an error instead? */
2030 string
= match_strdup(args
);
2034 if (!cifs_convert_address(dstaddr
, string
,
2036 pr_err("bad ip= option (%s)\n", string
);
2037 goto cifs_parse_mount_err
;
2042 string
= match_strdup(args
);
2046 if (strnlen(string
, CIFS_MAX_DOMAINNAME_LEN
)
2047 == CIFS_MAX_DOMAINNAME_LEN
) {
2048 pr_warn("domain name too long\n");
2049 goto cifs_parse_mount_err
;
2052 kfree(vol
->domainname
);
2053 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
2054 if (!vol
->domainname
) {
2055 pr_warn("no memory for domainname\n");
2056 goto cifs_parse_mount_err
;
2058 cifs_dbg(FYI
, "Domain name set\n");
2061 string
= match_strdup(args
);
2065 if (!cifs_convert_address(
2066 (struct sockaddr
*)&vol
->srcaddr
,
2067 string
, strlen(string
))) {
2068 pr_warn("Could not parse srcaddr: %s\n",
2070 goto cifs_parse_mount_err
;
2074 string
= match_strdup(args
);
2078 if (strnlen(string
, 1024) >= 65) {
2079 pr_warn("iocharset name too long\n");
2080 goto cifs_parse_mount_err
;
2083 if (strncasecmp(string
, "default", 7) != 0) {
2084 kfree(vol
->iocharset
);
2085 vol
->iocharset
= kstrdup(string
,
2087 if (!vol
->iocharset
) {
2088 pr_warn("no memory for charset\n");
2089 goto cifs_parse_mount_err
;
2092 /* if iocharset not set then load_nls_default
2095 cifs_dbg(FYI
, "iocharset set to %s\n", string
);
2097 case Opt_netbiosname
:
2098 string
= match_strdup(args
);
2102 memset(vol
->source_rfc1001_name
, 0x20,
2105 * FIXME: are there cases in which a comma can
2106 * be valid in workstation netbios name (and
2107 * need special handling)?
2109 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
2110 /* don't ucase netbiosname for user */
2113 vol
->source_rfc1001_name
[i
] = string
[i
];
2115 /* The string has 16th byte zero still from
2116 * set at top of the function
2118 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
2119 pr_warn("netbiosname longer than 15 truncated\n");
2122 /* servernetbiosname specified override *SMBSERVER */
2123 string
= match_strdup(args
);
2127 /* last byte, type, is 0x20 for servr type */
2128 memset(vol
->target_rfc1001_name
, 0x20,
2129 RFC1001_NAME_LEN_WITH_NULL
);
2131 /* BB are there cases in which a comma can be
2132 valid in this workstation netbios name
2133 (and need special handling)? */
2135 /* user or mount helper must uppercase the
2137 for (i
= 0; i
< 15; i
++) {
2140 vol
->target_rfc1001_name
[i
] = string
[i
];
2142 /* The string has 16th byte zero still from
2143 set at top of the function */
2144 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
2145 pr_warn("server netbiosname longer than 15 truncated\n");
2148 /* version of mount userspace tools, not dialect */
2149 string
= match_strdup(args
);
2153 /* If interface changes in mount.cifs bump to new ver */
2154 if (strncasecmp(string
, "1", 1) == 0) {
2155 if (strlen(string
) > 1) {
2156 pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
2158 goto cifs_parse_mount_err
;
2160 /* This is the default */
2163 /* For all other value, error */
2164 pr_warn("Invalid mount helper version specified\n");
2165 goto cifs_parse_mount_err
;
2167 /* protocol version (dialect) */
2168 string
= match_strdup(args
);
2172 if (cifs_parse_smb_version(string
, vol
, is_smb3
) != 0)
2173 goto cifs_parse_mount_err
;
2177 string
= match_strdup(args
);
2181 if (cifs_parse_security_flavors(string
, vol
) != 0)
2182 goto cifs_parse_mount_err
;
2185 string
= match_strdup(args
);
2189 if (cifs_parse_cache_flavor(string
, vol
) != 0)
2190 goto cifs_parse_mount_err
;
2194 * An option we don't recognize. Save it off for later
2195 * if we haven't already found one
2201 /* Free up any allocated string */
2206 if (!sloppy
&& invalid
) {
2207 pr_err("Unknown mount option \"%s\"\n", invalid
);
2208 goto cifs_parse_mount_err
;
2211 if (vol
->rdma
&& vol
->vals
->protocol_id
< SMB30_PROT_ID
) {
2212 cifs_dbg(VFS
, "SMB Direct requires Version >=3.0\n");
2213 goto cifs_parse_mount_err
;
2217 /* Muliuser mounts require CONFIG_KEYS support */
2218 if (vol
->multiuser
) {
2219 cifs_dbg(VFS
, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2220 goto cifs_parse_mount_err
;
2224 cifs_dbg(VFS
, "CIFS mount error: No usable UNC path provided in device string!\n");
2225 goto cifs_parse_mount_err
;
2228 /* make sure UNC has a share name */
2229 if (!strchr(vol
->UNC
+ 3, '\\')) {
2230 cifs_dbg(VFS
, "Malformed UNC. Unable to find share name.\n");
2231 goto cifs_parse_mount_err
;
2238 /* No ip= option specified? Try to get it from UNC */
2239 /* Use the address part of the UNC. */
2240 slash
= strchr(&vol
->UNC
[2], '\\');
2241 len
= slash
- &vol
->UNC
[2];
2242 if (!cifs_convert_address(dstaddr
, &vol
->UNC
[2], len
)) {
2243 pr_err("Unable to determine destination address\n");
2244 goto cifs_parse_mount_err
;
2248 /* set the port that we got earlier */
2249 cifs_set_port(dstaddr
, port
);
2252 vol
->override_uid
= override_uid
;
2253 else if (override_uid
== 1)
2254 pr_notice("ignoring forceuid mount option specified with no uid= option\n");
2257 vol
->override_gid
= override_gid
;
2258 else if (override_gid
== 1)
2259 pr_notice("ignoring forcegid mount option specified with no gid= option\n");
2261 if (got_version
== false)
2262 pr_warn_once("No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.\n");
2264 kfree(mountdata_copy
);
2268 pr_warn("Could not allocate temporary buffer\n");
2269 cifs_parse_mount_err
:
2271 kfree(mountdata_copy
);
2275 /** Returns true if srcaddr isn't specified and rhs isn't
2276 * specified, or if srcaddr is specified and
2277 * matches the IP address of the rhs argument.
2280 cifs_match_ipaddr(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
2282 switch (srcaddr
->sa_family
) {
2284 return (rhs
->sa_family
== AF_UNSPEC
);
2286 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
2287 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
2288 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
2291 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
2292 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
2293 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
2297 return false; /* don't expect to be here */
2302 * If no port is specified in addr structure, we try to match with 445 port
2303 * and if it fails - with 139 ports. It should be called only if address
2304 * families of server and addr are equal.
2307 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
2309 __be16 port
, *sport
;
2311 /* SMBDirect manages its own ports, don't match it here */
2315 switch (addr
->sa_family
) {
2317 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
2318 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
2321 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
2322 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
2330 port
= htons(CIFS_PORT
);
2334 port
= htons(RFC1001_PORT
);
2337 return port
== *sport
;
2341 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2342 struct sockaddr
*srcaddr
)
2344 switch (addr
->sa_family
) {
2346 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
2347 struct sockaddr_in
*srv_addr4
=
2348 (struct sockaddr_in
*)&server
->dstaddr
;
2350 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
2355 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
2356 struct sockaddr_in6
*srv_addr6
=
2357 (struct sockaddr_in6
*)&server
->dstaddr
;
2359 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
2360 &srv_addr6
->sin6_addr
))
2362 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
2368 return false; /* don't expect to be here */
2371 if (!cifs_match_ipaddr(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2378 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2381 * The select_sectype function should either return the vol->sectype
2382 * that was specified, or "Unspecified" if that sectype was not
2383 * compatible with the given NEGOTIATE request.
2385 if (server
->ops
->select_sectype(server
, vol
->sectype
)
2390 * Now check if signing mode is acceptable. No need to check
2391 * global_secflags at this point since if MUST_SIGN is set then
2392 * the server->sign had better be too.
2394 if (vol
->sign
&& !server
->sign
)
2400 static int match_server(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2402 struct sockaddr
*addr
= (struct sockaddr
*)&vol
->dstaddr
;
2404 if (vol
->nosharesock
)
2407 /* If multidialect negotiation see if existing sessions match one */
2408 if (strcmp(vol
->vals
->version_string
, SMB3ANY_VERSION_STRING
) == 0) {
2409 if (server
->vals
->protocol_id
< SMB30_PROT_ID
)
2411 } else if (strcmp(vol
->vals
->version_string
,
2412 SMBDEFAULT_VERSION_STRING
) == 0) {
2413 if (server
->vals
->protocol_id
< SMB21_PROT_ID
)
2415 } else if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2418 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2421 if (!match_address(server
, addr
,
2422 (struct sockaddr
*)&vol
->srcaddr
))
2425 if (!match_port(server
, addr
))
2428 if (!match_security(server
, vol
))
2431 if (server
->echo_interval
!= vol
->echo_interval
* HZ
)
2434 if (server
->rdma
!= vol
->rdma
)
2437 if (server
->ignore_signature
!= vol
->ignore_signature
)
2440 if (server
->min_offload
!= vol
->min_offload
)
2446 struct TCP_Server_Info
*
2447 cifs_find_tcp_session(struct smb_vol
*vol
)
2449 struct TCP_Server_Info
*server
;
2451 spin_lock(&cifs_tcp_ses_lock
);
2452 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2454 * Skip ses channels since they're only handled in lower layers
2455 * (e.g. cifs_send_recv).
2457 if (server
->is_channel
|| !match_server(server
, vol
))
2460 ++server
->srv_count
;
2461 spin_unlock(&cifs_tcp_ses_lock
);
2462 cifs_dbg(FYI
, "Existing tcp session with server found\n");
2465 spin_unlock(&cifs_tcp_ses_lock
);
2470 cifs_put_tcp_session(struct TCP_Server_Info
*server
, int from_reconnect
)
2472 struct task_struct
*task
;
2474 spin_lock(&cifs_tcp_ses_lock
);
2475 if (--server
->srv_count
> 0) {
2476 spin_unlock(&cifs_tcp_ses_lock
);
2480 put_net(cifs_net_ns(server
));
2482 list_del_init(&server
->tcp_ses_list
);
2483 spin_unlock(&cifs_tcp_ses_lock
);
2485 cancel_delayed_work_sync(&server
->echo
);
2489 * Avoid deadlock here: reconnect work calls
2490 * cifs_put_tcp_session() at its end. Need to be sure
2491 * that reconnect work does nothing with server pointer after
2494 cancel_delayed_work(&server
->reconnect
);
2496 cancel_delayed_work_sync(&server
->reconnect
);
2498 spin_lock(&GlobalMid_Lock
);
2499 server
->tcpStatus
= CifsExiting
;
2500 spin_unlock(&GlobalMid_Lock
);
2502 cifs_crypto_secmech_release(server
);
2503 cifs_fscache_release_client_cookie(server
);
2505 kfree(server
->session_key
.response
);
2506 server
->session_key
.response
= NULL
;
2507 server
->session_key
.len
= 0;
2509 task
= xchg(&server
->tsk
, NULL
);
2511 send_sig(SIGKILL
, task
, 1);
2514 struct TCP_Server_Info
*
2515 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2517 struct TCP_Server_Info
*tcp_ses
= NULL
;
2520 cifs_dbg(FYI
, "UNC: %s\n", volume_info
->UNC
);
2522 /* see if we already have a matching tcp_ses */
2523 tcp_ses
= cifs_find_tcp_session(volume_info
);
2527 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2533 tcp_ses
->ops
= volume_info
->ops
;
2534 tcp_ses
->vals
= volume_info
->vals
;
2535 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2536 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2537 if (IS_ERR(tcp_ses
->hostname
)) {
2538 rc
= PTR_ERR(tcp_ses
->hostname
);
2539 goto out_err_crypto_release
;
2542 tcp_ses
->noblockcnt
= volume_info
->rootfs
;
2543 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
|| volume_info
->rootfs
;
2544 tcp_ses
->noautotune
= volume_info
->noautotune
;
2545 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2546 tcp_ses
->rdma
= volume_info
->rdma
;
2547 tcp_ses
->in_flight
= 0;
2548 tcp_ses
->max_in_flight
= 0;
2549 tcp_ses
->credits
= 1;
2550 init_waitqueue_head(&tcp_ses
->response_q
);
2551 init_waitqueue_head(&tcp_ses
->request_q
);
2552 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2553 mutex_init(&tcp_ses
->srv_mutex
);
2554 memcpy(tcp_ses
->workstation_RFC1001_name
,
2555 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2556 memcpy(tcp_ses
->server_RFC1001_name
,
2557 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2558 tcp_ses
->session_estab
= false;
2559 tcp_ses
->sequence_number
= 0;
2560 tcp_ses
->reconnect_instance
= 1;
2561 tcp_ses
->lstrp
= jiffies
;
2562 tcp_ses
->compress_algorithm
= cpu_to_le16(volume_info
->compression
);
2563 spin_lock_init(&tcp_ses
->req_lock
);
2564 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2565 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2566 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2567 INIT_DELAYED_WORK(&tcp_ses
->reconnect
, smb2_reconnect_server
);
2568 mutex_init(&tcp_ses
->reconnect_mutex
);
2569 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2570 sizeof(tcp_ses
->srcaddr
));
2571 memcpy(&tcp_ses
->dstaddr
, &volume_info
->dstaddr
,
2572 sizeof(tcp_ses
->dstaddr
));
2573 if (volume_info
->use_client_guid
)
2574 memcpy(tcp_ses
->client_guid
, volume_info
->client_guid
,
2575 SMB2_CLIENT_GUID_SIZE
);
2577 generate_random_uuid(tcp_ses
->client_guid
);
2579 * at this point we are the only ones with the pointer
2580 * to the struct since the kernel thread not created yet
2581 * no need to spinlock this init of tcpStatus or srv_count
2583 tcp_ses
->tcpStatus
= CifsNew
;
2584 ++tcp_ses
->srv_count
;
2586 if (volume_info
->echo_interval
>= SMB_ECHO_INTERVAL_MIN
&&
2587 volume_info
->echo_interval
<= SMB_ECHO_INTERVAL_MAX
)
2588 tcp_ses
->echo_interval
= volume_info
->echo_interval
* HZ
;
2590 tcp_ses
->echo_interval
= SMB_ECHO_INTERVAL_DEFAULT
* HZ
;
2591 if (tcp_ses
->rdma
) {
2592 #ifndef CONFIG_CIFS_SMB_DIRECT
2593 cifs_dbg(VFS
, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2595 goto out_err_crypto_release
;
2597 tcp_ses
->smbd_conn
= smbd_get_connection(
2598 tcp_ses
, (struct sockaddr
*)&volume_info
->dstaddr
);
2599 if (tcp_ses
->smbd_conn
) {
2600 cifs_dbg(VFS
, "RDMA transport established\n");
2602 goto smbd_connected
;
2605 goto out_err_crypto_release
;
2608 rc
= ip_connect(tcp_ses
);
2610 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
2611 goto out_err_crypto_release
;
2615 * since we're in a cifs function already, we know that
2616 * this will succeed. No need for try_module_get().
2618 __module_get(THIS_MODULE
);
2619 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2621 if (IS_ERR(tcp_ses
->tsk
)) {
2622 rc
= PTR_ERR(tcp_ses
->tsk
);
2623 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
2624 module_put(THIS_MODULE
);
2625 goto out_err_crypto_release
;
2627 tcp_ses
->min_offload
= volume_info
->min_offload
;
2628 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2630 tcp_ses
->nr_targets
= 1;
2631 tcp_ses
->ignore_signature
= volume_info
->ignore_signature
;
2632 /* thread spawned, put it on the list */
2633 spin_lock(&cifs_tcp_ses_lock
);
2634 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2635 spin_unlock(&cifs_tcp_ses_lock
);
2637 cifs_fscache_get_client_cookie(tcp_ses
);
2639 /* queue echo request delayed work */
2640 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, tcp_ses
->echo_interval
);
2644 out_err_crypto_release
:
2645 cifs_crypto_secmech_release(tcp_ses
);
2647 put_net(cifs_net_ns(tcp_ses
));
2651 if (!IS_ERR(tcp_ses
->hostname
))
2652 kfree(tcp_ses
->hostname
);
2653 if (tcp_ses
->ssocket
)
2654 sock_release(tcp_ses
->ssocket
);
2660 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2662 if (vol
->sectype
!= Unspecified
&&
2663 vol
->sectype
!= ses
->sectype
)
2667 * If an existing session is limited to less channels than
2668 * requested, it should not be reused
2670 if (ses
->chan_max
< vol
->max_channels
)
2673 switch (ses
->sectype
) {
2675 if (!uid_eq(vol
->cred_uid
, ses
->cred_uid
))
2679 /* NULL username means anonymous session */
2680 if (ses
->user_name
== NULL
) {
2686 /* anything else takes username/password */
2687 if (strncmp(ses
->user_name
,
2688 vol
->username
? vol
->username
: "",
2689 CIFS_MAX_USERNAME_LEN
))
2691 if ((vol
->username
&& strlen(vol
->username
) != 0) &&
2692 ses
->password
!= NULL
&&
2693 strncmp(ses
->password
,
2694 vol
->password
? vol
->password
: "",
2695 CIFS_MAX_PASSWORD_LEN
))
2702 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2704 * A new IPC connection is made and stored in the session
2705 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2708 cifs_setup_ipc(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2711 struct cifs_tcon
*tcon
;
2712 struct nls_table
*nls_codepage
;
2713 char unc
[SERVER_NAME_LENGTH
+ sizeof("//x/IPC$")] = {0};
2715 struct TCP_Server_Info
*server
= ses
->server
;
2718 * If the mount request that resulted in the creation of the
2719 * session requires encryption, force IPC to be encrypted too.
2721 if (volume_info
->seal
) {
2722 if (server
->capabilities
& SMB2_GLOBAL_CAP_ENCRYPTION
)
2725 cifs_server_dbg(VFS
,
2726 "IPC: server doesn't support encryption\n");
2731 tcon
= tconInfoAlloc();
2735 scnprintf(unc
, sizeof(unc
), "\\\\%s\\IPC$", server
->hostname
);
2738 nls_codepage
= load_nls_default();
2744 rc
= server
->ops
->tree_connect(xid
, ses
, unc
, tcon
, nls_codepage
);
2748 cifs_server_dbg(VFS
, "failed to connect to IPC (rc=%d)\n", rc
);
2753 cifs_dbg(FYI
, "IPC tcon rc = %d ipc tid = %d\n", rc
, tcon
->tid
);
2755 ses
->tcon_ipc
= tcon
;
2757 unload_nls(nls_codepage
);
2762 * cifs_free_ipc - helper to release the session IPC tcon
2764 * Needs to be called everytime a session is destroyed
2767 cifs_free_ipc(struct cifs_ses
*ses
)
2770 struct cifs_tcon
*tcon
= ses
->tcon_ipc
;
2775 if (ses
->server
->ops
->tree_disconnect
) {
2777 rc
= ses
->server
->ops
->tree_disconnect(xid
, tcon
);
2782 cifs_dbg(FYI
, "failed to disconnect IPC tcon (rc=%d)\n", rc
);
2785 ses
->tcon_ipc
= NULL
;
2789 static struct cifs_ses
*
2790 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2792 struct cifs_ses
*ses
;
2794 spin_lock(&cifs_tcp_ses_lock
);
2795 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2796 if (ses
->status
== CifsExiting
)
2798 if (!match_session(ses
, vol
))
2801 spin_unlock(&cifs_tcp_ses_lock
);
2804 spin_unlock(&cifs_tcp_ses_lock
);
2808 void cifs_put_smb_ses(struct cifs_ses
*ses
)
2810 unsigned int rc
, xid
;
2811 struct TCP_Server_Info
*server
= ses
->server
;
2813 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2815 spin_lock(&cifs_tcp_ses_lock
);
2816 if (ses
->status
== CifsExiting
) {
2817 spin_unlock(&cifs_tcp_ses_lock
);
2820 if (--ses
->ses_count
> 0) {
2821 spin_unlock(&cifs_tcp_ses_lock
);
2824 if (ses
->status
== CifsGood
)
2825 ses
->status
= CifsExiting
;
2826 spin_unlock(&cifs_tcp_ses_lock
);
2830 if (ses
->status
== CifsExiting
&& server
->ops
->logoff
) {
2832 rc
= server
->ops
->logoff(xid
, ses
);
2834 cifs_server_dbg(VFS
, "%s: Session Logoff failure rc=%d\n",
2839 spin_lock(&cifs_tcp_ses_lock
);
2840 list_del_init(&ses
->smb_ses_list
);
2841 spin_unlock(&cifs_tcp_ses_lock
);
2843 /* close any extra channels */
2844 if (ses
->chan_count
> 1) {
2847 for (i
= 1; i
< ses
->chan_count
; i
++)
2848 cifs_put_tcp_session(ses
->chans
[i
].server
, 0);
2852 cifs_put_tcp_session(server
, 0);
2857 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2858 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2860 /* Populate username and pw fields from keyring if possible */
2862 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2866 const char *delim
, *payload
;
2870 struct TCP_Server_Info
*server
= ses
->server
;
2871 struct sockaddr_in
*sa
;
2872 struct sockaddr_in6
*sa6
;
2873 const struct user_key_payload
*upayload
;
2875 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2879 /* try to find an address key first */
2880 switch (server
->dstaddr
.ss_family
) {
2882 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2883 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2886 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2887 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2890 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
2891 server
->dstaddr
.ss_family
);
2896 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2897 key
= request_key(&key_type_logon
, desc
, "");
2899 if (!ses
->domainName
) {
2900 cifs_dbg(FYI
, "domainName is NULL\n");
2905 /* didn't work, try to find a domain key */
2906 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2907 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2908 key
= request_key(&key_type_logon
, desc
, "");
2916 down_read(&key
->sem
);
2917 upayload
= user_key_payload_locked(key
);
2918 if (IS_ERR_OR_NULL(upayload
)) {
2919 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2923 /* find first : in payload */
2924 payload
= upayload
->data
;
2925 delim
= strnchr(payload
, upayload
->datalen
, ':');
2926 cifs_dbg(FYI
, "payload=%s\n", payload
);
2928 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
2934 len
= delim
- payload
;
2935 if (len
> CIFS_MAX_USERNAME_LEN
|| len
<= 0) {
2936 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
2942 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2943 if (!vol
->username
) {
2944 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
2949 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, vol
->username
);
2951 len
= key
->datalen
- (len
+ 1);
2952 if (len
> CIFS_MAX_PASSWORD_LEN
|| len
<= 0) {
2953 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
2955 kfree(vol
->username
);
2956 vol
->username
= NULL
;
2961 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2962 if (!vol
->password
) {
2963 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
2966 kfree(vol
->username
);
2967 vol
->username
= NULL
;
2972 * If we have a domain key then we must set the domainName in the
2975 if (is_domain
&& ses
->domainName
) {
2976 vol
->domainname
= kstrndup(ses
->domainName
,
2977 strlen(ses
->domainName
),
2979 if (!vol
->domainname
) {
2980 cifs_dbg(FYI
, "Unable to allocate %zd bytes for domain\n",
2983 kfree(vol
->username
);
2984 vol
->username
= NULL
;
2985 kfree_sensitive(vol
->password
);
2986 vol
->password
= NULL
;
2996 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
2999 #else /* ! CONFIG_KEYS */
3001 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
3002 struct cifs_ses
*ses
__attribute__((unused
)))
3006 #endif /* CONFIG_KEYS */
3009 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3011 * This function assumes it is being called from cifs_mount() where we
3012 * already got a server reference (server refcount +1). See
3013 * cifs_get_tcon() for refcount explanations.
3016 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
3020 struct cifs_ses
*ses
;
3021 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3022 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3026 ses
= cifs_find_smb_ses(server
, volume_info
);
3028 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
3031 mutex_lock(&ses
->session_mutex
);
3032 rc
= cifs_negotiate_protocol(xid
, ses
);
3034 mutex_unlock(&ses
->session_mutex
);
3035 /* problem -- put our ses reference */
3036 cifs_put_smb_ses(ses
);
3040 if (ses
->need_reconnect
) {
3041 cifs_dbg(FYI
, "Session needs reconnect\n");
3042 rc
= cifs_setup_session(xid
, ses
,
3043 volume_info
->local_nls
);
3045 mutex_unlock(&ses
->session_mutex
);
3046 /* problem -- put our reference */
3047 cifs_put_smb_ses(ses
);
3052 mutex_unlock(&ses
->session_mutex
);
3054 /* existing SMB ses has a server reference already */
3055 cifs_put_tcp_session(server
, 0);
3060 cifs_dbg(FYI
, "Existing smb sess not found\n");
3061 ses
= sesInfoAlloc();
3065 /* new SMB session uses our server ref */
3066 ses
->server
= server
;
3067 if (server
->dstaddr
.ss_family
== AF_INET6
)
3068 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
3070 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
3072 if (volume_info
->username
) {
3073 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
3074 if (!ses
->user_name
)
3078 /* volume_info->password freed at unmount */
3079 if (volume_info
->password
) {
3080 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
3084 if (volume_info
->domainname
) {
3085 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
3086 if (!ses
->domainName
)
3089 if (volume_info
->domainauto
)
3090 ses
->domainAuto
= volume_info
->domainauto
;
3091 ses
->cred_uid
= volume_info
->cred_uid
;
3092 ses
->linux_uid
= volume_info
->linux_uid
;
3094 ses
->sectype
= volume_info
->sectype
;
3095 ses
->sign
= volume_info
->sign
;
3096 mutex_lock(&ses
->session_mutex
);
3098 /* add server as first channel */
3099 ses
->chans
[0].server
= server
;
3100 ses
->chan_count
= 1;
3101 ses
->chan_max
= volume_info
->multichannel
? volume_info
->max_channels
:1;
3103 rc
= cifs_negotiate_protocol(xid
, ses
);
3105 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
3107 /* each channel uses a different signing key */
3108 memcpy(ses
->chans
[0].signkey
, ses
->smb3signingkey
,
3109 sizeof(ses
->smb3signingkey
));
3111 mutex_unlock(&ses
->session_mutex
);
3115 /* success, put it on the list and add it as first channel */
3116 spin_lock(&cifs_tcp_ses_lock
);
3117 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
3118 spin_unlock(&cifs_tcp_ses_lock
);
3122 cifs_setup_ipc(ses
, volume_info
);
3132 static int match_tcon(struct cifs_tcon
*tcon
, struct smb_vol
*volume_info
)
3134 if (tcon
->tidStatus
== CifsExiting
)
3136 if (strncmp(tcon
->treeName
, volume_info
->UNC
, MAX_TREE_SIZE
))
3138 if (tcon
->seal
!= volume_info
->seal
)
3140 if (tcon
->snapshot_time
!= volume_info
->snapshot_time
)
3142 if (tcon
->handle_timeout
!= volume_info
->handle_timeout
)
3144 if (tcon
->no_lease
!= volume_info
->no_lease
)
3146 if (tcon
->nodelete
!= volume_info
->nodelete
)
3151 static struct cifs_tcon
*
3152 cifs_find_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
3154 struct list_head
*tmp
;
3155 struct cifs_tcon
*tcon
;
3157 spin_lock(&cifs_tcp_ses_lock
);
3158 list_for_each(tmp
, &ses
->tcon_list
) {
3159 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
3160 #ifdef CONFIG_CIFS_DFS_UPCALL
3164 if (!match_tcon(tcon
, volume_info
))
3167 spin_unlock(&cifs_tcp_ses_lock
);
3170 spin_unlock(&cifs_tcp_ses_lock
);
3175 cifs_put_tcon(struct cifs_tcon
*tcon
)
3178 struct cifs_ses
*ses
;
3181 * IPC tcon share the lifetime of their session and are
3182 * destroyed in the session put function
3184 if (tcon
== NULL
|| tcon
->ipc
)
3188 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
3189 spin_lock(&cifs_tcp_ses_lock
);
3190 if (--tcon
->tc_count
> 0) {
3191 spin_unlock(&cifs_tcp_ses_lock
);
3195 list_del_init(&tcon
->tcon_list
);
3196 spin_unlock(&cifs_tcp_ses_lock
);
3199 if (ses
->server
->ops
->tree_disconnect
)
3200 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
3203 cifs_fscache_release_super_cookie(tcon
);
3205 cifs_put_smb_ses(ses
);
3209 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3211 * - tcon refcount is the number of mount points using the tcon.
3212 * - ses refcount is the number of tcon using the session.
3214 * 1. This function assumes it is being called from cifs_mount() where
3215 * we already got a session reference (ses refcount +1).
3217 * 2. Since we're in the context of adding a mount point, the end
3218 * result should be either:
3220 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3221 * its session refcount incremented (1 new tcon). This +1 was
3222 * already done in (1).
3224 * b) an existing tcon with refcount+1 (add a mount point to it) and
3225 * identical ses refcount (no new tcon). Because of (1) we need to
3226 * decrement the ses refcount.
3228 static struct cifs_tcon
*
3229 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
3232 struct cifs_tcon
*tcon
;
3234 tcon
= cifs_find_tcon(ses
, volume_info
);
3237 * tcon has refcount already incremented but we need to
3238 * decrement extra ses reference gotten by caller (case b)
3240 cifs_dbg(FYI
, "Found match on UNC path\n");
3241 cifs_put_smb_ses(ses
);
3245 if (!ses
->server
->ops
->tree_connect
) {
3250 tcon
= tconInfoAlloc();
3256 if (volume_info
->snapshot_time
) {
3257 if (ses
->server
->vals
->protocol_id
== 0) {
3259 "Use SMB2 or later for snapshot mount option\n");
3263 tcon
->snapshot_time
= volume_info
->snapshot_time
;
3266 if (volume_info
->handle_timeout
) {
3267 if (ses
->server
->vals
->protocol_id
== 0) {
3269 "Use SMB2.1 or later for handle timeout option\n");
3273 tcon
->handle_timeout
= volume_info
->handle_timeout
;
3277 if (volume_info
->password
) {
3278 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
3279 if (!tcon
->password
) {
3285 if (volume_info
->seal
) {
3286 if (ses
->server
->vals
->protocol_id
== 0) {
3288 "SMB3 or later required for encryption\n");
3291 } else if (tcon
->ses
->server
->capabilities
&
3292 SMB2_GLOBAL_CAP_ENCRYPTION
)
3295 cifs_dbg(VFS
, "Encryption is not supported on share\n");
3301 if (volume_info
->linux_ext
) {
3302 if (ses
->server
->posix_ext_supported
) {
3303 tcon
->posix_extensions
= true;
3304 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
3306 cifs_dbg(VFS
, "Server does not support mounting with posix SMB3.11 extensions\n");
3313 * BB Do we need to wrap session_mutex around this TCon call and Unix
3314 * SetFS as we do on SessSetup and reconnect?
3317 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, volume_info
->UNC
, tcon
,
3318 volume_info
->local_nls
);
3320 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
3324 tcon
->use_persistent
= false;
3325 /* check if SMB2 or later, CIFS does not support persistent handles */
3326 if (volume_info
->persistent
) {
3327 if (ses
->server
->vals
->protocol_id
== 0) {
3329 "SMB3 or later required for persistent handles\n");
3332 } else if (ses
->server
->capabilities
&
3333 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
3334 tcon
->use_persistent
= true;
3335 else /* persistent handles requested but not supported */ {
3337 "Persistent handles not supported on share\n");
3341 } else if ((tcon
->capabilities
& SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY
)
3342 && (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
3343 && (volume_info
->nopersistent
== false)) {
3344 cifs_dbg(FYI
, "enabling persistent handles\n");
3345 tcon
->use_persistent
= true;
3346 } else if (volume_info
->resilient
) {
3347 if (ses
->server
->vals
->protocol_id
== 0) {
3349 "SMB2.1 or later required for resilient handles\n");
3353 tcon
->use_resilient
= true;
3356 /* If the user really knows what they are doing they can override */
3357 if (tcon
->share_flags
& SMB2_SHAREFLAG_NO_CACHING
) {
3358 if (volume_info
->cache_ro
)
3359 cifs_dbg(VFS
, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3360 else if (volume_info
->cache_rw
)
3361 cifs_dbg(VFS
, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3364 if (volume_info
->no_lease
) {
3365 if (ses
->server
->vals
->protocol_id
== 0) {
3367 "SMB2 or later required for nolease option\n");
3371 tcon
->no_lease
= volume_info
->no_lease
;
3375 * We can have only one retry value for a connection to a share so for
3376 * resources mounted more than once to the same server share the last
3377 * value passed in for the retry flag is used.
3379 tcon
->retry
= volume_info
->retry
;
3380 tcon
->nocase
= volume_info
->nocase
;
3381 if (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_DIRECTORY_LEASING
)
3382 tcon
->nohandlecache
= volume_info
->nohandlecache
;
3384 tcon
->nohandlecache
= 1;
3385 tcon
->nodelete
= volume_info
->nodelete
;
3386 tcon
->local_lease
= volume_info
->local_lease
;
3387 INIT_LIST_HEAD(&tcon
->pending_opens
);
3389 spin_lock(&cifs_tcp_ses_lock
);
3390 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
3391 spin_unlock(&cifs_tcp_ses_lock
);
3393 cifs_fscache_get_super_cookie(tcon
);
3403 cifs_put_tlink(struct tcon_link
*tlink
)
3405 if (!tlink
|| IS_ERR(tlink
))
3408 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
3409 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
3410 tlink
->tl_time
= jiffies
;
3414 if (!IS_ERR(tlink_tcon(tlink
)))
3415 cifs_put_tcon(tlink_tcon(tlink
));
3421 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
3423 struct cifs_sb_info
*old
= CIFS_SB(sb
);
3424 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
3425 unsigned int oldflags
= old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
;
3426 unsigned int newflags
= new->mnt_cifs_flags
& CIFS_MOUNT_MASK
;
3428 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
3431 if (old
->mnt_cifs_serverino_autodisabled
)
3432 newflags
&= ~CIFS_MOUNT_SERVER_INUM
;
3434 if (oldflags
!= newflags
)
3438 * We want to share sb only if we don't specify an r/wsize or
3439 * specified r/wsize is greater than or equal to existing one.
3441 if (new->wsize
&& new->wsize
< old
->wsize
)
3444 if (new->rsize
&& new->rsize
< old
->rsize
)
3447 if (!uid_eq(old
->mnt_uid
, new->mnt_uid
) || !gid_eq(old
->mnt_gid
, new->mnt_gid
))
3450 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
3451 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
3454 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
3457 if (old
->actimeo
!= new->actimeo
)
3464 match_prepath(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
3466 struct cifs_sb_info
*old
= CIFS_SB(sb
);
3467 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
3468 bool old_set
= (old
->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
) &&
3470 bool new_set
= (new->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
) &&
3473 if (old_set
&& new_set
&& !strcmp(new->prepath
, old
->prepath
))
3475 else if (!old_set
&& !new_set
)
3482 cifs_match_super(struct super_block
*sb
, void *data
)
3484 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
3485 struct smb_vol
*volume_info
;
3486 struct cifs_sb_info
*cifs_sb
;
3487 struct TCP_Server_Info
*tcp_srv
;
3488 struct cifs_ses
*ses
;
3489 struct cifs_tcon
*tcon
;
3490 struct tcon_link
*tlink
;
3493 spin_lock(&cifs_tcp_ses_lock
);
3494 cifs_sb
= CIFS_SB(sb
);
3495 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
3496 if (IS_ERR(tlink
)) {
3497 spin_unlock(&cifs_tcp_ses_lock
);
3500 tcon
= tlink_tcon(tlink
);
3502 tcp_srv
= ses
->server
;
3504 volume_info
= mnt_data
->vol
;
3506 if (!match_server(tcp_srv
, volume_info
) ||
3507 !match_session(ses
, volume_info
) ||
3508 !match_tcon(tcon
, volume_info
) ||
3509 !match_prepath(sb
, mnt_data
)) {
3514 rc
= compare_mount_options(sb
, mnt_data
);
3516 spin_unlock(&cifs_tcp_ses_lock
);
3517 cifs_put_tlink(tlink
);
3521 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3522 static struct lock_class_key cifs_key
[2];
3523 static struct lock_class_key cifs_slock_key
[2];
3526 cifs_reclassify_socket4(struct socket
*sock
)
3528 struct sock
*sk
= sock
->sk
;
3529 BUG_ON(!sock_allow_reclassification(sk
));
3530 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
3531 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
3535 cifs_reclassify_socket6(struct socket
*sock
)
3537 struct sock
*sk
= sock
->sk
;
3538 BUG_ON(!sock_allow_reclassification(sk
));
3539 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
3540 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
3544 cifs_reclassify_socket4(struct socket
*sock
)
3549 cifs_reclassify_socket6(struct socket
*sock
)
3554 /* See RFC1001 section 14 on representation of Netbios names */
3555 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
3559 for (i
= 0, j
= 0; i
< (length
); i
++) {
3560 /* mask a nibble at a time and encode */
3561 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
3562 target
[j
+1] = 'A' + (0x0F & source
[i
]);
3569 bind_socket(struct TCP_Server_Info
*server
)
3572 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
3573 /* Bind to the specified local IP address */
3574 struct socket
*socket
= server
->ssocket
;
3575 rc
= socket
->ops
->bind(socket
,
3576 (struct sockaddr
*) &server
->srcaddr
,
3577 sizeof(server
->srcaddr
));
3579 struct sockaddr_in
*saddr4
;
3580 struct sockaddr_in6
*saddr6
;
3581 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
3582 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
3583 if (saddr6
->sin6_family
== AF_INET6
)
3584 cifs_server_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
3585 &saddr6
->sin6_addr
, rc
);
3587 cifs_server_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
3588 &saddr4
->sin_addr
.s_addr
, rc
);
3595 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
3599 * some servers require RFC1001 sessinit before sending
3600 * negprot - BB check reconnection in case where second
3601 * sessinit is sent but no second negprot
3603 struct rfc1002_session_packet
*ses_init_buf
;
3604 struct smb_hdr
*smb_buf
;
3605 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
3608 ses_init_buf
->trailer
.session_req
.called_len
= 32;
3610 if (server
->server_RFC1001_name
[0] != 0)
3611 rfc1002mangle(ses_init_buf
->trailer
.
3612 session_req
.called_name
,
3613 server
->server_RFC1001_name
,
3614 RFC1001_NAME_LEN_WITH_NULL
);
3616 rfc1002mangle(ses_init_buf
->trailer
.
3617 session_req
.called_name
,
3618 DEFAULT_CIFS_CALLED_NAME
,
3619 RFC1001_NAME_LEN_WITH_NULL
);
3621 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
3624 * calling name ends in null (byte 16) from old smb
3627 if (server
->workstation_RFC1001_name
[0] != 0)
3628 rfc1002mangle(ses_init_buf
->trailer
.
3629 session_req
.calling_name
,
3630 server
->workstation_RFC1001_name
,
3631 RFC1001_NAME_LEN_WITH_NULL
);
3633 rfc1002mangle(ses_init_buf
->trailer
.
3634 session_req
.calling_name
,
3636 RFC1001_NAME_LEN_WITH_NULL
);
3638 ses_init_buf
->trailer
.session_req
.scope1
= 0;
3639 ses_init_buf
->trailer
.session_req
.scope2
= 0;
3640 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
3642 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3643 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
3644 rc
= smb_send(server
, smb_buf
, 0x44);
3645 kfree(ses_init_buf
);
3647 * RFC1001 layer in at least one server
3648 * requires very short break before negprot
3649 * presumably because not expecting negprot
3650 * to follow so fast. This is a simple
3651 * solution that works without
3652 * complicating the code and causes no
3653 * significant slowing down on mount
3656 usleep_range(1000, 2000);
3659 * else the negprot may still work without this
3660 * even though malloc failed
3667 generic_ip_connect(struct TCP_Server_Info
*server
)
3672 struct socket
*socket
= server
->ssocket
;
3673 struct sockaddr
*saddr
;
3675 saddr
= (struct sockaddr
*) &server
->dstaddr
;
3677 if (server
->dstaddr
.ss_family
== AF_INET6
) {
3678 struct sockaddr_in6
*ipv6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3680 sport
= ipv6
->sin6_port
;
3681 slen
= sizeof(struct sockaddr_in6
);
3683 cifs_dbg(FYI
, "%s: connecting to [%pI6]:%d\n", __func__
, &ipv6
->sin6_addr
,
3686 struct sockaddr_in
*ipv4
= (struct sockaddr_in
*)&server
->dstaddr
;
3688 sport
= ipv4
->sin_port
;
3689 slen
= sizeof(struct sockaddr_in
);
3691 cifs_dbg(FYI
, "%s: connecting to %pI4:%d\n", __func__
, &ipv4
->sin_addr
,
3695 if (socket
== NULL
) {
3696 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
3697 IPPROTO_TCP
, &socket
, 1);
3699 cifs_server_dbg(VFS
, "Error %d creating socket\n", rc
);
3700 server
->ssocket
= NULL
;
3704 /* BB other socket options to set KEEPALIVE, NODELAY? */
3705 cifs_dbg(FYI
, "Socket created\n");
3706 server
->ssocket
= socket
;
3707 socket
->sk
->sk_allocation
= GFP_NOFS
;
3708 if (sfamily
== AF_INET6
)
3709 cifs_reclassify_socket6(socket
);
3711 cifs_reclassify_socket4(socket
);
3714 rc
= bind_socket(server
);
3719 * Eventually check for other socket options to change from
3720 * the default. sock_setsockopt not used because it expects
3723 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3724 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3726 /* make the bufsizes depend on wsize/rsize and max requests */
3727 if (server
->noautotune
) {
3728 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3729 socket
->sk
->sk_sndbuf
= 200 * 1024;
3730 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3731 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3734 if (server
->tcp_nodelay
)
3735 tcp_sock_set_nodelay(socket
->sk
);
3737 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3738 socket
->sk
->sk_sndbuf
,
3739 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3741 rc
= socket
->ops
->connect(socket
, saddr
, slen
,
3742 server
->noblockcnt
? O_NONBLOCK
: 0);
3744 * When mounting SMB root file systems, we do not want to block in
3745 * connect. Otherwise bail out and then let cifs_reconnect() perform
3746 * reconnect failover - if possible.
3748 if (server
->noblockcnt
&& rc
== -EINPROGRESS
)
3751 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
3752 sock_release(socket
);
3753 server
->ssocket
= NULL
;
3757 if (sport
== htons(RFC1001_PORT
))
3758 rc
= ip_rfc1001_connect(server
);
3764 ip_connect(struct TCP_Server_Info
*server
)
3767 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3768 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3770 if (server
->dstaddr
.ss_family
== AF_INET6
)
3771 sport
= &addr6
->sin6_port
;
3773 sport
= &addr
->sin_port
;
3778 /* try with 445 port at first */
3779 *sport
= htons(CIFS_PORT
);
3781 rc
= generic_ip_connect(server
);
3785 /* if it failed, try with 139 port */
3786 *sport
= htons(RFC1001_PORT
);
3789 return generic_ip_connect(server
);
3792 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
3793 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3795 /* if we are reconnecting then should we check to see if
3796 * any requested capabilities changed locally e.g. via
3797 * remount but we can not do much about it here
3798 * if they have (even if we could detect it by the following)
3799 * Perhaps we could add a backpointer to array of sb from tcon
3800 * or if we change to make all sb to same share the same
3801 * sb as NFS - then we only have one backpointer to sb.
3802 * What if we wanted to mount the server share twice once with
3803 * and once without posixacls or posix paths? */
3804 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3806 if (vol_info
&& vol_info
->no_linux_ext
) {
3807 tcon
->fsUnixInfo
.Capability
= 0;
3808 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3809 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
3811 } else if (vol_info
)
3812 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3814 if (tcon
->unix_ext
== 0) {
3815 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
3819 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3820 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3821 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
3822 /* check for reconnect case in which we do not
3823 want to change the mount behavior if we can avoid it */
3824 if (vol_info
== NULL
) {
3825 /* turn off POSIX ACL and PATHNAMES if not set
3826 originally at mount time */
3827 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3828 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3829 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3830 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3831 cifs_dbg(VFS
, "POSIXPATH support change\n");
3832 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3833 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3834 cifs_dbg(VFS
, "possible reconnect error\n");
3835 cifs_dbg(VFS
, "server disabled POSIX path support\n");
3839 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3840 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
3842 cap
&= CIFS_UNIX_CAP_MASK
;
3843 if (vol_info
&& vol_info
->no_psx_acl
)
3844 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3845 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3846 cifs_dbg(FYI
, "negotiated posix acl support\n");
3848 cifs_sb
->mnt_cifs_flags
|=
3849 CIFS_MOUNT_POSIXACL
;
3852 if (vol_info
&& vol_info
->posix_paths
== 0)
3853 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3854 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3855 cifs_dbg(FYI
, "negotiate posix pathnames\n");
3857 cifs_sb
->mnt_cifs_flags
|=
3858 CIFS_MOUNT_POSIX_PATHS
;
3861 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
3862 #ifdef CONFIG_CIFS_DEBUG2
3863 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3864 cifs_dbg(FYI
, "FCNTL cap\n");
3865 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3866 cifs_dbg(FYI
, "EXTATTR cap\n");
3867 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3868 cifs_dbg(FYI
, "POSIX path cap\n");
3869 if (cap
& CIFS_UNIX_XATTR_CAP
)
3870 cifs_dbg(FYI
, "XATTR cap\n");
3871 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3872 cifs_dbg(FYI
, "POSIX ACL cap\n");
3873 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3874 cifs_dbg(FYI
, "very large read cap\n");
3875 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3876 cifs_dbg(FYI
, "very large write cap\n");
3877 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3878 cifs_dbg(FYI
, "transport encryption cap\n");
3879 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3880 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
3881 #endif /* CIFS_DEBUG2 */
3882 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3883 if (vol_info
== NULL
) {
3884 cifs_dbg(FYI
, "resetting capabilities failed\n");
3886 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");
3892 int cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3893 struct cifs_sb_info
*cifs_sb
)
3895 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3897 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3898 cifs_sb
->tlink_tree
= RB_ROOT
;
3900 cifs_sb
->bsize
= pvolume_info
->bsize
;
3902 * Temporarily set r/wsize for matching superblock. If we end up using
3903 * new sb then client will later negotiate it downward if needed.
3905 cifs_sb
->rsize
= pvolume_info
->rsize
;
3906 cifs_sb
->wsize
= pvolume_info
->wsize
;
3908 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3909 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3910 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3911 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3912 cifs_dbg(FYI
, "file mode: %04ho dir mode: %04ho\n",
3913 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3915 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3916 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3918 if (pvolume_info
->nodfs
)
3919 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_DFS
;
3920 if (pvolume_info
->noperm
)
3921 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3922 if (pvolume_info
->setuids
)
3923 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3924 if (pvolume_info
->setuidfromacl
)
3925 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UID_FROM_ACL
;
3926 if (pvolume_info
->server_ino
)
3927 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3928 if (pvolume_info
->remap
)
3929 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SFM_CHR
;
3930 if (pvolume_info
->sfu_remap
)
3931 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3932 if (pvolume_info
->no_xattr
)
3933 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3934 if (pvolume_info
->sfu_emul
)
3935 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3936 if (pvolume_info
->nobrl
)
3937 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3938 if (pvolume_info
->nohandlecache
)
3939 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_HANDLE_CACHE
;
3940 if (pvolume_info
->nostrictsync
)
3941 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3942 if (pvolume_info
->mand_lock
)
3943 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3944 if (pvolume_info
->rwpidforward
)
3945 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3946 if (pvolume_info
->mode_ace
)
3947 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MODE_FROM_SID
;
3948 if (pvolume_info
->cifs_acl
)
3949 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3950 if (pvolume_info
->backupuid_specified
) {
3951 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3952 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3954 if (pvolume_info
->backupgid_specified
) {
3955 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3956 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3958 if (pvolume_info
->override_uid
)
3959 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3960 if (pvolume_info
->override_gid
)
3961 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3962 if (pvolume_info
->dynperm
)
3963 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3964 if (pvolume_info
->fsc
)
3965 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3966 if (pvolume_info
->multiuser
)
3967 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3968 CIFS_MOUNT_NO_PERM
);
3969 if (pvolume_info
->strict_io
)
3970 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3971 if (pvolume_info
->direct_io
) {
3972 cifs_dbg(FYI
, "mounting share using direct i/o\n");
3973 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3975 if (pvolume_info
->cache_ro
) {
3976 cifs_dbg(VFS
, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
3977 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RO_CACHE
;
3978 } else if (pvolume_info
->cache_rw
) {
3979 cifs_dbg(VFS
, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
3980 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_RO_CACHE
|
3981 CIFS_MOUNT_RW_CACHE
);
3983 if (pvolume_info
->mfsymlinks
) {
3984 if (pvolume_info
->sfu_emul
) {
3986 * Our SFU ("Services for Unix" emulation does not allow
3987 * creating symlinks but does allow reading existing SFU
3988 * symlinks (it does allow both creating and reading SFU
3989 * style mknod and FIFOs though). When "mfsymlinks" and
3990 * "sfu" are both enabled at the same time, it allows
3991 * reading both types of symlinks, but will only create
3992 * them with mfsymlinks format. This allows better
3993 * Apple compatibility (probably better for Samba too)
3994 * while still recognizing old Windows style symlinks.
3996 cifs_dbg(VFS
, "mount options mfsymlinks and sfu both enabled\n");
3998 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
4001 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
4002 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
4004 if (pvolume_info
->prepath
) {
4005 cifs_sb
->prepath
= kstrdup(pvolume_info
->prepath
, GFP_KERNEL
);
4006 if (cifs_sb
->prepath
== NULL
)
4014 cifs_cleanup_volume_info_contents(struct smb_vol
*volume_info
)
4016 kfree(volume_info
->username
);
4017 kfree_sensitive(volume_info
->password
);
4018 kfree(volume_info
->UNC
);
4019 kfree(volume_info
->domainname
);
4020 kfree(volume_info
->iocharset
);
4021 kfree(volume_info
->prepath
);
4025 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
4029 cifs_cleanup_volume_info_contents(volume_info
);
4033 /* Release all succeed connections */
4034 static inline void mount_put_conns(struct cifs_sb_info
*cifs_sb
,
4036 struct TCP_Server_Info
*server
,
4037 struct cifs_ses
*ses
, struct cifs_tcon
*tcon
)
4042 cifs_put_tcon(tcon
);
4044 cifs_put_smb_ses(ses
);
4046 cifs_put_tcp_session(server
, 0);
4047 cifs_sb
->mnt_cifs_flags
&= ~CIFS_MOUNT_POSIX_PATHS
;
4051 /* Get connections for tcp, ses and tcon */
4052 static int mount_get_conns(struct smb_vol
*vol
, struct cifs_sb_info
*cifs_sb
,
4054 struct TCP_Server_Info
**nserver
,
4055 struct cifs_ses
**nses
, struct cifs_tcon
**ntcon
)
4058 struct TCP_Server_Info
*server
;
4059 struct cifs_ses
*ses
;
4060 struct cifs_tcon
*tcon
;
4068 /* get a reference to a tcp session */
4069 server
= cifs_get_tcp_session(vol
);
4070 if (IS_ERR(server
)) {
4071 rc
= PTR_ERR(server
);
4077 if ((vol
->max_credits
< 20) || (vol
->max_credits
> 60000))
4078 server
->max_credits
= SMB2_MAX_CREDITS_AVAILABLE
;
4080 server
->max_credits
= vol
->max_credits
;
4082 /* get a reference to a SMB session */
4083 ses
= cifs_get_smb_ses(server
, vol
);
4091 if ((vol
->persistent
== true) && (!(ses
->server
->capabilities
&
4092 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
))) {
4093 cifs_server_dbg(VFS
, "persistent handles not supported by server\n");
4097 /* search for existing tcon to this server share */
4098 tcon
= cifs_get_tcon(ses
, vol
);
4106 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4107 if (tcon
->posix_extensions
)
4108 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_POSIX_PATHS
;
4110 /* tell server which Unix caps we support */
4111 if (cap_unix(tcon
->ses
)) {
4113 * reset of caps checks mount to see if unix extensions disabled
4114 * for just this mount.
4116 reset_cifs_unix_caps(*xid
, tcon
, cifs_sb
, vol
);
4117 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
4118 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
4119 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
))
4122 tcon
->unix_ext
= 0; /* server does not support them */
4124 /* do not care if a following call succeed - informational */
4125 if (!tcon
->pipe
&& server
->ops
->qfs_tcon
) {
4126 server
->ops
->qfs_tcon(*xid
, tcon
, cifs_sb
);
4127 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_RO_CACHE
) {
4128 if (tcon
->fsDevInfo
.DeviceCharacteristics
&
4129 cpu_to_le32(FILE_READ_ONLY_DEVICE
))
4130 cifs_dbg(VFS
, "mounted to read only share\n");
4131 else if ((cifs_sb
->mnt_cifs_flags
&
4132 CIFS_MOUNT_RW_CACHE
) == 0)
4133 cifs_dbg(VFS
, "read only mount of RW share\n");
4134 /* no need to log a RW mount of a typical RW share */
4138 cifs_sb
->wsize
= server
->ops
->negotiate_wsize(tcon
, vol
);
4139 cifs_sb
->rsize
= server
->ops
->negotiate_rsize(tcon
, vol
);
4144 static int mount_setup_tlink(struct cifs_sb_info
*cifs_sb
, struct cifs_ses
*ses
,
4145 struct cifs_tcon
*tcon
)
4147 struct tcon_link
*tlink
;
4149 /* hang the tcon off of the superblock */
4150 tlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4154 tlink
->tl_uid
= ses
->linux_uid
;
4155 tlink
->tl_tcon
= tcon
;
4156 tlink
->tl_time
= jiffies
;
4157 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
4158 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4160 cifs_sb
->master_tlink
= tlink
;
4161 spin_lock(&cifs_sb
->tlink_tree_lock
);
4162 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4163 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4165 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
4170 #ifdef CONFIG_CIFS_DFS_UPCALL
4172 * cifs_build_path_to_root returns full path to root when we do not have an
4173 * exiting connection (tcon)
4176 build_unc_path_to_root(const struct smb_vol
*vol
,
4177 const struct cifs_sb_info
*cifs_sb
, bool useppath
)
4179 char *full_path
, *pos
;
4180 unsigned int pplen
= useppath
&& vol
->prepath
?
4181 strlen(vol
->prepath
) + 1 : 0;
4182 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
4184 if (unc_len
> MAX_TREE_SIZE
)
4185 return ERR_PTR(-EINVAL
);
4187 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
4188 if (full_path
== NULL
)
4189 return ERR_PTR(-ENOMEM
);
4191 memcpy(full_path
, vol
->UNC
, unc_len
);
4192 pos
= full_path
+ unc_len
;
4195 *pos
= CIFS_DIR_SEP(cifs_sb
);
4196 memcpy(pos
+ 1, vol
->prepath
, pplen
);
4200 *pos
= '\0'; /* add trailing null */
4201 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
4202 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
4207 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4210 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4211 * to a string containing updated options for the submount. Otherwise it
4212 * will be left untouched.
4214 * Returns the rc from get_dfs_path to the caller, which can be used to
4215 * determine whether there were referrals.
4218 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
4219 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
4223 struct dfs_info3_param referral
= {0};
4224 char *full_path
= NULL
, *mdata
= NULL
;
4226 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NO_DFS
)
4229 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
, true);
4230 if (IS_ERR(full_path
))
4231 return PTR_ERR(full_path
);
4233 rc
= dfs_cache_find(xid
, ses
, cifs_sb
->local_nls
, cifs_remap(cifs_sb
),
4234 ref_path
, &referral
, NULL
);
4236 char *fake_devname
= NULL
;
4238 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
4239 full_path
+ 1, &referral
,
4241 free_dfs_info_param(&referral
);
4243 if (IS_ERR(mdata
)) {
4244 rc
= PTR_ERR(mdata
);
4247 cifs_cleanup_volume_info_contents(volume_info
);
4248 rc
= cifs_setup_volume_info(volume_info
, mdata
,
4249 fake_devname
, false);
4251 kfree(fake_devname
);
4252 kfree(cifs_sb
->mountdata
);
4253 cifs_sb
->mountdata
= mdata
;
4259 static inline int get_next_dfs_tgt(const char *path
,
4260 struct dfs_cache_tgt_list
*tgt_list
,
4261 struct dfs_cache_tgt_iterator
**tgt_it
)
4264 *tgt_it
= dfs_cache_get_tgt_iterator(tgt_list
);
4266 *tgt_it
= dfs_cache_get_next_tgt(tgt_list
, *tgt_it
);
4267 return !*tgt_it
? -EHOSTDOWN
: 0;
4270 static int update_vol_info(const struct dfs_cache_tgt_iterator
*tgt_it
,
4271 struct smb_vol
*fake_vol
, struct smb_vol
*vol
)
4273 const char *tgt
= dfs_cache_get_tgt_name(tgt_it
);
4274 int len
= strlen(tgt
) + 2;
4277 new_unc
= kmalloc(len
, GFP_KERNEL
);
4280 scnprintf(new_unc
, len
, "\\%s", tgt
);
4285 if (fake_vol
->prepath
) {
4286 kfree(vol
->prepath
);
4287 vol
->prepath
= fake_vol
->prepath
;
4288 fake_vol
->prepath
= NULL
;
4290 memcpy(&vol
->dstaddr
, &fake_vol
->dstaddr
, sizeof(vol
->dstaddr
));
4295 static int setup_dfs_tgt_conn(const char *path
, const char *full_path
,
4296 const struct dfs_cache_tgt_iterator
*tgt_it
,
4297 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol
, unsigned int *xid
,
4298 struct TCP_Server_Info
**server
, struct cifs_ses
**ses
,
4299 struct cifs_tcon
**tcon
)
4302 struct dfs_info3_param ref
= {0};
4303 char *mdata
= NULL
, *fake_devname
= NULL
;
4304 struct smb_vol fake_vol
= {NULL
};
4306 cifs_dbg(FYI
, "%s: dfs path: %s\n", __func__
, path
);
4308 rc
= dfs_cache_get_tgt_referral(path
, tgt_it
, &ref
);
4312 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
, full_path
+ 1, &ref
, &fake_devname
);
4313 free_dfs_info_param(&ref
);
4315 if (IS_ERR(mdata
)) {
4316 rc
= PTR_ERR(mdata
);
4319 cifs_dbg(FYI
, "%s: fake_devname: %s\n", __func__
, fake_devname
);
4320 rc
= cifs_setup_volume_info(&fake_vol
, mdata
, fake_devname
,
4324 kfree(fake_devname
);
4328 * We use a 'fake_vol' here because we need pass it down to the
4329 * mount_{get,put} functions to test connection against new DFS
4332 mount_put_conns(cifs_sb
, *xid
, *server
, *ses
, *tcon
);
4333 rc
= mount_get_conns(&fake_vol
, cifs_sb
, xid
, server
, ses
,
4335 if (!rc
|| (*server
&& *ses
)) {
4337 * We were able to connect to new target server.
4338 * Update current volume info with new target server.
4340 rc
= update_vol_info(tgt_it
, &fake_vol
, vol
);
4343 cifs_cleanup_volume_info_contents(&fake_vol
);
4347 static int do_dfs_failover(const char *path
, const char *full_path
, struct cifs_sb_info
*cifs_sb
,
4348 struct smb_vol
*vol
, struct cifs_ses
*root_ses
, unsigned int *xid
,
4349 struct TCP_Server_Info
**server
, struct cifs_ses
**ses
,
4350 struct cifs_tcon
**tcon
)
4353 struct dfs_cache_tgt_list tgt_list
;
4354 struct dfs_cache_tgt_iterator
*tgt_it
= NULL
;
4356 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NO_DFS
)
4359 rc
= dfs_cache_noreq_find(path
, NULL
, &tgt_list
);
4364 /* Get next DFS target server - if any */
4365 rc
= get_next_dfs_tgt(path
, &tgt_list
, &tgt_it
);
4368 /* Connect to next DFS target */
4369 rc
= setup_dfs_tgt_conn(path
, full_path
, tgt_it
, cifs_sb
, vol
, xid
, server
, ses
,
4371 if (!rc
|| (*server
&& *ses
))
4376 * Update DFS target hint in DFS referral cache with the target
4377 * server we successfully reconnected to.
4379 rc
= dfs_cache_update_tgthint(*xid
, root_ses
? root_ses
: *ses
,
4381 cifs_remap(cifs_sb
), path
,
4384 dfs_cache_free_tgts(&tgt_list
);
4390 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
4391 const char *devname
, bool is_smb3
)
4395 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
, is_smb3
))
4398 if (volume_info
->nullauth
) {
4399 cifs_dbg(FYI
, "Anonymous login\n");
4400 kfree(volume_info
->username
);
4401 volume_info
->username
= NULL
;
4402 } else if (volume_info
->username
) {
4403 /* BB fixme parse for domain name here */
4404 cifs_dbg(FYI
, "Username: %s\n", volume_info
->username
);
4406 cifs_dbg(VFS
, "No username specified\n");
4407 /* In userspace mount helper we can get user name from alternate
4408 locations such as env variables and files on disk */
4412 /* this is needed for ASCII cp to Unicode converts */
4413 if (volume_info
->iocharset
== NULL
) {
4414 /* load_nls_default cannot return null */
4415 volume_info
->local_nls
= load_nls_default();
4417 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
4418 if (volume_info
->local_nls
== NULL
) {
4419 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
4420 volume_info
->iocharset
);
4429 cifs_get_volume_info(char *mount_data
, const char *devname
, bool is_smb3
)
4432 struct smb_vol
*volume_info
;
4434 volume_info
= kmalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
4436 return ERR_PTR(-ENOMEM
);
4438 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
, is_smb3
);
4440 cifs_cleanup_volume_info(volume_info
);
4441 volume_info
= ERR_PTR(rc
);
4448 cifs_are_all_path_components_accessible(struct TCP_Server_Info
*server
,
4450 struct cifs_tcon
*tcon
,
4451 struct cifs_sb_info
*cifs_sb
,
4458 int skip
= added_treename
? 1 : 0;
4460 sep
= CIFS_DIR_SEP(cifs_sb
);
4463 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
, "");
4465 /* skip separators */
4470 /* next separator */
4471 while (*s
&& *s
!= sep
)
4474 * if the treename is added, we then have to skip the first
4475 * part within the separators
4482 * temporarily null-terminate the path at the end of
4483 * the current component
4487 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
4495 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4498 static int is_path_remote(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol
,
4499 const unsigned int xid
,
4500 struct TCP_Server_Info
*server
,
4501 struct cifs_tcon
*tcon
)
4506 if (!server
->ops
->is_path_accessible
)
4510 * cifs_build_path_to_root works only when we have a valid tcon
4512 full_path
= cifs_build_path_to_root(vol
, cifs_sb
, tcon
,
4513 tcon
->Flags
& SMB_SHARE_IS_IN_DFS
);
4514 if (full_path
== NULL
)
4517 cifs_dbg(FYI
, "%s: full_path: %s\n", __func__
, full_path
);
4519 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
4521 if (rc
!= 0 && rc
!= -EREMOTE
) {
4526 if (rc
!= -EREMOTE
) {
4527 rc
= cifs_are_all_path_components_accessible(server
, xid
, tcon
,
4528 cifs_sb
, full_path
, tcon
->Flags
& SMB_SHARE_IS_IN_DFS
);
4530 cifs_server_dbg(VFS
, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4531 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_USE_PREFIX_PATH
;
4540 #ifdef CONFIG_CIFS_DFS_UPCALL
4541 static void set_root_ses(struct cifs_sb_info
*cifs_sb
, struct cifs_ses
*ses
,
4542 struct cifs_ses
**root_ses
)
4545 spin_lock(&cifs_tcp_ses_lock
);
4547 ses
->tcon_ipc
->remap
= cifs_remap(cifs_sb
);
4548 spin_unlock(&cifs_tcp_ses_lock
);
4553 static void put_root_ses(struct cifs_ses
*ses
)
4556 cifs_put_smb_ses(ses
);
4559 /* Check if a path component is remote and then update @dfs_path accordingly */
4560 static int check_dfs_prepath(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol
,
4561 const unsigned int xid
, struct TCP_Server_Info
*server
,
4562 struct cifs_tcon
*tcon
, char **dfs_path
)
4565 char sep
= CIFS_DIR_SEP(cifs_sb
), tmp
;
4568 int added_treename
= tcon
->Flags
& SMB_SHARE_IS_IN_DFS
;
4569 int skip
= added_treename
;
4571 path
= cifs_build_path_to_root(vol
, cifs_sb
, tcon
, added_treename
);
4576 * Walk through the path components in @path and check if they're accessible. In case any of
4577 * the components is -EREMOTE, then update @dfs_path with the next DFS referral request path
4578 * (NOT including the remaining components).
4582 /* skip separators */
4583 while (*s
&& *s
== sep
)
4587 /* next separator */
4588 while (*s
&& *s
!= sep
)
4591 * if the treename is added, we then have to skip the first
4592 * part within the separators
4600 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
, path
);
4601 if (rc
&& rc
== -EREMOTE
) {
4602 struct smb_vol v
= {NULL
};
4603 /* if @path contains a tree name, skip it in the prefix path */
4604 if (added_treename
) {
4605 rc
= cifs_parse_devname(path
, &v
);
4609 npath
= build_unc_path_to_root(&v
, cifs_sb
, true);
4610 cifs_cleanup_volume_info_contents(&v
);
4613 v
.prepath
= path
+ 1;
4614 npath
= build_unc_path_to_root(&v
, cifs_sb
, true);
4616 if (IS_ERR(npath
)) {
4617 rc
= PTR_ERR(npath
);
4630 int cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol
)
4634 struct TCP_Server_Info
*server
= NULL
;
4635 struct cifs_ses
*ses
= NULL
, *root_ses
= NULL
;
4636 struct cifs_tcon
*tcon
= NULL
;
4638 char *ref_path
= NULL
, *full_path
= NULL
;
4639 char *oldmnt
= NULL
;
4640 char *mntdata
= NULL
;
4642 rc
= mount_get_conns(vol
, cifs_sb
, &xid
, &server
, &ses
, &tcon
);
4644 * Unconditionally try to get an DFS referral (even cached) to determine whether it is an
4647 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
4648 * to respond with PATH_NOT_COVERED to requests that include the prefix.
4650 if (dfs_cache_find(xid
, ses
, cifs_sb
->local_nls
, cifs_remap(cifs_sb
), vol
->UNC
+ 1, NULL
,
4652 /* No DFS referral was returned. Looks like a regular share. */
4655 /* Check if it is fully accessible and then mount it */
4656 rc
= is_path_remote(cifs_sb
, vol
, xid
, server
, tcon
);
4662 /* Save mount options */
4663 mntdata
= kstrndup(cifs_sb
->mountdata
, strlen(cifs_sb
->mountdata
), GFP_KERNEL
);
4668 /* Get path of DFS root */
4669 ref_path
= build_unc_path_to_root(vol
, cifs_sb
, false);
4670 if (IS_ERR(ref_path
)) {
4671 rc
= PTR_ERR(ref_path
);
4676 set_root_ses(cifs_sb
, ses
, &root_ses
);
4678 /* Save full path of last DFS path we used to resolve final target server */
4680 full_path
= build_unc_path_to_root(vol
, cifs_sb
, !!count
);
4681 if (IS_ERR(full_path
)) {
4682 rc
= PTR_ERR(full_path
);
4686 /* Chase referral */
4687 oldmnt
= cifs_sb
->mountdata
;
4688 rc
= expand_dfs_referral(xid
, root_ses
, vol
, cifs_sb
, ref_path
+ 1);
4691 /* Connect to new DFS target only if we were redirected */
4692 if (oldmnt
!= cifs_sb
->mountdata
) {
4693 mount_put_conns(cifs_sb
, xid
, server
, ses
, tcon
);
4694 rc
= mount_get_conns(vol
, cifs_sb
, &xid
, &server
, &ses
, &tcon
);
4696 if (rc
&& !server
&& !ses
) {
4697 /* Failed to connect. Try to connect to other targets in the referral. */
4698 rc
= do_dfs_failover(ref_path
+ 1, full_path
, cifs_sb
, vol
, root_ses
, &xid
,
4699 &server
, &ses
, &tcon
);
4701 if (rc
== -EACCES
|| rc
== -EOPNOTSUPP
|| !server
|| !ses
)
4705 /* Make sure that requests go through new root servers */
4706 if (is_tcon_dfs(tcon
)) {
4707 put_root_ses(root_ses
);
4708 set_root_ses(cifs_sb
, ses
, &root_ses
);
4710 /* Check for remaining path components and then continue chasing them (-EREMOTE) */
4711 rc
= check_dfs_prepath(cifs_sb
, vol
, xid
, server
, tcon
, &ref_path
);
4712 /* Prevent recursion on broken link referrals */
4713 if (rc
== -EREMOTE
&& ++count
> MAX_NESTED_LINKS
)
4715 } while (rc
== -EREMOTE
);
4719 put_root_ses(root_ses
);
4724 * Store DFS full path in both superblock and tree connect structures.
4726 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
4727 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
4728 * links, the prefix path is included in both and may be changed during reconnect. See
4729 * cifs_tree_connect().
4731 cifs_sb
->origin_fullpath
= kstrndup(full_path
, strlen(full_path
), GFP_KERNEL
);
4732 if (!cifs_sb
->origin_fullpath
) {
4736 spin_lock(&cifs_tcp_ses_lock
);
4737 tcon
->dfs_path
= full_path
;
4739 tcon
->remap
= cifs_remap(cifs_sb
);
4740 spin_unlock(&cifs_tcp_ses_lock
);
4742 /* Add original volume information for DFS cache to be used when refreshing referrals */
4743 rc
= dfs_cache_add_vol(mntdata
, vol
, cifs_sb
->origin_fullpath
);
4747 * After reconnecting to a different server, unique ids won't
4748 * match anymore, so we disable serverino. This prevents
4749 * dentry revalidation to think the dentry are stale (ESTALE).
4751 cifs_autodisable_serverino(cifs_sb
);
4753 * Force the use of prefix path to support failover on DFS paths that
4754 * resolve to targets that have different prefix paths.
4756 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_USE_PREFIX_PATH
;
4757 kfree(cifs_sb
->prepath
);
4758 cifs_sb
->prepath
= vol
->prepath
;
4759 vol
->prepath
= NULL
;
4763 cifs_try_adding_channels(ses
);
4764 return mount_setup_tlink(cifs_sb
, ses
, tcon
);
4770 kfree(cifs_sb
->origin_fullpath
);
4771 put_root_ses(root_ses
);
4772 mount_put_conns(cifs_sb
, xid
, server
, ses
, tcon
);
4776 int cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol
)
4780 struct cifs_ses
*ses
;
4781 struct cifs_tcon
*tcon
;
4782 struct TCP_Server_Info
*server
;
4784 rc
= mount_get_conns(vol
, cifs_sb
, &xid
, &server
, &ses
, &tcon
);
4789 rc
= is_path_remote(cifs_sb
, vol
, xid
, server
, tcon
);
4798 return mount_setup_tlink(cifs_sb
, ses
, tcon
);
4801 mount_put_conns(cifs_sb
, xid
, server
, ses
, tcon
);
4807 * Issue a TREE_CONNECT request.
4810 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
4811 const char *tree
, struct cifs_tcon
*tcon
,
4812 const struct nls_table
*nls_codepage
)
4814 struct smb_hdr
*smb_buffer
;
4815 struct smb_hdr
*smb_buffer_response
;
4818 unsigned char *bcc_ptr
;
4821 __u16 bytes_left
, count
;
4826 smb_buffer
= cifs_buf_get();
4827 if (smb_buffer
== NULL
)
4830 smb_buffer_response
= smb_buffer
;
4832 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
4833 NULL
/*no tid */ , 4 /*wct */ );
4835 smb_buffer
->Mid
= get_next_mid(ses
->server
);
4836 smb_buffer
->Uid
= ses
->Suid
;
4837 pSMB
= (TCONX_REQ
*) smb_buffer
;
4838 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
4840 pSMB
->AndXCommand
= 0xFF;
4841 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
4842 bcc_ptr
= &pSMB
->Password
[0];
4843 if (tcon
->pipe
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
4844 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
4845 *bcc_ptr
= 0; /* password is null byte */
4846 bcc_ptr
++; /* skip password */
4847 /* already aligned so no need to do it below */
4849 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
4850 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4851 specified as required (when that support is added to
4852 the vfs in the future) as only NTLM or the much
4853 weaker LANMAN (which we do not send by default) is accepted
4854 by Samba (not sure whether other servers allow
4855 NTLMv2 password here) */
4856 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4857 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
4858 (ses
->sectype
== LANMAN
))
4859 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
4860 ses
->server
->sec_mode
&
4861 SECMODE_PW_ENCRYPT
? true : false,
4864 #endif /* CIFS_WEAK_PW_HASH */
4865 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
4866 bcc_ptr
, nls_codepage
);
4868 cifs_dbg(FYI
, "%s Can't generate NTLM rsp. Error: %d\n",
4870 cifs_buf_release(smb_buffer
);
4874 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
4875 if (ses
->capabilities
& CAP_UNICODE
) {
4876 /* must align unicode strings */
4877 *bcc_ptr
= 0; /* null byte password */
4882 if (ses
->server
->sign
)
4883 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
4885 if (ses
->capabilities
& CAP_STATUS32
) {
4886 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
4888 if (ses
->capabilities
& CAP_DFS
) {
4889 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
4891 if (ses
->capabilities
& CAP_UNICODE
) {
4892 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
4894 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
4895 6 /* max utf8 char length in bytes */ *
4896 (/* server len*/ + 256 /* share len */), nls_codepage
);
4897 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
4898 bcc_ptr
+= 2; /* skip trailing null */
4899 } else { /* ASCII */
4900 strcpy(bcc_ptr
, tree
);
4901 bcc_ptr
+= strlen(tree
) + 1;
4903 strcpy(bcc_ptr
, "?????");
4904 bcc_ptr
+= strlen("?????");
4906 count
= bcc_ptr
- &pSMB
->Password
[0];
4907 be32_add_cpu(&pSMB
->hdr
.smb_buf_length
, count
);
4908 pSMB
->ByteCount
= cpu_to_le16(count
);
4910 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
4913 /* above now done in SendReceive */
4917 tcon
->tidStatus
= CifsGood
;
4918 tcon
->need_reconnect
= false;
4919 tcon
->tid
= smb_buffer_response
->Tid
;
4920 bcc_ptr
= pByteArea(smb_buffer_response
);
4921 bytes_left
= get_bcc(smb_buffer_response
);
4922 length
= strnlen(bcc_ptr
, bytes_left
- 2);
4923 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
4929 /* skip service field (NB: this field is always ASCII) */
4931 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
4932 (bcc_ptr
[2] == 'C')) {
4933 cifs_dbg(FYI
, "IPC connection\n");
4937 } else if (length
== 2) {
4938 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
4939 /* the most common case */
4940 cifs_dbg(FYI
, "disk share connection\n");
4943 bcc_ptr
+= length
+ 1;
4944 bytes_left
-= (length
+ 1);
4945 strlcpy(tcon
->treeName
, tree
, sizeof(tcon
->treeName
));
4947 /* mostly informational -- no need to fail on error here */
4948 kfree(tcon
->nativeFileSystem
);
4949 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
4950 bytes_left
, is_unicode
,
4953 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
4955 if ((smb_buffer_response
->WordCount
== 3) ||
4956 (smb_buffer_response
->WordCount
== 7))
4957 /* field is in same location */
4958 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
4961 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
4964 cifs_buf_release(smb_buffer
);
4968 static void delayed_free(struct rcu_head
*p
)
4970 struct cifs_sb_info
*sbi
= container_of(p
, struct cifs_sb_info
, rcu
);
4971 unload_nls(sbi
->local_nls
);
4976 cifs_umount(struct cifs_sb_info
*cifs_sb
)
4978 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4979 struct rb_node
*node
;
4980 struct tcon_link
*tlink
;
4982 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
4984 spin_lock(&cifs_sb
->tlink_tree_lock
);
4985 while ((node
= rb_first(root
))) {
4986 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4987 cifs_get_tlink(tlink
);
4988 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4989 rb_erase(node
, root
);
4991 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4992 cifs_put_tlink(tlink
);
4993 spin_lock(&cifs_sb
->tlink_tree_lock
);
4995 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4997 kfree(cifs_sb
->mountdata
);
4998 kfree(cifs_sb
->prepath
);
4999 #ifdef CONFIG_CIFS_DFS_UPCALL
5000 dfs_cache_del_vol(cifs_sb
->origin_fullpath
);
5001 kfree(cifs_sb
->origin_fullpath
);
5003 call_rcu(&cifs_sb
->rcu
, delayed_free
);
5007 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
5010 struct TCP_Server_Info
*server
= cifs_ses_server(ses
);
5012 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
5015 /* only send once per connect */
5016 if (!server
->ops
->need_neg(server
))
5019 rc
= server
->ops
->negotiate(xid
, ses
);
5021 spin_lock(&GlobalMid_Lock
);
5022 if (server
->tcpStatus
== CifsNeedNegotiate
)
5023 server
->tcpStatus
= CifsGood
;
5026 spin_unlock(&GlobalMid_Lock
);
5033 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
5034 struct nls_table
*nls_info
)
5037 struct TCP_Server_Info
*server
= cifs_ses_server(ses
);
5039 if (!ses
->binding
) {
5040 ses
->capabilities
= server
->capabilities
;
5041 if (linuxExtEnabled
== 0)
5042 ses
->capabilities
&= (~server
->vals
->cap_unix
);
5044 if (ses
->auth_key
.response
) {
5045 cifs_dbg(FYI
, "Free previous auth_key.response = %p\n",
5046 ses
->auth_key
.response
);
5047 kfree(ses
->auth_key
.response
);
5048 ses
->auth_key
.response
= NULL
;
5049 ses
->auth_key
.len
= 0;
5053 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5054 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
5056 if (server
->ops
->sess_setup
)
5057 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
5060 cifs_server_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
5066 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
5068 vol
->sectype
= ses
->sectype
;
5070 /* krb5 is special, since we don't need username or pw */
5071 if (vol
->sectype
== Kerberos
)
5074 return cifs_set_cifscreds(vol
, ses
);
5077 static struct cifs_tcon
*
5078 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
5081 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
5082 struct cifs_ses
*ses
;
5083 struct cifs_tcon
*tcon
= NULL
;
5084 struct smb_vol
*vol_info
;
5086 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
5087 if (vol_info
== NULL
)
5088 return ERR_PTR(-ENOMEM
);
5090 vol_info
->local_nls
= cifs_sb
->local_nls
;
5091 vol_info
->linux_uid
= fsuid
;
5092 vol_info
->cred_uid
= fsuid
;
5093 vol_info
->UNC
= master_tcon
->treeName
;
5094 vol_info
->retry
= master_tcon
->retry
;
5095 vol_info
->nocase
= master_tcon
->nocase
;
5096 vol_info
->nohandlecache
= master_tcon
->nohandlecache
;
5097 vol_info
->local_lease
= master_tcon
->local_lease
;
5098 vol_info
->no_lease
= master_tcon
->no_lease
;
5099 vol_info
->resilient
= master_tcon
->use_resilient
;
5100 vol_info
->persistent
= master_tcon
->use_persistent
;
5101 vol_info
->handle_timeout
= master_tcon
->handle_timeout
;
5102 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
5103 vol_info
->linux_ext
= master_tcon
->posix_extensions
;
5104 vol_info
->sectype
= master_tcon
->ses
->sectype
;
5105 vol_info
->sign
= master_tcon
->ses
->sign
;
5106 vol_info
->seal
= master_tcon
->seal
;
5108 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
5114 /* get a reference for the same TCP session */
5115 spin_lock(&cifs_tcp_ses_lock
);
5116 ++master_tcon
->ses
->server
->srv_count
;
5117 spin_unlock(&cifs_tcp_ses_lock
);
5119 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
5121 tcon
= (struct cifs_tcon
*)ses
;
5122 cifs_put_tcp_session(master_tcon
->ses
->server
, 0);
5126 tcon
= cifs_get_tcon(ses
, vol_info
);
5128 cifs_put_smb_ses(ses
);
5133 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
5136 kfree(vol_info
->username
);
5137 kfree_sensitive(vol_info
->password
);
5144 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
5146 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
5149 /* find and return a tlink with given uid */
5150 static struct tcon_link
*
5151 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
5153 struct rb_node
*node
= root
->rb_node
;
5154 struct tcon_link
*tlink
;
5157 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
5159 if (uid_gt(tlink
->tl_uid
, uid
))
5160 node
= node
->rb_left
;
5161 else if (uid_lt(tlink
->tl_uid
, uid
))
5162 node
= node
->rb_right
;
5169 /* insert a tcon_link into the tree */
5171 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
5173 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
5174 struct tcon_link
*tlink
;
5177 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
5180 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
5181 new = &((*new)->rb_left
);
5183 new = &((*new)->rb_right
);
5186 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
5187 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
5191 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5194 * If the superblock doesn't refer to a multiuser mount, then just return
5195 * the master tcon for the mount.
5197 * First, search the rbtree for an existing tcon for this fsuid. If one
5198 * exists, then check to see if it's pending construction. If it is then wait
5199 * for construction to complete. Once it's no longer pending, check to see if
5200 * it failed and either return an error or retry construction, depending on
5203 * If one doesn't exist then insert a new tcon_link struct into the tree and
5204 * try to construct a new one.
5207 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
5210 kuid_t fsuid
= current_fsuid();
5211 struct tcon_link
*tlink
, *newtlink
;
5213 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
5214 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
5216 spin_lock(&cifs_sb
->tlink_tree_lock
);
5217 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
5219 cifs_get_tlink(tlink
);
5220 spin_unlock(&cifs_sb
->tlink_tree_lock
);
5222 if (tlink
== NULL
) {
5223 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
5224 if (newtlink
== NULL
)
5225 return ERR_PTR(-ENOMEM
);
5226 newtlink
->tl_uid
= fsuid
;
5227 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
5228 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
5229 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
5230 cifs_get_tlink(newtlink
);
5232 spin_lock(&cifs_sb
->tlink_tree_lock
);
5233 /* was one inserted after previous search? */
5234 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
5236 cifs_get_tlink(tlink
);
5237 spin_unlock(&cifs_sb
->tlink_tree_lock
);
5239 goto wait_for_construction
;
5242 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
5243 spin_unlock(&cifs_sb
->tlink_tree_lock
);
5245 wait_for_construction
:
5246 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
5247 TASK_INTERRUPTIBLE
);
5249 cifs_put_tlink(tlink
);
5250 return ERR_PTR(-ERESTARTSYS
);
5253 /* if it's good, return it */
5254 if (!IS_ERR(tlink
->tl_tcon
))
5257 /* return error if we tried this already recently */
5258 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
5259 cifs_put_tlink(tlink
);
5260 return ERR_PTR(-EACCES
);
5263 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
5264 goto wait_for_construction
;
5267 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
5268 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
5269 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
5271 if (IS_ERR(tlink
->tl_tcon
)) {
5272 cifs_put_tlink(tlink
);
5273 return ERR_PTR(-EACCES
);
5280 * periodic workqueue job that scans tcon_tree for a superblock and closes
5284 cifs_prune_tlinks(struct work_struct
*work
)
5286 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
5288 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
5289 struct rb_node
*node
;
5290 struct rb_node
*tmp
;
5291 struct tcon_link
*tlink
;
5294 * Because we drop the spinlock in the loop in order to put the tlink
5295 * it's not guarded against removal of links from the tree. The only
5296 * places that remove entries from the tree are this function and
5297 * umounts. Because this function is non-reentrant and is canceled
5298 * before umount can proceed, this is safe.
5300 spin_lock(&cifs_sb
->tlink_tree_lock
);
5301 node
= rb_first(root
);
5302 while (node
!= NULL
) {
5304 node
= rb_next(tmp
);
5305 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
5307 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
5308 atomic_read(&tlink
->tl_count
) != 0 ||
5309 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
5312 cifs_get_tlink(tlink
);
5313 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
5314 rb_erase(tmp
, root
);
5316 spin_unlock(&cifs_sb
->tlink_tree_lock
);
5317 cifs_put_tlink(tlink
);
5318 spin_lock(&cifs_sb
->tlink_tree_lock
);
5320 spin_unlock(&cifs_sb
->tlink_tree_lock
);
5322 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
5326 #ifdef CONFIG_CIFS_DFS_UPCALL
5327 int cifs_tree_connect(const unsigned int xid
, struct cifs_tcon
*tcon
, const struct nls_table
*nlsc
)
5330 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
5331 const struct smb_version_operations
*ops
= server
->ops
;
5332 struct dfs_cache_tgt_list tl
;
5333 struct dfs_cache_tgt_iterator
*it
= NULL
;
5335 const char *tcp_host
;
5336 size_t tcp_host_len
;
5337 const char *dfs_host
;
5338 size_t dfs_host_len
;
5339 char *share
= NULL
, *prefix
= NULL
;
5340 struct dfs_info3_param ref
= {0};
5343 tree
= kzalloc(MAX_TREE_SIZE
, GFP_KERNEL
);
5347 if (!tcon
->dfs_path
) {
5349 scnprintf(tree
, MAX_TREE_SIZE
, "\\\\%s\\IPC$", server
->hostname
);
5350 rc
= ops
->tree_connect(xid
, tcon
->ses
, tree
, tcon
, nlsc
);
5352 rc
= ops
->tree_connect(xid
, tcon
->ses
, tcon
->treeName
, tcon
, nlsc
);
5357 rc
= dfs_cache_noreq_find(tcon
->dfs_path
+ 1, &ref
, &tl
);
5360 isroot
= ref
.server_type
== DFS_TYPE_ROOT
;
5361 free_dfs_info_param(&ref
);
5363 extract_unc_hostname(server
->hostname
, &tcp_host
, &tcp_host_len
);
5365 for (it
= dfs_cache_get_tgt_iterator(&tl
); it
; it
= dfs_cache_get_next_tgt(&tl
, it
)) {
5373 rc
= dfs_cache_get_tgt_share(tcon
->dfs_path
+ 1, it
, &share
, &prefix
);
5375 cifs_dbg(VFS
, "%s: failed to parse target share %d\n",
5380 extract_unc_hostname(share
, &dfs_host
, &dfs_host_len
);
5382 if (dfs_host_len
!= tcp_host_len
5383 || strncasecmp(dfs_host
, tcp_host
, dfs_host_len
) != 0) {
5384 cifs_dbg(FYI
, "%s: %.*s doesn't match %.*s\n", __func__
, (int)dfs_host_len
,
5385 dfs_host
, (int)tcp_host_len
, tcp_host
);
5387 rc
= match_target_ip(server
, dfs_host
, dfs_host_len
, &target_match
);
5389 cifs_dbg(VFS
, "%s: failed to match target ip: %d\n", __func__
, rc
);
5393 if (!target_match
) {
5394 cifs_dbg(FYI
, "%s: skipping target\n", __func__
);
5400 scnprintf(tree
, MAX_TREE_SIZE
, "\\\\%s\\IPC$", share
);
5401 rc
= ops
->tree_connect(xid
, tcon
->ses
, tree
, tcon
, nlsc
);
5403 scnprintf(tree
, MAX_TREE_SIZE
, "\\%s", share
);
5404 rc
= ops
->tree_connect(xid
, tcon
->ses
, tree
, tcon
, nlsc
);
5405 /* Only handle prefix paths of DFS link targets */
5406 if (!rc
&& !isroot
) {
5407 rc
= update_super_prepath(tcon
, prefix
);
5420 rc
= dfs_cache_noreq_update_tgthint(tcon
->dfs_path
+ 1, it
);
5424 dfs_cache_free_tgts(&tl
);
5430 int cifs_tree_connect(const unsigned int xid
, struct cifs_tcon
*tcon
, const struct nls_table
*nlsc
)
5432 const struct smb_version_operations
*ops
= tcon
->ses
->server
->ops
;
5434 return ops
->tree_connect(xid
, tcon
->ses
, tcon
->treeName
, tcon
, nlsc
);