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