4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/list.h>
25 #include <linux/wait.h>
26 #include <linux/slab.h>
27 #include <linux/pagemap.h>
28 #include <linux/ctype.h>
29 #include <linux/utsname.h>
30 #include <linux/mempool.h>
31 #include <linux/delay.h>
32 #include <linux/completion.h>
33 #include <linux/kthread.h>
34 #include <linux/pagevec.h>
35 #include <linux/freezer.h>
36 #include <linux/namei.h>
37 #include <asm/uaccess.h>
38 #include <asm/processor.h>
39 #include <linux/inet.h>
40 #include <linux/module.h>
41 #include <keys/user-type.h>
43 #include <linux/parser.h>
47 #include "cifsproto.h"
48 #include "cifs_unicode.h"
49 #include "cifs_debug.h"
50 #include "cifs_fs_sb.h"
53 #include "rfc1002pdu.h"
57 #define RFC1001_PORT 139
59 extern mempool_t
*cifs_req_poolp
;
61 /* FIXME: should these be tunable? */
62 #define TLINK_ERROR_EXPIRE (1 * HZ)
63 #define TLINK_IDLE_EXPIRE (600 * HZ)
67 /* Mount options that take no arguments */
68 Opt_user_xattr
, Opt_nouser_xattr
,
69 Opt_forceuid
, Opt_noforceuid
,
70 Opt_forcegid
, Opt_noforcegid
,
71 Opt_noblocksend
, Opt_noautotune
,
72 Opt_hard
, Opt_soft
, Opt_perm
, Opt_noperm
,
73 Opt_mapposix
, Opt_nomapposix
,
74 Opt_mapchars
, Opt_nomapchars
, Opt_sfu
,
75 Opt_nosfu
, Opt_nodfs
, Opt_posixpaths
,
76 Opt_noposixpaths
, Opt_nounix
,
79 Opt_forcemandatorylock
, Opt_setuids
,
80 Opt_nosetuids
, Opt_dynperm
, Opt_nodynperm
,
81 Opt_nohard
, Opt_nosoft
,
83 Opt_nostrictsync
, Opt_strictsync
,
84 Opt_serverino
, Opt_noserverino
,
85 Opt_rwpidforward
, Opt_cifsacl
, Opt_nocifsacl
,
86 Opt_acl
, Opt_noacl
, Opt_locallease
,
87 Opt_sign
, Opt_seal
, Opt_noac
,
88 Opt_fsc
, Opt_mfsymlinks
,
89 Opt_multiuser
, Opt_sloppy
, Opt_nosharesock
,
90 Opt_persistent
, Opt_nopersistent
,
91 Opt_resilient
, Opt_noresilient
,
93 /* Mount options which take numeric value */
94 Opt_backupuid
, Opt_backupgid
, Opt_uid
,
95 Opt_cruid
, Opt_gid
, Opt_file_mode
,
96 Opt_dirmode
, Opt_port
,
97 Opt_rsize
, Opt_wsize
, Opt_actimeo
,
99 /* Mount options which take string value */
100 Opt_user
, Opt_pass
, Opt_ip
,
101 Opt_domain
, Opt_srcaddr
, Opt_iocharset
,
102 Opt_netbiosname
, Opt_servern
,
103 Opt_ver
, Opt_vers
, Opt_sec
, Opt_cache
,
105 /* Mount options to be ignored */
108 /* Options which could be blank */
116 static const match_table_t cifs_mount_option_tokens
= {
118 { Opt_user_xattr
, "user_xattr" },
119 { Opt_nouser_xattr
, "nouser_xattr" },
120 { Opt_forceuid
, "forceuid" },
121 { Opt_noforceuid
, "noforceuid" },
122 { Opt_forcegid
, "forcegid" },
123 { Opt_noforcegid
, "noforcegid" },
124 { Opt_noblocksend
, "noblocksend" },
125 { Opt_noautotune
, "noautotune" },
126 { Opt_hard
, "hard" },
127 { Opt_soft
, "soft" },
128 { Opt_perm
, "perm" },
129 { Opt_noperm
, "noperm" },
130 { Opt_mapchars
, "mapchars" }, /* SFU style */
131 { Opt_nomapchars
, "nomapchars" },
132 { Opt_mapposix
, "mapposix" }, /* SFM style */
133 { Opt_nomapposix
, "nomapposix" },
135 { Opt_nosfu
, "nosfu" },
136 { Opt_nodfs
, "nodfs" },
137 { Opt_posixpaths
, "posixpaths" },
138 { Opt_noposixpaths
, "noposixpaths" },
139 { Opt_nounix
, "nounix" },
140 { Opt_nounix
, "nolinux" },
141 { Opt_nocase
, "nocase" },
142 { Opt_nocase
, "ignorecase" },
144 { Opt_nobrl
, "nobrl" },
145 { Opt_nobrl
, "nolock" },
146 { Opt_forcemandatorylock
, "forcemandatorylock" },
147 { Opt_forcemandatorylock
, "forcemand" },
148 { Opt_setuids
, "setuids" },
149 { Opt_nosetuids
, "nosetuids" },
150 { Opt_dynperm
, "dynperm" },
151 { Opt_nodynperm
, "nodynperm" },
152 { Opt_nohard
, "nohard" },
153 { Opt_nosoft
, "nosoft" },
154 { Opt_nointr
, "nointr" },
155 { Opt_intr
, "intr" },
156 { Opt_nostrictsync
, "nostrictsync" },
157 { Opt_strictsync
, "strictsync" },
158 { Opt_serverino
, "serverino" },
159 { Opt_noserverino
, "noserverino" },
160 { Opt_rwpidforward
, "rwpidforward" },
161 { Opt_cifsacl
, "cifsacl" },
162 { Opt_nocifsacl
, "nocifsacl" },
164 { Opt_noacl
, "noacl" },
165 { Opt_locallease
, "locallease" },
166 { Opt_sign
, "sign" },
167 { Opt_seal
, "seal" },
168 { Opt_noac
, "noac" },
170 { Opt_mfsymlinks
, "mfsymlinks" },
171 { Opt_multiuser
, "multiuser" },
172 { Opt_sloppy
, "sloppy" },
173 { Opt_nosharesock
, "nosharesock" },
174 { Opt_persistent
, "persistenthandles"},
175 { Opt_nopersistent
, "nopersistenthandles"},
176 { Opt_resilient
, "resilienthandles"},
177 { Opt_noresilient
, "noresilienthandles"},
179 { Opt_backupuid
, "backupuid=%s" },
180 { Opt_backupgid
, "backupgid=%s" },
181 { Opt_uid
, "uid=%s" },
182 { Opt_cruid
, "cruid=%s" },
183 { Opt_gid
, "gid=%s" },
184 { Opt_file_mode
, "file_mode=%s" },
185 { Opt_dirmode
, "dirmode=%s" },
186 { Opt_dirmode
, "dir_mode=%s" },
187 { Opt_port
, "port=%s" },
188 { Opt_rsize
, "rsize=%s" },
189 { Opt_wsize
, "wsize=%s" },
190 { Opt_actimeo
, "actimeo=%s" },
192 { Opt_blank_user
, "user=" },
193 { Opt_blank_user
, "username=" },
194 { Opt_user
, "user=%s" },
195 { Opt_user
, "username=%s" },
196 { Opt_blank_pass
, "pass=" },
197 { Opt_blank_pass
, "password=" },
198 { Opt_pass
, "pass=%s" },
199 { Opt_pass
, "password=%s" },
200 { Opt_blank_ip
, "ip=" },
201 { Opt_blank_ip
, "addr=" },
203 { Opt_ip
, "addr=%s" },
204 { Opt_ignore
, "unc=%s" },
205 { Opt_ignore
, "target=%s" },
206 { Opt_ignore
, "path=%s" },
207 { Opt_domain
, "dom=%s" },
208 { Opt_domain
, "domain=%s" },
209 { Opt_domain
, "workgroup=%s" },
210 { Opt_srcaddr
, "srcaddr=%s" },
211 { Opt_ignore
, "prefixpath=%s" },
212 { Opt_iocharset
, "iocharset=%s" },
213 { Opt_netbiosname
, "netbiosname=%s" },
214 { Opt_servern
, "servern=%s" },
215 { Opt_ver
, "ver=%s" },
216 { Opt_vers
, "vers=%s" },
217 { Opt_sec
, "sec=%s" },
218 { Opt_cache
, "cache=%s" },
220 { Opt_ignore
, "cred" },
221 { Opt_ignore
, "credentials" },
222 { Opt_ignore
, "cred=%s" },
223 { Opt_ignore
, "credentials=%s" },
224 { Opt_ignore
, "guest" },
225 { Opt_ignore
, "rw" },
226 { Opt_ignore
, "ro" },
227 { Opt_ignore
, "suid" },
228 { Opt_ignore
, "nosuid" },
229 { Opt_ignore
, "exec" },
230 { Opt_ignore
, "noexec" },
231 { Opt_ignore
, "nodev" },
232 { Opt_ignore
, "noauto" },
233 { Opt_ignore
, "dev" },
234 { Opt_ignore
, "mand" },
235 { Opt_ignore
, "nomand" },
236 { Opt_ignore
, "_netdev" },
242 Opt_sec_krb5
, Opt_sec_krb5i
, Opt_sec_krb5p
,
243 Opt_sec_ntlmsspi
, Opt_sec_ntlmssp
,
244 Opt_ntlm
, Opt_sec_ntlmi
, Opt_sec_ntlmv2
,
245 Opt_sec_ntlmv2i
, Opt_sec_lanman
,
251 static const match_table_t cifs_secflavor_tokens
= {
252 { Opt_sec_krb5
, "krb5" },
253 { Opt_sec_krb5i
, "krb5i" },
254 { Opt_sec_krb5p
, "krb5p" },
255 { Opt_sec_ntlmsspi
, "ntlmsspi" },
256 { Opt_sec_ntlmssp
, "ntlmssp" },
257 { Opt_ntlm
, "ntlm" },
258 { Opt_sec_ntlmi
, "ntlmi" },
259 { Opt_sec_ntlmv2
, "nontlm" },
260 { Opt_sec_ntlmv2
, "ntlmv2" },
261 { Opt_sec_ntlmv2i
, "ntlmv2i" },
262 { Opt_sec_lanman
, "lanman" },
263 { Opt_sec_none
, "none" },
265 { Opt_sec_err
, NULL
}
276 static const match_table_t cifs_cacheflavor_tokens
= {
277 { Opt_cache_loose
, "loose" },
278 { Opt_cache_strict
, "strict" },
279 { Opt_cache_none
, "none" },
280 { Opt_cache_err
, NULL
}
283 static const match_table_t cifs_smb_version_tokens
= {
284 { Smb_1
, SMB1_VERSION_STRING
},
285 { Smb_20
, SMB20_VERSION_STRING
},
286 { Smb_21
, SMB21_VERSION_STRING
},
287 { Smb_30
, SMB30_VERSION_STRING
},
288 { Smb_302
, SMB302_VERSION_STRING
},
289 #ifdef CONFIG_CIFS_SMB311
290 { Smb_311
, SMB311_VERSION_STRING
},
291 { Smb_311
, ALT_SMB311_VERSION_STRING
},
293 { Smb_version_err
, NULL
}
296 static int ip_connect(struct TCP_Server_Info
*server
);
297 static int generic_ip_connect(struct TCP_Server_Info
*server
);
298 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
299 static void cifs_prune_tlinks(struct work_struct
*work
);
300 static int cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
301 const char *devname
);
304 * cifs tcp session reconnection
306 * mark tcp session as reconnecting so temporarily locked
307 * mark all smb sessions as reconnecting for tcp session
308 * reconnect tcp session
309 * wake up waiters on reconnection? - (not needed currently)
312 cifs_reconnect(struct TCP_Server_Info
*server
)
315 struct list_head
*tmp
, *tmp2
;
316 struct cifs_ses
*ses
;
317 struct cifs_tcon
*tcon
;
318 struct mid_q_entry
*mid_entry
;
319 struct list_head retry_list
;
321 spin_lock(&GlobalMid_Lock
);
322 if (server
->tcpStatus
== CifsExiting
) {
323 /* the demux thread will exit normally
324 next time through the loop */
325 spin_unlock(&GlobalMid_Lock
);
328 server
->tcpStatus
= CifsNeedReconnect
;
329 spin_unlock(&GlobalMid_Lock
);
331 #ifdef CONFIG_CIFS_SMB2
332 server
->max_read
= 0;
335 cifs_dbg(FYI
, "Reconnecting tcp session\n");
337 /* before reconnecting the tcp session, mark the smb session (uid)
338 and the tid bad so they are not used until reconnected */
339 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
341 spin_lock(&cifs_tcp_ses_lock
);
342 list_for_each(tmp
, &server
->smb_ses_list
) {
343 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
344 ses
->need_reconnect
= true;
346 list_for_each(tmp2
, &ses
->tcon_list
) {
347 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
348 tcon
->need_reconnect
= true;
351 spin_unlock(&cifs_tcp_ses_lock
);
353 /* do not want to be sending data on a socket we are freeing */
354 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
355 mutex_lock(&server
->srv_mutex
);
356 if (server
->ssocket
) {
357 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
358 server
->ssocket
->state
, server
->ssocket
->flags
);
359 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
360 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
361 server
->ssocket
->state
, server
->ssocket
->flags
);
362 sock_release(server
->ssocket
);
363 server
->ssocket
= NULL
;
365 server
->sequence_number
= 0;
366 server
->session_estab
= false;
367 kfree(server
->session_key
.response
);
368 server
->session_key
.response
= NULL
;
369 server
->session_key
.len
= 0;
370 server
->lstrp
= jiffies
;
372 /* mark submitted MIDs for retry and issue callback */
373 INIT_LIST_HEAD(&retry_list
);
374 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
375 spin_lock(&GlobalMid_Lock
);
376 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
377 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
378 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
379 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
380 list_move(&mid_entry
->qhead
, &retry_list
);
382 spin_unlock(&GlobalMid_Lock
);
383 mutex_unlock(&server
->srv_mutex
);
385 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
386 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
387 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
388 list_del_init(&mid_entry
->qhead
);
389 mid_entry
->callback(mid_entry
);
395 /* we should try only the port we connected to before */
396 mutex_lock(&server
->srv_mutex
);
397 rc
= generic_ip_connect(server
);
399 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
400 mutex_unlock(&server
->srv_mutex
);
403 atomic_inc(&tcpSesReconnectCount
);
404 spin_lock(&GlobalMid_Lock
);
405 if (server
->tcpStatus
!= CifsExiting
)
406 server
->tcpStatus
= CifsNeedNegotiate
;
407 spin_unlock(&GlobalMid_Lock
);
408 mutex_unlock(&server
->srv_mutex
);
410 } while (server
->tcpStatus
== CifsNeedReconnect
);
416 cifs_echo_request(struct work_struct
*work
)
419 struct TCP_Server_Info
*server
= container_of(work
,
420 struct TCP_Server_Info
, echo
.work
);
423 * We cannot send an echo if it is disabled or until the
424 * NEGOTIATE_PROTOCOL request is done, which is indicated by
425 * server->ops->need_neg() == true. Also, no need to ping if
426 * we got a response recently.
428 if (!server
->ops
->need_neg
|| server
->ops
->need_neg(server
) ||
429 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
430 time_before(jiffies
, server
->lstrp
+ SMB_ECHO_INTERVAL
- HZ
))
433 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
435 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
439 queue_delayed_work(cifsiod_wq
, &server
->echo
, SMB_ECHO_INTERVAL
);
443 allocate_buffers(struct TCP_Server_Info
*server
)
445 if (!server
->bigbuf
) {
446 server
->bigbuf
= (char *)cifs_buf_get();
447 if (!server
->bigbuf
) {
448 cifs_dbg(VFS
, "No memory for large SMB response\n");
450 /* retry will check if exiting */
453 } else if (server
->large_buf
) {
454 /* we are reusing a dirty large buf, clear its start */
455 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
458 if (!server
->smallbuf
) {
459 server
->smallbuf
= (char *)cifs_small_buf_get();
460 if (!server
->smallbuf
) {
461 cifs_dbg(VFS
, "No memory for SMB response\n");
463 /* retry will check if exiting */
466 /* beginning of smb buffer is cleared in our buf_get */
468 /* if existing small buf clear beginning */
469 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
476 server_unresponsive(struct TCP_Server_Info
*server
)
479 * We need to wait 2 echo intervals to make sure we handle such
481 * 1s client sends a normal SMB request
482 * 2s client gets a response
483 * 30s echo workqueue job pops, and decides we got a response recently
484 * and don't need to send another
486 * 65s kernel_recvmsg times out, and we see that we haven't gotten
487 * a response in >60s.
489 if (server
->tcpStatus
== CifsGood
&&
490 time_after(jiffies
, server
->lstrp
+ 2 * SMB_ECHO_INTERVAL
)) {
491 cifs_dbg(VFS
, "Server %s has not responded in %d seconds. Reconnecting...\n",
492 server
->hostname
, (2 * SMB_ECHO_INTERVAL
) / HZ
);
493 cifs_reconnect(server
);
494 wake_up(&server
->response_q
);
502 * kvec_array_init - clone a kvec array, and advance into it
503 * @new: pointer to memory for cloned array
504 * @iov: pointer to original array
505 * @nr_segs: number of members in original array
506 * @bytes: number of bytes to advance into the cloned array
508 * This function will copy the array provided in iov to a section of memory
509 * and advance the specified number of bytes into the new array. It returns
510 * the number of segments in the new array. "new" must be at least as big as
511 * the original iov array.
514 kvec_array_init(struct kvec
*new, struct kvec
*iov
, unsigned int nr_segs
,
519 while (bytes
|| !iov
->iov_len
) {
520 int copy
= min(bytes
, iov
->iov_len
);
524 if (iov
->iov_len
== base
) {
530 memcpy(new, iov
, sizeof(*iov
) * nr_segs
);
531 new->iov_base
+= base
;
532 new->iov_len
-= base
;
537 get_server_iovec(struct TCP_Server_Info
*server
, unsigned int nr_segs
)
539 struct kvec
*new_iov
;
541 if (server
->iov
&& nr_segs
<= server
->nr_iov
)
544 /* not big enough -- allocate a new one and release the old */
545 new_iov
= kmalloc(sizeof(*new_iov
) * nr_segs
, GFP_NOFS
);
548 server
->iov
= new_iov
;
549 server
->nr_iov
= nr_segs
;
555 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct kvec
*iov_orig
,
556 unsigned int nr_segs
, unsigned int to_read
)
561 struct msghdr smb_msg
;
564 iov
= get_server_iovec(server
, nr_segs
);
568 smb_msg
.msg_control
= NULL
;
569 smb_msg
.msg_controllen
= 0;
571 for (total_read
= 0; to_read
; total_read
+= length
, to_read
-= length
) {
574 if (server_unresponsive(server
)) {
575 total_read
= -ECONNABORTED
;
579 segs
= kvec_array_init(iov
, iov_orig
, nr_segs
, total_read
);
581 length
= kernel_recvmsg(server
->ssocket
, &smb_msg
,
582 iov
, segs
, to_read
, 0);
584 if (server
->tcpStatus
== CifsExiting
) {
585 total_read
= -ESHUTDOWN
;
587 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
588 cifs_reconnect(server
);
589 total_read
= -ECONNABORTED
;
591 } else if (length
== -ERESTARTSYS
||
595 * Minimum sleep to prevent looping, allowing socket
596 * to clear and app threads to set tcpStatus
597 * CifsNeedReconnect if server hung.
599 usleep_range(1000, 2000);
602 } else if (length
<= 0) {
603 cifs_dbg(FYI
, "Received no data or error: expecting %d\n"
604 "got %d", to_read
, length
);
605 cifs_reconnect(server
);
606 total_read
= -ECONNABORTED
;
614 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
615 unsigned int to_read
)
620 iov
.iov_len
= to_read
;
622 return cifs_readv_from_socket(server
, &iov
, 1, to_read
);
626 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
629 * The first byte big endian of the length field,
630 * is actually not part of the length but the type
631 * with the most common, zero, as regular data.
634 case RFC1002_SESSION_MESSAGE
:
635 /* Regular SMB response */
637 case RFC1002_SESSION_KEEP_ALIVE
:
638 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
640 case RFC1002_POSITIVE_SESSION_RESPONSE
:
641 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
643 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
645 * We get this from Windows 98 instead of an error on
646 * SMB negprot response.
648 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
649 /* give server a second to clean up */
652 * Always try 445 first on reconnect since we get NACK
653 * on some if we ever connected to port 139 (the NACK
654 * is since we do not begin with RFC1001 session
657 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
658 cifs_reconnect(server
);
659 wake_up(&server
->response_q
);
662 cifs_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
663 cifs_reconnect(server
);
670 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
672 #ifdef CONFIG_CIFS_STATS2
673 mid
->when_received
= jiffies
;
675 spin_lock(&GlobalMid_Lock
);
677 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
679 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
680 list_del_init(&mid
->qhead
);
681 spin_unlock(&GlobalMid_Lock
);
685 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
686 char *buf
, int malformed
)
688 if (server
->ops
->check_trans2
&&
689 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
692 mid
->large_buf
= server
->large_buf
;
693 /* Was previous buf put in mpx struct for multi-rsp? */
694 if (!mid
->multiRsp
) {
695 /* smb buffer will be freed by user thread */
696 if (server
->large_buf
)
697 server
->bigbuf
= NULL
;
699 server
->smallbuf
= NULL
;
701 dequeue_mid(mid
, malformed
);
704 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
708 /* take it off the list, if it's not already */
709 spin_lock(&cifs_tcp_ses_lock
);
710 list_del_init(&server
->tcp_ses_list
);
711 spin_unlock(&cifs_tcp_ses_lock
);
713 spin_lock(&GlobalMid_Lock
);
714 server
->tcpStatus
= CifsExiting
;
715 spin_unlock(&GlobalMid_Lock
);
716 wake_up_all(&server
->response_q
);
718 /* check if we have blocked requests that need to free */
719 spin_lock(&server
->req_lock
);
720 if (server
->credits
<= 0)
722 spin_unlock(&server
->req_lock
);
724 * Although there should not be any requests blocked on this queue it
725 * can not hurt to be paranoid and try to wake up requests that may
726 * haven been blocked when more than 50 at time were on the wire to the
727 * same server - they now will see the session is in exit state and get
728 * out of SendReceive.
730 wake_up_all(&server
->request_q
);
731 /* give those requests time to exit */
734 if (server
->ssocket
) {
735 sock_release(server
->ssocket
);
736 server
->ssocket
= NULL
;
739 if (!list_empty(&server
->pending_mid_q
)) {
740 struct list_head dispose_list
;
741 struct mid_q_entry
*mid_entry
;
742 struct list_head
*tmp
, *tmp2
;
744 INIT_LIST_HEAD(&dispose_list
);
745 spin_lock(&GlobalMid_Lock
);
746 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
747 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
748 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
749 mid_entry
->mid_state
= MID_SHUTDOWN
;
750 list_move(&mid_entry
->qhead
, &dispose_list
);
752 spin_unlock(&GlobalMid_Lock
);
754 /* now walk dispose list and issue callbacks */
755 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
756 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
757 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
758 list_del_init(&mid_entry
->qhead
);
759 mid_entry
->callback(mid_entry
);
761 /* 1/8th of sec is more than enough time for them to exit */
765 if (!list_empty(&server
->pending_mid_q
)) {
767 * mpx threads have not exited yet give them at least the smb
768 * send timeout time for long ops.
770 * Due to delays on oplock break requests, we need to wait at
771 * least 45 seconds before giving up on a request getting a
772 * response and going ahead and killing cifsd.
774 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
777 * If threads still have not exited they are probably never
778 * coming home not much else we can do but free the memory.
782 kfree(server
->hostname
);
786 length
= atomic_dec_return(&tcpSesAllocCount
);
788 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
792 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
795 char *buf
= server
->smallbuf
;
796 unsigned int pdu_length
= get_rfc1002_length(buf
);
798 /* make sure this will fit in a large buffer */
799 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) - 4) {
800 cifs_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
801 cifs_reconnect(server
);
802 wake_up(&server
->response_q
);
803 return -ECONNABORTED
;
806 /* switch to large buffer if too big for a small one */
807 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
808 server
->large_buf
= true;
809 memcpy(server
->bigbuf
, buf
, server
->total_read
);
810 buf
= server
->bigbuf
;
813 /* now read the rest */
814 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
815 pdu_length
- HEADER_SIZE(server
) + 1 + 4);
818 server
->total_read
+= length
;
820 dump_smb(buf
, server
->total_read
);
823 * We know that we received enough to get to the MID as we
824 * checked the pdu_length earlier. Now check to see
825 * if the rest of the header is OK. We borrow the length
826 * var for the rest of the loop to avoid a new stack var.
828 * 48 bytes is enough to display the header and a little bit
829 * into the payload for debugging purposes.
831 length
= server
->ops
->check_message(buf
, server
->total_read
);
833 cifs_dump_mem("Bad SMB: ", buf
,
834 min_t(unsigned int, server
->total_read
, 48));
836 if (server
->ops
->is_status_pending
&&
837 server
->ops
->is_status_pending(buf
, server
, length
))
843 handle_mid(mid
, server
, buf
, length
);
848 cifs_demultiplex_thread(void *p
)
851 struct TCP_Server_Info
*server
= p
;
852 unsigned int pdu_length
;
854 struct task_struct
*task_to_wake
= NULL
;
855 struct mid_q_entry
*mid_entry
;
857 current
->flags
|= PF_MEMALLOC
;
858 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
860 length
= atomic_inc_return(&tcpSesAllocCount
);
862 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
865 while (server
->tcpStatus
!= CifsExiting
) {
869 if (!allocate_buffers(server
))
872 server
->large_buf
= false;
873 buf
= server
->smallbuf
;
874 pdu_length
= 4; /* enough to get RFC1001 header */
876 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
879 server
->total_read
= length
;
882 * The right amount was read from socket - 4 bytes,
883 * so we can now interpret the length field.
885 pdu_length
= get_rfc1002_length(buf
);
887 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
888 if (!is_smb_response(server
, buf
[0]))
891 /* make sure we have enough to get to the MID */
892 if (pdu_length
< HEADER_SIZE(server
) - 1 - 4) {
893 cifs_dbg(VFS
, "SMB response too short (%u bytes)\n",
895 cifs_reconnect(server
);
896 wake_up(&server
->response_q
);
900 /* read down to the MID */
901 length
= cifs_read_from_socket(server
, buf
+ 4,
902 HEADER_SIZE(server
) - 1 - 4);
905 server
->total_read
+= length
;
907 mid_entry
= server
->ops
->find_mid(server
, buf
);
909 if (!mid_entry
|| !mid_entry
->receive
)
910 length
= standard_receive3(server
, mid_entry
);
912 length
= mid_entry
->receive(server
, mid_entry
);
917 if (server
->large_buf
)
918 buf
= server
->bigbuf
;
920 server
->lstrp
= jiffies
;
921 if (mid_entry
!= NULL
) {
922 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
923 mid_entry
->callback(mid_entry
);
924 } else if (!server
->ops
->is_oplock_break
||
925 !server
->ops
->is_oplock_break(buf
, server
)) {
926 cifs_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
927 atomic_read(&midCount
));
928 cifs_dump_mem("Received Data is: ", buf
,
929 HEADER_SIZE(server
));
930 #ifdef CONFIG_CIFS_DEBUG2
931 if (server
->ops
->dump_detail
)
932 server
->ops
->dump_detail(buf
);
933 cifs_dump_mids(server
);
934 #endif /* CIFS_DEBUG2 */
937 } /* end while !EXITING */
939 /* buffer usually freed in free_mid - need to free it here on exit */
940 cifs_buf_release(server
->bigbuf
);
941 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
942 cifs_small_buf_release(server
->smallbuf
);
944 task_to_wake
= xchg(&server
->tsk
, NULL
);
945 clean_demultiplex_info(server
);
947 /* if server->tsk was NULL then wait for a signal before exiting */
949 set_current_state(TASK_INTERRUPTIBLE
);
950 while (!signal_pending(current
)) {
952 set_current_state(TASK_INTERRUPTIBLE
);
954 set_current_state(TASK_RUNNING
);
957 module_put_and_exit(0);
960 /* extract the host portion of the UNC string */
962 extract_hostname(const char *unc
)
968 /* skip double chars at beginning of string */
969 /* BB: check validity of these bytes? */
972 /* delimiter between hostname and sharename is always '\\' now */
973 delim
= strchr(src
, '\\');
975 return ERR_PTR(-EINVAL
);
978 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
980 return ERR_PTR(-ENOMEM
);
982 memcpy(dst
, src
, len
);
988 static int get_option_ul(substring_t args
[], unsigned long *option
)
993 string
= match_strdup(args
);
996 rc
= kstrtoul(string
, 0, option
);
1002 static int get_option_uid(substring_t args
[], kuid_t
*result
)
1004 unsigned long value
;
1008 rc
= get_option_ul(args
, &value
);
1012 uid
= make_kuid(current_user_ns(), value
);
1013 if (!uid_valid(uid
))
1020 static int get_option_gid(substring_t args
[], kgid_t
*result
)
1022 unsigned long value
;
1026 rc
= get_option_ul(args
, &value
);
1030 gid
= make_kgid(current_user_ns(), value
);
1031 if (!gid_valid(gid
))
1038 static int cifs_parse_security_flavors(char *value
,
1039 struct smb_vol
*vol
)
1042 substring_t args
[MAX_OPT_ARGS
];
1045 * With mount options, the last one should win. Reset any existing
1046 * settings back to default.
1048 vol
->sectype
= Unspecified
;
1051 switch (match_token(value
, cifs_secflavor_tokens
, args
)) {
1053 cifs_dbg(VFS
, "sec=krb5p is not supported!\n");
1059 vol
->sectype
= Kerberos
;
1061 case Opt_sec_ntlmsspi
:
1064 case Opt_sec_ntlmssp
:
1065 vol
->sectype
= RawNTLMSSP
;
1071 vol
->sectype
= NTLM
;
1073 case Opt_sec_ntlmv2i
:
1076 case Opt_sec_ntlmv2
:
1077 vol
->sectype
= NTLMv2
;
1079 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1080 case Opt_sec_lanman
:
1081 vol
->sectype
= LANMAN
;
1088 cifs_dbg(VFS
, "bad security option: %s\n", value
);
1096 cifs_parse_cache_flavor(char *value
, struct smb_vol
*vol
)
1098 substring_t args
[MAX_OPT_ARGS
];
1100 switch (match_token(value
, cifs_cacheflavor_tokens
, args
)) {
1101 case Opt_cache_loose
:
1102 vol
->direct_io
= false;
1103 vol
->strict_io
= false;
1105 case Opt_cache_strict
:
1106 vol
->direct_io
= false;
1107 vol
->strict_io
= true;
1109 case Opt_cache_none
:
1110 vol
->direct_io
= true;
1111 vol
->strict_io
= false;
1114 cifs_dbg(VFS
, "bad cache= option: %s\n", value
);
1121 cifs_parse_smb_version(char *value
, struct smb_vol
*vol
)
1123 substring_t args
[MAX_OPT_ARGS
];
1125 switch (match_token(value
, cifs_smb_version_tokens
, args
)) {
1127 vol
->ops
= &smb1_operations
;
1128 vol
->vals
= &smb1_values
;
1130 #ifdef CONFIG_CIFS_SMB2
1132 vol
->ops
= &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
;
1155 cifs_dbg(VFS
, "Unknown vers= option specified: %s\n", value
);
1162 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1163 * fields with the result. Returns 0 on success and an error otherwise.
1166 cifs_parse_devname(const char *devname
, struct smb_vol
*vol
)
1169 const char *delims
= "/\\";
1172 /* make sure we have a valid UNC double delimiter prefix */
1173 len
= strspn(devname
, delims
);
1177 /* find delimiter between host and sharename */
1178 pos
= strpbrk(devname
+ 2, delims
);
1182 /* skip past delimiter */
1185 /* now go until next delimiter or end of string */
1186 len
= strcspn(pos
, delims
);
1188 /* move "pos" up to delimiter or NULL */
1190 vol
->UNC
= kstrndup(devname
, pos
- devname
, GFP_KERNEL
);
1194 convert_delimiter(vol
->UNC
, '\\');
1196 /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1197 if (!*pos
++ || !*pos
)
1200 vol
->prepath
= kstrdup(pos
, GFP_KERNEL
);
1208 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
1209 struct smb_vol
*vol
)
1212 char *mountdata_copy
= NULL
, *options
;
1213 unsigned int temp_len
, i
, j
;
1215 short int override_uid
= -1;
1216 short int override_gid
= -1;
1217 bool uid_specified
= false;
1218 bool gid_specified
= false;
1219 bool sloppy
= false;
1220 char *invalid
= NULL
;
1221 char *nodename
= utsname()->nodename
;
1222 char *string
= NULL
;
1223 char *tmp_end
, *value
;
1225 bool got_ip
= false;
1226 unsigned short port
= 0;
1227 struct sockaddr
*dstaddr
= (struct sockaddr
*)&vol
->dstaddr
;
1231 delim
= separator
[0];
1233 /* ensure we always start with zeroed-out smb_vol */
1234 memset(vol
, 0, sizeof(*vol
));
1237 * does not have to be perfect mapping since field is
1238 * informational, only used for servers that do not support
1239 * port 445 and it can be overridden at mount time
1241 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
1242 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
1243 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
1245 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
1246 /* null target name indicates to use *SMBSERVR default called name
1247 if we end up sending RFC1001 session initialize */
1248 vol
->target_rfc1001_name
[0] = 0;
1249 vol
->cred_uid
= current_uid();
1250 vol
->linux_uid
= current_uid();
1251 vol
->linux_gid
= current_gid();
1254 * default to SFM style remapping of seven reserved characters
1255 * unless user overrides it or we negotiate CIFS POSIX where
1256 * it is unnecessary. Can not simultaneously use more than one mapping
1257 * since then readdir could list files that open could not open
1261 /* default to only allowing write access to owner of the mount */
1262 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
1264 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1265 /* default is always to request posix paths. */
1266 vol
->posix_paths
= 1;
1267 /* default to using server inode numbers where available */
1268 vol
->server_ino
= 1;
1270 /* default is to use strict cifs caching semantics */
1271 vol
->strict_io
= true;
1273 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
1275 /* FIXME: add autonegotiation -- for now, SMB1 is default */
1276 vol
->ops
= &smb1_operations
;
1277 vol
->vals
= &smb1_values
;
1280 goto cifs_parse_mount_err
;
1282 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
1283 if (!mountdata_copy
)
1284 goto cifs_parse_mount_err
;
1286 options
= mountdata_copy
;
1287 end
= options
+ strlen(options
);
1289 if (strncmp(options
, "sep=", 4) == 0) {
1290 if (options
[4] != 0) {
1291 separator
[0] = options
[4];
1294 cifs_dbg(FYI
, "Null separator not allowed\n");
1297 vol
->backupuid_specified
= false; /* no backup intent for a user */
1298 vol
->backupgid_specified
= false; /* no backup intent for a group */
1300 switch (cifs_parse_devname(devname
, vol
)) {
1304 cifs_dbg(VFS
, "Unable to allocate memory for devname.\n");
1305 goto cifs_parse_mount_err
;
1307 cifs_dbg(VFS
, "Malformed UNC in devname.\n");
1308 goto cifs_parse_mount_err
;
1310 cifs_dbg(VFS
, "Unknown error parsing devname.\n");
1311 goto cifs_parse_mount_err
;
1314 while ((data
= strsep(&options
, separator
)) != NULL
) {
1315 substring_t args
[MAX_OPT_ARGS
];
1316 unsigned long option
;
1322 token
= match_token(data
, cifs_mount_option_tokens
, args
);
1326 /* Ingnore the following */
1330 /* Boolean values */
1331 case Opt_user_xattr
:
1334 case Opt_nouser_xattr
:
1340 case Opt_noforceuid
:
1346 case Opt_noforcegid
:
1349 case Opt_noblocksend
:
1350 vol
->noblocksnd
= 1;
1352 case Opt_noautotune
:
1353 vol
->noautotune
= 1;
1368 vol
->sfu_remap
= true;
1369 vol
->remap
= false; /* disable SFM mapping */
1371 case Opt_nomapchars
:
1372 vol
->sfu_remap
= false;
1376 vol
->sfu_remap
= false; /* disable SFU mapping */
1378 case Opt_nomapposix
:
1390 case Opt_posixpaths
:
1391 vol
->posix_paths
= 1;
1393 case Opt_noposixpaths
:
1394 vol
->posix_paths
= 0;
1397 vol
->no_linux_ext
= 1;
1408 * turn off mandatory locking in mode
1409 * if remote locking is turned off since the
1410 * local vfs will do advisory
1412 if (vol
->file_mode
==
1413 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1414 vol
->file_mode
= S_IALLUGO
;
1416 case Opt_forcemandatorylock
:
1426 vol
->dynperm
= true;
1429 vol
->dynperm
= false;
1443 case Opt_nostrictsync
:
1444 vol
->nostrictsync
= 1;
1446 case Opt_strictsync
:
1447 vol
->nostrictsync
= 0;
1450 vol
->server_ino
= 1;
1452 case Opt_noserverino
:
1453 vol
->server_ino
= 0;
1455 case Opt_rwpidforward
:
1456 vol
->rwpidforward
= 1;
1465 vol
->no_psx_acl
= 0;
1468 vol
->no_psx_acl
= 1;
1470 case Opt_locallease
:
1471 vol
->local_lease
= 1;
1477 /* we do not do the following in secFlags because seal
1478 * is a per tree connection (mount) not a per socket
1479 * or per-smb connection option in the protocol
1480 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1485 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1488 #ifndef CONFIG_CIFS_FSCACHE
1489 cifs_dbg(VFS
, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1490 goto cifs_parse_mount_err
;
1494 case Opt_mfsymlinks
:
1495 vol
->mfsymlinks
= true;
1498 vol
->multiuser
= true;
1503 case Opt_nosharesock
:
1504 vol
->nosharesock
= true;
1506 case Opt_nopersistent
:
1507 vol
->nopersistent
= true;
1508 if (vol
->persistent
) {
1510 "persistenthandles mount options conflict\n");
1511 goto cifs_parse_mount_err
;
1514 case Opt_persistent
:
1515 vol
->persistent
= true;
1516 if ((vol
->nopersistent
) || (vol
->resilient
)) {
1518 "persistenthandles mount options conflict\n");
1519 goto cifs_parse_mount_err
;
1523 vol
->resilient
= true;
1524 if (vol
->persistent
) {
1526 "persistenthandles mount options conflict\n");
1527 goto cifs_parse_mount_err
;
1530 case Opt_noresilient
:
1531 vol
->resilient
= false; /* already the default */
1534 /* Numeric Values */
1536 if (get_option_uid(args
, &vol
->backupuid
)) {
1537 cifs_dbg(VFS
, "%s: Invalid backupuid value\n",
1539 goto cifs_parse_mount_err
;
1541 vol
->backupuid_specified
= true;
1544 if (get_option_gid(args
, &vol
->backupgid
)) {
1545 cifs_dbg(VFS
, "%s: Invalid backupgid value\n",
1547 goto cifs_parse_mount_err
;
1549 vol
->backupgid_specified
= true;
1552 if (get_option_uid(args
, &vol
->linux_uid
)) {
1553 cifs_dbg(VFS
, "%s: Invalid uid value\n",
1555 goto cifs_parse_mount_err
;
1557 uid_specified
= true;
1560 if (get_option_uid(args
, &vol
->cred_uid
)) {
1561 cifs_dbg(VFS
, "%s: Invalid cruid value\n",
1563 goto cifs_parse_mount_err
;
1567 if (get_option_gid(args
, &vol
->linux_gid
)) {
1568 cifs_dbg(VFS
, "%s: Invalid gid value\n",
1570 goto cifs_parse_mount_err
;
1572 gid_specified
= true;
1575 if (get_option_ul(args
, &option
)) {
1576 cifs_dbg(VFS
, "%s: Invalid file_mode value\n",
1578 goto cifs_parse_mount_err
;
1580 vol
->file_mode
= option
;
1583 if (get_option_ul(args
, &option
)) {
1584 cifs_dbg(VFS
, "%s: Invalid dir_mode value\n",
1586 goto cifs_parse_mount_err
;
1588 vol
->dir_mode
= option
;
1591 if (get_option_ul(args
, &option
) ||
1592 option
> USHRT_MAX
) {
1593 cifs_dbg(VFS
, "%s: Invalid port value\n",
1595 goto cifs_parse_mount_err
;
1597 port
= (unsigned short)option
;
1600 if (get_option_ul(args
, &option
)) {
1601 cifs_dbg(VFS
, "%s: Invalid rsize value\n",
1603 goto cifs_parse_mount_err
;
1605 vol
->rsize
= option
;
1608 if (get_option_ul(args
, &option
)) {
1609 cifs_dbg(VFS
, "%s: Invalid wsize value\n",
1611 goto cifs_parse_mount_err
;
1613 vol
->wsize
= option
;
1616 if (get_option_ul(args
, &option
)) {
1617 cifs_dbg(VFS
, "%s: Invalid actimeo value\n",
1619 goto cifs_parse_mount_err
;
1621 vol
->actimeo
= HZ
* option
;
1622 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1623 cifs_dbg(VFS
, "attribute cache timeout too large\n");
1624 goto cifs_parse_mount_err
;
1628 /* String Arguments */
1630 case Opt_blank_user
:
1631 /* null user, ie. anonymous authentication */
1633 vol
->username
= NULL
;
1636 string
= match_strdup(args
);
1640 if (strnlen(string
, CIFS_MAX_USERNAME_LEN
) >
1641 CIFS_MAX_USERNAME_LEN
) {
1642 pr_warn("CIFS: username too long\n");
1643 goto cifs_parse_mount_err
;
1646 kfree(vol
->username
);
1647 vol
->username
= kstrdup(string
, GFP_KERNEL
);
1649 goto cifs_parse_mount_err
;
1651 case Opt_blank_pass
:
1652 /* passwords have to be handled differently
1653 * to allow the character used for deliminator
1654 * to be passed within them
1658 * Check if this is a case where the password
1659 * starts with a delimiter
1661 tmp_end
= strchr(data
, '=');
1663 if (!(tmp_end
< end
&& tmp_end
[1] == delim
)) {
1664 /* No it is not. Set the password to NULL */
1665 kfree(vol
->password
);
1666 vol
->password
= NULL
;
1669 /* Yes it is. Drop down to Opt_pass below.*/
1671 /* Obtain the value string */
1672 value
= strchr(data
, '=');
1675 /* Set tmp_end to end of the string */
1676 tmp_end
= (char *) value
+ strlen(value
);
1678 /* Check if following character is the deliminator
1679 * If yes, we have encountered a double deliminator
1680 * reset the NULL character to the deliminator
1682 if (tmp_end
< end
&& tmp_end
[1] == delim
) {
1685 /* Keep iterating until we get to a single
1686 * deliminator OR the end
1688 while ((tmp_end
= strchr(tmp_end
, delim
))
1689 != NULL
&& (tmp_end
[1] == delim
)) {
1690 tmp_end
= (char *) &tmp_end
[2];
1693 /* Reset var options to point to next element */
1696 options
= (char *) &tmp_end
[1];
1698 /* Reached the end of the mount option
1703 kfree(vol
->password
);
1704 /* Now build new password string */
1705 temp_len
= strlen(value
);
1706 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1707 if (vol
->password
== NULL
) {
1708 pr_warn("CIFS: no memory for password\n");
1709 goto cifs_parse_mount_err
;
1712 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1713 vol
->password
[j
] = value
[i
];
1714 if ((value
[i
] == delim
) &&
1715 value
[i
+1] == delim
)
1716 /* skip the second deliminator */
1719 vol
->password
[j
] = '\0';
1722 /* FIXME: should this be an error instead? */
1726 string
= match_strdup(args
);
1730 if (!cifs_convert_address(dstaddr
, string
,
1732 pr_err("CIFS: bad ip= option (%s).\n", string
);
1733 goto cifs_parse_mount_err
;
1738 string
= match_strdup(args
);
1742 if (strnlen(string
, CIFS_MAX_DOMAINNAME_LEN
)
1743 == CIFS_MAX_DOMAINNAME_LEN
) {
1744 pr_warn("CIFS: domain name too long\n");
1745 goto cifs_parse_mount_err
;
1748 kfree(vol
->domainname
);
1749 vol
->domainname
= kstrdup(string
, GFP_KERNEL
);
1750 if (!vol
->domainname
) {
1751 pr_warn("CIFS: no memory for domainname\n");
1752 goto cifs_parse_mount_err
;
1754 cifs_dbg(FYI
, "Domain name set\n");
1757 string
= match_strdup(args
);
1761 if (!cifs_convert_address(
1762 (struct sockaddr
*)&vol
->srcaddr
,
1763 string
, strlen(string
))) {
1764 pr_warn("CIFS: Could not parse srcaddr: %s\n",
1766 goto cifs_parse_mount_err
;
1770 string
= match_strdup(args
);
1774 if (strnlen(string
, 1024) >= 65) {
1775 pr_warn("CIFS: iocharset name too long.\n");
1776 goto cifs_parse_mount_err
;
1779 if (strncasecmp(string
, "default", 7) != 0) {
1780 kfree(vol
->iocharset
);
1781 vol
->iocharset
= kstrdup(string
,
1783 if (!vol
->iocharset
) {
1784 pr_warn("CIFS: no memory for charset\n");
1785 goto cifs_parse_mount_err
;
1788 /* if iocharset not set then load_nls_default
1791 cifs_dbg(FYI
, "iocharset set to %s\n", string
);
1793 case Opt_netbiosname
:
1794 string
= match_strdup(args
);
1798 memset(vol
->source_rfc1001_name
, 0x20,
1801 * FIXME: are there cases in which a comma can
1802 * be valid in workstation netbios name (and
1803 * need special handling)?
1805 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1806 /* don't ucase netbiosname for user */
1809 vol
->source_rfc1001_name
[i
] = string
[i
];
1811 /* The string has 16th byte zero still from
1812 * set at top of the function
1814 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1815 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1818 /* servernetbiosname specified override *SMBSERVER */
1819 string
= match_strdup(args
);
1823 /* last byte, type, is 0x20 for servr type */
1824 memset(vol
->target_rfc1001_name
, 0x20,
1825 RFC1001_NAME_LEN_WITH_NULL
);
1827 /* BB are there cases in which a comma can be
1828 valid in this workstation netbios name
1829 (and need special handling)? */
1831 /* user or mount helper must uppercase the
1833 for (i
= 0; i
< 15; i
++) {
1836 vol
->target_rfc1001_name
[i
] = string
[i
];
1838 /* The string has 16th byte zero still from
1839 set at top of the function */
1840 if (i
== RFC1001_NAME_LEN
&& string
[i
] != 0)
1841 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1844 string
= match_strdup(args
);
1848 if (strncasecmp(string
, "1", 1) == 0) {
1849 /* This is the default */
1852 /* For all other value, error */
1853 pr_warn("CIFS: Invalid version specified\n");
1854 goto cifs_parse_mount_err
;
1856 string
= match_strdup(args
);
1860 if (cifs_parse_smb_version(string
, vol
) != 0)
1861 goto cifs_parse_mount_err
;
1864 string
= match_strdup(args
);
1868 if (cifs_parse_security_flavors(string
, vol
) != 0)
1869 goto cifs_parse_mount_err
;
1872 string
= match_strdup(args
);
1876 if (cifs_parse_cache_flavor(string
, vol
) != 0)
1877 goto cifs_parse_mount_err
;
1881 * An option we don't recognize. Save it off for later
1882 * if we haven't already found one
1888 /* Free up any allocated string */
1893 if (!sloppy
&& invalid
) {
1894 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid
);
1895 goto cifs_parse_mount_err
;
1899 /* Muliuser mounts require CONFIG_KEYS support */
1900 if (vol
->multiuser
) {
1901 cifs_dbg(VFS
, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1902 goto cifs_parse_mount_err
;
1906 cifs_dbg(VFS
, "CIFS mount error: No usable UNC path provided in device string!\n");
1907 goto cifs_parse_mount_err
;
1910 /* make sure UNC has a share name */
1911 if (!strchr(vol
->UNC
+ 3, '\\')) {
1912 cifs_dbg(VFS
, "Malformed UNC. Unable to find share name.\n");
1913 goto cifs_parse_mount_err
;
1917 /* No ip= option specified? Try to get it from UNC */
1918 if (!cifs_convert_address(dstaddr
, &vol
->UNC
[2],
1919 strlen(&vol
->UNC
[2]))) {
1920 pr_err("Unable to determine destination address.\n");
1921 goto cifs_parse_mount_err
;
1925 /* set the port that we got earlier */
1926 cifs_set_port(dstaddr
, port
);
1929 vol
->override_uid
= override_uid
;
1930 else if (override_uid
== 1)
1931 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
1934 vol
->override_gid
= override_gid
;
1935 else if (override_gid
== 1)
1936 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
1938 kfree(mountdata_copy
);
1942 pr_warn("Could not allocate temporary buffer\n");
1943 cifs_parse_mount_err
:
1945 kfree(mountdata_copy
);
1949 /** Returns true if srcaddr isn't specified and rhs isn't
1950 * specified, or if srcaddr is specified and
1951 * matches the IP address of the rhs argument.
1954 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1956 switch (srcaddr
->sa_family
) {
1958 return (rhs
->sa_family
== AF_UNSPEC
);
1960 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1961 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1962 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1965 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1966 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
1967 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1971 return false; /* don't expect to be here */
1976 * If no port is specified in addr structure, we try to match with 445 port
1977 * and if it fails - with 139 ports. It should be called only if address
1978 * families of server and addr are equal.
1981 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1983 __be16 port
, *sport
;
1985 switch (addr
->sa_family
) {
1987 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1988 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1991 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1992 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
2000 port
= htons(CIFS_PORT
);
2004 port
= htons(RFC1001_PORT
);
2007 return port
== *sport
;
2011 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
2012 struct sockaddr
*srcaddr
)
2014 switch (addr
->sa_family
) {
2016 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
2017 struct sockaddr_in
*srv_addr4
=
2018 (struct sockaddr_in
*)&server
->dstaddr
;
2020 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
2025 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
2026 struct sockaddr_in6
*srv_addr6
=
2027 (struct sockaddr_in6
*)&server
->dstaddr
;
2029 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
2030 &srv_addr6
->sin6_addr
))
2032 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
2038 return false; /* don't expect to be here */
2041 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
2048 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2051 * The select_sectype function should either return the vol->sectype
2052 * that was specified, or "Unspecified" if that sectype was not
2053 * compatible with the given NEGOTIATE request.
2055 if (select_sectype(server
, vol
->sectype
) == Unspecified
)
2059 * Now check if signing mode is acceptable. No need to check
2060 * global_secflags at this point since if MUST_SIGN is set then
2061 * the server->sign had better be too.
2063 if (vol
->sign
&& !server
->sign
)
2069 static int match_server(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2071 struct sockaddr
*addr
= (struct sockaddr
*)&vol
->dstaddr
;
2073 if (vol
->nosharesock
)
2076 if ((server
->vals
!= vol
->vals
) || (server
->ops
!= vol
->ops
))
2079 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
2082 if (!match_address(server
, addr
,
2083 (struct sockaddr
*)&vol
->srcaddr
))
2086 if (!match_port(server
, addr
))
2089 if (!match_security(server
, vol
))
2095 static struct TCP_Server_Info
*
2096 cifs_find_tcp_session(struct smb_vol
*vol
)
2098 struct TCP_Server_Info
*server
;
2100 spin_lock(&cifs_tcp_ses_lock
);
2101 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
2102 if (!match_server(server
, vol
))
2105 ++server
->srv_count
;
2106 spin_unlock(&cifs_tcp_ses_lock
);
2107 cifs_dbg(FYI
, "Existing tcp session with server found\n");
2110 spin_unlock(&cifs_tcp_ses_lock
);
2115 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
2117 struct task_struct
*task
;
2119 spin_lock(&cifs_tcp_ses_lock
);
2120 if (--server
->srv_count
> 0) {
2121 spin_unlock(&cifs_tcp_ses_lock
);
2125 put_net(cifs_net_ns(server
));
2127 list_del_init(&server
->tcp_ses_list
);
2128 spin_unlock(&cifs_tcp_ses_lock
);
2130 cancel_delayed_work_sync(&server
->echo
);
2132 spin_lock(&GlobalMid_Lock
);
2133 server
->tcpStatus
= CifsExiting
;
2134 spin_unlock(&GlobalMid_Lock
);
2136 cifs_crypto_shash_release(server
);
2137 cifs_fscache_release_client_cookie(server
);
2139 kfree(server
->session_key
.response
);
2140 server
->session_key
.response
= NULL
;
2141 server
->session_key
.len
= 0;
2143 task
= xchg(&server
->tsk
, NULL
);
2145 force_sig(SIGKILL
, task
);
2148 static struct TCP_Server_Info
*
2149 cifs_get_tcp_session(struct smb_vol
*volume_info
)
2151 struct TCP_Server_Info
*tcp_ses
= NULL
;
2154 cifs_dbg(FYI
, "UNC: %s\n", volume_info
->UNC
);
2156 /* see if we already have a matching tcp_ses */
2157 tcp_ses
= cifs_find_tcp_session(volume_info
);
2161 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
2167 tcp_ses
->ops
= volume_info
->ops
;
2168 tcp_ses
->vals
= volume_info
->vals
;
2169 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
2170 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
2171 if (IS_ERR(tcp_ses
->hostname
)) {
2172 rc
= PTR_ERR(tcp_ses
->hostname
);
2173 goto out_err_crypto_release
;
2176 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
2177 tcp_ses
->noautotune
= volume_info
->noautotune
;
2178 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
2179 tcp_ses
->in_flight
= 0;
2180 tcp_ses
->credits
= 1;
2181 init_waitqueue_head(&tcp_ses
->response_q
);
2182 init_waitqueue_head(&tcp_ses
->request_q
);
2183 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
2184 mutex_init(&tcp_ses
->srv_mutex
);
2185 memcpy(tcp_ses
->workstation_RFC1001_name
,
2186 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2187 memcpy(tcp_ses
->server_RFC1001_name
,
2188 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
2189 tcp_ses
->session_estab
= false;
2190 tcp_ses
->sequence_number
= 0;
2191 tcp_ses
->lstrp
= jiffies
;
2192 spin_lock_init(&tcp_ses
->req_lock
);
2193 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
2194 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
2195 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
2196 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
2197 sizeof(tcp_ses
->srcaddr
));
2198 memcpy(&tcp_ses
->dstaddr
, &volume_info
->dstaddr
,
2199 sizeof(tcp_ses
->dstaddr
));
2200 #ifdef CONFIG_CIFS_SMB2
2201 get_random_bytes(tcp_ses
->client_guid
, SMB2_CLIENT_GUID_SIZE
);
2204 * at this point we are the only ones with the pointer
2205 * to the struct since the kernel thread not created yet
2206 * no need to spinlock this init of tcpStatus or srv_count
2208 tcp_ses
->tcpStatus
= CifsNew
;
2209 ++tcp_ses
->srv_count
;
2211 rc
= ip_connect(tcp_ses
);
2213 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
2214 goto out_err_crypto_release
;
2218 * since we're in a cifs function already, we know that
2219 * this will succeed. No need for try_module_get().
2221 __module_get(THIS_MODULE
);
2222 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
2224 if (IS_ERR(tcp_ses
->tsk
)) {
2225 rc
= PTR_ERR(tcp_ses
->tsk
);
2226 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
2227 module_put(THIS_MODULE
);
2228 goto out_err_crypto_release
;
2230 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
2232 /* thread spawned, put it on the list */
2233 spin_lock(&cifs_tcp_ses_lock
);
2234 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
2235 spin_unlock(&cifs_tcp_ses_lock
);
2237 cifs_fscache_get_client_cookie(tcp_ses
);
2239 /* queue echo request delayed work */
2240 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
2244 out_err_crypto_release
:
2245 cifs_crypto_shash_release(tcp_ses
);
2247 put_net(cifs_net_ns(tcp_ses
));
2251 if (!IS_ERR(tcp_ses
->hostname
))
2252 kfree(tcp_ses
->hostname
);
2253 if (tcp_ses
->ssocket
)
2254 sock_release(tcp_ses
->ssocket
);
2260 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
2262 if (vol
->sectype
!= Unspecified
&&
2263 vol
->sectype
!= ses
->sectype
)
2266 switch (ses
->sectype
) {
2268 if (!uid_eq(vol
->cred_uid
, ses
->cred_uid
))
2272 /* NULL username means anonymous session */
2273 if (ses
->user_name
== NULL
) {
2279 /* anything else takes username/password */
2280 if (strncmp(ses
->user_name
,
2281 vol
->username
? vol
->username
: "",
2282 CIFS_MAX_USERNAME_LEN
))
2284 if ((vol
->username
&& strlen(vol
->username
) != 0) &&
2285 ses
->password
!= NULL
&&
2286 strncmp(ses
->password
,
2287 vol
->password
? vol
->password
: "",
2288 CIFS_MAX_PASSWORD_LEN
))
2294 static struct cifs_ses
*
2295 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2297 struct cifs_ses
*ses
;
2299 spin_lock(&cifs_tcp_ses_lock
);
2300 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2301 if (ses
->status
== CifsExiting
)
2303 if (!match_session(ses
, vol
))
2306 spin_unlock(&cifs_tcp_ses_lock
);
2309 spin_unlock(&cifs_tcp_ses_lock
);
2314 cifs_put_smb_ses(struct cifs_ses
*ses
)
2316 unsigned int rc
, xid
;
2317 struct TCP_Server_Info
*server
= ses
->server
;
2319 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2321 spin_lock(&cifs_tcp_ses_lock
);
2322 if (ses
->status
== CifsExiting
) {
2323 spin_unlock(&cifs_tcp_ses_lock
);
2326 if (--ses
->ses_count
> 0) {
2327 spin_unlock(&cifs_tcp_ses_lock
);
2330 if (ses
->status
== CifsGood
)
2331 ses
->status
= CifsExiting
;
2332 spin_unlock(&cifs_tcp_ses_lock
);
2334 if (ses
->status
== CifsExiting
&& server
->ops
->logoff
) {
2336 rc
= server
->ops
->logoff(xid
, ses
);
2338 cifs_dbg(VFS
, "%s: Session Logoff failure rc=%d\n",
2343 spin_lock(&cifs_tcp_ses_lock
);
2344 list_del_init(&ses
->smb_ses_list
);
2345 spin_unlock(&cifs_tcp_ses_lock
);
2348 cifs_put_tcp_session(server
);
2353 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2354 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2356 /* Populate username and pw fields from keyring if possible */
2358 cifs_set_cifscreds(struct smb_vol
*vol
, struct cifs_ses
*ses
)
2361 const char *delim
, *payload
;
2365 struct TCP_Server_Info
*server
= ses
->server
;
2366 struct sockaddr_in
*sa
;
2367 struct sockaddr_in6
*sa6
;
2368 const struct user_key_payload
*upayload
;
2370 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
2374 /* try to find an address key first */
2375 switch (server
->dstaddr
.ss_family
) {
2377 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
2378 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
2381 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2382 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
2385 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
2386 server
->dstaddr
.ss_family
);
2391 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2392 key
= request_key(&key_type_logon
, desc
, "");
2394 if (!ses
->domainName
) {
2395 cifs_dbg(FYI
, "domainName is NULL\n");
2400 /* didn't work, try to find a domain key */
2401 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
2402 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
2403 key
= request_key(&key_type_logon
, desc
, "");
2410 down_read(&key
->sem
);
2411 upayload
= user_key_payload(key
);
2412 if (IS_ERR_OR_NULL(upayload
)) {
2413 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
2417 /* find first : in payload */
2418 payload
= upayload
->data
;
2419 delim
= strnchr(payload
, upayload
->datalen
, ':');
2420 cifs_dbg(FYI
, "payload=%s\n", payload
);
2422 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
2428 len
= delim
- payload
;
2429 if (len
> CIFS_MAX_USERNAME_LEN
|| len
<= 0) {
2430 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
2436 vol
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
2437 if (!vol
->username
) {
2438 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
2443 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, vol
->username
);
2445 len
= key
->datalen
- (len
+ 1);
2446 if (len
> CIFS_MAX_PASSWORD_LEN
|| len
<= 0) {
2447 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
2449 kfree(vol
->username
);
2450 vol
->username
= NULL
;
2455 vol
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
2456 if (!vol
->password
) {
2457 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
2460 kfree(vol
->username
);
2461 vol
->username
= NULL
;
2470 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
2473 #else /* ! CONFIG_KEYS */
2475 cifs_set_cifscreds(struct smb_vol
*vol
__attribute__((unused
)),
2476 struct cifs_ses
*ses
__attribute__((unused
)))
2480 #endif /* CONFIG_KEYS */
2482 static struct cifs_ses
*
2483 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2487 struct cifs_ses
*ses
;
2488 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2489 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2493 ses
= cifs_find_smb_ses(server
, volume_info
);
2495 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
2498 mutex_lock(&ses
->session_mutex
);
2499 rc
= cifs_negotiate_protocol(xid
, ses
);
2501 mutex_unlock(&ses
->session_mutex
);
2502 /* problem -- put our ses reference */
2503 cifs_put_smb_ses(ses
);
2507 if (ses
->need_reconnect
) {
2508 cifs_dbg(FYI
, "Session needs reconnect\n");
2509 rc
= cifs_setup_session(xid
, ses
,
2510 volume_info
->local_nls
);
2512 mutex_unlock(&ses
->session_mutex
);
2513 /* problem -- put our reference */
2514 cifs_put_smb_ses(ses
);
2519 mutex_unlock(&ses
->session_mutex
);
2521 /* existing SMB ses has a server reference already */
2522 cifs_put_tcp_session(server
);
2527 cifs_dbg(FYI
, "Existing smb sess not found\n");
2528 ses
= sesInfoAlloc();
2532 /* new SMB session uses our server ref */
2533 ses
->server
= server
;
2534 if (server
->dstaddr
.ss_family
== AF_INET6
)
2535 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2537 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2539 if (volume_info
->username
) {
2540 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2541 if (!ses
->user_name
)
2545 /* volume_info->password freed at unmount */
2546 if (volume_info
->password
) {
2547 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2551 if (volume_info
->domainname
) {
2552 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2553 if (!ses
->domainName
)
2556 ses
->cred_uid
= volume_info
->cred_uid
;
2557 ses
->linux_uid
= volume_info
->linux_uid
;
2559 ses
->sectype
= volume_info
->sectype
;
2560 ses
->sign
= volume_info
->sign
;
2562 mutex_lock(&ses
->session_mutex
);
2563 rc
= cifs_negotiate_protocol(xid
, ses
);
2565 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2566 mutex_unlock(&ses
->session_mutex
);
2570 /* success, put it on the list */
2571 spin_lock(&cifs_tcp_ses_lock
);
2572 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2573 spin_unlock(&cifs_tcp_ses_lock
);
2584 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2586 if (tcon
->tidStatus
== CifsExiting
)
2588 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2593 static struct cifs_tcon
*
2594 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2596 struct list_head
*tmp
;
2597 struct cifs_tcon
*tcon
;
2599 spin_lock(&cifs_tcp_ses_lock
);
2600 list_for_each(tmp
, &ses
->tcon_list
) {
2601 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2602 if (!match_tcon(tcon
, unc
))
2605 spin_unlock(&cifs_tcp_ses_lock
);
2608 spin_unlock(&cifs_tcp_ses_lock
);
2613 cifs_put_tcon(struct cifs_tcon
*tcon
)
2616 struct cifs_ses
*ses
= tcon
->ses
;
2618 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2619 spin_lock(&cifs_tcp_ses_lock
);
2620 if (--tcon
->tc_count
> 0) {
2621 spin_unlock(&cifs_tcp_ses_lock
);
2625 list_del_init(&tcon
->tcon_list
);
2626 spin_unlock(&cifs_tcp_ses_lock
);
2629 if (ses
->server
->ops
->tree_disconnect
)
2630 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
2633 cifs_fscache_release_super_cookie(tcon
);
2635 cifs_put_smb_ses(ses
);
2638 static struct cifs_tcon
*
2639 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2642 struct cifs_tcon
*tcon
;
2644 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2646 cifs_dbg(FYI
, "Found match on UNC path\n");
2647 /* existing tcon already has a reference */
2648 cifs_put_smb_ses(ses
);
2649 if (tcon
->seal
!= volume_info
->seal
)
2650 cifs_dbg(VFS
, "transport encryption setting conflicts with existing tid\n");
2654 if (!ses
->server
->ops
->tree_connect
) {
2659 tcon
= tconInfoAlloc();
2666 if (volume_info
->password
) {
2667 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2668 if (!tcon
->password
) {
2675 * BB Do we need to wrap session_mutex around this TCon call and Unix
2676 * SetFS as we do on SessSetup and reconnect?
2679 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, volume_info
->UNC
, tcon
,
2680 volume_info
->local_nls
);
2682 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
2686 if (volume_info
->nodfs
) {
2687 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2688 cifs_dbg(FYI
, "DFS disabled (%d)\n", tcon
->Flags
);
2690 tcon
->seal
= volume_info
->seal
;
2691 tcon
->use_persistent
= false;
2692 /* check if SMB2 or later, CIFS does not support persistent handles */
2693 if (volume_info
->persistent
) {
2694 if (ses
->server
->vals
->protocol_id
== 0) {
2696 "SMB3 or later required for persistent handles\n");
2699 #ifdef CONFIG_CIFS_SMB2
2700 } else if (ses
->server
->capabilities
&
2701 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2702 tcon
->use_persistent
= true;
2703 else /* persistent handles requested but not supported */ {
2705 "Persistent handles not supported on share\n");
2708 #endif /* CONFIG_CIFS_SMB2 */
2710 #ifdef CONFIG_CIFS_SMB2
2711 } else if ((tcon
->capabilities
& SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY
)
2712 && (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2713 && (volume_info
->nopersistent
== false)) {
2714 cifs_dbg(FYI
, "enabling persistent handles\n");
2715 tcon
->use_persistent
= true;
2716 #endif /* CONFIG_CIFS_SMB2 */
2717 } else if (volume_info
->resilient
) {
2718 if (ses
->server
->vals
->protocol_id
== 0) {
2720 "SMB2.1 or later required for resilient handles\n");
2724 tcon
->use_resilient
= true;
2728 * We can have only one retry value for a connection to a share so for
2729 * resources mounted more than once to the same server share the last
2730 * value passed in for the retry flag is used.
2732 tcon
->retry
= volume_info
->retry
;
2733 tcon
->nocase
= volume_info
->nocase
;
2734 tcon
->local_lease
= volume_info
->local_lease
;
2735 INIT_LIST_HEAD(&tcon
->pending_opens
);
2737 spin_lock(&cifs_tcp_ses_lock
);
2738 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2739 spin_unlock(&cifs_tcp_ses_lock
);
2741 cifs_fscache_get_super_cookie(tcon
);
2751 cifs_put_tlink(struct tcon_link
*tlink
)
2753 if (!tlink
|| IS_ERR(tlink
))
2756 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2757 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2758 tlink
->tl_time
= jiffies
;
2762 if (!IS_ERR(tlink_tcon(tlink
)))
2763 cifs_put_tcon(tlink_tcon(tlink
));
2768 static inline struct tcon_link
*
2769 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2771 return cifs_sb
->master_tlink
;
2775 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2777 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2778 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2780 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2783 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2784 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2788 * We want to share sb only if we don't specify an r/wsize or
2789 * specified r/wsize is greater than or equal to existing one.
2791 if (new->wsize
&& new->wsize
< old
->wsize
)
2794 if (new->rsize
&& new->rsize
< old
->rsize
)
2797 if (!uid_eq(old
->mnt_uid
, new->mnt_uid
) || !gid_eq(old
->mnt_gid
, new->mnt_gid
))
2800 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2801 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2804 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2807 if (old
->actimeo
!= new->actimeo
)
2814 cifs_match_super(struct super_block
*sb
, void *data
)
2816 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2817 struct smb_vol
*volume_info
;
2818 struct cifs_sb_info
*cifs_sb
;
2819 struct TCP_Server_Info
*tcp_srv
;
2820 struct cifs_ses
*ses
;
2821 struct cifs_tcon
*tcon
;
2822 struct tcon_link
*tlink
;
2825 spin_lock(&cifs_tcp_ses_lock
);
2826 cifs_sb
= CIFS_SB(sb
);
2827 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2828 if (IS_ERR(tlink
)) {
2829 spin_unlock(&cifs_tcp_ses_lock
);
2832 tcon
= tlink_tcon(tlink
);
2834 tcp_srv
= ses
->server
;
2836 volume_info
= mnt_data
->vol
;
2838 if (!match_server(tcp_srv
, volume_info
) ||
2839 !match_session(ses
, volume_info
) ||
2840 !match_tcon(tcon
, volume_info
->UNC
)) {
2845 rc
= compare_mount_options(sb
, mnt_data
);
2847 spin_unlock(&cifs_tcp_ses_lock
);
2848 cifs_put_tlink(tlink
);
2853 get_dfs_path(const unsigned int xid
, struct cifs_ses
*ses
, const char *old_path
,
2854 const struct nls_table
*nls_codepage
, unsigned int *num_referrals
,
2855 struct dfs_info3_param
**referrals
, int remap
)
2860 if (!ses
->server
->ops
->tree_connect
|| !ses
->server
->ops
->get_dfs_refer
)
2866 if (ses
->ipc_tid
== 0) {
2867 temp_unc
= kmalloc(2 /* for slashes */ +
2868 strnlen(ses
->serverName
, SERVER_NAME_LEN_WITH_NULL
* 2)
2869 + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL
);
2870 if (temp_unc
== NULL
)
2874 strcpy(temp_unc
+ 2, ses
->serverName
);
2875 strcpy(temp_unc
+ 2 + strlen(ses
->serverName
), "\\IPC$");
2876 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, temp_unc
, NULL
,
2878 cifs_dbg(FYI
, "Tcon rc = %d ipc_tid = %d\n", rc
, ses
->ipc_tid
);
2882 rc
= ses
->server
->ops
->get_dfs_refer(xid
, ses
, old_path
,
2883 referrals
, num_referrals
,
2884 nls_codepage
, remap
);
2886 * BB - map targetUNCs to dfs_info3 structures, here or in
2887 * ses->server->ops->get_dfs_refer.
2893 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2894 static struct lock_class_key cifs_key
[2];
2895 static struct lock_class_key cifs_slock_key
[2];
2898 cifs_reclassify_socket4(struct socket
*sock
)
2900 struct sock
*sk
= sock
->sk
;
2901 BUG_ON(sock_owned_by_user(sk
));
2902 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2903 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2907 cifs_reclassify_socket6(struct socket
*sock
)
2909 struct sock
*sk
= sock
->sk
;
2910 BUG_ON(sock_owned_by_user(sk
));
2911 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2912 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2916 cifs_reclassify_socket4(struct socket
*sock
)
2921 cifs_reclassify_socket6(struct socket
*sock
)
2926 /* See RFC1001 section 14 on representation of Netbios names */
2927 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2931 for (i
= 0, j
= 0; i
< (length
); i
++) {
2932 /* mask a nibble at a time and encode */
2933 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2934 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2941 bind_socket(struct TCP_Server_Info
*server
)
2944 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2945 /* Bind to the specified local IP address */
2946 struct socket
*socket
= server
->ssocket
;
2947 rc
= socket
->ops
->bind(socket
,
2948 (struct sockaddr
*) &server
->srcaddr
,
2949 sizeof(server
->srcaddr
));
2951 struct sockaddr_in
*saddr4
;
2952 struct sockaddr_in6
*saddr6
;
2953 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2954 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2955 if (saddr6
->sin6_family
== AF_INET6
)
2956 cifs_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
2957 &saddr6
->sin6_addr
, rc
);
2959 cifs_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
2960 &saddr4
->sin_addr
.s_addr
, rc
);
2967 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2971 * some servers require RFC1001 sessinit before sending
2972 * negprot - BB check reconnection in case where second
2973 * sessinit is sent but no second negprot
2975 struct rfc1002_session_packet
*ses_init_buf
;
2976 struct smb_hdr
*smb_buf
;
2977 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2980 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2982 if (server
->server_RFC1001_name
&&
2983 server
->server_RFC1001_name
[0] != 0)
2984 rfc1002mangle(ses_init_buf
->trailer
.
2985 session_req
.called_name
,
2986 server
->server_RFC1001_name
,
2987 RFC1001_NAME_LEN_WITH_NULL
);
2989 rfc1002mangle(ses_init_buf
->trailer
.
2990 session_req
.called_name
,
2991 DEFAULT_CIFS_CALLED_NAME
,
2992 RFC1001_NAME_LEN_WITH_NULL
);
2994 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2997 * calling name ends in null (byte 16) from old smb
3000 if (server
->workstation_RFC1001_name
[0] != 0)
3001 rfc1002mangle(ses_init_buf
->trailer
.
3002 session_req
.calling_name
,
3003 server
->workstation_RFC1001_name
,
3004 RFC1001_NAME_LEN_WITH_NULL
);
3006 rfc1002mangle(ses_init_buf
->trailer
.
3007 session_req
.calling_name
,
3009 RFC1001_NAME_LEN_WITH_NULL
);
3011 ses_init_buf
->trailer
.session_req
.scope1
= 0;
3012 ses_init_buf
->trailer
.session_req
.scope2
= 0;
3013 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
3015 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3016 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
3017 rc
= smb_send(server
, smb_buf
, 0x44);
3018 kfree(ses_init_buf
);
3020 * RFC1001 layer in at least one server
3021 * requires very short break before negprot
3022 * presumably because not expecting negprot
3023 * to follow so fast. This is a simple
3024 * solution that works without
3025 * complicating the code and causes no
3026 * significant slowing down on mount
3029 usleep_range(1000, 2000);
3032 * else the negprot may still work without this
3033 * even though malloc failed
3040 generic_ip_connect(struct TCP_Server_Info
*server
)
3045 struct socket
*socket
= server
->ssocket
;
3046 struct sockaddr
*saddr
;
3048 saddr
= (struct sockaddr
*) &server
->dstaddr
;
3050 if (server
->dstaddr
.ss_family
== AF_INET6
) {
3051 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
3052 slen
= sizeof(struct sockaddr_in6
);
3055 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
3056 slen
= sizeof(struct sockaddr_in
);
3060 if (socket
== NULL
) {
3061 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
3062 IPPROTO_TCP
, &socket
, 1);
3064 cifs_dbg(VFS
, "Error %d creating socket\n", rc
);
3065 server
->ssocket
= NULL
;
3069 /* BB other socket options to set KEEPALIVE, NODELAY? */
3070 cifs_dbg(FYI
, "Socket created\n");
3071 server
->ssocket
= socket
;
3072 socket
->sk
->sk_allocation
= GFP_NOFS
;
3073 if (sfamily
== AF_INET6
)
3074 cifs_reclassify_socket6(socket
);
3076 cifs_reclassify_socket4(socket
);
3079 rc
= bind_socket(server
);
3084 * Eventually check for other socket options to change from
3085 * the default. sock_setsockopt not used because it expects
3088 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
3089 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
3091 /* make the bufsizes depend on wsize/rsize and max requests */
3092 if (server
->noautotune
) {
3093 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
3094 socket
->sk
->sk_sndbuf
= 200 * 1024;
3095 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
3096 socket
->sk
->sk_rcvbuf
= 140 * 1024;
3099 if (server
->tcp_nodelay
) {
3101 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
3102 (char *)&val
, sizeof(val
));
3104 cifs_dbg(FYI
, "set TCP_NODELAY socket option error %d\n",
3108 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3109 socket
->sk
->sk_sndbuf
,
3110 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
3112 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
3114 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
3115 sock_release(socket
);
3116 server
->ssocket
= NULL
;
3120 if (sport
== htons(RFC1001_PORT
))
3121 rc
= ip_rfc1001_connect(server
);
3127 ip_connect(struct TCP_Server_Info
*server
)
3130 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
3131 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
3133 if (server
->dstaddr
.ss_family
== AF_INET6
)
3134 sport
= &addr6
->sin6_port
;
3136 sport
= &addr
->sin_port
;
3141 /* try with 445 port at first */
3142 *sport
= htons(CIFS_PORT
);
3144 rc
= generic_ip_connect(server
);
3148 /* if it failed, try with 139 port */
3149 *sport
= htons(RFC1001_PORT
);
3152 return generic_ip_connect(server
);
3155 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
3156 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
3158 /* if we are reconnecting then should we check to see if
3159 * any requested capabilities changed locally e.g. via
3160 * remount but we can not do much about it here
3161 * if they have (even if we could detect it by the following)
3162 * Perhaps we could add a backpointer to array of sb from tcon
3163 * or if we change to make all sb to same share the same
3164 * sb as NFS - then we only have one backpointer to sb.
3165 * What if we wanted to mount the server share twice once with
3166 * and once without posixacls or posix paths? */
3167 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3169 if (vol_info
&& vol_info
->no_linux_ext
) {
3170 tcon
->fsUnixInfo
.Capability
= 0;
3171 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
3172 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
3174 } else if (vol_info
)
3175 tcon
->unix_ext
= 1; /* Unix Extensions supported */
3177 if (tcon
->unix_ext
== 0) {
3178 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
3182 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
3183 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
3184 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
3185 /* check for reconnect case in which we do not
3186 want to change the mount behavior if we can avoid it */
3187 if (vol_info
== NULL
) {
3188 /* turn off POSIX ACL and PATHNAMES if not set
3189 originally at mount time */
3190 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
3191 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3192 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3193 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3194 cifs_dbg(VFS
, "POSIXPATH support change\n");
3195 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3196 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
3197 cifs_dbg(VFS
, "possible reconnect error\n");
3198 cifs_dbg(VFS
, "server disabled POSIX path support\n");
3202 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3203 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
3205 cap
&= CIFS_UNIX_CAP_MASK
;
3206 if (vol_info
&& vol_info
->no_psx_acl
)
3207 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
3208 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
3209 cifs_dbg(FYI
, "negotiated posix acl support\n");
3211 cifs_sb
->mnt_cifs_flags
|=
3212 CIFS_MOUNT_POSIXACL
;
3215 if (vol_info
&& vol_info
->posix_paths
== 0)
3216 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
3217 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
3218 cifs_dbg(FYI
, "negotiate posix pathnames\n");
3220 cifs_sb
->mnt_cifs_flags
|=
3221 CIFS_MOUNT_POSIX_PATHS
;
3224 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
3225 #ifdef CONFIG_CIFS_DEBUG2
3226 if (cap
& CIFS_UNIX_FCNTL_CAP
)
3227 cifs_dbg(FYI
, "FCNTL cap\n");
3228 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
3229 cifs_dbg(FYI
, "EXTATTR cap\n");
3230 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
3231 cifs_dbg(FYI
, "POSIX path cap\n");
3232 if (cap
& CIFS_UNIX_XATTR_CAP
)
3233 cifs_dbg(FYI
, "XATTR cap\n");
3234 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
3235 cifs_dbg(FYI
, "POSIX ACL cap\n");
3236 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
3237 cifs_dbg(FYI
, "very large read cap\n");
3238 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
3239 cifs_dbg(FYI
, "very large write cap\n");
3240 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
3241 cifs_dbg(FYI
, "transport encryption cap\n");
3242 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
3243 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
3244 #endif /* CIFS_DEBUG2 */
3245 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
3246 if (vol_info
== NULL
) {
3247 cifs_dbg(FYI
, "resetting capabilities failed\n");
3249 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");
3255 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
3256 struct cifs_sb_info
*cifs_sb
)
3258 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
3260 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
3261 cifs_sb
->tlink_tree
= RB_ROOT
;
3264 * Temporarily set r/wsize for matching superblock. If we end up using
3265 * new sb then client will later negotiate it downward if needed.
3267 cifs_sb
->rsize
= pvolume_info
->rsize
;
3268 cifs_sb
->wsize
= pvolume_info
->wsize
;
3270 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
3271 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
3272 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
3273 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
3274 cifs_dbg(FYI
, "file mode: 0x%hx dir mode: 0x%hx\n",
3275 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
3277 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
3278 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
3280 if (pvolume_info
->noperm
)
3281 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
3282 if (pvolume_info
->setuids
)
3283 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
3284 if (pvolume_info
->server_ino
)
3285 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
3286 if (pvolume_info
->remap
)
3287 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SFM_CHR
;
3288 if (pvolume_info
->sfu_remap
)
3289 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
3290 if (pvolume_info
->no_xattr
)
3291 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
3292 if (pvolume_info
->sfu_emul
)
3293 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
3294 if (pvolume_info
->nobrl
)
3295 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
3296 if (pvolume_info
->nostrictsync
)
3297 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
3298 if (pvolume_info
->mand_lock
)
3299 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
3300 if (pvolume_info
->rwpidforward
)
3301 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
3302 if (pvolume_info
->cifs_acl
)
3303 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
3304 if (pvolume_info
->backupuid_specified
) {
3305 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
3306 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
3308 if (pvolume_info
->backupgid_specified
) {
3309 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
3310 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
3312 if (pvolume_info
->override_uid
)
3313 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
3314 if (pvolume_info
->override_gid
)
3315 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
3316 if (pvolume_info
->dynperm
)
3317 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
3318 if (pvolume_info
->fsc
)
3319 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
3320 if (pvolume_info
->multiuser
)
3321 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
3322 CIFS_MOUNT_NO_PERM
);
3323 if (pvolume_info
->strict_io
)
3324 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
3325 if (pvolume_info
->direct_io
) {
3326 cifs_dbg(FYI
, "mounting share using direct i/o\n");
3327 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
3329 if (pvolume_info
->mfsymlinks
) {
3330 if (pvolume_info
->sfu_emul
) {
3332 * Our SFU ("Services for Unix" emulation does not allow
3333 * creating symlinks but does allow reading existing SFU
3334 * symlinks (it does allow both creating and reading SFU
3335 * style mknod and FIFOs though). When "mfsymlinks" and
3336 * "sfu" are both enabled at the same time, it allows
3337 * reading both types of symlinks, but will only create
3338 * them with mfsymlinks format. This allows better
3339 * Apple compatibility (probably better for Samba too)
3340 * while still recognizing old Windows style symlinks.
3342 cifs_dbg(VFS
, "mount options mfsymlinks and sfu both enabled\n");
3344 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
3347 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
3348 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
3352 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3354 kfree(volume_info
->username
);
3355 kzfree(volume_info
->password
);
3356 kfree(volume_info
->UNC
);
3357 kfree(volume_info
->domainname
);
3358 kfree(volume_info
->iocharset
);
3359 kfree(volume_info
->prepath
);
3363 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3367 cleanup_volume_info_contents(volume_info
);
3372 #ifdef CONFIG_CIFS_DFS_UPCALL
3374 * cifs_build_path_to_root returns full path to root when we do not have an
3375 * exiting connection (tcon)
3378 build_unc_path_to_root(const struct smb_vol
*vol
,
3379 const struct cifs_sb_info
*cifs_sb
)
3381 char *full_path
, *pos
;
3382 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) + 1 : 0;
3383 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3385 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3386 if (full_path
== NULL
)
3387 return ERR_PTR(-ENOMEM
);
3389 strncpy(full_path
, vol
->UNC
, unc_len
);
3390 pos
= full_path
+ unc_len
;
3393 *pos
= CIFS_DIR_SEP(cifs_sb
);
3394 strncpy(pos
+ 1, vol
->prepath
, pplen
);
3398 *pos
= '\0'; /* add trailing null */
3399 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3400 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
3405 * Perform a dfs referral query for a share and (optionally) prefix
3407 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3408 * to a string containing updated options for the submount. Otherwise it
3409 * will be left untouched.
3411 * Returns the rc from get_dfs_path to the caller, which can be used to
3412 * determine whether there were referrals.
3415 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
3416 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3420 unsigned int num_referrals
= 0;
3421 struct dfs_info3_param
*referrals
= NULL
;
3422 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3424 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3425 if (IS_ERR(full_path
))
3426 return PTR_ERR(full_path
);
3428 /* For DFS paths, skip the first '\' of the UNC */
3429 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3431 rc
= get_dfs_path(xid
, ses
, ref_path
, cifs_sb
->local_nls
,
3432 &num_referrals
, &referrals
, cifs_remap(cifs_sb
));
3434 if (!rc
&& num_referrals
> 0) {
3435 char *fake_devname
= NULL
;
3437 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3438 full_path
+ 1, referrals
,
3441 free_dfs_info_array(referrals
, num_referrals
);
3443 if (IS_ERR(mdata
)) {
3444 rc
= PTR_ERR(mdata
);
3447 cleanup_volume_info_contents(volume_info
);
3448 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3451 kfree(fake_devname
);
3452 kfree(cifs_sb
->mountdata
);
3453 cifs_sb
->mountdata
= mdata
;
3461 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3462 const char *devname
)
3466 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3469 if (volume_info
->nullauth
) {
3470 cifs_dbg(FYI
, "Anonymous login\n");
3471 kfree(volume_info
->username
);
3472 volume_info
->username
= NULL
;
3473 } else if (volume_info
->username
) {
3474 /* BB fixme parse for domain name here */
3475 cifs_dbg(FYI
, "Username: %s\n", volume_info
->username
);
3477 cifs_dbg(VFS
, "No username specified\n");
3478 /* In userspace mount helper we can get user name from alternate
3479 locations such as env variables and files on disk */
3483 /* this is needed for ASCII cp to Unicode converts */
3484 if (volume_info
->iocharset
== NULL
) {
3485 /* load_nls_default cannot return null */
3486 volume_info
->local_nls
= load_nls_default();
3488 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3489 if (volume_info
->local_nls
== NULL
) {
3490 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
3491 volume_info
->iocharset
);
3500 cifs_get_volume_info(char *mount_data
, const char *devname
)
3503 struct smb_vol
*volume_info
;
3505 volume_info
= kmalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3507 return ERR_PTR(-ENOMEM
);
3509 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3511 cifs_cleanup_volume_info(volume_info
);
3512 volume_info
= ERR_PTR(rc
);
3519 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3523 struct cifs_ses
*ses
;
3524 struct cifs_tcon
*tcon
;
3525 struct TCP_Server_Info
*server
;
3527 struct tcon_link
*tlink
;
3528 #ifdef CONFIG_CIFS_DFS_UPCALL
3529 int referral_walks_count
= 0;
3532 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs");
3536 #ifdef CONFIG_CIFS_DFS_UPCALL
3538 /* cleanup activities if we're chasing a referral */
3539 if (referral_walks_count
) {
3541 cifs_put_tcon(tcon
);
3543 cifs_put_smb_ses(ses
);
3545 cifs_sb
->mnt_cifs_flags
&= ~CIFS_MOUNT_POSIX_PATHS
;
3559 /* get a reference to a tcp session */
3560 server
= cifs_get_tcp_session(volume_info
);
3561 if (IS_ERR(server
)) {
3562 rc
= PTR_ERR(server
);
3563 bdi_destroy(&cifs_sb
->bdi
);
3567 /* get a reference to a SMB session */
3568 ses
= cifs_get_smb_ses(server
, volume_info
);
3572 goto mount_fail_check
;
3575 #ifdef CONFIG_CIFS_SMB2
3576 if ((volume_info
->persistent
== true) && ((ses
->server
->capabilities
&
3577 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
) == 0)) {
3578 cifs_dbg(VFS
, "persistent handles not supported by server\n");
3580 goto mount_fail_check
;
3582 #endif /* CONFIG_CIFS_SMB2*/
3584 /* search for existing tcon to this server share */
3585 tcon
= cifs_get_tcon(ses
, volume_info
);
3589 goto remote_path_check
;
3592 /* tell server which Unix caps we support */
3593 if (cap_unix(tcon
->ses
)) {
3594 /* reset of caps checks mount to see if unix extensions
3595 disabled for just this mount */
3596 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3597 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3598 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3599 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3601 goto mount_fail_check
;
3604 tcon
->unix_ext
= 0; /* server does not support them */
3606 /* do not care if a following call succeed - informational */
3607 if (!tcon
->ipc
&& server
->ops
->qfs_tcon
)
3608 server
->ops
->qfs_tcon(xid
, tcon
);
3610 cifs_sb
->wsize
= server
->ops
->negotiate_wsize(tcon
, volume_info
);
3611 cifs_sb
->rsize
= server
->ops
->negotiate_rsize(tcon
, volume_info
);
3613 /* tune readahead according to rsize */
3614 cifs_sb
->bdi
.ra_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3617 #ifdef CONFIG_CIFS_DFS_UPCALL
3619 * Perform an unconditional check for whether there are DFS
3620 * referrals for this path without prefix, to provide support
3621 * for DFS referrals from w2k8 servers which don't seem to respond
3622 * with PATH_NOT_COVERED to requests that include the prefix.
3623 * Chase the referral if found, otherwise continue normally.
3625 if (referral_walks_count
== 0) {
3626 int refrc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
,
3629 referral_walks_count
++;
3630 goto try_mount_again
;
3635 /* check if a whole path is not remote */
3637 if (!server
->ops
->is_path_accessible
) {
3639 goto mount_fail_check
;
3642 * cifs_build_path_to_root works only when we have a valid tcon
3644 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3645 if (full_path
== NULL
) {
3647 goto mount_fail_check
;
3649 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3651 if (rc
!= 0 && rc
!= -EREMOTE
) {
3653 goto mount_fail_check
;
3658 /* get referral if needed */
3659 if (rc
== -EREMOTE
) {
3660 #ifdef CONFIG_CIFS_DFS_UPCALL
3661 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3663 * BB: when we implement proper loop detection,
3664 * we will remove this check. But now we need it
3665 * to prevent an indefinite loop if 'DFS tree' is
3666 * misconfigured (i.e. has loops).
3669 goto mount_fail_check
;
3672 rc
= expand_dfs_referral(xid
, ses
, volume_info
, cifs_sb
, true);
3675 referral_walks_count
++;
3676 goto try_mount_again
;
3678 goto mount_fail_check
;
3679 #else /* No DFS support, return error on mount */
3685 goto mount_fail_check
;
3687 /* now, hang the tcon off of the superblock */
3688 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3689 if (tlink
== NULL
) {
3691 goto mount_fail_check
;
3694 tlink
->tl_uid
= ses
->linux_uid
;
3695 tlink
->tl_tcon
= tcon
;
3696 tlink
->tl_time
= jiffies
;
3697 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3698 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3700 cifs_sb
->master_tlink
= tlink
;
3701 spin_lock(&cifs_sb
->tlink_tree_lock
);
3702 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3703 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3705 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
3709 /* on error free sesinfo and tcon struct if needed */
3711 /* If find_unc succeeded then rc == 0 so we can not end */
3712 /* up accidentally freeing someone elses tcon struct */
3714 cifs_put_tcon(tcon
);
3716 cifs_put_smb_ses(ses
);
3718 cifs_put_tcp_session(server
);
3719 bdi_destroy(&cifs_sb
->bdi
);
3728 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3729 * pointer may be NULL.
3732 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
3733 const char *tree
, struct cifs_tcon
*tcon
,
3734 const struct nls_table
*nls_codepage
)
3736 struct smb_hdr
*smb_buffer
;
3737 struct smb_hdr
*smb_buffer_response
;
3740 unsigned char *bcc_ptr
;
3743 __u16 bytes_left
, count
;
3748 smb_buffer
= cifs_buf_get();
3749 if (smb_buffer
== NULL
)
3752 smb_buffer_response
= smb_buffer
;
3754 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3755 NULL
/*no tid */ , 4 /*wct */ );
3757 smb_buffer
->Mid
= get_next_mid(ses
->server
);
3758 smb_buffer
->Uid
= ses
->Suid
;
3759 pSMB
= (TCONX_REQ
*) smb_buffer
;
3760 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3762 pSMB
->AndXCommand
= 0xFF;
3763 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3764 bcc_ptr
= &pSMB
->Password
[0];
3765 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3766 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3767 *bcc_ptr
= 0; /* password is null byte */
3768 bcc_ptr
++; /* skip password */
3769 /* already aligned so no need to do it below */
3771 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3772 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3773 specified as required (when that support is added to
3774 the vfs in the future) as only NTLM or the much
3775 weaker LANMAN (which we do not send by default) is accepted
3776 by Samba (not sure whether other servers allow
3777 NTLMv2 password here) */
3778 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3779 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3780 (ses
->sectype
== LANMAN
))
3781 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3782 ses
->server
->sec_mode
&
3783 SECMODE_PW_ENCRYPT
? true : false,
3786 #endif /* CIFS_WEAK_PW_HASH */
3787 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3788 bcc_ptr
, nls_codepage
);
3790 cifs_dbg(FYI
, "%s Can't generate NTLM rsp. Error: %d\n",
3792 cifs_buf_release(smb_buffer
);
3796 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3797 if (ses
->capabilities
& CAP_UNICODE
) {
3798 /* must align unicode strings */
3799 *bcc_ptr
= 0; /* null byte password */
3804 if (ses
->server
->sign
)
3805 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3807 if (ses
->capabilities
& CAP_STATUS32
) {
3808 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3810 if (ses
->capabilities
& CAP_DFS
) {
3811 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3813 if (ses
->capabilities
& CAP_UNICODE
) {
3814 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3816 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
3817 6 /* max utf8 char length in bytes */ *
3818 (/* server len*/ + 256 /* share len */), nls_codepage
);
3819 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3820 bcc_ptr
+= 2; /* skip trailing null */
3821 } else { /* ASCII */
3822 strcpy(bcc_ptr
, tree
);
3823 bcc_ptr
+= strlen(tree
) + 1;
3825 strcpy(bcc_ptr
, "?????");
3826 bcc_ptr
+= strlen("?????");
3828 count
= bcc_ptr
- &pSMB
->Password
[0];
3829 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
3830 pSMB
->hdr
.smb_buf_length
) + count
);
3831 pSMB
->ByteCount
= cpu_to_le16(count
);
3833 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3836 /* above now done in SendReceive */
3837 if ((rc
== 0) && (tcon
!= NULL
)) {
3840 tcon
->tidStatus
= CifsGood
;
3841 tcon
->need_reconnect
= false;
3842 tcon
->tid
= smb_buffer_response
->Tid
;
3843 bcc_ptr
= pByteArea(smb_buffer_response
);
3844 bytes_left
= get_bcc(smb_buffer_response
);
3845 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3846 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3852 /* skip service field (NB: this field is always ASCII) */
3854 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3855 (bcc_ptr
[2] == 'C')) {
3856 cifs_dbg(FYI
, "IPC connection\n");
3859 } else if (length
== 2) {
3860 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3861 /* the most common case */
3862 cifs_dbg(FYI
, "disk share connection\n");
3865 bcc_ptr
+= length
+ 1;
3866 bytes_left
-= (length
+ 1);
3867 strlcpy(tcon
->treeName
, tree
, sizeof(tcon
->treeName
));
3869 /* mostly informational -- no need to fail on error here */
3870 kfree(tcon
->nativeFileSystem
);
3871 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
3872 bytes_left
, is_unicode
,
3875 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
3877 if ((smb_buffer_response
->WordCount
== 3) ||
3878 (smb_buffer_response
->WordCount
== 7))
3879 /* field is in same location */
3880 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3883 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
3884 } else if ((rc
== 0) && tcon
== NULL
) {
3885 /* all we need to save for IPC$ connection */
3886 ses
->ipc_tid
= smb_buffer_response
->Tid
;
3889 cifs_buf_release(smb_buffer
);
3893 static void delayed_free(struct rcu_head
*p
)
3895 struct cifs_sb_info
*sbi
= container_of(p
, struct cifs_sb_info
, rcu
);
3896 unload_nls(sbi
->local_nls
);
3901 cifs_umount(struct cifs_sb_info
*cifs_sb
)
3903 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3904 struct rb_node
*node
;
3905 struct tcon_link
*tlink
;
3907 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3909 spin_lock(&cifs_sb
->tlink_tree_lock
);
3910 while ((node
= rb_first(root
))) {
3911 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3912 cifs_get_tlink(tlink
);
3913 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3914 rb_erase(node
, root
);
3916 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3917 cifs_put_tlink(tlink
);
3918 spin_lock(&cifs_sb
->tlink_tree_lock
);
3920 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3922 bdi_destroy(&cifs_sb
->bdi
);
3923 kfree(cifs_sb
->mountdata
);
3924 call_rcu(&cifs_sb
->rcu
, delayed_free
);
3928 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
3931 struct TCP_Server_Info
*server
= ses
->server
;
3933 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
3936 /* only send once per connect */
3937 if (!server
->ops
->need_neg(server
))
3940 set_credits(server
, 1);
3942 rc
= server
->ops
->negotiate(xid
, ses
);
3944 spin_lock(&GlobalMid_Lock
);
3945 if (server
->tcpStatus
== CifsNeedNegotiate
)
3946 server
->tcpStatus
= CifsGood
;
3949 spin_unlock(&GlobalMid_Lock
);
3956 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
3957 struct nls_table
*nls_info
)
3960 struct TCP_Server_Info
*server
= ses
->server
;
3962 ses
->capabilities
= server
->capabilities
;
3963 if (linuxExtEnabled
== 0)
3964 ses
->capabilities
&= (~server
->vals
->cap_unix
);
3966 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3967 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
3969 if (server
->ops
->sess_setup
)
3970 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
3973 cifs_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
3979 cifs_set_vol_auth(struct smb_vol
*vol
, struct cifs_ses
*ses
)
3981 vol
->sectype
= ses
->sectype
;
3983 /* krb5 is special, since we don't need username or pw */
3984 if (vol
->sectype
== Kerberos
)
3987 return cifs_set_cifscreds(vol
, ses
);
3990 static struct cifs_tcon
*
3991 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
3994 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3995 struct cifs_ses
*ses
;
3996 struct cifs_tcon
*tcon
= NULL
;
3997 struct smb_vol
*vol_info
;
3999 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
4000 if (vol_info
== NULL
)
4001 return ERR_PTR(-ENOMEM
);
4003 vol_info
->local_nls
= cifs_sb
->local_nls
;
4004 vol_info
->linux_uid
= fsuid
;
4005 vol_info
->cred_uid
= fsuid
;
4006 vol_info
->UNC
= master_tcon
->treeName
;
4007 vol_info
->retry
= master_tcon
->retry
;
4008 vol_info
->nocase
= master_tcon
->nocase
;
4009 vol_info
->local_lease
= master_tcon
->local_lease
;
4010 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
4011 vol_info
->sectype
= master_tcon
->ses
->sectype
;
4012 vol_info
->sign
= master_tcon
->ses
->sign
;
4014 rc
= cifs_set_vol_auth(vol_info
, master_tcon
->ses
);
4020 /* get a reference for the same TCP session */
4021 spin_lock(&cifs_tcp_ses_lock
);
4022 ++master_tcon
->ses
->server
->srv_count
;
4023 spin_unlock(&cifs_tcp_ses_lock
);
4025 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
4027 tcon
= (struct cifs_tcon
*)ses
;
4028 cifs_put_tcp_session(master_tcon
->ses
->server
);
4032 tcon
= cifs_get_tcon(ses
, vol_info
);
4034 cifs_put_smb_ses(ses
);
4039 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
4041 kfree(vol_info
->username
);
4042 kfree(vol_info
->password
);
4049 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
4051 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
4054 /* find and return a tlink with given uid */
4055 static struct tcon_link
*
4056 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
4058 struct rb_node
*node
= root
->rb_node
;
4059 struct tcon_link
*tlink
;
4062 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
4064 if (uid_gt(tlink
->tl_uid
, uid
))
4065 node
= node
->rb_left
;
4066 else if (uid_lt(tlink
->tl_uid
, uid
))
4067 node
= node
->rb_right
;
4074 /* insert a tcon_link into the tree */
4076 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
4078 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
4079 struct tcon_link
*tlink
;
4082 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
4085 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
4086 new = &((*new)->rb_left
);
4088 new = &((*new)->rb_right
);
4091 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
4092 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
4096 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4099 * If the superblock doesn't refer to a multiuser mount, then just return
4100 * the master tcon for the mount.
4102 * First, search the rbtree for an existing tcon for this fsuid. If one
4103 * exists, then check to see if it's pending construction. If it is then wait
4104 * for construction to complete. Once it's no longer pending, check to see if
4105 * it failed and either return an error or retry construction, depending on
4108 * If one doesn't exist then insert a new tcon_link struct into the tree and
4109 * try to construct a new one.
4112 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
4115 kuid_t fsuid
= current_fsuid();
4116 struct tcon_link
*tlink
, *newtlink
;
4118 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
4119 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
4121 spin_lock(&cifs_sb
->tlink_tree_lock
);
4122 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4124 cifs_get_tlink(tlink
);
4125 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4127 if (tlink
== NULL
) {
4128 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
4129 if (newtlink
== NULL
)
4130 return ERR_PTR(-ENOMEM
);
4131 newtlink
->tl_uid
= fsuid
;
4132 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
4133 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
4134 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
4135 cifs_get_tlink(newtlink
);
4137 spin_lock(&cifs_sb
->tlink_tree_lock
);
4138 /* was one inserted after previous search? */
4139 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
4141 cifs_get_tlink(tlink
);
4142 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4144 goto wait_for_construction
;
4147 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
4148 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4150 wait_for_construction
:
4151 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
4152 TASK_INTERRUPTIBLE
);
4154 cifs_put_tlink(tlink
);
4155 return ERR_PTR(-ERESTARTSYS
);
4158 /* if it's good, return it */
4159 if (!IS_ERR(tlink
->tl_tcon
))
4162 /* return error if we tried this already recently */
4163 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
4164 cifs_put_tlink(tlink
);
4165 return ERR_PTR(-EACCES
);
4168 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
4169 goto wait_for_construction
;
4172 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
4173 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
4174 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
4176 if (IS_ERR(tlink
->tl_tcon
)) {
4177 cifs_put_tlink(tlink
);
4178 return ERR_PTR(-EACCES
);
4185 * periodic workqueue job that scans tcon_tree for a superblock and closes
4189 cifs_prune_tlinks(struct work_struct
*work
)
4191 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
4193 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
4194 struct rb_node
*node
= rb_first(root
);
4195 struct rb_node
*tmp
;
4196 struct tcon_link
*tlink
;
4199 * Because we drop the spinlock in the loop in order to put the tlink
4200 * it's not guarded against removal of links from the tree. The only
4201 * places that remove entries from the tree are this function and
4202 * umounts. Because this function is non-reentrant and is canceled
4203 * before umount can proceed, this is safe.
4205 spin_lock(&cifs_sb
->tlink_tree_lock
);
4206 node
= rb_first(root
);
4207 while (node
!= NULL
) {
4209 node
= rb_next(tmp
);
4210 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4212 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4213 atomic_read(&tlink
->tl_count
) != 0 ||
4214 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4217 cifs_get_tlink(tlink
);
4218 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4219 rb_erase(tmp
, root
);
4221 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4222 cifs_put_tlink(tlink
);
4223 spin_lock(&cifs_sb
->tlink_tree_lock
);
4225 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4227 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,