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/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
45 #include <linux/parser.h>
46 #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"
61 #define RFC1001_PORT 139
63 extern mempool_t
*cifs_req_poolp
;
65 /* FIXME: should these be tunable? */
66 #define TLINK_ERROR_EXPIRE (1 * HZ)
67 #define TLINK_IDLE_EXPIRE (600 * HZ)
70 /* Mount options that take no arguments */
71 Opt_user_xattr
, Opt_nouser_xattr
,
72 Opt_forceuid
, Opt_noforceuid
,
73 Opt_forcegid
, Opt_noforcegid
,
74 Opt_noblocksend
, Opt_noautotune
,
75 Opt_hard
, Opt_soft
, Opt_perm
, Opt_noperm
,
76 Opt_mapposix
, Opt_nomapposix
,
77 Opt_mapchars
, Opt_nomapchars
, Opt_sfu
,
78 Opt_nosfu
, Opt_nodfs
, Opt_posixpaths
,
79 Opt_noposixpaths
, Opt_nounix
,
82 Opt_forcemandatorylock
, Opt_setuidfromacl
, Opt_setuids
,
83 Opt_nosetuids
, Opt_dynperm
, Opt_nodynperm
,
84 Opt_nohard
, Opt_nosoft
,
86 Opt_nostrictsync
, Opt_strictsync
,
87 Opt_serverino
, Opt_noserverino
,
88 Opt_rwpidforward
, Opt_cifsacl
, Opt_nocifsacl
,
89 Opt_acl
, Opt_noacl
, Opt_locallease
,
90 Opt_sign
, Opt_seal
, Opt_noac
,
91 Opt_fsc
, Opt_mfsymlinks
,
92 Opt_multiuser
, Opt_sloppy
, Opt_nosharesock
,
93 Opt_persistent
, Opt_nopersistent
,
94 Opt_resilient
, Opt_noresilient
,
97 /* Mount options which take numeric value */
98 Opt_backupuid
, Opt_backupgid
, Opt_uid
,
99 Opt_cruid
, Opt_gid
, Opt_file_mode
,
100 Opt_dirmode
, Opt_port
,
101 Opt_rsize
, Opt_wsize
, Opt_actimeo
,
102 Opt_echo_interval
, Opt_max_credits
,
105 /* Mount options which take string value */
106 Opt_user
, Opt_pass
, Opt_ip
,
107 Opt_domain
, Opt_srcaddr
, Opt_iocharset
,
108 Opt_netbiosname
, Opt_servern
,
109 Opt_ver
, Opt_vers
, Opt_sec
, Opt_cache
,
111 /* Mount options to be ignored */
114 /* Options which could be blank */
122 static const match_table_t cifs_mount_option_tokens
= {
124 { Opt_user_xattr
, "user_xattr" },
125 { Opt_nouser_xattr
, "nouser_xattr" },
126 { Opt_forceuid
, "forceuid" },
127 { Opt_noforceuid
, "noforceuid" },
128 { Opt_forcegid
, "forcegid" },
129 { Opt_noforcegid
, "noforcegid" },
130 { Opt_noblocksend
, "noblocksend" },
131 { Opt_noautotune
, "noautotune" },
132 { Opt_hard
, "hard" },
133 { Opt_soft
, "soft" },
134 { Opt_perm
, "perm" },
135 { Opt_noperm
, "noperm" },
136 { Opt_mapchars
, "mapchars" }, /* SFU style */
137 { Opt_nomapchars
, "nomapchars" },
138 { Opt_mapposix
, "mapposix" }, /* SFM style */
139 { Opt_nomapposix
, "nomapposix" },
141 { Opt_nosfu
, "nosfu" },
142 { Opt_nodfs
, "nodfs" },
143 { Opt_posixpaths
, "posixpaths" },
144 { Opt_noposixpaths
, "noposixpaths" },
145 { Opt_nounix
, "nounix" },
146 { Opt_nounix
, "nolinux" },
147 { Opt_nocase
, "nocase" },
148 { Opt_nocase
, "ignorecase" },
150 { Opt_nobrl
, "nobrl" },
151 { Opt_nobrl
, "nolock" },
152 { Opt_forcemandatorylock
, "forcemandatorylock" },
153 { Opt_forcemandatorylock
, "forcemand" },
154 { Opt_setuids
, "setuids" },
155 { Opt_nosetuids
, "nosetuids" },
156 { Opt_setuidfromacl
, "idsfromsid" },
157 { Opt_dynperm
, "dynperm" },
158 { Opt_nodynperm
, "nodynperm" },
159 { Opt_nohard
, "nohard" },
160 { Opt_nosoft
, "nosoft" },
161 { Opt_nointr
, "nointr" },
162 { Opt_intr
, "intr" },
163 { Opt_nostrictsync
, "nostrictsync" },
164 { Opt_strictsync
, "strictsync" },
165 { Opt_serverino
, "serverino" },
166 { Opt_noserverino
, "noserverino" },
167 { Opt_rwpidforward
, "rwpidforward" },
168 { Opt_cifsacl
, "cifsacl" },
169 { Opt_nocifsacl
, "nocifsacl" },
171 { Opt_noacl
, "noacl" },
172 { Opt_locallease
, "locallease" },
173 { Opt_sign
, "sign" },
174 { Opt_seal
, "seal" },
175 { Opt_noac
, "noac" },
177 { Opt_mfsymlinks
, "mfsymlinks" },
178 { Opt_multiuser
, "multiuser" },
179 { Opt_sloppy
, "sloppy" },
180 { Opt_nosharesock
, "nosharesock" },
181 { Opt_persistent
, "persistenthandles"},
182 { Opt_nopersistent
, "nopersistenthandles"},
183 { Opt_resilient
, "resilienthandles"},
184 { Opt_noresilient
, "noresilienthandles"},
185 { Opt_domainauto
, "domainauto"},
187 { Opt_backupuid
, "backupuid=%s" },
188 { Opt_backupgid
, "backupgid=%s" },
189 { Opt_uid
, "uid=%s" },
190 { Opt_cruid
, "cruid=%s" },
191 { Opt_gid
, "gid=%s" },
192 { Opt_file_mode
, "file_mode=%s" },
193 { Opt_dirmode
, "dirmode=%s" },
194 { Opt_dirmode
, "dir_mode=%s" },
195 { Opt_port
, "port=%s" },
196 { Opt_rsize
, "rsize=%s" },
197 { Opt_wsize
, "wsize=%s" },
198 { Opt_actimeo
, "actimeo=%s" },
199 { Opt_echo_interval
, "echo_interval=%s" },
200 { Opt_max_credits
, "max_credits=%s" },
201 { Opt_snapshot
, "snapshot=%s" },
203 { Opt_blank_user
, "user=" },
204 { Opt_blank_user
, "username=" },
205 { Opt_user
, "user=%s" },
206 { Opt_user
, "username=%s" },
207 { Opt_blank_pass
, "pass=" },
208 { Opt_blank_pass
, "password=" },
209 { Opt_pass
, "pass=%s" },
210 { Opt_pass
, "password=%s" },
211 { Opt_blank_ip
, "ip=" },
212 { Opt_blank_ip
, "addr=" },
214 { Opt_ip
, "addr=%s" },
215 { Opt_ignore
, "unc=%s" },
216 { Opt_ignore
, "target=%s" },
217 { Opt_ignore
, "path=%s" },
218 { Opt_domain
, "dom=%s" },
219 { Opt_domain
, "domain=%s" },
220 { Opt_domain
, "workgroup=%s" },
221 { Opt_srcaddr
, "srcaddr=%s" },
222 { Opt_ignore
, "prefixpath=%s" },
223 { Opt_iocharset
, "iocharset=%s" },
224 { Opt_netbiosname
, "netbiosname=%s" },
225 { Opt_servern
, "servern=%s" },
226 { Opt_ver
, "ver=%s" },
227 { Opt_vers
, "vers=%s" },
228 { Opt_sec
, "sec=%s" },
229 { Opt_cache
, "cache=%s" },
231 { Opt_ignore
, "cred" },
232 { Opt_ignore
, "credentials" },
233 { Opt_ignore
, "cred=%s" },
234 { Opt_ignore
, "credentials=%s" },
235 { Opt_ignore
, "guest" },
236 { Opt_ignore
, "rw" },
237 { Opt_ignore
, "ro" },
238 { Opt_ignore
, "suid" },
239 { Opt_ignore
, "nosuid" },
240 { Opt_ignore
, "exec" },
241 { Opt_ignore
, "noexec" },
242 { Opt_ignore
, "nodev" },
243 { Opt_ignore
, "noauto" },
244 { Opt_ignore
, "dev" },
245 { Opt_ignore
, "mand" },
246 { Opt_ignore
, "nomand" },
247 { Opt_ignore
, "_netdev" },
253 Opt_sec_krb5
, Opt_sec_krb5i
, Opt_sec_krb5p
,
254 Opt_sec_ntlmsspi
, Opt_sec_ntlmssp
,
255 Opt_ntlm
, Opt_sec_ntlmi
, Opt_sec_ntlmv2
,
256 Opt_sec_ntlmv2i
, Opt_sec_lanman
,
262 static const match_table_t cifs_secflavor_tokens
= {
263 { Opt_sec_krb5
, "krb5" },
264 { Opt_sec_krb5i
, "krb5i" },
265 { Opt_sec_krb5p
, "krb5p" },
266 { Opt_sec_ntlmsspi
, "ntlmsspi" },
267 { Opt_sec_ntlmssp
, "ntlmssp" },
268 { Opt_ntlm
, "ntlm" },
269 { Opt_sec_ntlmi
, "ntlmi" },
270 { Opt_sec_ntlmv2
, "nontlm" },
271 { Opt_sec_ntlmv2
, "ntlmv2" },
272 { Opt_sec_ntlmv2i
, "ntlmv2i" },
273 { Opt_sec_lanman
, "lanman" },
274 { Opt_sec_none
, "none" },
276 { Opt_sec_err
, NULL
}
287 static const match_table_t cifs_cacheflavor_tokens
= {
288 { Opt_cache_loose
, "loose" },
289 { Opt_cache_strict
, "strict" },
290 { Opt_cache_none
, "none" },
291 { Opt_cache_err
, NULL
}
294 static const match_table_t cifs_smb_version_tokens
= {
295 { Smb_1
, SMB1_VERSION_STRING
},
296 { Smb_20
, SMB20_VERSION_STRING
},
297 { Smb_21
, SMB21_VERSION_STRING
},
298 { Smb_30
, SMB30_VERSION_STRING
},
299 { Smb_302
, SMB302_VERSION_STRING
},
300 #ifdef CONFIG_CIFS_SMB311
301 { Smb_311
, SMB311_VERSION_STRING
},
302 { Smb_311
, ALT_SMB311_VERSION_STRING
},
304 { Smb_3any
, SMB3ANY_VERSION_STRING
},
305 { Smb_default
, SMBDEFAULT_VERSION_STRING
},
306 { Smb_version_err
, NULL
}
309 static int ip_connect(struct TCP_Server_Info
*server
);
310 static int generic_ip_connect(struct TCP_Server_Info
*server
);
311 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
312 static void cifs_prune_tlinks(struct work_struct
*work
);
313 static int cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
314 const char *devname
);
317 * cifs tcp session reconnection
319 * mark tcp session as reconnecting so temporarily locked
320 * mark all smb sessions as reconnecting for tcp session
321 * reconnect tcp session
322 * wake up waiters on reconnection? - (not needed currently)
325 cifs_reconnect(struct TCP_Server_Info
*server
)
328 struct list_head
*tmp
, *tmp2
;
329 struct cifs_ses
*ses
;
330 struct cifs_tcon
*tcon
;
331 struct mid_q_entry
*mid_entry
;
332 struct list_head retry_list
;
334 spin_lock(&GlobalMid_Lock
);
335 if (server
->tcpStatus
== CifsExiting
) {
336 /* the demux thread will exit normally
337 next time through the loop */
338 spin_unlock(&GlobalMid_Lock
);
341 server
->tcpStatus
= CifsNeedReconnect
;
342 spin_unlock(&GlobalMid_Lock
);
344 server
->max_read
= 0;
346 cifs_dbg(FYI
, "Reconnecting tcp session\n");
348 /* before reconnecting the tcp session, mark the smb session (uid)
349 and the tid bad so they are not used until reconnected */
350 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
352 spin_lock(&cifs_tcp_ses_lock
);
353 list_for_each(tmp
, &server
->smb_ses_list
) {
354 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
355 ses
->need_reconnect
= true;
357 list_for_each(tmp2
, &ses
->tcon_list
) {
358 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
359 tcon
->need_reconnect
= true;
362 spin_unlock(&cifs_tcp_ses_lock
);
364 /* do not want to be sending data on a socket we are freeing */
365 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
366 mutex_lock(&server
->srv_mutex
);
367 if (server
->ssocket
) {
368 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
369 server
->ssocket
->state
, server
->ssocket
->flags
);
370 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
371 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
372 server
->ssocket
->state
, server
->ssocket
->flags
);
373 sock_release(server
->ssocket
);
374 server
->ssocket
= NULL
;
376 server
->sequence_number
= 0;
377 server
->session_estab
= false;
378 kfree(server
->session_key
.response
);
379 server
->session_key
.response
= NULL
;
380 server
->session_key
.len
= 0;
381 server
->lstrp
= jiffies
;
383 /* mark submitted MIDs for retry and issue callback */
384 INIT_LIST_HEAD(&retry_list
);
385 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
386 spin_lock(&GlobalMid_Lock
);
387 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
388 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
389 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
390 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
391 list_move(&mid_entry
->qhead
, &retry_list
);
393 spin_unlock(&GlobalMid_Lock
);
394 mutex_unlock(&server
->srv_mutex
);
396 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
397 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
398 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
399 list_del_init(&mid_entry
->qhead
);
400 mid_entry
->callback(mid_entry
);
406 /* we should try only the port we connected to before */
407 mutex_lock(&server
->srv_mutex
);
408 rc
= generic_ip_connect(server
);
410 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
411 mutex_unlock(&server
->srv_mutex
);
414 atomic_inc(&tcpSesReconnectCount
);
415 spin_lock(&GlobalMid_Lock
);
416 if (server
->tcpStatus
!= CifsExiting
)
417 server
->tcpStatus
= CifsNeedNegotiate
;
418 spin_unlock(&GlobalMid_Lock
);
419 mutex_unlock(&server
->srv_mutex
);
421 } while (server
->tcpStatus
== CifsNeedReconnect
);
423 if (server
->tcpStatus
== CifsNeedNegotiate
)
424 mod_delayed_work(cifsiod_wq
, &server
->echo
, 0);
430 cifs_echo_request(struct work_struct
*work
)
433 struct TCP_Server_Info
*server
= container_of(work
,
434 struct TCP_Server_Info
, echo
.work
);
435 unsigned long echo_interval
;
438 * If we need to renegotiate, set echo interval to zero to
439 * immediately call echo service where we can renegotiate.
441 if (server
->tcpStatus
== CifsNeedNegotiate
)
444 echo_interval
= server
->echo_interval
;
447 * We cannot send an echo if it is disabled.
448 * Also, no need to ping if we got a response recently.
451 if (server
->tcpStatus
== CifsNeedReconnect
||
452 server
->tcpStatus
== CifsExiting
||
453 server
->tcpStatus
== CifsNew
||
454 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
455 time_before(jiffies
, server
->lstrp
+ echo_interval
- HZ
))
458 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
460 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
464 queue_delayed_work(cifsiod_wq
, &server
->echo
, server
->echo_interval
);
468 allocate_buffers(struct TCP_Server_Info
*server
)
470 if (!server
->bigbuf
) {
471 server
->bigbuf
= (char *)cifs_buf_get();
472 if (!server
->bigbuf
) {
473 cifs_dbg(VFS
, "No memory for large SMB response\n");
475 /* retry will check if exiting */
478 } else if (server
->large_buf
) {
479 /* we are reusing a dirty large buf, clear its start */
480 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
483 if (!server
->smallbuf
) {
484 server
->smallbuf
= (char *)cifs_small_buf_get();
485 if (!server
->smallbuf
) {
486 cifs_dbg(VFS
, "No memory for SMB response\n");
488 /* retry will check if exiting */
491 /* beginning of smb buffer is cleared in our buf_get */
493 /* if existing small buf clear beginning */
494 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
501 server_unresponsive(struct TCP_Server_Info
*server
)
504 * We need to wait 2 echo intervals to make sure we handle such
506 * 1s client sends a normal SMB request
507 * 2s client gets a response
508 * 30s echo workqueue job pops, and decides we got a response recently
509 * and don't need to send another
511 * 65s kernel_recvmsg times out, and we see that we haven't gotten
512 * a response in >60s.
514 if ((server
->tcpStatus
== CifsGood
||
515 server
->tcpStatus
== CifsNeedNegotiate
) &&
516 time_after(jiffies
, server
->lstrp
+ 2 * server
->echo_interval
)) {
517 cifs_dbg(VFS
, "Server %s has not responded in %lu seconds. Reconnecting...\n",
518 server
->hostname
, (2 * server
->echo_interval
) / HZ
);
519 cifs_reconnect(server
);
520 wake_up(&server
->response_q
);
528 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct msghdr
*smb_msg
)
533 smb_msg
->msg_control
= NULL
;
534 smb_msg
->msg_controllen
= 0;
536 for (total_read
= 0; msg_data_left(smb_msg
); total_read
+= length
) {
539 if (server_unresponsive(server
))
540 return -ECONNABORTED
;
542 length
= sock_recvmsg(server
->ssocket
, smb_msg
, 0);
544 if (server
->tcpStatus
== CifsExiting
)
547 if (server
->tcpStatus
== CifsNeedReconnect
) {
548 cifs_reconnect(server
);
549 return -ECONNABORTED
;
552 if (length
== -ERESTARTSYS
||
556 * Minimum sleep to prevent looping, allowing socket
557 * to clear and app threads to set tcpStatus
558 * CifsNeedReconnect if server hung.
560 usleep_range(1000, 2000);
566 cifs_dbg(FYI
, "Received no data or error: %d\n", length
);
567 cifs_reconnect(server
);
568 return -ECONNABORTED
;
575 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
576 unsigned int to_read
)
578 struct msghdr smb_msg
;
579 struct kvec iov
= {.iov_base
= buf
, .iov_len
= to_read
};
580 iov_iter_kvec(&smb_msg
.msg_iter
, READ
| ITER_KVEC
, &iov
, 1, to_read
);
582 return cifs_readv_from_socket(server
, &smb_msg
);
586 cifs_read_page_from_socket(struct TCP_Server_Info
*server
, struct page
*page
,
587 unsigned int to_read
)
589 struct msghdr smb_msg
;
590 struct bio_vec bv
= {.bv_page
= page
, .bv_len
= to_read
};
591 iov_iter_bvec(&smb_msg
.msg_iter
, READ
| ITER_BVEC
, &bv
, 1, to_read
);
592 return cifs_readv_from_socket(server
, &smb_msg
);
596 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
599 * The first byte big endian of the length field,
600 * is actually not part of the length but the type
601 * with the most common, zero, as regular data.
604 case RFC1002_SESSION_MESSAGE
:
605 /* Regular SMB response */
607 case RFC1002_SESSION_KEEP_ALIVE
:
608 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
610 case RFC1002_POSITIVE_SESSION_RESPONSE
:
611 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
613 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
615 * We get this from Windows 98 instead of an error on
616 * SMB negprot response.
618 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
619 /* give server a second to clean up */
622 * Always try 445 first on reconnect since we get NACK
623 * on some if we ever connected to port 139 (the NACK
624 * is since we do not begin with RFC1001 session
627 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
628 cifs_reconnect(server
);
629 wake_up(&server
->response_q
);
632 cifs_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
633 cifs_reconnect(server
);
640 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
642 #ifdef CONFIG_CIFS_STATS2
643 mid
->when_received
= jiffies
;
645 spin_lock(&GlobalMid_Lock
);
647 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
649 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
650 list_del_init(&mid
->qhead
);
651 spin_unlock(&GlobalMid_Lock
);
655 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
656 char *buf
, int malformed
)
658 if (server
->ops
->check_trans2
&&
659 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
662 mid
->large_buf
= server
->large_buf
;
663 /* Was previous buf put in mpx struct for multi-rsp? */
664 if (!mid
->multiRsp
) {
665 /* smb buffer will be freed by user thread */
666 if (server
->large_buf
)
667 server
->bigbuf
= NULL
;
669 server
->smallbuf
= NULL
;
671 dequeue_mid(mid
, malformed
);
674 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
678 /* take it off the list, if it's not already */
679 spin_lock(&cifs_tcp_ses_lock
);
680 list_del_init(&server
->tcp_ses_list
);
681 spin_unlock(&cifs_tcp_ses_lock
);
683 spin_lock(&GlobalMid_Lock
);
684 server
->tcpStatus
= CifsExiting
;
685 spin_unlock(&GlobalMid_Lock
);
686 wake_up_all(&server
->response_q
);
688 /* check if we have blocked requests that need to free */
689 spin_lock(&server
->req_lock
);
690 if (server
->credits
<= 0)
692 spin_unlock(&server
->req_lock
);
694 * Although there should not be any requests blocked on this queue it
695 * can not hurt to be paranoid and try to wake up requests that may
696 * haven been blocked when more than 50 at time were on the wire to the
697 * same server - they now will see the session is in exit state and get
698 * out of SendReceive.
700 wake_up_all(&server
->request_q
);
701 /* give those requests time to exit */
704 if (server
->ssocket
) {
705 sock_release(server
->ssocket
);
706 server
->ssocket
= NULL
;
709 if (!list_empty(&server
->pending_mid_q
)) {
710 struct list_head dispose_list
;
711 struct mid_q_entry
*mid_entry
;
712 struct list_head
*tmp
, *tmp2
;
714 INIT_LIST_HEAD(&dispose_list
);
715 spin_lock(&GlobalMid_Lock
);
716 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
717 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
718 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
719 mid_entry
->mid_state
= MID_SHUTDOWN
;
720 list_move(&mid_entry
->qhead
, &dispose_list
);
722 spin_unlock(&GlobalMid_Lock
);
724 /* now walk dispose list and issue callbacks */
725 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
726 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
727 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
728 list_del_init(&mid_entry
->qhead
);
729 mid_entry
->callback(mid_entry
);
731 /* 1/8th of sec is more than enough time for them to exit */
735 if (!list_empty(&server
->pending_mid_q
)) {
737 * mpx threads have not exited yet give them at least the smb
738 * send timeout time for long ops.
740 * Due to delays on oplock break requests, we need to wait at
741 * least 45 seconds before giving up on a request getting a
742 * response and going ahead and killing cifsd.
744 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
747 * If threads still have not exited they are probably never
748 * coming home not much else we can do but free the memory.
752 kfree(server
->hostname
);
755 length
= atomic_dec_return(&tcpSesAllocCount
);
757 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
761 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
764 char *buf
= server
->smallbuf
;
765 unsigned int pdu_length
= get_rfc1002_length(buf
);
767 /* make sure this will fit in a large buffer */
768 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) - 4) {
769 cifs_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
770 cifs_reconnect(server
);
771 wake_up(&server
->response_q
);
772 return -ECONNABORTED
;
775 /* switch to large buffer if too big for a small one */
776 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
777 server
->large_buf
= true;
778 memcpy(server
->bigbuf
, buf
, server
->total_read
);
779 buf
= server
->bigbuf
;
782 /* now read the rest */
783 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
784 pdu_length
- HEADER_SIZE(server
) + 1 + 4);
787 server
->total_read
+= length
;
789 dump_smb(buf
, server
->total_read
);
791 return cifs_handle_standard(server
, mid
);
795 cifs_handle_standard(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
797 char *buf
= server
->large_buf
? server
->bigbuf
: server
->smallbuf
;
801 * We know that we received enough to get to the MID as we
802 * checked the pdu_length earlier. Now check to see
803 * if the rest of the header is OK. We borrow the length
804 * var for the rest of the loop to avoid a new stack var.
806 * 48 bytes is enough to display the header and a little bit
807 * into the payload for debugging purposes.
809 length
= server
->ops
->check_message(buf
, server
->total_read
, server
);
811 cifs_dump_mem("Bad SMB: ", buf
,
812 min_t(unsigned int, server
->total_read
, 48));
814 if (server
->ops
->is_session_expired
&&
815 server
->ops
->is_session_expired(buf
)) {
816 cifs_reconnect(server
);
817 wake_up(&server
->response_q
);
821 if (server
->ops
->is_status_pending
&&
822 server
->ops
->is_status_pending(buf
, server
, length
))
828 handle_mid(mid
, server
, buf
, length
);
833 cifs_demultiplex_thread(void *p
)
836 struct TCP_Server_Info
*server
= p
;
837 unsigned int pdu_length
;
839 struct task_struct
*task_to_wake
= NULL
;
840 struct mid_q_entry
*mid_entry
;
842 current
->flags
|= PF_MEMALLOC
;
843 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
845 length
= atomic_inc_return(&tcpSesAllocCount
);
847 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
850 while (server
->tcpStatus
!= CifsExiting
) {
854 if (!allocate_buffers(server
))
857 server
->large_buf
= false;
858 buf
= server
->smallbuf
;
859 pdu_length
= 4; /* enough to get RFC1001 header */
861 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
864 server
->total_read
= length
;
867 * The right amount was read from socket - 4 bytes,
868 * so we can now interpret the length field.
870 pdu_length
= get_rfc1002_length(buf
);
872 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
873 if (!is_smb_response(server
, buf
[0]))
876 /* make sure we have enough to get to the MID */
877 if (pdu_length
< HEADER_SIZE(server
) - 1 - 4) {
878 cifs_dbg(VFS
, "SMB response too short (%u bytes)\n",
880 cifs_reconnect(server
);
881 wake_up(&server
->response_q
);
885 /* read down to the MID */
886 length
= cifs_read_from_socket(server
, buf
+ 4,
887 HEADER_SIZE(server
) - 1 - 4);
890 server
->total_read
+= length
;
892 if (server
->ops
->is_transform_hdr
&&
893 server
->ops
->receive_transform
&&
894 server
->ops
->is_transform_hdr(buf
)) {
895 length
= server
->ops
->receive_transform(server
,
898 mid_entry
= server
->ops
->find_mid(server
, buf
);
900 if (!mid_entry
|| !mid_entry
->receive
)
901 length
= standard_receive3(server
, mid_entry
);
903 length
= mid_entry
->receive(server
, mid_entry
);
909 if (server
->large_buf
)
910 buf
= server
->bigbuf
;
912 server
->lstrp
= jiffies
;
913 if (mid_entry
!= NULL
) {
914 if ((mid_entry
->mid_flags
& MID_WAIT_CANCELLED
) &&
915 mid_entry
->mid_state
== MID_RESPONSE_RECEIVED
&&
916 server
->ops
->handle_cancelled_mid
)
917 server
->ops
->handle_cancelled_mid(
921 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
922 mid_entry
->callback(mid_entry
);
923 } else if (server
->ops
->is_oplock_break
&&
924 server
->ops
->is_oplock_break(buf
, server
)) {
925 cifs_dbg(FYI
, "Received oplock break\n");
927 cifs_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
928 atomic_read(&midCount
));
929 cifs_dump_mem("Received Data is: ", buf
,
930 HEADER_SIZE(server
));
931 #ifdef CONFIG_CIFS_DEBUG2
932 if (server
->ops
->dump_detail
)
933 server
->ops
->dump_detail(buf
);
934 cifs_dump_mids(server
);
935 #endif /* CIFS_DEBUG2 */
938 } /* end while !EXITING */
940 /* buffer usually freed in free_mid - need to free it here on exit */
941 cifs_buf_release(server
->bigbuf
);
942 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
943 cifs_small_buf_release(server
->smallbuf
);
945 task_to_wake
= xchg(&server
->tsk
, NULL
);
946 clean_demultiplex_info(server
);
948 /* if server->tsk was NULL then wait for a signal before exiting */
950 set_current_state(TASK_INTERRUPTIBLE
);
951 while (!signal_pending(current
)) {
953 set_current_state(TASK_INTERRUPTIBLE
);
955 set_current_state(TASK_RUNNING
);
958 module_put_and_exit(0);
961 /* extract the host portion of the UNC string */
963 extract_hostname(const char *unc
)
969 /* skip double chars at beginning of string */
970 /* BB: check validity of these bytes? */
973 /* delimiter between hostname and sharename is always '\\' now */
974 delim
= strchr(src
, '\\');
976 return ERR_PTR(-EINVAL
);
979 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
981 return ERR_PTR(-ENOMEM
);
983 memcpy(dst
, src
, len
);
989 static int get_option_ul(substring_t args
[], unsigned long *option
)
994 string
= match_strdup(args
);
997 rc
= kstrtoul(string
, 0, option
);
1003 static int get_option_uid(substring_t args
[], kuid_t
*result
)
1005 unsigned long value
;
1009 rc
= get_option_ul(args
, &value
);
1013 uid
= make_kuid(current_user_ns(), value
);
1014 if (!uid_valid(uid
))
1021 static int get_option_gid(substring_t args
[], kgid_t
*result
)
1023 unsigned long value
;
1027 rc
= get_option_ul(args
, &value
);
1031 gid
= make_kgid(current_user_ns(), value
);
1032 if (!gid_valid(gid
))
1039 static int cifs_parse_security_flavors(char *value
,
1040 struct smb_vol
*vol
)
1043 substring_t args
[MAX_OPT_ARGS
];
1046 * With mount options, the last one should win. Reset any existing
1047 * settings back to default.
1049 vol
->sectype
= Unspecified
;
1052 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1054 cifs_dbg(VFS
, "sec=krb5p is not supported!\n");
1060 vol
->sectype
= Kerberos
;
1062 case Opt_sec_ntlmsspi
:
1065 case Opt_sec_ntlmssp
:
1066 vol
->sectype
= RawNTLMSSP
;
1072 vol
->sectype
= NTLM
;
1074 case Opt_sec_ntlmv2i
:
1077 case Opt_sec_ntlmv2
:
1078 vol
->sectype
= NTLMv2
;
1080 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1081 case Opt_sec_lanman
:
1082 vol
->sectype
= LANMAN
;
1089 cifs_dbg(VFS
, "bad security option: %s\n", value
);
1097 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1099 substring_t args
[MAX_OPT_ARGS
];
1101 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1102 case Opt_cache_loose
:
1103 vol
->direct_io
= false;
1104 vol
->strict_io
= false;
1106 case Opt_cache_strict
:
1107 vol
->direct_io
= false;
1108 vol
->strict_io
= true;
1110 case Opt_cache_none
:
1111 vol
->direct_io
= true;
1112 vol
->strict_io
= false;
1115 cifs_dbg(VFS
, "bad cache= option: %s\n", value
);
1122 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1124 substring_t args
[MAX_OPT_ARGS
];
1126 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1128 vol
->ops
= &smb1_operations
;
1129 vol
->vals
= &smb1_values
;
1132 vol
->ops
= &smb20_operations
;
1133 vol
->vals
= &smb20_values
;
1136 vol
->ops
= &smb21_operations
;
1137 vol
->vals
= &smb21_values
;
1140 vol
->ops
= &smb30_operations
;
1141 vol
->vals
= &smb30_values
;
1144 vol
->ops
= &smb30_operations
; /* currently identical with 3.0 */
1145 vol
->vals
= &smb302_values
;
1147 #ifdef CONFIG_CIFS_SMB311
1149 vol
->ops
= &smb311_operations
;
1150 vol
->vals
= &smb311_values
;
1154 vol
->ops
= &smb30_operations
; /* currently identical with 3.0 */
1155 vol
->vals
= &smb3any_values
;
1158 vol
->ops
= &smb30_operations
; /* currently identical with 3.0 */
1159 vol
->vals
= &smbdefault_values
;
1162 cifs_dbg(VFS
, "Unknown vers= option specified: %s\n", value
);
1169 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1170 * fields with the result. Returns 0 on success and an error otherwise.
1173 cifs_parse_devname(const char *devname
, struct smb_vol
*vol
)
1176 const char *delims
= "/\\";
1179 /* make sure we have a valid UNC double delimiter prefix */
1180 len
= strspn(devname
, delims
);
1184 /* find delimiter between host and sharename */
1185 pos
= strpbrk(devname
+ 2, delims
);
1189 /* skip past delimiter */
1192 /* now go until next delimiter or end of string */
1193 len
= strcspn(pos
, delims
);
1195 /* move "pos" up to delimiter or NULL */
1197 vol
->UNC
= kstrndup(devname
, pos
- devname
, GFP_KERNEL
);
1201 convert_delimiter(vol
->UNC
, '\\');
1203 /* skip any delimiter */
1204 if (*pos
== '/' || *pos
== '\\')
1207 /* If pos is NULL then no prepath */
1211 vol
->prepath
= kstrdup(pos
, GFP_KERNEL
);
1219 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1220 struct smb_vol
*vol
)
1223 char *mountdata_copy
= NULL
, *options
;
1224 unsigned int temp_len
, i
, j
;
1226 short int override_uid
= -1;
1227 short int override_gid
= -1;
1228 bool uid_specified
= false;
1229 bool gid_specified
= false;
1230 bool sloppy
= false;
1231 char *invalid
= NULL
;
1232 char *nodename
= utsname()->nodename
;
1233 char *string
= NULL
;
1234 char *tmp_end
, *value
;
1236 bool got_ip
= false;
1237 bool got_version
= false;
1238 unsigned short port
= 0;
1239 struct sockaddr
*dstaddr
= (struct sockaddr
*)&vol
->dstaddr
;
1243 delim
= separator
[0];
1245 /* ensure we always start with zeroed-out smb_vol */
1246 memset(vol
, 0, sizeof(*vol
));
1249 * does not have to be perfect mapping since field is
1250 * informational, only used for servers that do not support
1251 * port 445 and it can be overridden at mount time
1253 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1254 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1255 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1257 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1258 /* null target name indicates to use *SMBSERVR default called name
1259 if we end up sending RFC1001 session initialize */
1260 vol
->target_rfc1001_name
[0] = 0;
1261 vol
->cred_uid
= current_uid();
1262 vol
->linux_uid
= current_uid();
1263 vol
->linux_gid
= current_gid();
1266 * default to SFM style remapping of seven reserved characters
1267 * unless user overrides it or we negotiate CIFS POSIX where
1268 * it is unnecessary. Can not simultaneously use more than one mapping
1269 * since then readdir could list files that open could not open
1273 /* default to only allowing write access to owner of the mount */
1274 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1276 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1277 /* default is always to request posix paths. */
1278 vol
->posix_paths
= 1;
1279 /* default to using server inode numbers where available */
1280 vol
->server_ino
= 1;
1282 /* default is to use strict cifs caching semantics */
1283 vol
->strict_io
= true;
1285 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1287 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1288 vol
->ops
= &smb30_operations
;
1289 vol
->vals
= &smbdefault_values
;
1291 vol
->echo_interval
= SMB_ECHO_INTERVAL_DEFAULT
;
1294 goto cifs_parse_mount_err
;
1296 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1297 if (!mountdata_copy
)
1298 goto cifs_parse_mount_err
;
1300 options
= mountdata_copy
;
1301 end
= options
+ strlen(options
);
1303 if (strncmp(options
, "sep=", 4) == 0) {
1304 if (options
[4] != 0) {
1305 separator
[0] = options
[4];
1308 cifs_dbg(FYI
, "Null separator not allowed\n");
1311 vol
->backupuid_specified
= false; /* no backup intent for a user */
1312 vol
->backupgid_specified
= false; /* no backup intent for a group */
1314 switch (cifs_parse_devname(devname
, vol
)) {
1318 cifs_dbg(VFS
, "Unable to allocate memory for devname.\n");
1319 goto cifs_parse_mount_err
;
1321 cifs_dbg(VFS
, "Malformed UNC in devname.\n");
1322 goto cifs_parse_mount_err
;
1324 cifs_dbg(VFS
, "Unknown error parsing devname.\n");
1325 goto cifs_parse_mount_err
;
1328 while ((data
= strsep(&options
, separator
)) != NULL
) {
1329 substring_t args
[MAX_OPT_ARGS
];
1330 unsigned long option
;
1336 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1340 /* Ingnore the following */
1344 /* Boolean values */
1345 case Opt_user_xattr
:
1348 case Opt_nouser_xattr
:
1354 case Opt_noforceuid
:
1360 case Opt_noforcegid
:
1363 case Opt_noblocksend
:
1364 vol
->noblocksnd
= 1;
1366 case Opt_noautotune
:
1367 vol
->noautotune
= 1;
1382 vol
->sfu_remap
= true;
1383 vol
->remap
= false; /* disable SFM mapping */
1385 case Opt_nomapchars
:
1386 vol
->sfu_remap
= false;
1390 vol
->sfu_remap
= false; /* disable SFU mapping */
1392 case Opt_nomapposix
:
1404 case Opt_posixpaths
:
1405 vol
->posix_paths
= 1;
1407 case Opt_noposixpaths
:
1408 vol
->posix_paths
= 0;
1411 vol
->no_linux_ext
= 1;
1422 * turn off mandatory locking in mode
1423 * if remote locking is turned off since the
1424 * local vfs will do advisory
1426 if (vol
->file_mode
==
1427 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1428 vol
->file_mode
= S_IALLUGO
;
1430 case Opt_forcemandatorylock
:
1439 case Opt_setuidfromacl
:
1440 vol
->setuidfromacl
= 1;
1443 vol
->dynperm
= true;
1446 vol
->dynperm
= false;
1460 case Opt_nostrictsync
:
1461 vol
->nostrictsync
= 1;
1463 case Opt_strictsync
:
1464 vol
->nostrictsync
= 0;
1467 vol
->server_ino
= 1;
1469 case Opt_noserverino
:
1470 vol
->server_ino
= 0;
1472 case Opt_rwpidforward
:
1473 vol
->rwpidforward
= 1;
1482 vol
->no_psx_acl
= 0;
1485 vol
->no_psx_acl
= 1;
1487 case Opt_locallease
:
1488 vol
->local_lease
= 1;
1494 /* we do not do the following in secFlags because seal
1495 * is a per tree connection (mount) not a per socket
1496 * or per-smb connection option in the protocol
1497 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1502 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1505 #ifndef CONFIG_CIFS_FSCACHE
1506 cifs_dbg(VFS
, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1507 goto cifs_parse_mount_err
;
1511 case Opt_mfsymlinks
:
1512 vol
->mfsymlinks
= true;
1515 vol
->multiuser
= true;
1520 case Opt_nosharesock
:
1521 vol
->nosharesock
= true;
1523 case Opt_nopersistent
:
1524 vol
->nopersistent
= true;
1525 if (vol
->persistent
) {
1527 "persistenthandles mount options conflict\n");
1528 goto cifs_parse_mount_err
;
1531 case Opt_persistent
:
1532 vol
->persistent
= true;
1533 if ((vol
->nopersistent
) || (vol
->resilient
)) {
1535 "persistenthandles mount options conflict\n");
1536 goto cifs_parse_mount_err
;
1540 vol
->resilient
= true;
1541 if (vol
->persistent
) {
1543 "persistenthandles mount options conflict\n");
1544 goto cifs_parse_mount_err
;
1547 case Opt_noresilient
:
1548 vol
->resilient
= false; /* already the default */
1550 case Opt_domainauto
:
1551 vol
->domainauto
= true;
1554 /* Numeric Values */
1556 if (get_option_uid(args
, &vol
->backupuid
)) {
1557 cifs_dbg(VFS
, "%s: Invalid backupuid value\n",
1559 goto cifs_parse_mount_err
;
1561 vol
->backupuid_specified
= true;
1564 if (get_option_gid(args
, &vol
->backupgid
)) {
1565 cifs_dbg(VFS
, "%s: Invalid backupgid value\n",
1567 goto cifs_parse_mount_err
;
1569 vol
->backupgid_specified
= true;
1572 if (get_option_uid(args
, &vol
->linux_uid
)) {
1573 cifs_dbg(VFS
, "%s: Invalid uid value\n",
1575 goto cifs_parse_mount_err
;
1577 uid_specified
= true;
1580 if (get_option_uid(args
, &vol
->cred_uid
)) {
1581 cifs_dbg(VFS
, "%s: Invalid cruid value\n",
1583 goto cifs_parse_mount_err
;
1587 if (get_option_gid(args
, &vol
->linux_gid
)) {
1588 cifs_dbg(VFS
, "%s: Invalid gid value\n",
1590 goto cifs_parse_mount_err
;
1592 gid_specified
= true;
1595 if (get_option_ul(args
, &option
)) {
1596 cifs_dbg(VFS
, "%s: Invalid file_mode value\n",
1598 goto cifs_parse_mount_err
;
1600 vol
->file_mode
= option
;
1603 if (get_option_ul(args
, &option
)) {
1604 cifs_dbg(VFS
, "%s: Invalid dir_mode value\n",
1606 goto cifs_parse_mount_err
;
1608 vol
->dir_mode
= option
;
1611 if (get_option_ul(args
, &option
) ||
1612 option
> USHRT_MAX
) {
1613 cifs_dbg(VFS
, "%s: Invalid port value\n",
1615 goto cifs_parse_mount_err
;
1617 port
= (unsigned short)option
;
1620 if (get_option_ul(args
, &option
)) {
1621 cifs_dbg(VFS
, "%s: Invalid rsize value\n",
1623 goto cifs_parse_mount_err
;
1625 vol
->rsize
= option
;
1628 if (get_option_ul(args
, &option
)) {
1629 cifs_dbg(VFS
, "%s: Invalid wsize value\n",
1631 goto cifs_parse_mount_err
;
1633 vol
->wsize
= option
;
1636 if (get_option_ul(args
, &option
)) {
1637 cifs_dbg(VFS
, "%s: Invalid actimeo value\n",
1639 goto cifs_parse_mount_err
;
1641 vol
->actimeo
= HZ
* option
;
1642 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1643 cifs_dbg(VFS
, "attribute cache timeout too large\n");
1644 goto cifs_parse_mount_err
;
1647 case Opt_echo_interval
:
1648 if (get_option_ul(args
, &option
)) {
1649 cifs_dbg(VFS
, "%s: Invalid echo interval value\n",
1651 goto cifs_parse_mount_err
;
1653 vol
->echo_interval
= option
;
1656 if (get_option_ul(args
, &option
)) {
1657 cifs_dbg(VFS
, "%s: Invalid snapshot time\n",
1659 goto cifs_parse_mount_err
;
1661 vol
->snapshot_time
= option
;
1663 case Opt_max_credits
:
1664 if (get_option_ul(args
, &option
) || (option
< 20) ||
1666 cifs_dbg(VFS
, "%s: Invalid max_credits value\n",
1668 goto cifs_parse_mount_err
;
1670 vol
->max_credits
= option
;
1673 /* String Arguments */
1675 case Opt_blank_user
:
1676 /* null user, ie. anonymous authentication */
1678 vol
->username
= NULL
;
1681 string
= match_strdup(args
);
1685 if (strnlen(string
, CIFS_MAX_USERNAME_LEN
) >
1686 CIFS_MAX_USERNAME_LEN
) {
1687 pr_warn("CIFS: username too long\n");
1688 goto cifs_parse_mount_err
;
1691 kfree(vol
->username
);
1692 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1694 goto cifs_parse_mount_err
;
1696 case Opt_blank_pass
:
1697 /* passwords have to be handled differently
1698 * to allow the character used for deliminator
1699 * to be passed within them
1703 * Check if this is a case where the password
1704 * starts with a delimiter
1706 tmp_end
= strchr(data
, '=');
1708 if (!(tmp_end
< end
&& tmp_end
[1] == delim
)) {
1709 /* No it is not. Set the password to NULL */
1710 kfree(vol
->password
);
1711 vol
->password
= NULL
;
1714 /* Yes it is. Drop down to Opt_pass below.*/
1716 /* Obtain the value string */
1717 value
= strchr(data
, '=');
1720 /* Set tmp_end to end of the string */
1721 tmp_end
= (char *) value
+ strlen(value
);
1723 /* Check if following character is the deliminator
1724 * If yes, we have encountered a double deliminator
1725 * reset the NULL character to the deliminator
1727 if (tmp_end
< end
&& tmp_end
[1] == delim
) {
1730 /* Keep iterating until we get to a single
1731 * deliminator OR the end
1733 while ((tmp_end
= strchr(tmp_end
, delim
))
1734 != NULL
&& (tmp_end
[1] == delim
)) {
1735 tmp_end
= (char *) &tmp_end
[2];
1738 /* Reset var options to point to next element */
1741 options
= (char *) &tmp_end
[1];
1743 /* Reached the end of the mount option
1748 kfree(vol
->password
);
1749 /* Now build new password string */
1750 temp_len
= strlen(value
);
1751 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1752 if (vol
->password
== NULL
) {
1753 pr_warn("CIFS: no memory for password\n");
1754 goto cifs_parse_mount_err
;
1757 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1758 vol
->password
[j
] = value
[i
];
1759 if ((value
[i
] == delim
) &&
1760 value
[i
+1] == delim
)
1761 /* skip the second deliminator */
1764 vol
->password
[j
] = '\0';
1767 /* FIXME: should this be an error instead? */
1771 string
= match_strdup(args
);
1775 if (!cifs_convert_address(dstaddr
, string
,
1777 pr_err("CIFS: bad ip= option (%s).\n", string
);
1778 goto cifs_parse_mount_err
;
1783 string
= match_strdup(args
);
1787 if (strnlen(string
, CIFS_MAX_DOMAINNAME_LEN
)
1788 == CIFS_MAX_DOMAINNAME_LEN
) {
1789 pr_warn("CIFS: domain name too long\n");
1790 goto cifs_parse_mount_err
;
1793 kfree(vol
->domainname
);
1794 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1795 if (!vol
->domainname
) {
1796 pr_warn("CIFS: no memory for domainname\n");
1797 goto cifs_parse_mount_err
;
1799 cifs_dbg(FYI
, "Domain name set\n");
1802 string
= match_strdup(args
);
1806 if (!cifs_convert_address(
1807 (struct sockaddr
*)&vol
->srcaddr
,
1808 string
, strlen(string
))) {
1809 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1811 goto cifs_parse_mount_err
;
1815 string
= match_strdup(args
);
1819 if (strnlen(string
, 1024) >= 65) {
1820 pr_warn("CIFS: iocharset name too long.\n");
1821 goto cifs_parse_mount_err
;
1824 if (strncasecmp(string
, "default", 7) != 0) {
1825 kfree(vol
->iocharset
);
1826 vol
->iocharset
= kstrdup(string
,
1828 if (!vol
->iocharset
) {
1829 pr_warn("CIFS: no memory for charset\n");
1830 goto cifs_parse_mount_err
;
1833 /* if iocharset not set then load_nls_default
1836 cifs_dbg(FYI
, "iocharset set to %s\n", string
);
1838 case Opt_netbiosname
:
1839 string
= match_strdup(args
);
1843 memset(vol
->source_rfc1001_name
, 0x20,
1846 * FIXME: are there cases in which a comma can
1847 * be valid in workstation netbios name (and
1848 * need special handling)?
1850 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1851 /* don't ucase netbiosname for user */
1854 vol
->source_rfc1001_name
[i
] = string
[i
];
1856 /* The string has 16th byte zero still from
1857 * set at top of the function
1859 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1860 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1863 /* servernetbiosname specified override *SMBSERVER */
1864 string
= match_strdup(args
);
1868 /* last byte, type, is 0x20 for servr type */
1869 memset(vol
->target_rfc1001_name
, 0x20,
1870 RFC1001_NAME_LEN_WITH_NULL
);
1872 /* BB are there cases in which a comma can be
1873 valid in this workstation netbios name
1874 (and need special handling)? */
1876 /* user or mount helper must uppercase the
1878 for (i
= 0; i
< 15; i
++) {
1881 vol
->target_rfc1001_name
[i
] = string
[i
];
1883 /* The string has 16th byte zero still from
1884 set at top of the function */
1885 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1886 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1889 /* version of mount userspace tools, not dialect */
1890 string
= match_strdup(args
);
1894 /* If interface changes in mount.cifs bump to new ver */
1895 if (strncasecmp(string
, "1", 1) == 0) {
1896 if (strlen(string
) > 1) {
1897 pr_warn("Bad mount helper ver=%s. Did "
1898 "you want SMB1 (CIFS) dialect "
1899 "and mean to type vers=1.0 "
1900 "instead?\n", string
);
1901 goto cifs_parse_mount_err
;
1903 /* This is the default */
1906 /* For all other value, error */
1907 pr_warn("CIFS: Invalid mount helper version specified\n");
1908 goto cifs_parse_mount_err
;
1910 /* protocol version (dialect) */
1911 string
= match_strdup(args
);
1915 if (cifs_parse_smb_version(string
, vol
) != 0)
1916 goto cifs_parse_mount_err
;
1920 string
= match_strdup(args
);
1924 if (cifs_parse_security_flavors(string
, vol
) != 0)
1925 goto cifs_parse_mount_err
;
1928 string
= match_strdup(args
);
1932 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1933 goto cifs_parse_mount_err
;
1937 * An option we don't recognize. Save it off for later
1938 * if we haven't already found one
1944 /* Free up any allocated string */
1949 if (!sloppy
&& invalid
) {
1950 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid
);
1951 goto cifs_parse_mount_err
;
1955 /* Muliuser mounts require CONFIG_KEYS support */
1956 if (vol
->multiuser
) {
1957 cifs_dbg(VFS
, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1958 goto cifs_parse_mount_err
;
1962 cifs_dbg(VFS
, "CIFS mount error: No usable UNC path provided in device string!\n");
1963 goto cifs_parse_mount_err
;
1966 /* make sure UNC has a share name */
1967 if (!strchr(vol
->UNC
+ 3, '\\')) {
1968 cifs_dbg(VFS
, "Malformed UNC. Unable to find share name.\n");
1969 goto cifs_parse_mount_err
;
1976 /* No ip= option specified? Try to get it from UNC */
1977 /* Use the address part of the UNC. */
1978 slash
= strchr(&vol
->UNC
[2], '\\');
1979 len
= slash
- &vol
->UNC
[2];
1980 if (!cifs_convert_address(dstaddr
, &vol
->UNC
[2], len
)) {
1981 pr_err("Unable to determine destination address.\n");
1982 goto cifs_parse_mount_err
;
1986 /* set the port that we got earlier */
1987 cifs_set_port(dstaddr
, port
);
1990 vol
->override_uid
= override_uid
;
1991 else if (override_uid
== 1)
1992 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
1995 vol
->override_gid
= override_gid
;
1996 else if (override_gid
== 1)
1997 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
1999 if (got_version
== false)
2000 pr_warn("No dialect specified on mount. Default has changed to "
2001 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2002 "(SMB1). To use the less secure SMB1 dialect to access "
2003 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2006 kfree(mountdata_copy
);
2010 pr_warn("Could not allocate temporary buffer\n");
2011 cifs_parse_mount_err
:
2013 kfree(mountdata_copy
);
2017 /** Returns true if srcaddr isn't specified and rhs isn't
2018 * specified, or if srcaddr is specified and
2019 * matches the IP address of the rhs argument.
2022 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
2024 switch (srcaddr
->sa_family
) {
2026 return (rhs
->sa_family
== AF_UNSPEC
);
2028 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
2029 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
2030 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
2033 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
2034 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
2035 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
2039 return false; /* don't expect to be here */
2044 * If no port is specified in addr structure, we try to match with 445 port
2045 * and if it fails - with 139 ports. It should be called only if address
2046 * families of server and addr are equal.
2049 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
2051 __be16 port
, *sport
;
2053 switch (addr
->sa_family
) {
2055 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
2056 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
2059 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
2060 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
2068 port
= htons(CIFS_PORT
);
2072 port
= htons(RFC1001_PORT
);
2075 return port
== *sport
;
2079 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2080 struct sockaddr
*srcaddr
)
2082 switch (addr
->sa_family
) {
2084 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
2085 struct sockaddr_in
*srv_addr4
=
2086 (struct sockaddr_in
*)&server
->dstaddr
;
2088 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
2093 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
2094 struct sockaddr_in6
*srv_addr6
=
2095 (struct sockaddr_in6
*)&server
->dstaddr
;
2097 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
2098 &srv_addr6
->sin6_addr
))
2100 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
2106 return false; /* don't expect to be here */
2109 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2116 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2119 * The select_sectype function should either return the vol->sectype
2120 * that was specified, or "Unspecified" if that sectype was not
2121 * compatible with the given NEGOTIATE request.
2123 if (server
->ops
->select_sectype(server
, vol
->sectype
)
2128 * Now check if signing mode is acceptable. No need to check
2129 * global_secflags at this point since if MUST_SIGN is set then
2130 * the server->sign had better be too.
2132 if (vol
->sign
&& !server
->sign
)
2138 static int match_server(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2140 struct sockaddr
*addr
= (struct sockaddr
*)&vol
->dstaddr
;
2142 if (vol
->nosharesock
)
2145 /* BB update this for smb3any and default case */
2146 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2149 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2152 if (!match_address(server
, addr
,
2153 (struct sockaddr
*)&vol
->srcaddr
))
2156 if (!match_port(server
, addr
))
2159 if (!match_security(server
, vol
))
2162 if (server
->echo_interval
!= vol
->echo_interval
* HZ
)
2168 static struct TCP_Server_Info
*
2169 cifs_find_tcp_session(struct smb_vol
*vol
)
2171 struct TCP_Server_Info
*server
;
2173 spin_lock(&cifs_tcp_ses_lock
);
2174 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2175 if (!match_server(server
, vol
))
2178 ++server
->srv_count
;
2179 spin_unlock(&cifs_tcp_ses_lock
);
2180 cifs_dbg(FYI
, "Existing tcp session with server found\n");
2183 spin_unlock(&cifs_tcp_ses_lock
);
2188 cifs_put_tcp_session(struct TCP_Server_Info
*server
, int from_reconnect
)
2190 struct task_struct
*task
;
2192 spin_lock(&cifs_tcp_ses_lock
);
2193 if (--server
->srv_count
> 0) {
2194 spin_unlock(&cifs_tcp_ses_lock
);
2198 put_net(cifs_net_ns(server
));
2200 list_del_init(&server
->tcp_ses_list
);
2201 spin_unlock(&cifs_tcp_ses_lock
);
2203 cancel_delayed_work_sync(&server
->echo
);
2207 * Avoid deadlock here: reconnect work calls
2208 * cifs_put_tcp_session() at its end. Need to be sure
2209 * that reconnect work does nothing with server pointer after
2212 cancel_delayed_work(&server
->reconnect
);
2214 cancel_delayed_work_sync(&server
->reconnect
);
2216 spin_lock(&GlobalMid_Lock
);
2217 server
->tcpStatus
= CifsExiting
;
2218 spin_unlock(&GlobalMid_Lock
);
2220 cifs_crypto_secmech_release(server
);
2221 cifs_fscache_release_client_cookie(server
);
2223 kfree(server
->session_key
.response
);
2224 server
->session_key
.response
= NULL
;
2225 server
->session_key
.len
= 0;
2227 task
= xchg(&server
->tsk
, NULL
);
2229 force_sig(SIGKILL
, task
);
2232 static struct TCP_Server_Info
*
2233 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2235 struct TCP_Server_Info
*tcp_ses
= NULL
;
2238 cifs_dbg(FYI
, "UNC: %s\n", volume_info
->UNC
);
2240 /* see if we already have a matching tcp_ses */
2241 tcp_ses
= cifs_find_tcp_session(volume_info
);
2245 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2251 tcp_ses
->ops
= volume_info
->ops
;
2252 tcp_ses
->vals
= volume_info
->vals
;
2253 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2254 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2255 if (IS_ERR(tcp_ses
->hostname
)) {
2256 rc
= PTR_ERR(tcp_ses
->hostname
);
2257 goto out_err_crypto_release
;
2260 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2261 tcp_ses
->noautotune
= volume_info
->noautotune
;
2262 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2263 tcp_ses
->in_flight
= 0;
2264 tcp_ses
->credits
= 1;
2265 init_waitqueue_head(&tcp_ses
->response_q
);
2266 init_waitqueue_head(&tcp_ses
->request_q
);
2267 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2268 mutex_init(&tcp_ses
->srv_mutex
);
2269 memcpy(tcp_ses
->workstation_RFC1001_name
,
2270 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2271 memcpy(tcp_ses
->server_RFC1001_name
,
2272 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2273 tcp_ses
->session_estab
= false;
2274 tcp_ses
->sequence_number
= 0;
2275 tcp_ses
->lstrp
= jiffies
;
2276 spin_lock_init(&tcp_ses
->req_lock
);
2277 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2278 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2279 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2280 INIT_DELAYED_WORK(&tcp_ses
->reconnect
, smb2_reconnect_server
);
2281 mutex_init(&tcp_ses
->reconnect_mutex
);
2282 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2283 sizeof(tcp_ses
->srcaddr
));
2284 memcpy(&tcp_ses
->dstaddr
, &volume_info
->dstaddr
,
2285 sizeof(tcp_ses
->dstaddr
));
2286 generate_random_uuid(tcp_ses
->client_guid
);
2288 * at this point we are the only ones with the pointer
2289 * to the struct since the kernel thread not created yet
2290 * no need to spinlock this init of tcpStatus or srv_count
2292 tcp_ses
->tcpStatus
= CifsNew
;
2293 ++tcp_ses
->srv_count
;
2295 if (volume_info
->echo_interval
>= SMB_ECHO_INTERVAL_MIN
&&
2296 volume_info
->echo_interval
<= SMB_ECHO_INTERVAL_MAX
)
2297 tcp_ses
->echo_interval
= volume_info
->echo_interval
* HZ
;
2299 tcp_ses
->echo_interval
= SMB_ECHO_INTERVAL_DEFAULT
* HZ
;
2301 rc
= ip_connect(tcp_ses
);
2303 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
2304 goto out_err_crypto_release
;
2308 * since we're in a cifs function already, we know that
2309 * this will succeed. No need for try_module_get().
2311 __module_get(THIS_MODULE
);
2312 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2314 if (IS_ERR(tcp_ses
->tsk
)) {
2315 rc
= PTR_ERR(tcp_ses
->tsk
);
2316 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
2317 module_put(THIS_MODULE
);
2318 goto out_err_crypto_release
;
2320 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2322 /* thread spawned, put it on the list */
2323 spin_lock(&cifs_tcp_ses_lock
);
2324 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2325 spin_unlock(&cifs_tcp_ses_lock
);
2327 cifs_fscache_get_client_cookie(tcp_ses
);
2329 /* queue echo request delayed work */
2330 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, tcp_ses
->echo_interval
);
2334 out_err_crypto_release
:
2335 cifs_crypto_secmech_release(tcp_ses
);
2337 put_net(cifs_net_ns(tcp_ses
));
2341 if (!IS_ERR(tcp_ses
->hostname
))
2342 kfree(tcp_ses
->hostname
);
2343 if (tcp_ses
->ssocket
)
2344 sock_release(tcp_ses
->ssocket
);
2350 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2352 if (vol
->sectype
!= Unspecified
&&
2353 vol
->sectype
!= ses
->sectype
)
2356 switch (ses
->sectype
) {
2358 if (!uid_eq(vol
->cred_uid
, ses
->cred_uid
))
2362 /* NULL username means anonymous session */
2363 if (ses
->user_name
== NULL
) {
2369 /* anything else takes username/password */
2370 if (strncmp(ses
->user_name
,
2371 vol
->username
? vol
->username
: "",
2372 CIFS_MAX_USERNAME_LEN
))
2374 if ((vol
->username
&& strlen(vol
->username
) != 0) &&
2375 ses
->password
!= NULL
&&
2376 strncmp(ses
->password
,
2377 vol
->password
? vol
->password
: "",
2378 CIFS_MAX_PASSWORD_LEN
))
2384 static struct cifs_ses
*
2385 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2387 struct cifs_ses
*ses
;
2389 spin_lock(&cifs_tcp_ses_lock
);
2390 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2391 if (ses
->status
== CifsExiting
)
2393 if (!match_session(ses
, vol
))
2396 spin_unlock(&cifs_tcp_ses_lock
);
2399 spin_unlock(&cifs_tcp_ses_lock
);
2404 cifs_put_smb_ses(struct cifs_ses
*ses
)
2406 unsigned int rc
, xid
;
2407 struct TCP_Server_Info
*server
= ses
->server
;
2409 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2411 spin_lock(&cifs_tcp_ses_lock
);
2412 if (ses
->status
== CifsExiting
) {
2413 spin_unlock(&cifs_tcp_ses_lock
);
2416 if (--ses
->ses_count
> 0) {
2417 spin_unlock(&cifs_tcp_ses_lock
);
2420 if (ses
->status
== CifsGood
)
2421 ses
->status
= CifsExiting
;
2422 spin_unlock(&cifs_tcp_ses_lock
);
2424 if (ses
->status
== CifsExiting
&& server
->ops
->logoff
) {
2426 rc
= server
->ops
->logoff(xid
, ses
);
2428 cifs_dbg(VFS
, "%s: Session Logoff failure rc=%d\n",
2433 spin_lock(&cifs_tcp_ses_lock
);
2434 list_del_init(&ses
->smb_ses_list
);
2435 spin_unlock(&cifs_tcp_ses_lock
);
2438 cifs_put_tcp_session(server
, 0);
2443 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2444 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2446 /* Populate username and pw fields from keyring if possible */
2448 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2451 const char *delim
, *payload
;
2455 struct TCP_Server_Info
*server
= ses
->server
;
2456 struct sockaddr_in
*sa
;
2457 struct sockaddr_in6
*sa6
;
2458 const struct user_key_payload
*upayload
;
2460 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2464 /* try to find an address key first */
2465 switch (server
->dstaddr
.ss_family
) {
2467 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2468 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2471 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2472 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2475 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
2476 server
->dstaddr
.ss_family
);
2481 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2482 key
= request_key(&key_type_logon
, desc
, "");
2484 if (!ses
->domainName
) {
2485 cifs_dbg(FYI
, "domainName is NULL\n");
2490 /* didn't work, try to find a domain key */
2491 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2492 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2493 key
= request_key(&key_type_logon
, desc
, "");
2500 down_read(&key
->sem
);
2501 upayload
= user_key_payload_locked(key
);
2502 if (IS_ERR_OR_NULL(upayload
)) {
2503 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2507 /* find first : in payload */
2508 payload
= upayload
->data
;
2509 delim
= strnchr(payload
, upayload
->datalen
, ':');
2510 cifs_dbg(FYI
, "payload=%s\n", payload
);
2512 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
2518 len
= delim
- payload
;
2519 if (len
> CIFS_MAX_USERNAME_LEN
|| len
<= 0) {
2520 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
2526 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2527 if (!vol
->username
) {
2528 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
2533 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, vol
->username
);
2535 len
= key
->datalen
- (len
+ 1);
2536 if (len
> CIFS_MAX_PASSWORD_LEN
|| len
<= 0) {
2537 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
2539 kfree(vol
->username
);
2540 vol
->username
= NULL
;
2545 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2546 if (!vol
->password
) {
2547 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
2550 kfree(vol
->username
);
2551 vol
->username
= NULL
;
2560 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
2563 #else /* ! CONFIG_KEYS */
2565 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2566 struct cifs_ses
*ses
__attribute__((unused
)))
2570 #endif /* CONFIG_KEYS */
2572 static struct cifs_ses
*
2573 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2577 struct cifs_ses
*ses
;
2578 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2579 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2583 ses
= cifs_find_smb_ses(server
, volume_info
);
2585 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
2588 mutex_lock(&ses
->session_mutex
);
2589 rc
= cifs_negotiate_protocol(xid
, ses
);
2591 mutex_unlock(&ses
->session_mutex
);
2592 /* problem -- put our ses reference */
2593 cifs_put_smb_ses(ses
);
2597 if (ses
->need_reconnect
) {
2598 cifs_dbg(FYI
, "Session needs reconnect\n");
2599 rc
= cifs_setup_session(xid
, ses
,
2600 volume_info
->local_nls
);
2602 mutex_unlock(&ses
->session_mutex
);
2603 /* problem -- put our reference */
2604 cifs_put_smb_ses(ses
);
2609 mutex_unlock(&ses
->session_mutex
);
2611 /* existing SMB ses has a server reference already */
2612 cifs_put_tcp_session(server
, 0);
2617 cifs_dbg(FYI
, "Existing smb sess not found\n");
2618 ses
= sesInfoAlloc();
2622 /* new SMB session uses our server ref */
2623 ses
->server
= server
;
2624 if (server
->dstaddr
.ss_family
== AF_INET6
)
2625 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2627 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2629 if (volume_info
->username
) {
2630 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2631 if (!ses
->user_name
)
2635 /* volume_info->password freed at unmount */
2636 if (volume_info
->password
) {
2637 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2641 if (volume_info
->domainname
) {
2642 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2643 if (!ses
->domainName
)
2646 if (volume_info
->domainauto
)
2647 ses
->domainAuto
= volume_info
->domainauto
;
2648 ses
->cred_uid
= volume_info
->cred_uid
;
2649 ses
->linux_uid
= volume_info
->linux_uid
;
2651 ses
->sectype
= volume_info
->sectype
;
2652 ses
->sign
= volume_info
->sign
;
2654 mutex_lock(&ses
->session_mutex
);
2655 rc
= cifs_negotiate_protocol(xid
, ses
);
2657 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2658 mutex_unlock(&ses
->session_mutex
);
2662 /* success, put it on the list */
2663 spin_lock(&cifs_tcp_ses_lock
);
2664 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2665 spin_unlock(&cifs_tcp_ses_lock
);
2676 static int match_tcon(struct cifs_tcon
*tcon
, struct smb_vol
*volume_info
)
2678 if (tcon
->tidStatus
== CifsExiting
)
2680 if (strncmp(tcon
->treeName
, volume_info
->UNC
, MAX_TREE_SIZE
))
2682 if (tcon
->seal
!= volume_info
->seal
)
2684 if (tcon
->snapshot_time
!= volume_info
->snapshot_time
)
2689 static struct cifs_tcon
*
2690 cifs_find_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2692 struct list_head
*tmp
;
2693 struct cifs_tcon
*tcon
;
2695 spin_lock(&cifs_tcp_ses_lock
);
2696 list_for_each(tmp
, &ses
->tcon_list
) {
2697 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2698 if (!match_tcon(tcon
, volume_info
))
2701 spin_unlock(&cifs_tcp_ses_lock
);
2704 spin_unlock(&cifs_tcp_ses_lock
);
2709 cifs_put_tcon(struct cifs_tcon
*tcon
)
2712 struct cifs_ses
*ses
= tcon
->ses
;
2714 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2715 spin_lock(&cifs_tcp_ses_lock
);
2716 if (--tcon
->tc_count
> 0) {
2717 spin_unlock(&cifs_tcp_ses_lock
);
2721 list_del_init(&tcon
->tcon_list
);
2722 spin_unlock(&cifs_tcp_ses_lock
);
2725 if (ses
->server
->ops
->tree_disconnect
)
2726 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
2729 cifs_fscache_release_super_cookie(tcon
);
2731 cifs_put_smb_ses(ses
);
2734 static struct cifs_tcon
*
2735 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2738 struct cifs_tcon
*tcon
;
2740 tcon
= cifs_find_tcon(ses
, volume_info
);
2742 cifs_dbg(FYI
, "Found match on UNC path\n");
2743 /* existing tcon already has a reference */
2744 cifs_put_smb_ses(ses
);
2748 if (!ses
->server
->ops
->tree_connect
) {
2753 tcon
= tconInfoAlloc();
2759 if (volume_info
->snapshot_time
) {
2760 if (ses
->server
->vals
->protocol_id
== 0) {
2762 "Use SMB2 or later for snapshot mount option\n");
2766 tcon
->snapshot_time
= volume_info
->snapshot_time
;
2770 if (volume_info
->password
) {
2771 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2772 if (!tcon
->password
) {
2779 * BB Do we need to wrap session_mutex around this TCon call and Unix
2780 * SetFS as we do on SessSetup and reconnect?
2783 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, volume_info
->UNC
, tcon
,
2784 volume_info
->local_nls
);
2786 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
2790 if (volume_info
->nodfs
) {
2791 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2792 cifs_dbg(FYI
, "DFS disabled (%d)\n", tcon
->Flags
);
2794 tcon
->use_persistent
= false;
2795 /* check if SMB2 or later, CIFS does not support persistent handles */
2796 if (volume_info
->persistent
) {
2797 if (ses
->server
->vals
->protocol_id
== 0) {
2799 "SMB3 or later required for persistent handles\n");
2802 } else if (ses
->server
->capabilities
&
2803 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2804 tcon
->use_persistent
= true;
2805 else /* persistent handles requested but not supported */ {
2807 "Persistent handles not supported on share\n");
2811 } else if ((tcon
->capabilities
& SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY
)
2812 && (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2813 && (volume_info
->nopersistent
== false)) {
2814 cifs_dbg(FYI
, "enabling persistent handles\n");
2815 tcon
->use_persistent
= true;
2816 } else if (volume_info
->resilient
) {
2817 if (ses
->server
->vals
->protocol_id
== 0) {
2819 "SMB2.1 or later required for resilient handles\n");
2823 tcon
->use_resilient
= true;
2826 if (volume_info
->seal
) {
2827 if (ses
->server
->vals
->protocol_id
== 0) {
2829 "SMB3 or later required for encryption\n");
2832 } else if (tcon
->ses
->server
->capabilities
&
2833 SMB2_GLOBAL_CAP_ENCRYPTION
)
2836 cifs_dbg(VFS
, "Encryption is not supported on share\n");
2843 * We can have only one retry value for a connection to a share so for
2844 * resources mounted more than once to the same server share the last
2845 * value passed in for the retry flag is used.
2847 tcon
->retry
= volume_info
->retry
;
2848 tcon
->nocase
= volume_info
->nocase
;
2849 tcon
->local_lease
= volume_info
->local_lease
;
2850 INIT_LIST_HEAD(&tcon
->pending_opens
);
2852 spin_lock(&cifs_tcp_ses_lock
);
2853 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2854 spin_unlock(&cifs_tcp_ses_lock
);
2856 cifs_fscache_get_super_cookie(tcon
);
2866 cifs_put_tlink(struct tcon_link
*tlink
)
2868 if (!tlink
|| IS_ERR(tlink
))
2871 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2872 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2873 tlink
->tl_time
= jiffies
;
2877 if (!IS_ERR(tlink_tcon(tlink
)))
2878 cifs_put_tcon(tlink_tcon(tlink
));
2883 static inline struct tcon_link
*
2884 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2886 return cifs_sb
->master_tlink
;
2890 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2892 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2893 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2895 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2898 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2899 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2903 * We want to share sb only if we don't specify an r/wsize or
2904 * specified r/wsize is greater than or equal to existing one.
2906 if (new->wsize
&& new->wsize
< old
->wsize
)
2909 if (new->rsize
&& new->rsize
< old
->rsize
)
2912 if (!uid_eq(old
->mnt_uid
, new->mnt_uid
) || !gid_eq(old
->mnt_gid
, new->mnt_gid
))
2915 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2916 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2919 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2922 if (old
->actimeo
!= new->actimeo
)
2929 match_prepath(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2931 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2932 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2933 bool old_set
= old
->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
;
2934 bool new_set
= new->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
;
2936 if (old_set
&& new_set
&& !strcmp(new->prepath
, old
->prepath
))
2938 else if (!old_set
&& !new_set
)
2945 cifs_match_super(struct super_block
*sb
, void *data
)
2947 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2948 struct smb_vol
*volume_info
;
2949 struct cifs_sb_info
*cifs_sb
;
2950 struct TCP_Server_Info
*tcp_srv
;
2951 struct cifs_ses
*ses
;
2952 struct cifs_tcon
*tcon
;
2953 struct tcon_link
*tlink
;
2956 spin_lock(&cifs_tcp_ses_lock
);
2957 cifs_sb
= CIFS_SB(sb
);
2958 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2959 if (IS_ERR(tlink
)) {
2960 spin_unlock(&cifs_tcp_ses_lock
);
2963 tcon
= tlink_tcon(tlink
);
2965 tcp_srv
= ses
->server
;
2967 volume_info
= mnt_data
->vol
;
2969 if (!match_server(tcp_srv
, volume_info
) ||
2970 !match_session(ses
, volume_info
) ||
2971 !match_tcon(tcon
, volume_info
) ||
2972 !match_prepath(sb
, mnt_data
)) {
2977 rc
= compare_mount_options(sb
, mnt_data
);
2979 spin_unlock(&cifs_tcp_ses_lock
);
2980 cifs_put_tlink(tlink
);
2985 get_dfs_path(const unsigned int xid
, struct cifs_ses
*ses
, const char *old_path
,
2986 const struct nls_table
*nls_codepage
, unsigned int *num_referrals
,
2987 struct dfs_info3_param
**referrals
, int remap
)
2992 if (!ses
->server
->ops
->tree_connect
|| !ses
->server
->ops
->get_dfs_refer
)
2998 if (ses
->ipc_tid
== 0) {
2999 temp_unc
= kmalloc(2 /* for slashes */ +
3000 strnlen(ses
->serverName
, SERVER_NAME_LEN_WITH_NULL
* 2)
3001 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL
);
3002 if (temp_unc
== NULL
)
3006 strcpy(temp_unc
+ 2, ses
->serverName
);
3007 strcpy(temp_unc
+ 2 + strlen(ses
->serverName
), "\\IPC$");
3008 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, temp_unc
, NULL
,
3010 cifs_dbg(FYI
, "Tcon rc = %d ipc_tid = %d\n", rc
, ses
->ipc_tid
);
3014 rc
= ses
->server
->ops
->get_dfs_refer(xid
, ses
, old_path
,
3015 referrals
, num_referrals
,
3016 nls_codepage
, remap
);
3018 * BB - map targetUNCs to dfs_info3 structures, here or in
3019 * ses->server->ops->get_dfs_refer.
3025 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3026 static struct lock_class_key cifs_key
[2];
3027 static struct lock_class_key cifs_slock_key
[2];
3030 cifs_reclassify_socket4(struct socket
*sock
)
3032 struct sock
*sk
= sock
->sk
;
3033 BUG_ON(!sock_allow_reclassification(sk
));
3034 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
3035 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
3039 cifs_reclassify_socket6(struct socket
*sock
)
3041 struct sock
*sk
= sock
->sk
;
3042 BUG_ON(!sock_allow_reclassification(sk
));
3043 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
3044 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
3048 cifs_reclassify_socket4(struct socket
*sock
)
3053 cifs_reclassify_socket6(struct socket
*sock
)
3058 /* See RFC1001 section 14 on representation of Netbios names */
3059 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
3063 for (i
= 0, j
= 0; i
< (length
); i
++) {
3064 /* mask a nibble at a time and encode */
3065 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
3066 target
[j
+1] = 'A' + (0x0F & source
[i
]);
3073 bind_socket(struct TCP_Server_Info
*server
)
3076 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
3077 /* Bind to the specified local IP address */
3078 struct socket
*socket
= server
->ssocket
;
3079 rc
= socket
->ops
->bind(socket
,
3080 (struct sockaddr
*) &server
->srcaddr
,
3081 sizeof(server
->srcaddr
));
3083 struct sockaddr_in
*saddr4
;
3084 struct sockaddr_in6
*saddr6
;
3085 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
3086 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
3087 if (saddr6
->sin6_family
== AF_INET6
)
3088 cifs_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
3089 &saddr6
->sin6_addr
, rc
);
3091 cifs_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
3092 &saddr4
->sin_addr
.s_addr
, rc
);
3099 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
3103 * some servers require RFC1001 sessinit before sending
3104 * negprot - BB check reconnection in case where second
3105 * sessinit is sent but no second negprot
3107 struct rfc1002_session_packet
*ses_init_buf
;
3108 struct smb_hdr
*smb_buf
;
3109 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
3112 ses_init_buf
->trailer
.session_req
.called_len
= 32;
3114 if (server
->server_RFC1001_name
[0] != 0)
3115 rfc1002mangle(ses_init_buf
->trailer
.
3116 session_req
.called_name
,
3117 server
->server_RFC1001_name
,
3118 RFC1001_NAME_LEN_WITH_NULL
);
3120 rfc1002mangle(ses_init_buf
->trailer
.
3121 session_req
.called_name
,
3122 DEFAULT_CIFS_CALLED_NAME
,
3123 RFC1001_NAME_LEN_WITH_NULL
);
3125 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
3128 * calling name ends in null (byte 16) from old smb
3131 if (server
->workstation_RFC1001_name
[0] != 0)
3132 rfc1002mangle(ses_init_buf
->trailer
.
3133 session_req
.calling_name
,
3134 server
->workstation_RFC1001_name
,
3135 RFC1001_NAME_LEN_WITH_NULL
);
3137 rfc1002mangle(ses_init_buf
->trailer
.
3138 session_req
.calling_name
,
3140 RFC1001_NAME_LEN_WITH_NULL
);
3142 ses_init_buf
->trailer
.session_req
.scope1
= 0;
3143 ses_init_buf
->trailer
.session_req
.scope2
= 0;
3144 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
3146 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3147 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
3148 rc
= smb_send(server
, smb_buf
, 0x44);
3149 kfree(ses_init_buf
);
3151 * RFC1001 layer in at least one server
3152 * requires very short break before negprot
3153 * presumably because not expecting negprot
3154 * to follow so fast. This is a simple
3155 * solution that works without
3156 * complicating the code and causes no
3157 * significant slowing down on mount
3160 usleep_range(1000, 2000);
3163 * else the negprot may still work without this
3164 * even though malloc failed
3171 generic_ip_connect(struct TCP_Server_Info
*server
)
3176 struct socket
*socket
= server
->ssocket
;
3177 struct sockaddr
*saddr
;
3179 saddr
= (struct sockaddr
*) &server
->dstaddr
;
3181 if (server
->dstaddr
.ss_family
== AF_INET6
) {
3182 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
3183 slen
= sizeof(struct sockaddr_in6
);
3186 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
3187 slen
= sizeof(struct sockaddr_in
);
3191 if (socket
== NULL
) {
3192 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
3193 IPPROTO_TCP
, &socket
, 1);
3195 cifs_dbg(VFS
, "Error %d creating socket\n", rc
);
3196 server
->ssocket
= NULL
;
3200 /* BB other socket options to set KEEPALIVE, NODELAY? */
3201 cifs_dbg(FYI
, "Socket created\n");
3202 server
->ssocket
= socket
;
3203 socket
->sk
->sk_allocation
= GFP_NOFS
;
3204 if (sfamily
== AF_INET6
)
3205 cifs_reclassify_socket6(socket
);
3207 cifs_reclassify_socket4(socket
);
3210 rc
= bind_socket(server
);
3215 * Eventually check for other socket options to change from
3216 * the default. sock_setsockopt not used because it expects
3219 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3220 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3222 /* make the bufsizes depend on wsize/rsize and max requests */
3223 if (server
->noautotune
) {
3224 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3225 socket
->sk
->sk_sndbuf
= 200 * 1024;
3226 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3227 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3230 if (server
->tcp_nodelay
) {
3232 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
3233 (char *)&val
, sizeof(val
));
3235 cifs_dbg(FYI
, "set TCP_NODELAY socket option error %d\n",
3239 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3240 socket
->sk
->sk_sndbuf
,
3241 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3243 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3245 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
3246 sock_release(socket
);
3247 server
->ssocket
= NULL
;
3251 if (sport
== htons(RFC1001_PORT
))
3252 rc
= ip_rfc1001_connect(server
);
3258 ip_connect(struct TCP_Server_Info
*server
)
3261 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3262 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3264 if (server
->dstaddr
.ss_family
== AF_INET6
)
3265 sport
= &addr6
->sin6_port
;
3267 sport
= &addr
->sin_port
;
3272 /* try with 445 port at first */
3273 *sport
= htons(CIFS_PORT
);
3275 rc
= generic_ip_connect(server
);
3279 /* if it failed, try with 139 port */
3280 *sport
= htons(RFC1001_PORT
);
3283 return generic_ip_connect(server
);
3286 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
3287 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3289 /* if we are reconnecting then should we check to see if
3290 * any requested capabilities changed locally e.g. via
3291 * remount but we can not do much about it here
3292 * if they have (even if we could detect it by the following)
3293 * Perhaps we could add a backpointer to array of sb from tcon
3294 * or if we change to make all sb to same share the same
3295 * sb as NFS - then we only have one backpointer to sb.
3296 * What if we wanted to mount the server share twice once with
3297 * and once without posixacls or posix paths? */
3298 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3300 if (vol_info
&& vol_info
->no_linux_ext
) {
3301 tcon
->fsUnixInfo
.Capability
= 0;
3302 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3303 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
3305 } else if (vol_info
)
3306 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3308 if (tcon
->unix_ext
== 0) {
3309 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
3313 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3314 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3315 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
3316 /* check for reconnect case in which we do not
3317 want to change the mount behavior if we can avoid it */
3318 if (vol_info
== NULL
) {
3319 /* turn off POSIX ACL and PATHNAMES if not set
3320 originally at mount time */
3321 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3322 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3323 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3324 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3325 cifs_dbg(VFS
, "POSIXPATH support change\n");
3326 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3327 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3328 cifs_dbg(VFS
, "possible reconnect error\n");
3329 cifs_dbg(VFS
, "server disabled POSIX path support\n");
3333 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3334 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
3336 cap
&= CIFS_UNIX_CAP_MASK
;
3337 if (vol_info
&& vol_info
->no_psx_acl
)
3338 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3339 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3340 cifs_dbg(FYI
, "negotiated posix acl support\n");
3342 cifs_sb
->mnt_cifs_flags
|=
3343 CIFS_MOUNT_POSIXACL
;
3346 if (vol_info
&& vol_info
->posix_paths
== 0)
3347 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3348 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3349 cifs_dbg(FYI
, "negotiate posix pathnames\n");
3351 cifs_sb
->mnt_cifs_flags
|=
3352 CIFS_MOUNT_POSIX_PATHS
;
3355 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
3356 #ifdef CONFIG_CIFS_DEBUG2
3357 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3358 cifs_dbg(FYI
, "FCNTL cap\n");
3359 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3360 cifs_dbg(FYI
, "EXTATTR cap\n");
3361 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3362 cifs_dbg(FYI
, "POSIX path cap\n");
3363 if (cap
& CIFS_UNIX_XATTR_CAP
)
3364 cifs_dbg(FYI
, "XATTR cap\n");
3365 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3366 cifs_dbg(FYI
, "POSIX ACL cap\n");
3367 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3368 cifs_dbg(FYI
, "very large read cap\n");
3369 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3370 cifs_dbg(FYI
, "very large write cap\n");
3371 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3372 cifs_dbg(FYI
, "transport encryption cap\n");
3373 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3374 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
3375 #endif /* CIFS_DEBUG2 */
3376 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3377 if (vol_info
== NULL
) {
3378 cifs_dbg(FYI
, "resetting capabilities failed\n");
3380 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");
3386 int cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3387 struct cifs_sb_info
*cifs_sb
)
3389 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3391 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3392 cifs_sb
->tlink_tree
= RB_ROOT
;
3395 * Temporarily set r/wsize for matching superblock. If we end up using
3396 * new sb then client will later negotiate it downward if needed.
3398 cifs_sb
->rsize
= pvolume_info
->rsize
;
3399 cifs_sb
->wsize
= pvolume_info
->wsize
;
3401 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3402 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3403 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3404 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3405 cifs_dbg(FYI
, "file mode: 0x%hx dir mode: 0x%hx\n",
3406 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3408 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3409 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3411 if (pvolume_info
->noperm
)
3412 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3413 if (pvolume_info
->setuids
)
3414 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3415 if (pvolume_info
->setuidfromacl
)
3416 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UID_FROM_ACL
;
3417 if (pvolume_info
->server_ino
)
3418 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3419 if (pvolume_info
->remap
)
3420 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SFM_CHR
;
3421 if (pvolume_info
->sfu_remap
)
3422 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3423 if (pvolume_info
->no_xattr
)
3424 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3425 if (pvolume_info
->sfu_emul
)
3426 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3427 if (pvolume_info
->nobrl
)
3428 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3429 if (pvolume_info
->nostrictsync
)
3430 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3431 if (pvolume_info
->mand_lock
)
3432 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3433 if (pvolume_info
->rwpidforward
)
3434 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3435 if (pvolume_info
->cifs_acl
)
3436 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3437 if (pvolume_info
->backupuid_specified
) {
3438 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3439 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3441 if (pvolume_info
->backupgid_specified
) {
3442 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3443 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3445 if (pvolume_info
->override_uid
)
3446 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3447 if (pvolume_info
->override_gid
)
3448 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3449 if (pvolume_info
->dynperm
)
3450 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3451 if (pvolume_info
->fsc
)
3452 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3453 if (pvolume_info
->multiuser
)
3454 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3455 CIFS_MOUNT_NO_PERM
);
3456 if (pvolume_info
->strict_io
)
3457 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3458 if (pvolume_info
->direct_io
) {
3459 cifs_dbg(FYI
, "mounting share using direct i/o\n");
3460 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3462 if (pvolume_info
->mfsymlinks
) {
3463 if (pvolume_info
->sfu_emul
) {
3465 * Our SFU ("Services for Unix" emulation does not allow
3466 * creating symlinks but does allow reading existing SFU
3467 * symlinks (it does allow both creating and reading SFU
3468 * style mknod and FIFOs though). When "mfsymlinks" and
3469 * "sfu" are both enabled at the same time, it allows
3470 * reading both types of symlinks, but will only create
3471 * them with mfsymlinks format. This allows better
3472 * Apple compatibility (probably better for Samba too)
3473 * while still recognizing old Windows style symlinks.
3475 cifs_dbg(VFS
, "mount options mfsymlinks and sfu both enabled\n");
3477 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3480 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3481 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
3483 if (pvolume_info
->prepath
) {
3484 cifs_sb
->prepath
= kstrdup(pvolume_info
->prepath
, GFP_KERNEL
);
3485 if (cifs_sb
->prepath
== NULL
)
3493 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3495 kfree(volume_info
->username
);
3496 kzfree(volume_info
->password
);
3497 kfree(volume_info
->UNC
);
3498 kfree(volume_info
->domainname
);
3499 kfree(volume_info
->iocharset
);
3500 kfree(volume_info
->prepath
);
3504 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3508 cleanup_volume_info_contents(volume_info
);
3513 #ifdef CONFIG_CIFS_DFS_UPCALL
3515 * cifs_build_path_to_root returns full path to root when we do not have an
3516 * exiting connection (tcon)
3519 build_unc_path_to_root(const struct smb_vol
*vol
,
3520 const struct cifs_sb_info
*cifs_sb
)
3522 char *full_path
, *pos
;
3523 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) + 1 : 0;
3524 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3526 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3527 if (full_path
== NULL
)
3528 return ERR_PTR(-ENOMEM
);
3530 strncpy(full_path
, vol
->UNC
, unc_len
);
3531 pos
= full_path
+ unc_len
;
3534 *pos
= CIFS_DIR_SEP(cifs_sb
);
3535 strncpy(pos
+ 1, vol
->prepath
, pplen
);
3539 *pos
= '\0'; /* add trailing null */
3540 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3541 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
3546 * Perform a dfs referral query for a share and (optionally) prefix
3548 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3549 * to a string containing updated options for the submount. Otherwise it
3550 * will be left untouched.
3552 * Returns the rc from get_dfs_path to the caller, which can be used to
3553 * determine whether there were referrals.
3556 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
3557 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3561 unsigned int num_referrals
= 0;
3562 struct dfs_info3_param
*referrals
= NULL
;
3563 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3565 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3566 if (IS_ERR(full_path
))
3567 return PTR_ERR(full_path
);
3569 /* For DFS paths, skip the first '\' of the UNC */
3570 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3572 rc
= get_dfs_path(xid
, ses
, ref_path
, cifs_sb
->local_nls
,
3573 &num_referrals
, &referrals
, cifs_remap(cifs_sb
));
3575 if (!rc
&& num_referrals
> 0) {
3576 char *fake_devname
= NULL
;
3578 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3579 full_path
+ 1, referrals
,
3582 free_dfs_info_array(referrals
, num_referrals
);
3584 if (IS_ERR(mdata
)) {
3585 rc
= PTR_ERR(mdata
);
3588 cleanup_volume_info_contents(volume_info
);
3589 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3592 kfree(fake_devname
);
3593 kfree(cifs_sb
->mountdata
);
3594 cifs_sb
->mountdata
= mdata
;
3602 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3603 const char *devname
)
3607 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3610 if (volume_info
->nullauth
) {
3611 cifs_dbg(FYI
, "Anonymous login\n");
3612 kfree(volume_info
->username
);
3613 volume_info
->username
= NULL
;
3614 } else if (volume_info
->username
) {
3615 /* BB fixme parse for domain name here */
3616 cifs_dbg(FYI
, "Username: %s\n", volume_info
->username
);
3618 cifs_dbg(VFS
, "No username specified\n");
3619 /* In userspace mount helper we can get user name from alternate
3620 locations such as env variables and files on disk */
3624 /* this is needed for ASCII cp to Unicode converts */
3625 if (volume_info
->iocharset
== NULL
) {
3626 /* load_nls_default cannot return null */
3627 volume_info
->local_nls
= load_nls_default();
3629 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3630 if (volume_info
->local_nls
== NULL
) {
3631 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
3632 volume_info
->iocharset
);
3641 cifs_get_volume_info(char *mount_data
, const char *devname
)
3644 struct smb_vol
*volume_info
;
3646 volume_info
= kmalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3648 return ERR_PTR(-ENOMEM
);
3650 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3652 cifs_cleanup_volume_info(volume_info
);
3653 volume_info
= ERR_PTR(rc
);
3660 cifs_are_all_path_components_accessible(struct TCP_Server_Info
*server
,
3662 struct cifs_tcon
*tcon
,
3663 struct cifs_sb_info
*cifs_sb
,
3670 sep
= CIFS_DIR_SEP(cifs_sb
);
3673 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
, "");
3675 /* skip separators */
3680 /* next separator */
3681 while (*s
&& *s
!= sep
)
3685 * temporarily null-terminate the path at the end of
3686 * the current component
3690 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3698 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3702 struct cifs_ses
*ses
;
3703 struct cifs_tcon
*tcon
;
3704 struct TCP_Server_Info
*server
;
3706 struct tcon_link
*tlink
;
3707 #ifdef CONFIG_CIFS_DFS_UPCALL
3708 int referral_walks_count
= 0;
3711 #ifdef CONFIG_CIFS_DFS_UPCALL
3713 /* cleanup activities if we're chasing a referral */
3714 if (referral_walks_count
) {
3716 cifs_put_tcon(tcon
);
3718 cifs_put_smb_ses(ses
);
3720 cifs_sb
->mnt_cifs_flags
&= ~CIFS_MOUNT_POSIX_PATHS
;
3734 /* get a reference to a tcp session */
3735 server
= cifs_get_tcp_session(volume_info
);
3736 if (IS_ERR(server
)) {
3737 rc
= PTR_ERR(server
);
3740 if ((volume_info
->max_credits
< 20) ||
3741 (volume_info
->max_credits
> 60000))
3742 server
->max_credits
= SMB2_MAX_CREDITS_AVAILABLE
;
3744 server
->max_credits
= volume_info
->max_credits
;
3745 /* get a reference to a SMB session */
3746 ses
= cifs_get_smb_ses(server
, volume_info
);
3750 goto mount_fail_check
;
3753 if ((volume_info
->persistent
== true) && ((ses
->server
->capabilities
&
3754 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
) == 0)) {
3755 cifs_dbg(VFS
, "persistent handles not supported by server\n");
3757 goto mount_fail_check
;
3760 /* search for existing tcon to this server share */
3761 tcon
= cifs_get_tcon(ses
, volume_info
);
3766 goto mount_fail_check
;
3768 goto remote_path_check
;
3771 /* tell server which Unix caps we support */
3772 if (cap_unix(tcon
->ses
)) {
3773 /* reset of caps checks mount to see if unix extensions
3774 disabled for just this mount */
3775 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3776 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3777 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3778 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3780 goto mount_fail_check
;
3783 tcon
->unix_ext
= 0; /* server does not support them */
3785 /* do not care if a following call succeed - informational */
3786 if (!tcon
->ipc
&& server
->ops
->qfs_tcon
)
3787 server
->ops
->qfs_tcon(xid
, tcon
);
3789 cifs_sb
->wsize
= server
->ops
->negotiate_wsize(tcon
, volume_info
);
3790 cifs_sb
->rsize
= server
->ops
->negotiate_rsize(tcon
, volume_info
);
3793 #ifdef CONFIG_CIFS_DFS_UPCALL
3795 * Perform an unconditional check for whether there are DFS
3796 * referrals for this path without prefix, to provide support
3797 * for DFS referrals from w2k8 servers which don't seem to respond
3798 * with PATH_NOT_COVERED to requests that include the prefix.
3799 * Chase the referral if found, otherwise continue normally.
3801 if (referral_walks_count
== 0) {
3802 int refrc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
,
3805 referral_walks_count
++;
3806 goto try_mount_again
;
3811 /* check if a whole path is not remote */
3813 if (!server
->ops
->is_path_accessible
) {
3815 goto mount_fail_check
;
3818 * cifs_build_path_to_root works only when we have a valid tcon
3820 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
,
3821 tcon
->Flags
& SMB_SHARE_IS_IN_DFS
);
3822 if (full_path
== NULL
) {
3824 goto mount_fail_check
;
3826 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3828 if (rc
!= 0 && rc
!= -EREMOTE
) {
3830 goto mount_fail_check
;
3833 if (rc
!= -EREMOTE
) {
3834 rc
= cifs_are_all_path_components_accessible(server
,
3838 cifs_dbg(VFS
, "cannot query dirs between root and final path, "
3839 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3840 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_USE_PREFIX_PATH
;
3847 /* get referral if needed */
3848 if (rc
== -EREMOTE
) {
3849 #ifdef CONFIG_CIFS_DFS_UPCALL
3850 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3852 * BB: when we implement proper loop detection,
3853 * we will remove this check. But now we need it
3854 * to prevent an indefinite loop if 'DFS tree' is
3855 * misconfigured (i.e. has loops).
3858 goto mount_fail_check
;
3861 rc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
, true);
3864 referral_walks_count
++;
3865 goto try_mount_again
;
3867 goto mount_fail_check
;
3868 #else /* No DFS support, return error on mount */
3874 goto mount_fail_check
;
3876 /* now, hang the tcon off of the superblock */
3877 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3878 if (tlink
== NULL
) {
3880 goto mount_fail_check
;
3883 tlink
->tl_uid
= ses
->linux_uid
;
3884 tlink
->tl_tcon
= tcon
;
3885 tlink
->tl_time
= jiffies
;
3886 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3887 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3889 cifs_sb
->master_tlink
= tlink
;
3890 spin_lock(&cifs_sb
->tlink_tree_lock
);
3891 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3892 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3894 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3898 /* on error free sesinfo and tcon struct if needed */
3900 /* If find_unc succeeded then rc == 0 so we can not end */
3901 /* up accidentally freeing someone elses tcon struct */
3903 cifs_put_tcon(tcon
);
3905 cifs_put_smb_ses(ses
);
3907 cifs_put_tcp_session(server
, 0);
3916 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3917 * pointer may be NULL.
3920 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
3921 const char *tree
, struct cifs_tcon
*tcon
,
3922 const struct nls_table
*nls_codepage
)
3924 struct smb_hdr
*smb_buffer
;
3925 struct smb_hdr
*smb_buffer_response
;
3928 unsigned char *bcc_ptr
;
3931 __u16 bytes_left
, count
;
3936 smb_buffer
= cifs_buf_get();
3937 if (smb_buffer
== NULL
)
3940 smb_buffer_response
= smb_buffer
;
3942 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3943 NULL
/*no tid */ , 4 /*wct */ );
3945 smb_buffer
->Mid
= get_next_mid(ses
->server
);
3946 smb_buffer
->Uid
= ses
->Suid
;
3947 pSMB
= (TCONX_REQ
*) smb_buffer
;
3948 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3950 pSMB
->AndXCommand
= 0xFF;
3951 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3952 bcc_ptr
= &pSMB
->Password
[0];
3953 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3954 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3955 *bcc_ptr
= 0; /* password is null byte */
3956 bcc_ptr
++; /* skip password */
3957 /* already aligned so no need to do it below */
3959 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3960 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3961 specified as required (when that support is added to
3962 the vfs in the future) as only NTLM or the much
3963 weaker LANMAN (which we do not send by default) is accepted
3964 by Samba (not sure whether other servers allow
3965 NTLMv2 password here) */
3966 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3967 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3968 (ses
->sectype
== LANMAN
))
3969 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3970 ses
->server
->sec_mode
&
3971 SECMODE_PW_ENCRYPT
? true : false,
3974 #endif /* CIFS_WEAK_PW_HASH */
3975 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3976 bcc_ptr
, nls_codepage
);
3978 cifs_dbg(FYI
, "%s Can't generate NTLM rsp. Error: %d\n",
3980 cifs_buf_release(smb_buffer
);
3984 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3985 if (ses
->capabilities
& CAP_UNICODE
) {
3986 /* must align unicode strings */
3987 *bcc_ptr
= 0; /* null byte password */
3992 if (ses
->server
->sign
)
3993 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3995 if (ses
->capabilities
& CAP_STATUS32
) {
3996 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3998 if (ses
->capabilities
& CAP_DFS
) {
3999 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
4001 if (ses
->capabilities
& CAP_UNICODE
) {
4002 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
4004 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
4005 6 /* max utf8 char length in bytes */ *
4006 (/* server len*/ + 256 /* share len */), nls_codepage
);
4007 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
4008 bcc_ptr
+= 2; /* skip trailing null */
4009 } else { /* ASCII */
4010 strcpy(bcc_ptr
, tree
);
4011 bcc_ptr
+= strlen(tree
) + 1;
4013 strcpy(bcc_ptr
, "?????");
4014 bcc_ptr
+= strlen("?????");
4016 count
= bcc_ptr
- &pSMB
->Password
[0];
4017 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
4018 pSMB
->hdr
.smb_buf_length
) + count
);
4019 pSMB
->ByteCount
= cpu_to_le16(count
);
4021 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
4024 /* above now done in SendReceive */
4025 if ((rc
== 0) && (tcon
!= NULL
)) {
4028 tcon
->tidStatus
= CifsGood
;
4029 tcon
->need_reconnect
= false;
4030 tcon
->tid
= smb_buffer_response
->Tid
;
4031 bcc_ptr
= pByteArea(smb_buffer_response
);
4032 bytes_left
= get_bcc(smb_buffer_response
);
4033 length
= strnlen(bcc_ptr
, bytes_left
- 2);
4034 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
4040 /* skip service field (NB: this field is always ASCII) */
4042 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
4043 (bcc_ptr
[2] == 'C')) {
4044 cifs_dbg(FYI
, "IPC connection\n");
4047 } else if (length
== 2) {
4048 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
4049 /* the most common case */
4050 cifs_dbg(FYI
, "disk share connection\n");
4053 bcc_ptr
+= length
+ 1;
4054 bytes_left
-= (length
+ 1);
4055 strlcpy(tcon
->treeName
, tree
, sizeof(tcon
->treeName
));
4057 /* mostly informational -- no need to fail on error here */
4058 kfree(tcon
->nativeFileSystem
);
4059 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
4060 bytes_left
, is_unicode
,
4063 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
4065 if ((smb_buffer_response
->WordCount
== 3) ||
4066 (smb_buffer_response
->WordCount
== 7))
4067 /* field is in same location */
4068 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
4071 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
4072 } else if ((rc
== 0) && tcon
== NULL
) {
4073 /* all we need to save for IPC$ connection */
4074 ses
->ipc_tid
= smb_buffer_response
->Tid
;
4077 cifs_buf_release(smb_buffer
);
4081 static void delayed_free(struct rcu_head
*p
)
4083 struct cifs_sb_info
*sbi
= container_of(p
, struct cifs_sb_info
, rcu
);
4084 unload_nls(sbi
->local_nls
);
4089 cifs_umount(struct cifs_sb_info
*cifs_sb
)
4091 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4092 struct rb_node
*node
;
4093 struct tcon_link
*tlink
;
4095 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
4097 spin_lock(&cifs_sb
->tlink_tree_lock
);
4098 while ((node
= rb_first(root
))) {
4099 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4100 cifs_get_tlink(tlink
);
4101 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4102 rb_erase(node
, root
);
4104 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4105 cifs_put_tlink(tlink
);
4106 spin_lock(&cifs_sb
->tlink_tree_lock
);
4108 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4110 kfree(cifs_sb
->mountdata
);
4111 kfree(cifs_sb
->prepath
);
4112 call_rcu(&cifs_sb
->rcu
, delayed_free
);
4116 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
4119 struct TCP_Server_Info
*server
= ses
->server
;
4121 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
4124 /* only send once per connect */
4125 if (!server
->ops
->need_neg(server
))
4128 set_credits(server
, 1);
4130 rc
= server
->ops
->negotiate(xid
, ses
);
4132 spin_lock(&GlobalMid_Lock
);
4133 if (server
->tcpStatus
== CifsNeedNegotiate
)
4134 server
->tcpStatus
= CifsGood
;
4137 spin_unlock(&GlobalMid_Lock
);
4144 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
4145 struct nls_table
*nls_info
)
4148 struct TCP_Server_Info
*server
= ses
->server
;
4150 ses
->capabilities
= server
->capabilities
;
4151 if (linuxExtEnabled
== 0)
4152 ses
->capabilities
&= (~server
->vals
->cap_unix
);
4154 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4155 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
4157 if (ses
->auth_key
.response
) {
4158 cifs_dbg(VFS
, "Free previous auth_key.response = %p\n",
4159 ses
->auth_key
.response
);
4160 kfree(ses
->auth_key
.response
);
4161 ses
->auth_key
.response
= NULL
;
4162 ses
->auth_key
.len
= 0;
4165 if (server
->ops
->sess_setup
)
4166 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
4169 cifs_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
4175 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
4177 vol
->sectype
= ses
->sectype
;
4179 /* krb5 is special, since we don't need username or pw */
4180 if (vol
->sectype
== Kerberos
)
4183 return cifs_set_cifscreds(vol
, ses
);
4186 static struct cifs_tcon
*
4187 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
4190 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
4191 struct cifs_ses
*ses
;
4192 struct cifs_tcon
*tcon
= NULL
;
4193 struct smb_vol
*vol_info
;
4195 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
4196 if (vol_info
== NULL
)
4197 return ERR_PTR(-ENOMEM
);
4199 vol_info
->local_nls
= cifs_sb
->local_nls
;
4200 vol_info
->linux_uid
= fsuid
;
4201 vol_info
->cred_uid
= fsuid
;
4202 vol_info
->UNC
= master_tcon
->treeName
;
4203 vol_info
->retry
= master_tcon
->retry
;
4204 vol_info
->nocase
= master_tcon
->nocase
;
4205 vol_info
->local_lease
= master_tcon
->local_lease
;
4206 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
4207 vol_info
->sectype
= master_tcon
->ses
->sectype
;
4208 vol_info
->sign
= master_tcon
->ses
->sign
;
4210 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
4216 /* get a reference for the same TCP session */
4217 spin_lock(&cifs_tcp_ses_lock
);
4218 ++master_tcon
->ses
->server
->srv_count
;
4219 spin_unlock(&cifs_tcp_ses_lock
);
4221 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
4223 tcon
= (struct cifs_tcon
*)ses
;
4224 cifs_put_tcp_session(master_tcon
->ses
->server
, 0);
4228 tcon
= cifs_get_tcon(ses
, vol_info
);
4230 cifs_put_smb_ses(ses
);
4235 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
4237 kfree(vol_info
->username
);
4238 kfree(vol_info
->password
);
4245 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
4247 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
4250 /* find and return a tlink with given uid */
4251 static struct tcon_link
*
4252 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
4254 struct rb_node
*node
= root
->rb_node
;
4255 struct tcon_link
*tlink
;
4258 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4260 if (uid_gt(tlink
->tl_uid
, uid
))
4261 node
= node
->rb_left
;
4262 else if (uid_lt(tlink
->tl_uid
, uid
))
4263 node
= node
->rb_right
;
4270 /* insert a tcon_link into the tree */
4272 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
4274 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
4275 struct tcon_link
*tlink
;
4278 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
4281 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
4282 new = &((*new)->rb_left
);
4284 new = &((*new)->rb_right
);
4287 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
4288 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
4292 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4295 * If the superblock doesn't refer to a multiuser mount, then just return
4296 * the master tcon for the mount.
4298 * First, search the rbtree for an existing tcon for this fsuid. If one
4299 * exists, then check to see if it's pending construction. If it is then wait
4300 * for construction to complete. Once it's no longer pending, check to see if
4301 * it failed and either return an error or retry construction, depending on
4304 * If one doesn't exist then insert a new tcon_link struct into the tree and
4305 * try to construct a new one.
4308 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4311 kuid_t fsuid
= current_fsuid();
4312 struct tcon_link
*tlink
, *newtlink
;
4314 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4315 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4317 spin_lock(&cifs_sb
->tlink_tree_lock
);
4318 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4320 cifs_get_tlink(tlink
);
4321 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4323 if (tlink
== NULL
) {
4324 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4325 if (newtlink
== NULL
)
4326 return ERR_PTR(-ENOMEM
);
4327 newtlink
->tl_uid
= fsuid
;
4328 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4329 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4330 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4331 cifs_get_tlink(newtlink
);
4333 spin_lock(&cifs_sb
->tlink_tree_lock
);
4334 /* was one inserted after previous search? */
4335 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4337 cifs_get_tlink(tlink
);
4338 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4340 goto wait_for_construction
;
4343 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4344 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4346 wait_for_construction
:
4347 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4348 TASK_INTERRUPTIBLE
);
4350 cifs_put_tlink(tlink
);
4351 return ERR_PTR(-ERESTARTSYS
);
4354 /* if it's good, return it */
4355 if (!IS_ERR(tlink
->tl_tcon
))
4358 /* return error if we tried this already recently */
4359 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4360 cifs_put_tlink(tlink
);
4361 return ERR_PTR(-EACCES
);
4364 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4365 goto wait_for_construction
;
4368 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4369 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4370 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4372 if (IS_ERR(tlink
->tl_tcon
)) {
4373 cifs_put_tlink(tlink
);
4374 return ERR_PTR(-EACCES
);
4381 * periodic workqueue job that scans tcon_tree for a superblock and closes
4385 cifs_prune_tlinks(struct work_struct
*work
)
4387 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4389 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4390 struct rb_node
*node
= rb_first(root
);
4391 struct rb_node
*tmp
;
4392 struct tcon_link
*tlink
;
4395 * Because we drop the spinlock in the loop in order to put the tlink
4396 * it's not guarded against removal of links from the tree. The only
4397 * places that remove entries from the tree are this function and
4398 * umounts. Because this function is non-reentrant and is canceled
4399 * before umount can proceed, this is safe.
4401 spin_lock(&cifs_sb
->tlink_tree_lock
);
4402 node
= rb_first(root
);
4403 while (node
!= NULL
) {
4405 node
= rb_next(tmp
);
4406 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4408 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4409 atomic_read(&tlink
->tl_count
) != 0 ||
4410 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4413 cifs_get_tlink(tlink
);
4414 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4415 rb_erase(tmp
, root
);
4417 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4418 cifs_put_tlink(tlink
);
4419 spin_lock(&cifs_sb
->tlink_tree_lock
);
4421 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4423 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,