serial: core, remove uart_update_termios
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / cifs / connect.c
blobdb9d55b507d0afe36b816889165975edd3a7198b
1 /*
2 * fs/cifs/connect.c
4 * Copyright (C) International Business Machines Corp., 2002,2009
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/list.h>
25 #include <linux/wait.h>
26 #include <linux/slab.h>
27 #include <linux/pagemap.h>
28 #include <linux/ctype.h>
29 #include <linux/utsname.h>
30 #include <linux/mempool.h>
31 #include <linux/delay.h>
32 #include <linux/completion.h>
33 #include <linux/kthread.h>
34 #include <linux/pagevec.h>
35 #include <linux/freezer.h>
36 #include <linux/namei.h>
37 #include <asm/uaccess.h>
38 #include <asm/processor.h>
39 #include <linux/inet.h>
40 #include <net/ipv6.h>
41 #include "cifspdu.h"
42 #include "cifsglob.h"
43 #include "cifsproto.h"
44 #include "cifs_unicode.h"
45 #include "cifs_debug.h"
46 #include "cifs_fs_sb.h"
47 #include "ntlmssp.h"
48 #include "nterr.h"
49 #include "rfc1002pdu.h"
50 #include "fscache.h"
52 #define CIFS_PORT 445
53 #define RFC1001_PORT 139
55 /* SMB echo "timeout" -- FIXME: tunable? */
56 #define SMB_ECHO_INTERVAL (60 * HZ)
58 extern mempool_t *cifs_req_poolp;
60 struct smb_vol {
61 char *username;
62 char *password;
63 char *domainname;
64 char *UNC;
65 char *UNCip;
66 char *iocharset; /* local code page for mapping to and from Unicode */
67 char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */
68 char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */
69 uid_t cred_uid;
70 uid_t linux_uid;
71 gid_t linux_gid;
72 mode_t file_mode;
73 mode_t dir_mode;
74 unsigned secFlg;
75 bool retry:1;
76 bool intr:1;
77 bool setuids:1;
78 bool override_uid:1;
79 bool override_gid:1;
80 bool dynperm:1;
81 bool noperm:1;
82 bool no_psx_acl:1; /* set if posix acl support should be disabled */
83 bool cifs_acl:1;
84 bool no_xattr:1; /* set if xattr (EA) support should be disabled*/
85 bool server_ino:1; /* use inode numbers from server ie UniqueId */
86 bool direct_io:1;
87 bool strict_io:1; /* strict cache behavior */
88 bool remap:1; /* set to remap seven reserved chars in filenames */
89 bool posix_paths:1; /* unset to not ask for posix pathnames. */
90 bool no_linux_ext:1;
91 bool sfu_emul:1;
92 bool nullauth:1; /* attempt to authenticate with null user */
93 bool nocase:1; /* request case insensitive filenames */
94 bool nobrl:1; /* disable sending byte range locks to srv */
95 bool mand_lock:1; /* send mandatory not posix byte range lock reqs */
96 bool seal:1; /* request transport encryption on share */
97 bool nodfs:1; /* Do not request DFS, even if available */
98 bool local_lease:1; /* check leases only on local system, not remote */
99 bool noblocksnd:1;
100 bool noautotune:1;
101 bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
102 bool fsc:1; /* enable fscache */
103 bool mfsymlinks:1; /* use Minshall+French Symlinks */
104 bool multiuser:1;
105 unsigned int rsize;
106 unsigned int wsize;
107 bool sockopt_tcp_nodelay:1;
108 unsigned short int port;
109 unsigned long actimeo; /* attribute cache timeout (jiffies) */
110 char *prepath;
111 struct sockaddr_storage srcaddr; /* allow binding to a local IP */
112 struct nls_table *local_nls;
115 /* FIXME: should these be tunable? */
116 #define TLINK_ERROR_EXPIRE (1 * HZ)
117 #define TLINK_IDLE_EXPIRE (600 * HZ)
119 static int ip_connect(struct TCP_Server_Info *server);
120 static int generic_ip_connect(struct TCP_Server_Info *server);
121 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
122 static void cifs_prune_tlinks(struct work_struct *work);
125 * cifs tcp session reconnection
127 * mark tcp session as reconnecting so temporarily locked
128 * mark all smb sessions as reconnecting for tcp session
129 * reconnect tcp session
130 * wake up waiters on reconnection? - (not needed currently)
132 static int
133 cifs_reconnect(struct TCP_Server_Info *server)
135 int rc = 0;
136 struct list_head *tmp, *tmp2;
137 struct cifsSesInfo *ses;
138 struct cifsTconInfo *tcon;
139 struct mid_q_entry *mid_entry;
141 spin_lock(&GlobalMid_Lock);
142 if (server->tcpStatus == CifsExiting) {
143 /* the demux thread will exit normally
144 next time through the loop */
145 spin_unlock(&GlobalMid_Lock);
146 return rc;
147 } else
148 server->tcpStatus = CifsNeedReconnect;
149 spin_unlock(&GlobalMid_Lock);
150 server->maxBuf = 0;
152 cFYI(1, "Reconnecting tcp session");
154 /* before reconnecting the tcp session, mark the smb session (uid)
155 and the tid bad so they are not used until reconnected */
156 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
157 spin_lock(&cifs_tcp_ses_lock);
158 list_for_each(tmp, &server->smb_ses_list) {
159 ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
160 ses->need_reconnect = true;
161 ses->ipc_tid = 0;
162 list_for_each(tmp2, &ses->tcon_list) {
163 tcon = list_entry(tmp2, struct cifsTconInfo, tcon_list);
164 tcon->need_reconnect = true;
167 spin_unlock(&cifs_tcp_ses_lock);
169 /* do not want to be sending data on a socket we are freeing */
170 cFYI(1, "%s: tearing down socket", __func__);
171 mutex_lock(&server->srv_mutex);
172 if (server->ssocket) {
173 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
174 server->ssocket->flags);
175 kernel_sock_shutdown(server->ssocket, SHUT_WR);
176 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
177 server->ssocket->state,
178 server->ssocket->flags);
179 sock_release(server->ssocket);
180 server->ssocket = NULL;
182 server->sequence_number = 0;
183 server->session_estab = false;
184 kfree(server->session_key.response);
185 server->session_key.response = NULL;
186 server->session_key.len = 0;
187 server->lstrp = jiffies;
188 mutex_unlock(&server->srv_mutex);
190 /* mark submitted MIDs for retry and issue callback */
191 cFYI(1, "%s: issuing mid callbacks", __func__);
192 spin_lock(&GlobalMid_Lock);
193 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
194 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
195 if (mid_entry->midState == MID_REQUEST_SUBMITTED)
196 mid_entry->midState = MID_RETRY_NEEDED;
197 list_del_init(&mid_entry->qhead);
198 mid_entry->callback(mid_entry);
200 spin_unlock(&GlobalMid_Lock);
202 while (server->tcpStatus == CifsNeedReconnect) {
203 try_to_freeze();
205 /* we should try only the port we connected to before */
206 rc = generic_ip_connect(server);
207 if (rc) {
208 cFYI(1, "reconnect error %d", rc);
209 msleep(3000);
210 } else {
211 atomic_inc(&tcpSesReconnectCount);
212 spin_lock(&GlobalMid_Lock);
213 if (server->tcpStatus != CifsExiting)
214 server->tcpStatus = CifsNeedNegotiate;
215 spin_unlock(&GlobalMid_Lock);
219 return rc;
223 return codes:
224 0 not a transact2, or all data present
225 >0 transact2 with that much data missing
226 -EINVAL = invalid transact2
229 static int check2ndT2(struct smb_hdr *pSMB, unsigned int maxBufSize)
231 struct smb_t2_rsp *pSMBt;
232 int remaining;
233 __u16 total_data_size, data_in_this_rsp;
235 if (pSMB->Command != SMB_COM_TRANSACTION2)
236 return 0;
238 /* check for plausible wct, bcc and t2 data and parm sizes */
239 /* check for parm and data offset going beyond end of smb */
240 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
241 cFYI(1, "invalid transact2 word count");
242 return -EINVAL;
245 pSMBt = (struct smb_t2_rsp *)pSMB;
247 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
248 data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
250 if (total_data_size == data_in_this_rsp)
251 return 0;
252 else if (total_data_size < data_in_this_rsp) {
253 cFYI(1, "total data %d smaller than data in frame %d",
254 total_data_size, data_in_this_rsp);
255 return -EINVAL;
258 remaining = total_data_size - data_in_this_rsp;
260 cFYI(1, "missing %d bytes from transact2, check next response",
261 remaining);
262 if (total_data_size > maxBufSize) {
263 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
264 total_data_size, maxBufSize);
265 return -EINVAL;
267 return remaining;
270 static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
272 struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond;
273 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB;
274 char *data_area_of_target;
275 char *data_area_of_buf2;
276 int remaining;
277 __u16 byte_count, total_data_size, total_in_buf, total_in_buf2;
279 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
281 if (total_data_size !=
282 get_unaligned_le16(&pSMB2->t2_rsp.TotalDataCount))
283 cFYI(1, "total data size of primary and secondary t2 differ");
285 total_in_buf = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
287 remaining = total_data_size - total_in_buf;
289 if (remaining < 0)
290 return -EINVAL;
292 if (remaining == 0) /* nothing to do, ignore */
293 return 0;
295 total_in_buf2 = get_unaligned_le16(&pSMB2->t2_rsp.DataCount);
296 if (remaining < total_in_buf2) {
297 cFYI(1, "transact2 2nd response contains too much data");
300 /* find end of first SMB data area */
301 data_area_of_target = (char *)&pSMBt->hdr.Protocol +
302 get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
303 /* validate target area */
305 data_area_of_buf2 = (char *)&pSMB2->hdr.Protocol +
306 get_unaligned_le16(&pSMB2->t2_rsp.DataOffset);
308 data_area_of_target += total_in_buf;
310 /* copy second buffer into end of first buffer */
311 memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2);
312 total_in_buf += total_in_buf2;
313 put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount);
314 byte_count = get_bcc_le(pTargetSMB);
315 byte_count += total_in_buf2;
316 put_bcc_le(byte_count, pTargetSMB);
318 byte_count = pTargetSMB->smb_buf_length;
319 byte_count += total_in_buf2;
321 /* BB also add check that we are not beyond maximum buffer size */
323 pTargetSMB->smb_buf_length = byte_count;
325 if (remaining == total_in_buf2) {
326 cFYI(1, "found the last secondary response");
327 return 0; /* we are done */
328 } else /* more responses to go */
329 return 1;
332 static void
333 cifs_echo_request(struct work_struct *work)
335 int rc;
336 struct TCP_Server_Info *server = container_of(work,
337 struct TCP_Server_Info, echo.work);
340 * We cannot send an echo until the NEGOTIATE_PROTOCOL request is
341 * done, which is indicated by maxBuf != 0. Also, no need to ping if
342 * we got a response recently
344 if (server->maxBuf == 0 ||
345 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
346 goto requeue_echo;
348 rc = CIFSSMBEcho(server);
349 if (rc)
350 cFYI(1, "Unable to send echo request to server: %s",
351 server->hostname);
353 requeue_echo:
354 queue_delayed_work(system_nrt_wq, &server->echo, SMB_ECHO_INTERVAL);
357 static int
358 cifs_demultiplex_thread(struct TCP_Server_Info *server)
360 int length;
361 unsigned int pdu_length, total_read;
362 struct smb_hdr *smb_buffer = NULL;
363 struct smb_hdr *bigbuf = NULL;
364 struct smb_hdr *smallbuf = NULL;
365 struct msghdr smb_msg;
366 struct kvec iov;
367 struct socket *csocket = server->ssocket;
368 struct list_head *tmp, *tmp2;
369 struct task_struct *task_to_wake = NULL;
370 struct mid_q_entry *mid_entry;
371 char temp;
372 bool isLargeBuf = false;
373 bool isMultiRsp;
374 int reconnect;
376 current->flags |= PF_MEMALLOC;
377 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
379 length = atomic_inc_return(&tcpSesAllocCount);
380 if (length > 1)
381 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
382 GFP_KERNEL);
384 set_freezable();
385 while (server->tcpStatus != CifsExiting) {
386 if (try_to_freeze())
387 continue;
388 if (bigbuf == NULL) {
389 bigbuf = cifs_buf_get();
390 if (!bigbuf) {
391 cERROR(1, "No memory for large SMB response");
392 msleep(3000);
393 /* retry will check if exiting */
394 continue;
396 } else if (isLargeBuf) {
397 /* we are reusing a dirty large buf, clear its start */
398 memset(bigbuf, 0, sizeof(struct smb_hdr));
401 if (smallbuf == NULL) {
402 smallbuf = cifs_small_buf_get();
403 if (!smallbuf) {
404 cERROR(1, "No memory for SMB response");
405 msleep(1000);
406 /* retry will check if exiting */
407 continue;
409 /* beginning of smb buffer is cleared in our buf_get */
410 } else /* if existing small buf clear beginning */
411 memset(smallbuf, 0, sizeof(struct smb_hdr));
413 isLargeBuf = false;
414 isMultiRsp = false;
415 smb_buffer = smallbuf;
416 iov.iov_base = smb_buffer;
417 iov.iov_len = 4;
418 smb_msg.msg_control = NULL;
419 smb_msg.msg_controllen = 0;
420 pdu_length = 4; /* enough to get RFC1001 header */
422 incomplete_rcv:
423 if (echo_retries > 0 && server->tcpStatus == CifsGood &&
424 time_after(jiffies, server->lstrp +
425 (echo_retries * SMB_ECHO_INTERVAL))) {
426 cERROR(1, "Server %s has not responded in %d seconds. "
427 "Reconnecting...", server->hostname,
428 (echo_retries * SMB_ECHO_INTERVAL / HZ));
429 cifs_reconnect(server);
430 csocket = server->ssocket;
431 wake_up(&server->response_q);
432 continue;
435 length =
436 kernel_recvmsg(csocket, &smb_msg,
437 &iov, 1, pdu_length, 0 /* BB other flags? */);
439 if (server->tcpStatus == CifsExiting) {
440 break;
441 } else if (server->tcpStatus == CifsNeedReconnect) {
442 cFYI(1, "Reconnect after server stopped responding");
443 cifs_reconnect(server);
444 cFYI(1, "call to reconnect done");
445 csocket = server->ssocket;
446 continue;
447 } else if (length == -ERESTARTSYS ||
448 length == -EAGAIN ||
449 length == -EINTR) {
450 msleep(1); /* minimum sleep to prevent looping
451 allowing socket to clear and app threads to set
452 tcpStatus CifsNeedReconnect if server hung */
453 if (pdu_length < 4) {
454 iov.iov_base = (4 - pdu_length) +
455 (char *)smb_buffer;
456 iov.iov_len = pdu_length;
457 smb_msg.msg_control = NULL;
458 smb_msg.msg_controllen = 0;
459 goto incomplete_rcv;
460 } else
461 continue;
462 } else if (length <= 0) {
463 cFYI(1, "Reconnect after unexpected peek error %d",
464 length);
465 cifs_reconnect(server);
466 csocket = server->ssocket;
467 wake_up(&server->response_q);
468 continue;
469 } else if (length < pdu_length) {
470 cFYI(1, "requested %d bytes but only got %d bytes",
471 pdu_length, length);
472 pdu_length -= length;
473 msleep(1);
474 goto incomplete_rcv;
477 /* The right amount was read from socket - 4 bytes */
478 /* so we can now interpret the length field */
480 /* the first byte big endian of the length field,
481 is actually not part of the length but the type
482 with the most common, zero, as regular data */
483 temp = *((char *) smb_buffer);
485 /* Note that FC 1001 length is big endian on the wire,
486 but we convert it here so it is always manipulated
487 as host byte order */
488 pdu_length = be32_to_cpu((__force __be32)smb_buffer->smb_buf_length);
489 smb_buffer->smb_buf_length = pdu_length;
491 cFYI(1, "rfc1002 length 0x%x", pdu_length+4);
493 if (temp == (char) RFC1002_SESSION_KEEP_ALIVE) {
494 continue;
495 } else if (temp == (char)RFC1002_POSITIVE_SESSION_RESPONSE) {
496 cFYI(1, "Good RFC 1002 session rsp");
497 continue;
498 } else if (temp == (char)RFC1002_NEGATIVE_SESSION_RESPONSE) {
499 /* we get this from Windows 98 instead of
500 an error on SMB negprot response */
501 cFYI(1, "Negative RFC1002 Session Response Error 0x%x)",
502 pdu_length);
503 /* give server a second to clean up */
504 msleep(1000);
505 /* always try 445 first on reconnect since we get NACK
506 * on some if we ever connected to port 139 (the NACK
507 * is since we do not begin with RFC1001 session
508 * initialize frame)
510 cifs_set_port((struct sockaddr *)
511 &server->dstaddr, CIFS_PORT);
512 cifs_reconnect(server);
513 csocket = server->ssocket;
514 wake_up(&server->response_q);
515 continue;
516 } else if (temp != (char) 0) {
517 cERROR(1, "Unknown RFC 1002 frame");
518 cifs_dump_mem(" Received Data: ", (char *)smb_buffer,
519 length);
520 cifs_reconnect(server);
521 csocket = server->ssocket;
522 continue;
525 /* else we have an SMB response */
526 if ((pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) ||
527 (pdu_length < sizeof(struct smb_hdr) - 1 - 4)) {
528 cERROR(1, "Invalid size SMB length %d pdu_length %d",
529 length, pdu_length+4);
530 cifs_reconnect(server);
531 csocket = server->ssocket;
532 wake_up(&server->response_q);
533 continue;
536 /* else length ok */
537 reconnect = 0;
539 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
540 isLargeBuf = true;
541 memcpy(bigbuf, smallbuf, 4);
542 smb_buffer = bigbuf;
544 length = 0;
545 iov.iov_base = 4 + (char *)smb_buffer;
546 iov.iov_len = pdu_length;
547 for (total_read = 0; total_read < pdu_length;
548 total_read += length) {
549 length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
550 pdu_length - total_read, 0);
551 if (server->tcpStatus == CifsExiting) {
552 /* then will exit */
553 reconnect = 2;
554 break;
555 } else if (server->tcpStatus == CifsNeedReconnect) {
556 cifs_reconnect(server);
557 csocket = server->ssocket;
558 /* Reconnect wakes up rspns q */
559 /* Now we will reread sock */
560 reconnect = 1;
561 break;
562 } else if (length == -ERESTARTSYS ||
563 length == -EAGAIN ||
564 length == -EINTR) {
565 msleep(1); /* minimum sleep to prevent looping,
566 allowing socket to clear and app
567 threads to set tcpStatus
568 CifsNeedReconnect if server hung*/
569 length = 0;
570 continue;
571 } else if (length <= 0) {
572 cERROR(1, "Received no data, expecting %d",
573 pdu_length - total_read);
574 cifs_reconnect(server);
575 csocket = server->ssocket;
576 reconnect = 1;
577 break;
580 if (reconnect == 2)
581 break;
582 else if (reconnect == 1)
583 continue;
585 total_read += 4; /* account for rfc1002 hdr */
587 dump_smb(smb_buffer, total_read);
590 * We know that we received enough to get to the MID as we
591 * checked the pdu_length earlier. Now check to see
592 * if the rest of the header is OK. We borrow the length
593 * var for the rest of the loop to avoid a new stack var.
595 * 48 bytes is enough to display the header and a little bit
596 * into the payload for debugging purposes.
598 length = checkSMB(smb_buffer, smb_buffer->Mid, total_read);
599 if (length != 0)
600 cifs_dump_mem("Bad SMB: ", smb_buffer,
601 min_t(unsigned int, total_read, 48));
603 mid_entry = NULL;
604 server->lstrp = jiffies;
606 spin_lock(&GlobalMid_Lock);
607 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
608 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
610 if ((mid_entry->mid == smb_buffer->Mid) &&
611 (mid_entry->midState == MID_REQUEST_SUBMITTED) &&
612 (mid_entry->command == smb_buffer->Command)) {
613 if (length == 0 &&
614 check2ndT2(smb_buffer, server->maxBuf) > 0) {
615 /* We have a multipart transact2 resp */
616 isMultiRsp = true;
617 if (mid_entry->resp_buf) {
618 /* merge response - fix up 1st*/
619 if (coalesce_t2(smb_buffer,
620 mid_entry->resp_buf)) {
621 mid_entry->multiRsp =
622 true;
623 break;
624 } else {
625 /* all parts received */
626 mid_entry->multiEnd =
627 true;
628 goto multi_t2_fnd;
630 } else {
631 if (!isLargeBuf) {
632 cERROR(1, "1st trans2 resp needs bigbuf");
633 /* BB maybe we can fix this up, switch
634 to already allocated large buffer? */
635 } else {
636 /* Have first buffer */
637 mid_entry->resp_buf =
638 smb_buffer;
639 mid_entry->largeBuf =
640 true;
641 bigbuf = NULL;
644 break;
646 mid_entry->resp_buf = smb_buffer;
647 mid_entry->largeBuf = isLargeBuf;
648 multi_t2_fnd:
649 if (length == 0)
650 mid_entry->midState =
651 MID_RESPONSE_RECEIVED;
652 else
653 mid_entry->midState =
654 MID_RESPONSE_MALFORMED;
655 #ifdef CONFIG_CIFS_STATS2
656 mid_entry->when_received = jiffies;
657 #endif
658 list_del_init(&mid_entry->qhead);
659 mid_entry->callback(mid_entry);
660 break;
662 mid_entry = NULL;
664 spin_unlock(&GlobalMid_Lock);
666 if (mid_entry != NULL) {
667 /* Was previous buf put in mpx struct for multi-rsp? */
668 if (!isMultiRsp) {
669 /* smb buffer will be freed by user thread */
670 if (isLargeBuf)
671 bigbuf = NULL;
672 else
673 smallbuf = NULL;
675 } else if (length != 0) {
676 /* response sanity checks failed */
677 continue;
678 } else if (!is_valid_oplock_break(smb_buffer, server) &&
679 !isMultiRsp) {
680 cERROR(1, "No task to wake, unknown frame received! "
681 "NumMids %d", atomic_read(&midCount));
682 cifs_dump_mem("Received Data is: ", (char *)smb_buffer,
683 sizeof(struct smb_hdr));
684 #ifdef CONFIG_CIFS_DEBUG2
685 cifs_dump_detail(smb_buffer);
686 cifs_dump_mids(server);
687 #endif /* CIFS_DEBUG2 */
690 } /* end while !EXITING */
692 /* take it off the list, if it's not already */
693 spin_lock(&cifs_tcp_ses_lock);
694 list_del_init(&server->tcp_ses_list);
695 spin_unlock(&cifs_tcp_ses_lock);
697 spin_lock(&GlobalMid_Lock);
698 server->tcpStatus = CifsExiting;
699 spin_unlock(&GlobalMid_Lock);
700 wake_up_all(&server->response_q);
702 /* check if we have blocked requests that need to free */
703 /* Note that cifs_max_pending is normally 50, but
704 can be set at module install time to as little as two */
705 spin_lock(&GlobalMid_Lock);
706 if (atomic_read(&server->inFlight) >= cifs_max_pending)
707 atomic_set(&server->inFlight, cifs_max_pending - 1);
708 /* We do not want to set the max_pending too low or we
709 could end up with the counter going negative */
710 spin_unlock(&GlobalMid_Lock);
711 /* Although there should not be any requests blocked on
712 this queue it can not hurt to be paranoid and try to wake up requests
713 that may haven been blocked when more than 50 at time were on the wire
714 to the same server - they now will see the session is in exit state
715 and get out of SendReceive. */
716 wake_up_all(&server->request_q);
717 /* give those requests time to exit */
718 msleep(125);
720 if (server->ssocket) {
721 sock_release(csocket);
722 server->ssocket = NULL;
724 /* buffer usuallly freed in free_mid - need to free it here on exit */
725 cifs_buf_release(bigbuf);
726 if (smallbuf) /* no sense logging a debug message if NULL */
727 cifs_small_buf_release(smallbuf);
729 if (!list_empty(&server->pending_mid_q)) {
730 spin_lock(&GlobalMid_Lock);
731 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
732 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
733 cFYI(1, "Clearing Mid 0x%x - issuing callback",
734 mid_entry->mid);
735 list_del_init(&mid_entry->qhead);
736 mid_entry->callback(mid_entry);
738 spin_unlock(&GlobalMid_Lock);
739 /* 1/8th of sec is more than enough time for them to exit */
740 msleep(125);
743 if (!list_empty(&server->pending_mid_q)) {
744 /* mpx threads have not exited yet give them
745 at least the smb send timeout time for long ops */
746 /* due to delays on oplock break requests, we need
747 to wait at least 45 seconds before giving up
748 on a request getting a response and going ahead
749 and killing cifsd */
750 cFYI(1, "Wait for exit from demultiplex thread");
751 msleep(46000);
752 /* if threads still have not exited they are probably never
753 coming home not much else we can do but free the memory */
756 kfree(server->hostname);
757 task_to_wake = xchg(&server->tsk, NULL);
758 kfree(server);
760 length = atomic_dec_return(&tcpSesAllocCount);
761 if (length > 0)
762 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
763 GFP_KERNEL);
765 /* if server->tsk was NULL then wait for a signal before exiting */
766 if (!task_to_wake) {
767 set_current_state(TASK_INTERRUPTIBLE);
768 while (!signal_pending(current)) {
769 schedule();
770 set_current_state(TASK_INTERRUPTIBLE);
772 set_current_state(TASK_RUNNING);
775 module_put_and_exit(0);
778 /* extract the host portion of the UNC string */
779 static char *
780 extract_hostname(const char *unc)
782 const char *src;
783 char *dst, *delim;
784 unsigned int len;
786 /* skip double chars at beginning of string */
787 /* BB: check validity of these bytes? */
788 src = unc + 2;
790 /* delimiter between hostname and sharename is always '\\' now */
791 delim = strchr(src, '\\');
792 if (!delim)
793 return ERR_PTR(-EINVAL);
795 len = delim - src;
796 dst = kmalloc((len + 1), GFP_KERNEL);
797 if (dst == NULL)
798 return ERR_PTR(-ENOMEM);
800 memcpy(dst, src, len);
801 dst[len] = '\0';
803 return dst;
806 static int
807 cifs_parse_mount_options(char *options, const char *devname,
808 struct smb_vol *vol)
810 char *value;
811 char *data;
812 unsigned int temp_len, i, j;
813 char separator[2];
814 short int override_uid = -1;
815 short int override_gid = -1;
816 bool uid_specified = false;
817 bool gid_specified = false;
818 char *nodename = utsname()->nodename;
820 separator[0] = ',';
821 separator[1] = 0;
824 * does not have to be perfect mapping since field is
825 * informational, only used for servers that do not support
826 * port 445 and it can be overridden at mount time
828 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
829 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
830 vol->source_rfc1001_name[i] = toupper(nodename[i]);
832 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
833 /* null target name indicates to use *SMBSERVR default called name
834 if we end up sending RFC1001 session initialize */
835 vol->target_rfc1001_name[0] = 0;
836 vol->cred_uid = current_uid();
837 vol->linux_uid = current_uid();
838 vol->linux_gid = current_gid();
840 /* default to only allowing write access to owner of the mount */
841 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
843 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
844 /* default is always to request posix paths. */
845 vol->posix_paths = 1;
846 /* default to using server inode numbers where available */
847 vol->server_ino = 1;
849 vol->actimeo = CIFS_DEF_ACTIMEO;
851 if (!options)
852 return 1;
854 if (strncmp(options, "sep=", 4) == 0) {
855 if (options[4] != 0) {
856 separator[0] = options[4];
857 options += 5;
858 } else {
859 cFYI(1, "Null separator not allowed");
863 while ((data = strsep(&options, separator)) != NULL) {
864 if (!*data)
865 continue;
866 if ((value = strchr(data, '=')) != NULL)
867 *value++ = '\0';
869 /* Have to parse this before we parse for "user" */
870 if (strnicmp(data, "user_xattr", 10) == 0) {
871 vol->no_xattr = 0;
872 } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
873 vol->no_xattr = 1;
874 } else if (strnicmp(data, "user", 4) == 0) {
875 if (!value) {
876 printk(KERN_WARNING
877 "CIFS: invalid or missing username\n");
878 return 1; /* needs_arg; */
879 } else if (!*value) {
880 /* null user, ie anonymous, authentication */
881 vol->nullauth = 1;
883 if (strnlen(value, MAX_USERNAME_SIZE) <
884 MAX_USERNAME_SIZE) {
885 vol->username = value;
886 } else {
887 printk(KERN_WARNING "CIFS: username too long\n");
888 return 1;
890 } else if (strnicmp(data, "pass", 4) == 0) {
891 if (!value) {
892 vol->password = NULL;
893 continue;
894 } else if (value[0] == 0) {
895 /* check if string begins with double comma
896 since that would mean the password really
897 does start with a comma, and would not
898 indicate an empty string */
899 if (value[1] != separator[0]) {
900 vol->password = NULL;
901 continue;
904 temp_len = strlen(value);
905 /* removed password length check, NTLM passwords
906 can be arbitrarily long */
908 /* if comma in password, the string will be
909 prematurely null terminated. Commas in password are
910 specified across the cifs mount interface by a double
911 comma ie ,, and a comma used as in other cases ie ','
912 as a parameter delimiter/separator is single and due
913 to the strsep above is temporarily zeroed. */
915 /* NB: password legally can have multiple commas and
916 the only illegal character in a password is null */
918 if ((value[temp_len] == 0) &&
919 (value[temp_len+1] == separator[0])) {
920 /* reinsert comma */
921 value[temp_len] = separator[0];
922 temp_len += 2; /* move after second comma */
923 while (value[temp_len] != 0) {
924 if (value[temp_len] == separator[0]) {
925 if (value[temp_len+1] ==
926 separator[0]) {
927 /* skip second comma */
928 temp_len++;
929 } else {
930 /* single comma indicating start
931 of next parm */
932 break;
935 temp_len++;
937 if (value[temp_len] == 0) {
938 options = NULL;
939 } else {
940 value[temp_len] = 0;
941 /* point option to start of next parm */
942 options = value + temp_len + 1;
944 /* go from value to value + temp_len condensing
945 double commas to singles. Note that this ends up
946 allocating a few bytes too many, which is ok */
947 vol->password = kzalloc(temp_len, GFP_KERNEL);
948 if (vol->password == NULL) {
949 printk(KERN_WARNING "CIFS: no memory "
950 "for password\n");
951 return 1;
953 for (i = 0, j = 0; i < temp_len; i++, j++) {
954 vol->password[j] = value[i];
955 if (value[i] == separator[0]
956 && value[i+1] == separator[0]) {
957 /* skip second comma */
958 i++;
961 vol->password[j] = 0;
962 } else {
963 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
964 if (vol->password == NULL) {
965 printk(KERN_WARNING "CIFS: no memory "
966 "for password\n");
967 return 1;
969 strcpy(vol->password, value);
971 } else if (!strnicmp(data, "ip", 2) ||
972 !strnicmp(data, "addr", 4)) {
973 if (!value || !*value) {
974 vol->UNCip = NULL;
975 } else if (strnlen(value, INET6_ADDRSTRLEN) <
976 INET6_ADDRSTRLEN) {
977 vol->UNCip = value;
978 } else {
979 printk(KERN_WARNING "CIFS: ip address "
980 "too long\n");
981 return 1;
983 } else if (strnicmp(data, "sec", 3) == 0) {
984 if (!value || !*value) {
985 cERROR(1, "no security value specified");
986 continue;
987 } else if (strnicmp(value, "krb5i", 5) == 0) {
988 vol->secFlg |= CIFSSEC_MAY_KRB5 |
989 CIFSSEC_MUST_SIGN;
990 } else if (strnicmp(value, "krb5p", 5) == 0) {
991 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
992 CIFSSEC_MAY_KRB5; */
993 cERROR(1, "Krb5 cifs privacy not supported");
994 return 1;
995 } else if (strnicmp(value, "krb5", 4) == 0) {
996 vol->secFlg |= CIFSSEC_MAY_KRB5;
997 } else if (strnicmp(value, "ntlmsspi", 8) == 0) {
998 vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
999 CIFSSEC_MUST_SIGN;
1000 } else if (strnicmp(value, "ntlmssp", 7) == 0) {
1001 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1002 } else if (strnicmp(value, "ntlmv2i", 7) == 0) {
1003 vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
1004 CIFSSEC_MUST_SIGN;
1005 } else if (strnicmp(value, "ntlmv2", 6) == 0) {
1006 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1007 } else if (strnicmp(value, "ntlmi", 5) == 0) {
1008 vol->secFlg |= CIFSSEC_MAY_NTLM |
1009 CIFSSEC_MUST_SIGN;
1010 } else if (strnicmp(value, "ntlm", 4) == 0) {
1011 /* ntlm is default so can be turned off too */
1012 vol->secFlg |= CIFSSEC_MAY_NTLM;
1013 } else if (strnicmp(value, "nontlm", 6) == 0) {
1014 /* BB is there a better way to do this? */
1015 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1016 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1017 } else if (strnicmp(value, "lanman", 6) == 0) {
1018 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1019 #endif
1020 } else if (strnicmp(value, "none", 4) == 0) {
1021 vol->nullauth = 1;
1022 } else {
1023 cERROR(1, "bad security option: %s", value);
1024 return 1;
1026 } else if ((strnicmp(data, "unc", 3) == 0)
1027 || (strnicmp(data, "target", 6) == 0)
1028 || (strnicmp(data, "path", 4) == 0)) {
1029 if (!value || !*value) {
1030 printk(KERN_WARNING "CIFS: invalid path to "
1031 "network resource\n");
1032 return 1; /* needs_arg; */
1034 if ((temp_len = strnlen(value, 300)) < 300) {
1035 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1036 if (vol->UNC == NULL)
1037 return 1;
1038 strcpy(vol->UNC, value);
1039 if (strncmp(vol->UNC, "//", 2) == 0) {
1040 vol->UNC[0] = '\\';
1041 vol->UNC[1] = '\\';
1042 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1043 printk(KERN_WARNING
1044 "CIFS: UNC Path does not begin "
1045 "with // or \\\\ \n");
1046 return 1;
1048 } else {
1049 printk(KERN_WARNING "CIFS: UNC name too long\n");
1050 return 1;
1052 } else if ((strnicmp(data, "domain", 3) == 0)
1053 || (strnicmp(data, "workgroup", 5) == 0)) {
1054 if (!value || !*value) {
1055 printk(KERN_WARNING "CIFS: invalid domain name\n");
1056 return 1; /* needs_arg; */
1058 /* BB are there cases in which a comma can be valid in
1059 a domain name and need special handling? */
1060 if (strnlen(value, 256) < 256) {
1061 vol->domainname = value;
1062 cFYI(1, "Domain name set");
1063 } else {
1064 printk(KERN_WARNING "CIFS: domain name too "
1065 "long\n");
1066 return 1;
1068 } else if (strnicmp(data, "srcaddr", 7) == 0) {
1069 vol->srcaddr.ss_family = AF_UNSPEC;
1071 if (!value || !*value) {
1072 printk(KERN_WARNING "CIFS: srcaddr value"
1073 " not specified.\n");
1074 return 1; /* needs_arg; */
1076 i = cifs_convert_address((struct sockaddr *)&vol->srcaddr,
1077 value, strlen(value));
1078 if (i == 0) {
1079 printk(KERN_WARNING "CIFS: Could not parse"
1080 " srcaddr: %s\n",
1081 value);
1082 return 1;
1084 } else if (strnicmp(data, "prefixpath", 10) == 0) {
1085 if (!value || !*value) {
1086 printk(KERN_WARNING
1087 "CIFS: invalid path prefix\n");
1088 return 1; /* needs_argument */
1090 if ((temp_len = strnlen(value, 1024)) < 1024) {
1091 if (value[0] != '/')
1092 temp_len++; /* missing leading slash */
1093 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1094 if (vol->prepath == NULL)
1095 return 1;
1096 if (value[0] != '/') {
1097 vol->prepath[0] = '/';
1098 strcpy(vol->prepath+1, value);
1099 } else
1100 strcpy(vol->prepath, value);
1101 cFYI(1, "prefix path %s", vol->prepath);
1102 } else {
1103 printk(KERN_WARNING "CIFS: prefix too long\n");
1104 return 1;
1106 } else if (strnicmp(data, "iocharset", 9) == 0) {
1107 if (!value || !*value) {
1108 printk(KERN_WARNING "CIFS: invalid iocharset "
1109 "specified\n");
1110 return 1; /* needs_arg; */
1112 if (strnlen(value, 65) < 65) {
1113 if (strnicmp(value, "default", 7))
1114 vol->iocharset = value;
1115 /* if iocharset not set then load_nls_default
1116 is used by caller */
1117 cFYI(1, "iocharset set to %s", value);
1118 } else {
1119 printk(KERN_WARNING "CIFS: iocharset name "
1120 "too long.\n");
1121 return 1;
1123 } else if (!strnicmp(data, "uid", 3) && value && *value) {
1124 vol->linux_uid = simple_strtoul(value, &value, 0);
1125 uid_specified = true;
1126 } else if (!strnicmp(data, "cruid", 5) && value && *value) {
1127 vol->cred_uid = simple_strtoul(value, &value, 0);
1128 } else if (!strnicmp(data, "forceuid", 8)) {
1129 override_uid = 1;
1130 } else if (!strnicmp(data, "noforceuid", 10)) {
1131 override_uid = 0;
1132 } else if (!strnicmp(data, "gid", 3) && value && *value) {
1133 vol->linux_gid = simple_strtoul(value, &value, 0);
1134 gid_specified = true;
1135 } else if (!strnicmp(data, "forcegid", 8)) {
1136 override_gid = 1;
1137 } else if (!strnicmp(data, "noforcegid", 10)) {
1138 override_gid = 0;
1139 } else if (strnicmp(data, "file_mode", 4) == 0) {
1140 if (value && *value) {
1141 vol->file_mode =
1142 simple_strtoul(value, &value, 0);
1144 } else if (strnicmp(data, "dir_mode", 4) == 0) {
1145 if (value && *value) {
1146 vol->dir_mode =
1147 simple_strtoul(value, &value, 0);
1149 } else if (strnicmp(data, "dirmode", 4) == 0) {
1150 if (value && *value) {
1151 vol->dir_mode =
1152 simple_strtoul(value, &value, 0);
1154 } else if (strnicmp(data, "port", 4) == 0) {
1155 if (value && *value) {
1156 vol->port =
1157 simple_strtoul(value, &value, 0);
1159 } else if (strnicmp(data, "rsize", 5) == 0) {
1160 if (value && *value) {
1161 vol->rsize =
1162 simple_strtoul(value, &value, 0);
1164 } else if (strnicmp(data, "wsize", 5) == 0) {
1165 if (value && *value) {
1166 vol->wsize =
1167 simple_strtoul(value, &value, 0);
1169 } else if (strnicmp(data, "sockopt", 5) == 0) {
1170 if (!value || !*value) {
1171 cERROR(1, "no socket option specified");
1172 continue;
1173 } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1174 vol->sockopt_tcp_nodelay = 1;
1176 } else if (strnicmp(data, "netbiosname", 4) == 0) {
1177 if (!value || !*value || (*value == ' ')) {
1178 cFYI(1, "invalid (empty) netbiosname");
1179 } else {
1180 memset(vol->source_rfc1001_name, 0x20,
1181 RFC1001_NAME_LEN);
1183 * FIXME: are there cases in which a comma can
1184 * be valid in workstation netbios name (and
1185 * need special handling)?
1187 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1188 /* don't ucase netbiosname for user */
1189 if (value[i] == 0)
1190 break;
1191 vol->source_rfc1001_name[i] = value[i];
1193 /* The string has 16th byte zero still from
1194 set at top of the function */
1195 if (i == RFC1001_NAME_LEN && value[i] != 0)
1196 printk(KERN_WARNING "CIFS: netbiosname"
1197 " longer than 15 truncated.\n");
1199 } else if (strnicmp(data, "servern", 7) == 0) {
1200 /* servernetbiosname specified override *SMBSERVER */
1201 if (!value || !*value || (*value == ' ')) {
1202 cFYI(1, "empty server netbiosname specified");
1203 } else {
1204 /* last byte, type, is 0x20 for servr type */
1205 memset(vol->target_rfc1001_name, 0x20,
1206 RFC1001_NAME_LEN_WITH_NULL);
1208 for (i = 0; i < 15; i++) {
1209 /* BB are there cases in which a comma can be
1210 valid in this workstation netbios name
1211 (and need special handling)? */
1213 /* user or mount helper must uppercase
1214 the netbiosname */
1215 if (value[i] == 0)
1216 break;
1217 else
1218 vol->target_rfc1001_name[i] =
1219 value[i];
1221 /* The string has 16th byte zero still from
1222 set at top of the function */
1223 if (i == RFC1001_NAME_LEN && value[i] != 0)
1224 printk(KERN_WARNING "CIFS: server net"
1225 "biosname longer than 15 truncated.\n");
1227 } else if (strnicmp(data, "actimeo", 7) == 0) {
1228 if (value && *value) {
1229 vol->actimeo = HZ * simple_strtoul(value,
1230 &value, 0);
1231 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1232 cERROR(1, "CIFS: attribute cache"
1233 "timeout too large");
1234 return 1;
1237 } else if (strnicmp(data, "credentials", 4) == 0) {
1238 /* ignore */
1239 } else if (strnicmp(data, "version", 3) == 0) {
1240 /* ignore */
1241 } else if (strnicmp(data, "guest", 5) == 0) {
1242 /* ignore */
1243 } else if (strnicmp(data, "rw", 2) == 0) {
1244 /* ignore */
1245 } else if (strnicmp(data, "ro", 2) == 0) {
1246 /* ignore */
1247 } else if (strnicmp(data, "noblocksend", 11) == 0) {
1248 vol->noblocksnd = 1;
1249 } else if (strnicmp(data, "noautotune", 10) == 0) {
1250 vol->noautotune = 1;
1251 } else if ((strnicmp(data, "suid", 4) == 0) ||
1252 (strnicmp(data, "nosuid", 6) == 0) ||
1253 (strnicmp(data, "exec", 4) == 0) ||
1254 (strnicmp(data, "noexec", 6) == 0) ||
1255 (strnicmp(data, "nodev", 5) == 0) ||
1256 (strnicmp(data, "noauto", 6) == 0) ||
1257 (strnicmp(data, "dev", 3) == 0)) {
1258 /* The mount tool or mount.cifs helper (if present)
1259 uses these opts to set flags, and the flags are read
1260 by the kernel vfs layer before we get here (ie
1261 before read super) so there is no point trying to
1262 parse these options again and set anything and it
1263 is ok to just ignore them */
1264 continue;
1265 } else if (strnicmp(data, "hard", 4) == 0) {
1266 vol->retry = 1;
1267 } else if (strnicmp(data, "soft", 4) == 0) {
1268 vol->retry = 0;
1269 } else if (strnicmp(data, "perm", 4) == 0) {
1270 vol->noperm = 0;
1271 } else if (strnicmp(data, "noperm", 6) == 0) {
1272 vol->noperm = 1;
1273 } else if (strnicmp(data, "mapchars", 8) == 0) {
1274 vol->remap = 1;
1275 } else if (strnicmp(data, "nomapchars", 10) == 0) {
1276 vol->remap = 0;
1277 } else if (strnicmp(data, "sfu", 3) == 0) {
1278 vol->sfu_emul = 1;
1279 } else if (strnicmp(data, "nosfu", 5) == 0) {
1280 vol->sfu_emul = 0;
1281 } else if (strnicmp(data, "nodfs", 5) == 0) {
1282 vol->nodfs = 1;
1283 } else if (strnicmp(data, "posixpaths", 10) == 0) {
1284 vol->posix_paths = 1;
1285 } else if (strnicmp(data, "noposixpaths", 12) == 0) {
1286 vol->posix_paths = 0;
1287 } else if (strnicmp(data, "nounix", 6) == 0) {
1288 vol->no_linux_ext = 1;
1289 } else if (strnicmp(data, "nolinux", 7) == 0) {
1290 vol->no_linux_ext = 1;
1291 } else if ((strnicmp(data, "nocase", 6) == 0) ||
1292 (strnicmp(data, "ignorecase", 10) == 0)) {
1293 vol->nocase = 1;
1294 } else if (strnicmp(data, "mand", 4) == 0) {
1295 /* ignore */
1296 } else if (strnicmp(data, "nomand", 6) == 0) {
1297 /* ignore */
1298 } else if (strnicmp(data, "_netdev", 7) == 0) {
1299 /* ignore */
1300 } else if (strnicmp(data, "brl", 3) == 0) {
1301 vol->nobrl = 0;
1302 } else if ((strnicmp(data, "nobrl", 5) == 0) ||
1303 (strnicmp(data, "nolock", 6) == 0)) {
1304 vol->nobrl = 1;
1305 /* turn off mandatory locking in mode
1306 if remote locking is turned off since the
1307 local vfs will do advisory */
1308 if (vol->file_mode ==
1309 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1310 vol->file_mode = S_IALLUGO;
1311 } else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1312 /* will take the shorter form "forcemand" as well */
1313 /* This mount option will force use of mandatory
1314 (DOS/Windows style) byte range locks, instead of
1315 using posix advisory byte range locks, even if the
1316 Unix extensions are available and posix locks would
1317 be supported otherwise. If Unix extensions are not
1318 negotiated this has no effect since mandatory locks
1319 would be used (mandatory locks is all that those
1320 those servers support) */
1321 vol->mand_lock = 1;
1322 } else if (strnicmp(data, "setuids", 7) == 0) {
1323 vol->setuids = 1;
1324 } else if (strnicmp(data, "nosetuids", 9) == 0) {
1325 vol->setuids = 0;
1326 } else if (strnicmp(data, "dynperm", 7) == 0) {
1327 vol->dynperm = true;
1328 } else if (strnicmp(data, "nodynperm", 9) == 0) {
1329 vol->dynperm = false;
1330 } else if (strnicmp(data, "nohard", 6) == 0) {
1331 vol->retry = 0;
1332 } else if (strnicmp(data, "nosoft", 6) == 0) {
1333 vol->retry = 1;
1334 } else if (strnicmp(data, "nointr", 6) == 0) {
1335 vol->intr = 0;
1336 } else if (strnicmp(data, "intr", 4) == 0) {
1337 vol->intr = 1;
1338 } else if (strnicmp(data, "nostrictsync", 12) == 0) {
1339 vol->nostrictsync = 1;
1340 } else if (strnicmp(data, "strictsync", 10) == 0) {
1341 vol->nostrictsync = 0;
1342 } else if (strnicmp(data, "serverino", 7) == 0) {
1343 vol->server_ino = 1;
1344 } else if (strnicmp(data, "noserverino", 9) == 0) {
1345 vol->server_ino = 0;
1346 } else if (strnicmp(data, "cifsacl", 7) == 0) {
1347 vol->cifs_acl = 1;
1348 } else if (strnicmp(data, "nocifsacl", 9) == 0) {
1349 vol->cifs_acl = 0;
1350 } else if (strnicmp(data, "acl", 3) == 0) {
1351 vol->no_psx_acl = 0;
1352 } else if (strnicmp(data, "noacl", 5) == 0) {
1353 vol->no_psx_acl = 1;
1354 } else if (strnicmp(data, "locallease", 6) == 0) {
1355 vol->local_lease = 1;
1356 } else if (strnicmp(data, "sign", 4) == 0) {
1357 vol->secFlg |= CIFSSEC_MUST_SIGN;
1358 } else if (strnicmp(data, "seal", 4) == 0) {
1359 /* we do not do the following in secFlags because seal
1360 is a per tree connection (mount) not a per socket
1361 or per-smb connection option in the protocol */
1362 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1363 vol->seal = 1;
1364 } else if (strnicmp(data, "direct", 6) == 0) {
1365 vol->direct_io = 1;
1366 } else if (strnicmp(data, "forcedirectio", 13) == 0) {
1367 vol->direct_io = 1;
1368 } else if (strnicmp(data, "strictcache", 11) == 0) {
1369 vol->strict_io = 1;
1370 } else if (strnicmp(data, "noac", 4) == 0) {
1371 printk(KERN_WARNING "CIFS: Mount option noac not "
1372 "supported. Instead set "
1373 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1374 } else if (strnicmp(data, "fsc", 3) == 0) {
1375 #ifndef CONFIG_CIFS_FSCACHE
1376 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE"
1377 "kernel config option set");
1378 return 1;
1379 #endif
1380 vol->fsc = true;
1381 } else if (strnicmp(data, "mfsymlinks", 10) == 0) {
1382 vol->mfsymlinks = true;
1383 } else if (strnicmp(data, "multiuser", 8) == 0) {
1384 vol->multiuser = true;
1385 } else
1386 printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1387 data);
1389 if (vol->UNC == NULL) {
1390 if (devname == NULL) {
1391 printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1392 "target\n");
1393 return 1;
1395 if ((temp_len = strnlen(devname, 300)) < 300) {
1396 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1397 if (vol->UNC == NULL)
1398 return 1;
1399 strcpy(vol->UNC, devname);
1400 if (strncmp(vol->UNC, "//", 2) == 0) {
1401 vol->UNC[0] = '\\';
1402 vol->UNC[1] = '\\';
1403 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1404 printk(KERN_WARNING "CIFS: UNC Path does not "
1405 "begin with // or \\\\ \n");
1406 return 1;
1408 value = strpbrk(vol->UNC+2, "/\\");
1409 if (value)
1410 *value = '\\';
1411 } else {
1412 printk(KERN_WARNING "CIFS: UNC name too long\n");
1413 return 1;
1417 if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) {
1418 cERROR(1, "Multiuser mounts currently require krb5 "
1419 "authentication!");
1420 return 1;
1423 if (vol->UNCip == NULL)
1424 vol->UNCip = &vol->UNC[2];
1426 if (uid_specified)
1427 vol->override_uid = override_uid;
1428 else if (override_uid == 1)
1429 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1430 "specified with no uid= option.\n");
1432 if (gid_specified)
1433 vol->override_gid = override_gid;
1434 else if (override_gid == 1)
1435 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1436 "specified with no gid= option.\n");
1438 return 0;
1441 /** Returns true if srcaddr isn't specified and rhs isn't
1442 * specified, or if srcaddr is specified and
1443 * matches the IP address of the rhs argument.
1445 static bool
1446 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1448 switch (srcaddr->sa_family) {
1449 case AF_UNSPEC:
1450 return (rhs->sa_family == AF_UNSPEC);
1451 case AF_INET: {
1452 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1453 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1454 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1456 case AF_INET6: {
1457 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1458 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1459 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1461 default:
1462 WARN_ON(1);
1463 return false; /* don't expect to be here */
1468 * If no port is specified in addr structure, we try to match with 445 port
1469 * and if it fails - with 139 ports. It should be called only if address
1470 * families of server and addr are equal.
1472 static bool
1473 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1475 __be16 port, *sport;
1477 switch (addr->sa_family) {
1478 case AF_INET:
1479 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1480 port = ((struct sockaddr_in *) addr)->sin_port;
1481 break;
1482 case AF_INET6:
1483 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1484 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1485 break;
1486 default:
1487 WARN_ON(1);
1488 return false;
1491 if (!port) {
1492 port = htons(CIFS_PORT);
1493 if (port == *sport)
1494 return true;
1496 port = htons(RFC1001_PORT);
1499 return port == *sport;
1502 static bool
1503 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1504 struct sockaddr *srcaddr)
1506 switch (addr->sa_family) {
1507 case AF_INET: {
1508 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1509 struct sockaddr_in *srv_addr4 =
1510 (struct sockaddr_in *)&server->dstaddr;
1512 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1513 return false;
1514 break;
1516 case AF_INET6: {
1517 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1518 struct sockaddr_in6 *srv_addr6 =
1519 (struct sockaddr_in6 *)&server->dstaddr;
1521 if (!ipv6_addr_equal(&addr6->sin6_addr,
1522 &srv_addr6->sin6_addr))
1523 return false;
1524 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1525 return false;
1526 break;
1528 default:
1529 WARN_ON(1);
1530 return false; /* don't expect to be here */
1533 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1534 return false;
1536 return true;
1539 static bool
1540 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1542 unsigned int secFlags;
1544 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1545 secFlags = vol->secFlg;
1546 else
1547 secFlags = global_secflags | vol->secFlg;
1549 switch (server->secType) {
1550 case LANMAN:
1551 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1552 return false;
1553 break;
1554 case NTLMv2:
1555 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1556 return false;
1557 break;
1558 case NTLM:
1559 if (!(secFlags & CIFSSEC_MAY_NTLM))
1560 return false;
1561 break;
1562 case Kerberos:
1563 if (!(secFlags & CIFSSEC_MAY_KRB5))
1564 return false;
1565 break;
1566 case RawNTLMSSP:
1567 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1568 return false;
1569 break;
1570 default:
1571 /* shouldn't happen */
1572 return false;
1575 /* now check if signing mode is acceptable */
1576 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1577 (server->secMode & SECMODE_SIGN_REQUIRED))
1578 return false;
1579 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1580 (server->secMode &
1581 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1582 return false;
1584 return true;
1587 static struct TCP_Server_Info *
1588 cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1590 struct TCP_Server_Info *server;
1592 spin_lock(&cifs_tcp_ses_lock);
1593 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1594 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1595 continue;
1597 if (!match_address(server, addr,
1598 (struct sockaddr *)&vol->srcaddr))
1599 continue;
1601 if (!match_port(server, addr))
1602 continue;
1604 if (!match_security(server, vol))
1605 continue;
1607 ++server->srv_count;
1608 spin_unlock(&cifs_tcp_ses_lock);
1609 cFYI(1, "Existing tcp session with server found");
1610 return server;
1612 spin_unlock(&cifs_tcp_ses_lock);
1613 return NULL;
1616 static void
1617 cifs_put_tcp_session(struct TCP_Server_Info *server)
1619 struct task_struct *task;
1621 spin_lock(&cifs_tcp_ses_lock);
1622 if (--server->srv_count > 0) {
1623 spin_unlock(&cifs_tcp_ses_lock);
1624 return;
1627 put_net(cifs_net_ns(server));
1629 list_del_init(&server->tcp_ses_list);
1630 spin_unlock(&cifs_tcp_ses_lock);
1632 cancel_delayed_work_sync(&server->echo);
1634 spin_lock(&GlobalMid_Lock);
1635 server->tcpStatus = CifsExiting;
1636 spin_unlock(&GlobalMid_Lock);
1638 cifs_crypto_shash_release(server);
1639 cifs_fscache_release_client_cookie(server);
1641 kfree(server->session_key.response);
1642 server->session_key.response = NULL;
1643 server->session_key.len = 0;
1645 task = xchg(&server->tsk, NULL);
1646 if (task)
1647 force_sig(SIGKILL, task);
1650 static struct TCP_Server_Info *
1651 cifs_get_tcp_session(struct smb_vol *volume_info)
1653 struct TCP_Server_Info *tcp_ses = NULL;
1654 struct sockaddr_storage addr;
1655 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1656 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1657 int rc;
1659 memset(&addr, 0, sizeof(struct sockaddr_storage));
1661 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
1663 if (volume_info->UNCip && volume_info->UNC) {
1664 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1665 volume_info->UNCip,
1666 strlen(volume_info->UNCip),
1667 volume_info->port);
1668 if (!rc) {
1669 /* we failed translating address */
1670 rc = -EINVAL;
1671 goto out_err;
1673 } else if (volume_info->UNCip) {
1674 /* BB using ip addr as tcp_ses name to connect to the
1675 DFS root below */
1676 cERROR(1, "Connecting to DFS root not implemented yet");
1677 rc = -EINVAL;
1678 goto out_err;
1679 } else /* which tcp_sess DFS root would we conect to */ {
1680 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1681 "unc=//192.168.1.100/public) specified");
1682 rc = -EINVAL;
1683 goto out_err;
1686 /* see if we already have a matching tcp_ses */
1687 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
1688 if (tcp_ses)
1689 return tcp_ses;
1691 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1692 if (!tcp_ses) {
1693 rc = -ENOMEM;
1694 goto out_err;
1697 rc = cifs_crypto_shash_allocate(tcp_ses);
1698 if (rc) {
1699 cERROR(1, "could not setup hash structures rc %d", rc);
1700 goto out_err;
1703 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1704 tcp_ses->hostname = extract_hostname(volume_info->UNC);
1705 if (IS_ERR(tcp_ses->hostname)) {
1706 rc = PTR_ERR(tcp_ses->hostname);
1707 goto out_err_crypto_release;
1710 tcp_ses->noblocksnd = volume_info->noblocksnd;
1711 tcp_ses->noautotune = volume_info->noautotune;
1712 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
1713 atomic_set(&tcp_ses->inFlight, 0);
1714 init_waitqueue_head(&tcp_ses->response_q);
1715 init_waitqueue_head(&tcp_ses->request_q);
1716 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1717 mutex_init(&tcp_ses->srv_mutex);
1718 memcpy(tcp_ses->workstation_RFC1001_name,
1719 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1720 memcpy(tcp_ses->server_RFC1001_name,
1721 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1722 tcp_ses->session_estab = false;
1723 tcp_ses->sequence_number = 0;
1724 tcp_ses->lstrp = jiffies;
1725 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1726 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1727 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1730 * at this point we are the only ones with the pointer
1731 * to the struct since the kernel thread not created yet
1732 * no need to spinlock this init of tcpStatus or srv_count
1734 tcp_ses->tcpStatus = CifsNew;
1735 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
1736 sizeof(tcp_ses->srcaddr));
1737 ++tcp_ses->srv_count;
1739 if (addr.ss_family == AF_INET6) {
1740 cFYI(1, "attempting ipv6 connect");
1741 /* BB should we allow ipv6 on port 139? */
1742 /* other OS never observed in Wild doing 139 with v6 */
1743 memcpy(&tcp_ses->dstaddr, sin_server6,
1744 sizeof(struct sockaddr_in6));
1745 } else
1746 memcpy(&tcp_ses->dstaddr, sin_server,
1747 sizeof(struct sockaddr_in));
1749 rc = ip_connect(tcp_ses);
1750 if (rc < 0) {
1751 cERROR(1, "Error connecting to socket. Aborting operation");
1752 goto out_err_crypto_release;
1756 * since we're in a cifs function already, we know that
1757 * this will succeed. No need for try_module_get().
1759 __module_get(THIS_MODULE);
1760 tcp_ses->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread,
1761 tcp_ses, "cifsd");
1762 if (IS_ERR(tcp_ses->tsk)) {
1763 rc = PTR_ERR(tcp_ses->tsk);
1764 cERROR(1, "error %d create cifsd thread", rc);
1765 module_put(THIS_MODULE);
1766 goto out_err_crypto_release;
1768 tcp_ses->tcpStatus = CifsNeedNegotiate;
1770 /* thread spawned, put it on the list */
1771 spin_lock(&cifs_tcp_ses_lock);
1772 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1773 spin_unlock(&cifs_tcp_ses_lock);
1775 cifs_fscache_get_client_cookie(tcp_ses);
1777 /* queue echo request delayed work */
1778 queue_delayed_work(system_nrt_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
1780 return tcp_ses;
1782 out_err_crypto_release:
1783 cifs_crypto_shash_release(tcp_ses);
1785 put_net(cifs_net_ns(tcp_ses));
1787 out_err:
1788 if (tcp_ses) {
1789 if (!IS_ERR(tcp_ses->hostname))
1790 kfree(tcp_ses->hostname);
1791 if (tcp_ses->ssocket)
1792 sock_release(tcp_ses->ssocket);
1793 kfree(tcp_ses);
1795 return ERR_PTR(rc);
1798 static struct cifsSesInfo *
1799 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
1801 struct cifsSesInfo *ses;
1803 spin_lock(&cifs_tcp_ses_lock);
1804 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1805 switch (server->secType) {
1806 case Kerberos:
1807 if (vol->cred_uid != ses->cred_uid)
1808 continue;
1809 break;
1810 default:
1811 /* anything else takes username/password */
1812 if (ses->user_name == NULL)
1813 continue;
1814 if (strncmp(ses->user_name, vol->username,
1815 MAX_USERNAME_SIZE))
1816 continue;
1817 if (strlen(vol->username) != 0 &&
1818 ses->password != NULL &&
1819 strncmp(ses->password,
1820 vol->password ? vol->password : "",
1821 MAX_PASSWORD_SIZE))
1822 continue;
1824 ++ses->ses_count;
1825 spin_unlock(&cifs_tcp_ses_lock);
1826 return ses;
1828 spin_unlock(&cifs_tcp_ses_lock);
1829 return NULL;
1832 static void
1833 cifs_put_smb_ses(struct cifsSesInfo *ses)
1835 int xid;
1836 struct TCP_Server_Info *server = ses->server;
1838 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
1839 spin_lock(&cifs_tcp_ses_lock);
1840 if (--ses->ses_count > 0) {
1841 spin_unlock(&cifs_tcp_ses_lock);
1842 return;
1845 list_del_init(&ses->smb_ses_list);
1846 spin_unlock(&cifs_tcp_ses_lock);
1848 if (ses->status == CifsGood) {
1849 xid = GetXid();
1850 CIFSSMBLogoff(xid, ses);
1851 _FreeXid(xid);
1853 sesInfoFree(ses);
1854 cifs_put_tcp_session(server);
1857 static bool warned_on_ntlm; /* globals init to false automatically */
1859 static struct cifsSesInfo *
1860 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
1862 int rc = -ENOMEM, xid;
1863 struct cifsSesInfo *ses;
1864 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1865 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1867 xid = GetXid();
1869 ses = cifs_find_smb_ses(server, volume_info);
1870 if (ses) {
1871 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
1873 mutex_lock(&ses->session_mutex);
1874 rc = cifs_negotiate_protocol(xid, ses);
1875 if (rc) {
1876 mutex_unlock(&ses->session_mutex);
1877 /* problem -- put our ses reference */
1878 cifs_put_smb_ses(ses);
1879 FreeXid(xid);
1880 return ERR_PTR(rc);
1882 if (ses->need_reconnect) {
1883 cFYI(1, "Session needs reconnect");
1884 rc = cifs_setup_session(xid, ses,
1885 volume_info->local_nls);
1886 if (rc) {
1887 mutex_unlock(&ses->session_mutex);
1888 /* problem -- put our reference */
1889 cifs_put_smb_ses(ses);
1890 FreeXid(xid);
1891 return ERR_PTR(rc);
1894 mutex_unlock(&ses->session_mutex);
1896 /* existing SMB ses has a server reference already */
1897 cifs_put_tcp_session(server);
1898 FreeXid(xid);
1899 return ses;
1902 cFYI(1, "Existing smb sess not found");
1903 ses = sesInfoAlloc();
1904 if (ses == NULL)
1905 goto get_ses_fail;
1907 /* new SMB session uses our server ref */
1908 ses->server = server;
1909 if (server->dstaddr.ss_family == AF_INET6)
1910 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
1911 else
1912 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
1914 if (volume_info->username) {
1915 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
1916 if (!ses->user_name)
1917 goto get_ses_fail;
1920 /* volume_info->password freed at unmount */
1921 if (volume_info->password) {
1922 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
1923 if (!ses->password)
1924 goto get_ses_fail;
1926 if (volume_info->domainname) {
1927 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
1928 if (!ses->domainName)
1929 goto get_ses_fail;
1931 ses->cred_uid = volume_info->cred_uid;
1932 ses->linux_uid = volume_info->linux_uid;
1934 /* ntlmv2 is much stronger than ntlm security, and has been broadly
1935 supported for many years, time to update default security mechanism */
1936 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
1937 warned_on_ntlm = true;
1938 cERROR(1, "default security mechanism requested. The default "
1939 "security mechanism will be upgraded from ntlm to "
1940 "ntlmv2 in kernel release 2.6.41");
1942 ses->overrideSecFlg = volume_info->secFlg;
1944 mutex_lock(&ses->session_mutex);
1945 rc = cifs_negotiate_protocol(xid, ses);
1946 if (!rc)
1947 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
1948 mutex_unlock(&ses->session_mutex);
1949 if (rc)
1950 goto get_ses_fail;
1952 /* success, put it on the list */
1953 spin_lock(&cifs_tcp_ses_lock);
1954 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1955 spin_unlock(&cifs_tcp_ses_lock);
1957 FreeXid(xid);
1958 return ses;
1960 get_ses_fail:
1961 sesInfoFree(ses);
1962 FreeXid(xid);
1963 return ERR_PTR(rc);
1966 static struct cifsTconInfo *
1967 cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
1969 struct list_head *tmp;
1970 struct cifsTconInfo *tcon;
1972 spin_lock(&cifs_tcp_ses_lock);
1973 list_for_each(tmp, &ses->tcon_list) {
1974 tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
1975 if (tcon->tidStatus == CifsExiting)
1976 continue;
1977 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
1978 continue;
1980 ++tcon->tc_count;
1981 spin_unlock(&cifs_tcp_ses_lock);
1982 return tcon;
1984 spin_unlock(&cifs_tcp_ses_lock);
1985 return NULL;
1988 static void
1989 cifs_put_tcon(struct cifsTconInfo *tcon)
1991 int xid;
1992 struct cifsSesInfo *ses = tcon->ses;
1994 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
1995 spin_lock(&cifs_tcp_ses_lock);
1996 if (--tcon->tc_count > 0) {
1997 spin_unlock(&cifs_tcp_ses_lock);
1998 return;
2001 list_del_init(&tcon->tcon_list);
2002 spin_unlock(&cifs_tcp_ses_lock);
2004 xid = GetXid();
2005 CIFSSMBTDis(xid, tcon);
2006 _FreeXid(xid);
2008 cifs_fscache_release_super_cookie(tcon);
2009 tconInfoFree(tcon);
2010 cifs_put_smb_ses(ses);
2013 static struct cifsTconInfo *
2014 cifs_get_tcon(struct cifsSesInfo *ses, struct smb_vol *volume_info)
2016 int rc, xid;
2017 struct cifsTconInfo *tcon;
2019 tcon = cifs_find_tcon(ses, volume_info->UNC);
2020 if (tcon) {
2021 cFYI(1, "Found match on UNC path");
2022 /* existing tcon already has a reference */
2023 cifs_put_smb_ses(ses);
2024 if (tcon->seal != volume_info->seal)
2025 cERROR(1, "transport encryption setting "
2026 "conflicts with existing tid");
2027 return tcon;
2030 tcon = tconInfoAlloc();
2031 if (tcon == NULL) {
2032 rc = -ENOMEM;
2033 goto out_fail;
2036 tcon->ses = ses;
2037 if (volume_info->password) {
2038 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2039 if (!tcon->password) {
2040 rc = -ENOMEM;
2041 goto out_fail;
2045 if (strchr(volume_info->UNC + 3, '\\') == NULL
2046 && strchr(volume_info->UNC + 3, '/') == NULL) {
2047 cERROR(1, "Missing share name");
2048 rc = -ENODEV;
2049 goto out_fail;
2052 /* BB Do we need to wrap session_mutex around
2053 * this TCon call and Unix SetFS as
2054 * we do on SessSetup and reconnect? */
2055 xid = GetXid();
2056 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2057 FreeXid(xid);
2058 cFYI(1, "CIFS Tcon rc = %d", rc);
2059 if (rc)
2060 goto out_fail;
2062 if (volume_info->nodfs) {
2063 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2064 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2066 tcon->seal = volume_info->seal;
2067 /* we can have only one retry value for a connection
2068 to a share so for resources mounted more than once
2069 to the same server share the last value passed in
2070 for the retry flag is used */
2071 tcon->retry = volume_info->retry;
2072 tcon->nocase = volume_info->nocase;
2073 tcon->local_lease = volume_info->local_lease;
2075 spin_lock(&cifs_tcp_ses_lock);
2076 list_add(&tcon->tcon_list, &ses->tcon_list);
2077 spin_unlock(&cifs_tcp_ses_lock);
2079 cifs_fscache_get_super_cookie(tcon);
2081 return tcon;
2083 out_fail:
2084 tconInfoFree(tcon);
2085 return ERR_PTR(rc);
2088 void
2089 cifs_put_tlink(struct tcon_link *tlink)
2091 if (!tlink || IS_ERR(tlink))
2092 return;
2094 if (!atomic_dec_and_test(&tlink->tl_count) ||
2095 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2096 tlink->tl_time = jiffies;
2097 return;
2100 if (!IS_ERR(tlink_tcon(tlink)))
2101 cifs_put_tcon(tlink_tcon(tlink));
2102 kfree(tlink);
2103 return;
2107 get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
2108 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
2109 struct dfs_info3_param **preferrals, int remap)
2111 char *temp_unc;
2112 int rc = 0;
2114 *pnum_referrals = 0;
2115 *preferrals = NULL;
2117 if (pSesInfo->ipc_tid == 0) {
2118 temp_unc = kmalloc(2 /* for slashes */ +
2119 strnlen(pSesInfo->serverName,
2120 SERVER_NAME_LEN_WITH_NULL * 2)
2121 + 1 + 4 /* slash IPC$ */ + 2,
2122 GFP_KERNEL);
2123 if (temp_unc == NULL)
2124 return -ENOMEM;
2125 temp_unc[0] = '\\';
2126 temp_unc[1] = '\\';
2127 strcpy(temp_unc + 2, pSesInfo->serverName);
2128 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2129 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
2130 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
2131 kfree(temp_unc);
2133 if (rc == 0)
2134 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
2135 pnum_referrals, nls_codepage, remap);
2136 /* BB map targetUNCs to dfs_info3 structures, here or
2137 in CIFSGetDFSRefer BB */
2139 return rc;
2142 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2143 static struct lock_class_key cifs_key[2];
2144 static struct lock_class_key cifs_slock_key[2];
2146 static inline void
2147 cifs_reclassify_socket4(struct socket *sock)
2149 struct sock *sk = sock->sk;
2150 BUG_ON(sock_owned_by_user(sk));
2151 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2152 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2155 static inline void
2156 cifs_reclassify_socket6(struct socket *sock)
2158 struct sock *sk = sock->sk;
2159 BUG_ON(sock_owned_by_user(sk));
2160 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2161 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2163 #else
2164 static inline void
2165 cifs_reclassify_socket4(struct socket *sock)
2169 static inline void
2170 cifs_reclassify_socket6(struct socket *sock)
2173 #endif
2175 /* See RFC1001 section 14 on representation of Netbios names */
2176 static void rfc1002mangle(char *target, char *source, unsigned int length)
2178 unsigned int i, j;
2180 for (i = 0, j = 0; i < (length); i++) {
2181 /* mask a nibble at a time and encode */
2182 target[j] = 'A' + (0x0F & (source[i] >> 4));
2183 target[j+1] = 'A' + (0x0F & source[i]);
2184 j += 2;
2189 static int
2190 bind_socket(struct TCP_Server_Info *server)
2192 int rc = 0;
2193 if (server->srcaddr.ss_family != AF_UNSPEC) {
2194 /* Bind to the specified local IP address */
2195 struct socket *socket = server->ssocket;
2196 rc = socket->ops->bind(socket,
2197 (struct sockaddr *) &server->srcaddr,
2198 sizeof(server->srcaddr));
2199 if (rc < 0) {
2200 struct sockaddr_in *saddr4;
2201 struct sockaddr_in6 *saddr6;
2202 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2203 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2204 if (saddr6->sin6_family == AF_INET6)
2205 cERROR(1, "cifs: "
2206 "Failed to bind to: %pI6c, error: %d\n",
2207 &saddr6->sin6_addr, rc);
2208 else
2209 cERROR(1, "cifs: "
2210 "Failed to bind to: %pI4, error: %d\n",
2211 &saddr4->sin_addr.s_addr, rc);
2214 return rc;
2217 static int
2218 ip_rfc1001_connect(struct TCP_Server_Info *server)
2220 int rc = 0;
2222 * some servers require RFC1001 sessinit before sending
2223 * negprot - BB check reconnection in case where second
2224 * sessinit is sent but no second negprot
2226 struct rfc1002_session_packet *ses_init_buf;
2227 struct smb_hdr *smb_buf;
2228 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2229 GFP_KERNEL);
2230 if (ses_init_buf) {
2231 ses_init_buf->trailer.session_req.called_len = 32;
2233 if (server->server_RFC1001_name &&
2234 server->server_RFC1001_name[0] != 0)
2235 rfc1002mangle(ses_init_buf->trailer.
2236 session_req.called_name,
2237 server->server_RFC1001_name,
2238 RFC1001_NAME_LEN_WITH_NULL);
2239 else
2240 rfc1002mangle(ses_init_buf->trailer.
2241 session_req.called_name,
2242 DEFAULT_CIFS_CALLED_NAME,
2243 RFC1001_NAME_LEN_WITH_NULL);
2245 ses_init_buf->trailer.session_req.calling_len = 32;
2248 * calling name ends in null (byte 16) from old smb
2249 * convention.
2251 if (server->workstation_RFC1001_name &&
2252 server->workstation_RFC1001_name[0] != 0)
2253 rfc1002mangle(ses_init_buf->trailer.
2254 session_req.calling_name,
2255 server->workstation_RFC1001_name,
2256 RFC1001_NAME_LEN_WITH_NULL);
2257 else
2258 rfc1002mangle(ses_init_buf->trailer.
2259 session_req.calling_name,
2260 "LINUX_CIFS_CLNT",
2261 RFC1001_NAME_LEN_WITH_NULL);
2263 ses_init_buf->trailer.session_req.scope1 = 0;
2264 ses_init_buf->trailer.session_req.scope2 = 0;
2265 smb_buf = (struct smb_hdr *)ses_init_buf;
2267 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2268 smb_buf->smb_buf_length = 0x81000044;
2269 rc = smb_send(server, smb_buf, 0x44);
2270 kfree(ses_init_buf);
2272 * RFC1001 layer in at least one server
2273 * requires very short break before negprot
2274 * presumably because not expecting negprot
2275 * to follow so fast. This is a simple
2276 * solution that works without
2277 * complicating the code and causes no
2278 * significant slowing down on mount
2279 * for everyone else
2281 usleep_range(1000, 2000);
2284 * else the negprot may still work without this
2285 * even though malloc failed
2288 return rc;
2291 static int
2292 generic_ip_connect(struct TCP_Server_Info *server)
2294 int rc = 0;
2295 __be16 sport;
2296 int slen, sfamily;
2297 struct socket *socket = server->ssocket;
2298 struct sockaddr *saddr;
2300 saddr = (struct sockaddr *) &server->dstaddr;
2302 if (server->dstaddr.ss_family == AF_INET6) {
2303 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2304 slen = sizeof(struct sockaddr_in6);
2305 sfamily = AF_INET6;
2306 } else {
2307 sport = ((struct sockaddr_in *) saddr)->sin_port;
2308 slen = sizeof(struct sockaddr_in);
2309 sfamily = AF_INET;
2312 if (socket == NULL) {
2313 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2314 IPPROTO_TCP, &socket, 1);
2315 if (rc < 0) {
2316 cERROR(1, "Error %d creating socket", rc);
2317 server->ssocket = NULL;
2318 return rc;
2321 /* BB other socket options to set KEEPALIVE, NODELAY? */
2322 cFYI(1, "Socket created");
2323 server->ssocket = socket;
2324 socket->sk->sk_allocation = GFP_NOFS;
2325 if (sfamily == AF_INET6)
2326 cifs_reclassify_socket6(socket);
2327 else
2328 cifs_reclassify_socket4(socket);
2331 rc = bind_socket(server);
2332 if (rc < 0)
2333 return rc;
2335 rc = socket->ops->connect(socket, saddr, slen, 0);
2336 if (rc < 0) {
2337 cFYI(1, "Error %d connecting to server", rc);
2338 sock_release(socket);
2339 server->ssocket = NULL;
2340 return rc;
2344 * Eventually check for other socket options to change from
2345 * the default. sock_setsockopt not used because it expects
2346 * user space buffer
2348 socket->sk->sk_rcvtimeo = 7 * HZ;
2349 socket->sk->sk_sndtimeo = 5 * HZ;
2351 /* make the bufsizes depend on wsize/rsize and max requests */
2352 if (server->noautotune) {
2353 if (socket->sk->sk_sndbuf < (200 * 1024))
2354 socket->sk->sk_sndbuf = 200 * 1024;
2355 if (socket->sk->sk_rcvbuf < (140 * 1024))
2356 socket->sk->sk_rcvbuf = 140 * 1024;
2359 if (server->tcp_nodelay) {
2360 int val = 1;
2361 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2362 (char *)&val, sizeof(val));
2363 if (rc)
2364 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
2367 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2368 socket->sk->sk_sndbuf,
2369 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2371 if (sport == htons(RFC1001_PORT))
2372 rc = ip_rfc1001_connect(server);
2374 return rc;
2377 static int
2378 ip_connect(struct TCP_Server_Info *server)
2380 __be16 *sport;
2381 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2382 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2384 if (server->dstaddr.ss_family == AF_INET6)
2385 sport = &addr6->sin6_port;
2386 else
2387 sport = &addr->sin_port;
2389 if (*sport == 0) {
2390 int rc;
2392 /* try with 445 port at first */
2393 *sport = htons(CIFS_PORT);
2395 rc = generic_ip_connect(server);
2396 if (rc >= 0)
2397 return rc;
2399 /* if it failed, try with 139 port */
2400 *sport = htons(RFC1001_PORT);
2403 return generic_ip_connect(server);
2406 void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
2407 struct super_block *sb, struct smb_vol *vol_info)
2409 /* if we are reconnecting then should we check to see if
2410 * any requested capabilities changed locally e.g. via
2411 * remount but we can not do much about it here
2412 * if they have (even if we could detect it by the following)
2413 * Perhaps we could add a backpointer to array of sb from tcon
2414 * or if we change to make all sb to same share the same
2415 * sb as NFS - then we only have one backpointer to sb.
2416 * What if we wanted to mount the server share twice once with
2417 * and once without posixacls or posix paths? */
2418 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2420 if (vol_info && vol_info->no_linux_ext) {
2421 tcon->fsUnixInfo.Capability = 0;
2422 tcon->unix_ext = 0; /* Unix Extensions disabled */
2423 cFYI(1, "Linux protocol extensions disabled");
2424 return;
2425 } else if (vol_info)
2426 tcon->unix_ext = 1; /* Unix Extensions supported */
2428 if (tcon->unix_ext == 0) {
2429 cFYI(1, "Unix extensions disabled so not set on reconnect");
2430 return;
2433 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2434 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2436 /* check for reconnect case in which we do not
2437 want to change the mount behavior if we can avoid it */
2438 if (vol_info == NULL) {
2439 /* turn off POSIX ACL and PATHNAMES if not set
2440 originally at mount time */
2441 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2442 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2443 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2444 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2445 cERROR(1, "POSIXPATH support change");
2446 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2447 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2448 cERROR(1, "possible reconnect error");
2449 cERROR(1, "server disabled POSIX path support");
2453 cap &= CIFS_UNIX_CAP_MASK;
2454 if (vol_info && vol_info->no_psx_acl)
2455 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2456 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2457 cFYI(1, "negotiated posix acl support");
2458 if (sb)
2459 sb->s_flags |= MS_POSIXACL;
2462 if (vol_info && vol_info->posix_paths == 0)
2463 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2464 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2465 cFYI(1, "negotiate posix pathnames");
2466 if (sb)
2467 CIFS_SB(sb)->mnt_cifs_flags |=
2468 CIFS_MOUNT_POSIX_PATHS;
2471 /* We might be setting the path sep back to a different
2472 form if we are reconnecting and the server switched its
2473 posix path capability for this share */
2474 if (sb && (CIFS_SB(sb)->prepathlen > 0))
2475 CIFS_SB(sb)->prepath[0] = CIFS_DIR_SEP(CIFS_SB(sb));
2477 if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) {
2478 if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) {
2479 CIFS_SB(sb)->rsize = 127 * 1024;
2480 cFYI(DBG2, "larger reads not supported by srv");
2485 cFYI(1, "Negotiate caps 0x%x", (int)cap);
2486 #ifdef CONFIG_CIFS_DEBUG2
2487 if (cap & CIFS_UNIX_FCNTL_CAP)
2488 cFYI(1, "FCNTL cap");
2489 if (cap & CIFS_UNIX_EXTATTR_CAP)
2490 cFYI(1, "EXTATTR cap");
2491 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2492 cFYI(1, "POSIX path cap");
2493 if (cap & CIFS_UNIX_XATTR_CAP)
2494 cFYI(1, "XATTR cap");
2495 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2496 cFYI(1, "POSIX ACL cap");
2497 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2498 cFYI(1, "very large read cap");
2499 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2500 cFYI(1, "very large write cap");
2501 #endif /* CIFS_DEBUG2 */
2502 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2503 if (vol_info == NULL) {
2504 cFYI(1, "resetting capabilities failed");
2505 } else
2506 cERROR(1, "Negotiating Unix capabilities "
2507 "with the server failed. Consider "
2508 "mounting with the Unix Extensions\n"
2509 "disabled, if problems are found, "
2510 "by specifying the nounix mount "
2511 "option.");
2517 static void
2518 convert_delimiter(char *path, char delim)
2520 int i;
2521 char old_delim;
2523 if (path == NULL)
2524 return;
2526 if (delim == '/')
2527 old_delim = '\\';
2528 else
2529 old_delim = '/';
2531 for (i = 0; path[i] != '\0'; i++) {
2532 if (path[i] == old_delim)
2533 path[i] = delim;
2537 static void setup_cifs_sb(struct smb_vol *pvolume_info,
2538 struct cifs_sb_info *cifs_sb)
2540 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2542 if (pvolume_info->rsize > CIFSMaxBufSize) {
2543 cERROR(1, "rsize %d too large, using MaxBufSize",
2544 pvolume_info->rsize);
2545 cifs_sb->rsize = CIFSMaxBufSize;
2546 } else if ((pvolume_info->rsize) &&
2547 (pvolume_info->rsize <= CIFSMaxBufSize))
2548 cifs_sb->rsize = pvolume_info->rsize;
2549 else /* default */
2550 cifs_sb->rsize = CIFSMaxBufSize;
2552 if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
2553 cERROR(1, "wsize %d too large, using 4096 instead",
2554 pvolume_info->wsize);
2555 cifs_sb->wsize = 4096;
2556 } else if (pvolume_info->wsize)
2557 cifs_sb->wsize = pvolume_info->wsize;
2558 else
2559 cifs_sb->wsize = min_t(const int,
2560 PAGEVEC_SIZE * PAGE_CACHE_SIZE,
2561 127*1024);
2562 /* old default of CIFSMaxBufSize was too small now
2563 that SMB Write2 can send multiple pages in kvec.
2564 RFC1001 does not describe what happens when frame
2565 bigger than 128K is sent so use that as max in
2566 conjunction with 52K kvec constraint on arch with 4K
2567 page size */
2569 if (cifs_sb->rsize < 2048) {
2570 cifs_sb->rsize = 2048;
2571 /* Windows ME may prefer this */
2572 cFYI(1, "readsize set to minimum: 2048");
2574 /* calculate prepath */
2575 cifs_sb->prepath = pvolume_info->prepath;
2576 if (cifs_sb->prepath) {
2577 cifs_sb->prepathlen = strlen(cifs_sb->prepath);
2578 /* we can not convert the / to \ in the path
2579 separators in the prefixpath yet because we do not
2580 know (until reset_cifs_unix_caps is called later)
2581 whether POSIX PATH CAP is available. We normalize
2582 the / to \ after reset_cifs_unix_caps is called */
2583 pvolume_info->prepath = NULL;
2584 } else
2585 cifs_sb->prepathlen = 0;
2586 cifs_sb->mnt_uid = pvolume_info->linux_uid;
2587 cifs_sb->mnt_gid = pvolume_info->linux_gid;
2588 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2589 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
2590 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2591 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
2593 cifs_sb->actimeo = pvolume_info->actimeo;
2595 if (pvolume_info->noperm)
2596 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
2597 if (pvolume_info->setuids)
2598 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
2599 if (pvolume_info->server_ino)
2600 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
2601 if (pvolume_info->remap)
2602 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
2603 if (pvolume_info->no_xattr)
2604 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
2605 if (pvolume_info->sfu_emul)
2606 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
2607 if (pvolume_info->nobrl)
2608 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
2609 if (pvolume_info->nostrictsync)
2610 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
2611 if (pvolume_info->mand_lock)
2612 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
2613 if (pvolume_info->cifs_acl)
2614 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
2615 if (pvolume_info->override_uid)
2616 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
2617 if (pvolume_info->override_gid)
2618 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
2619 if (pvolume_info->dynperm)
2620 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
2621 if (pvolume_info->fsc)
2622 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
2623 if (pvolume_info->multiuser)
2624 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
2625 CIFS_MOUNT_NO_PERM);
2626 if (pvolume_info->strict_io)
2627 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
2628 if (pvolume_info->direct_io) {
2629 cFYI(1, "mounting share using direct i/o");
2630 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2632 if (pvolume_info->mfsymlinks) {
2633 if (pvolume_info->sfu_emul) {
2634 cERROR(1, "mount option mfsymlinks ignored if sfu "
2635 "mount option is used");
2636 } else {
2637 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
2641 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
2642 cERROR(1, "mount option dynperm ignored if cifsacl "
2643 "mount option supported");
2646 static int
2647 is_path_accessible(int xid, struct cifsTconInfo *tcon,
2648 struct cifs_sb_info *cifs_sb, const char *full_path)
2650 int rc;
2651 FILE_ALL_INFO *pfile_info;
2653 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
2654 if (pfile_info == NULL)
2655 return -ENOMEM;
2657 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
2658 0 /* not legacy */, cifs_sb->local_nls,
2659 cifs_sb->mnt_cifs_flags &
2660 CIFS_MOUNT_MAP_SPECIAL_CHR);
2661 kfree(pfile_info);
2662 return rc;
2665 static void
2666 cleanup_volume_info(struct smb_vol **pvolume_info)
2668 struct smb_vol *volume_info;
2670 if (!pvolume_info || !*pvolume_info)
2671 return;
2673 volume_info = *pvolume_info;
2674 kzfree(volume_info->password);
2675 kfree(volume_info->UNC);
2676 kfree(volume_info->prepath);
2677 kfree(volume_info);
2678 *pvolume_info = NULL;
2679 return;
2682 #ifdef CONFIG_CIFS_DFS_UPCALL
2683 /* build_path_to_root returns full path to root when
2684 * we do not have an exiting connection (tcon) */
2685 static char *
2686 build_unc_path_to_root(const struct smb_vol *volume_info,
2687 const struct cifs_sb_info *cifs_sb)
2689 char *full_path;
2691 int unc_len = strnlen(volume_info->UNC, MAX_TREE_SIZE + 1);
2692 full_path = kmalloc(unc_len + cifs_sb->prepathlen + 1, GFP_KERNEL);
2693 if (full_path == NULL)
2694 return ERR_PTR(-ENOMEM);
2696 strncpy(full_path, volume_info->UNC, unc_len);
2697 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
2698 int i;
2699 for (i = 0; i < unc_len; i++) {
2700 if (full_path[i] == '\\')
2701 full_path[i] = '/';
2705 if (cifs_sb->prepathlen)
2706 strncpy(full_path + unc_len, cifs_sb->prepath,
2707 cifs_sb->prepathlen);
2709 full_path[unc_len + cifs_sb->prepathlen] = 0; /* add trailing null */
2710 return full_path;
2712 #endif
2715 cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
2716 char *mount_data_global, const char *devname)
2718 int rc;
2719 int xid;
2720 struct smb_vol *volume_info;
2721 struct cifsSesInfo *pSesInfo;
2722 struct cifsTconInfo *tcon;
2723 struct TCP_Server_Info *srvTcp;
2724 char *full_path;
2725 char *mount_data = mount_data_global;
2726 struct tcon_link *tlink;
2727 #ifdef CONFIG_CIFS_DFS_UPCALL
2728 struct dfs_info3_param *referrals = NULL;
2729 unsigned int num_referrals = 0;
2730 int referral_walks_count = 0;
2731 try_mount_again:
2732 #endif
2733 rc = 0;
2734 tcon = NULL;
2735 pSesInfo = NULL;
2736 srvTcp = NULL;
2737 full_path = NULL;
2738 tlink = NULL;
2740 xid = GetXid();
2742 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
2743 if (!volume_info) {
2744 rc = -ENOMEM;
2745 goto out;
2748 if (cifs_parse_mount_options(mount_data, devname, volume_info)) {
2749 rc = -EINVAL;
2750 goto out;
2753 if (volume_info->nullauth) {
2754 cFYI(1, "null user");
2755 volume_info->username = "";
2756 } else if (volume_info->username) {
2757 /* BB fixme parse for domain name here */
2758 cFYI(1, "Username: %s", volume_info->username);
2759 } else {
2760 cifserror("No username specified");
2761 /* In userspace mount helper we can get user name from alternate
2762 locations such as env variables and files on disk */
2763 rc = -EINVAL;
2764 goto out;
2767 /* this is needed for ASCII cp to Unicode converts */
2768 if (volume_info->iocharset == NULL) {
2769 /* load_nls_default cannot return null */
2770 volume_info->local_nls = load_nls_default();
2771 } else {
2772 volume_info->local_nls = load_nls(volume_info->iocharset);
2773 if (volume_info->local_nls == NULL) {
2774 cERROR(1, "CIFS mount error: iocharset %s not found",
2775 volume_info->iocharset);
2776 rc = -ELIBACC;
2777 goto out;
2780 cifs_sb->local_nls = volume_info->local_nls;
2782 /* get a reference to a tcp session */
2783 srvTcp = cifs_get_tcp_session(volume_info);
2784 if (IS_ERR(srvTcp)) {
2785 rc = PTR_ERR(srvTcp);
2786 goto out;
2789 /* get a reference to a SMB session */
2790 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
2791 if (IS_ERR(pSesInfo)) {
2792 rc = PTR_ERR(pSesInfo);
2793 pSesInfo = NULL;
2794 goto mount_fail_check;
2797 setup_cifs_sb(volume_info, cifs_sb);
2798 if (pSesInfo->capabilities & CAP_LARGE_FILES)
2799 sb->s_maxbytes = MAX_LFS_FILESIZE;
2800 else
2801 sb->s_maxbytes = MAX_NON_LFS;
2803 /* BB FIXME fix time_gran to be larger for LANMAN sessions */
2804 sb->s_time_gran = 100;
2806 /* search for existing tcon to this server share */
2807 tcon = cifs_get_tcon(pSesInfo, volume_info);
2808 if (IS_ERR(tcon)) {
2809 rc = PTR_ERR(tcon);
2810 tcon = NULL;
2811 goto remote_path_check;
2814 /* do not care if following two calls succeed - informational */
2815 if (!tcon->ipc) {
2816 CIFSSMBQFSDeviceInfo(xid, tcon);
2817 CIFSSMBQFSAttributeInfo(xid, tcon);
2820 /* tell server which Unix caps we support */
2821 if (tcon->ses->capabilities & CAP_UNIX)
2822 /* reset of caps checks mount to see if unix extensions
2823 disabled for just this mount */
2824 reset_cifs_unix_caps(xid, tcon, sb, volume_info);
2825 else
2826 tcon->unix_ext = 0; /* server does not support them */
2828 /* convert forward to back slashes in prepath here if needed */
2829 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
2830 convert_delimiter(cifs_sb->prepath, CIFS_DIR_SEP(cifs_sb));
2832 if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
2833 cifs_sb->rsize = 1024 * 127;
2834 cFYI(DBG2, "no very large read support, rsize now 127K");
2836 if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
2837 cifs_sb->wsize = min(cifs_sb->wsize,
2838 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
2839 if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
2840 cifs_sb->rsize = min(cifs_sb->rsize,
2841 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
2843 remote_path_check:
2844 /* check if a whole path (including prepath) is not remote */
2845 if (!rc && tcon) {
2846 /* build_path_to_root works only when we have a valid tcon */
2847 full_path = cifs_build_path_to_root(cifs_sb, tcon);
2848 if (full_path == NULL) {
2849 rc = -ENOMEM;
2850 goto mount_fail_check;
2852 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
2853 if (rc != 0 && rc != -EREMOTE) {
2854 kfree(full_path);
2855 goto mount_fail_check;
2857 kfree(full_path);
2860 /* get referral if needed */
2861 if (rc == -EREMOTE) {
2862 #ifdef CONFIG_CIFS_DFS_UPCALL
2863 if (referral_walks_count > MAX_NESTED_LINKS) {
2865 * BB: when we implement proper loop detection,
2866 * we will remove this check. But now we need it
2867 * to prevent an indefinite loop if 'DFS tree' is
2868 * misconfigured (i.e. has loops).
2870 rc = -ELOOP;
2871 goto mount_fail_check;
2873 /* convert forward to back slashes in prepath here if needed */
2874 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
2875 convert_delimiter(cifs_sb->prepath,
2876 CIFS_DIR_SEP(cifs_sb));
2877 full_path = build_unc_path_to_root(volume_info, cifs_sb);
2878 if (IS_ERR(full_path)) {
2879 rc = PTR_ERR(full_path);
2880 goto mount_fail_check;
2883 cFYI(1, "Getting referral for: %s", full_path);
2884 rc = get_dfs_path(xid, pSesInfo , full_path + 1,
2885 cifs_sb->local_nls, &num_referrals, &referrals,
2886 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
2887 if (!rc && num_referrals > 0) {
2888 char *fake_devname = NULL;
2890 if (mount_data != mount_data_global)
2891 kfree(mount_data);
2893 mount_data = cifs_compose_mount_options(
2894 cifs_sb->mountdata, full_path + 1,
2895 referrals, &fake_devname);
2897 free_dfs_info_array(referrals, num_referrals);
2898 kfree(fake_devname);
2899 kfree(full_path);
2901 if (IS_ERR(mount_data)) {
2902 rc = PTR_ERR(mount_data);
2903 mount_data = NULL;
2904 goto mount_fail_check;
2907 if (tcon)
2908 cifs_put_tcon(tcon);
2909 else if (pSesInfo)
2910 cifs_put_smb_ses(pSesInfo);
2912 cleanup_volume_info(&volume_info);
2913 referral_walks_count++;
2914 FreeXid(xid);
2915 goto try_mount_again;
2917 #else /* No DFS support, return error on mount */
2918 rc = -EOPNOTSUPP;
2919 #endif
2922 if (rc)
2923 goto mount_fail_check;
2925 /* now, hang the tcon off of the superblock */
2926 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
2927 if (tlink == NULL) {
2928 rc = -ENOMEM;
2929 goto mount_fail_check;
2932 tlink->tl_uid = pSesInfo->linux_uid;
2933 tlink->tl_tcon = tcon;
2934 tlink->tl_time = jiffies;
2935 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2936 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2938 cifs_sb->master_tlink = tlink;
2939 spin_lock(&cifs_sb->tlink_tree_lock);
2940 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2941 spin_unlock(&cifs_sb->tlink_tree_lock);
2943 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
2944 TLINK_IDLE_EXPIRE);
2946 mount_fail_check:
2947 /* on error free sesinfo and tcon struct if needed */
2948 if (rc) {
2949 if (mount_data != mount_data_global)
2950 kfree(mount_data);
2951 /* If find_unc succeeded then rc == 0 so we can not end */
2952 /* up accidentally freeing someone elses tcon struct */
2953 if (tcon)
2954 cifs_put_tcon(tcon);
2955 else if (pSesInfo)
2956 cifs_put_smb_ses(pSesInfo);
2957 else
2958 cifs_put_tcp_session(srvTcp);
2959 goto out;
2962 /* volume_info->password is freed above when existing session found
2963 (in which case it is not needed anymore) but when new sesion is created
2964 the password ptr is put in the new session structure (in which case the
2965 password will be freed at unmount time) */
2966 out:
2967 /* zero out password before freeing */
2968 cleanup_volume_info(&volume_info);
2969 FreeXid(xid);
2970 return rc;
2974 CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
2975 const char *tree, struct cifsTconInfo *tcon,
2976 const struct nls_table *nls_codepage)
2978 struct smb_hdr *smb_buffer;
2979 struct smb_hdr *smb_buffer_response;
2980 TCONX_REQ *pSMB;
2981 TCONX_RSP *pSMBr;
2982 unsigned char *bcc_ptr;
2983 int rc = 0;
2984 int length;
2985 __u16 bytes_left, count;
2987 if (ses == NULL)
2988 return -EIO;
2990 smb_buffer = cifs_buf_get();
2991 if (smb_buffer == NULL)
2992 return -ENOMEM;
2994 smb_buffer_response = smb_buffer;
2996 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
2997 NULL /*no tid */ , 4 /*wct */ );
2999 smb_buffer->Mid = GetNextMid(ses->server);
3000 smb_buffer->Uid = ses->Suid;
3001 pSMB = (TCONX_REQ *) smb_buffer;
3002 pSMBr = (TCONX_RSP *) smb_buffer_response;
3004 pSMB->AndXCommand = 0xFF;
3005 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3006 bcc_ptr = &pSMB->Password[0];
3007 if ((ses->server->secMode) & SECMODE_USER) {
3008 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3009 *bcc_ptr = 0; /* password is null byte */
3010 bcc_ptr++; /* skip password */
3011 /* already aligned so no need to do it below */
3012 } else {
3013 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3014 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3015 specified as required (when that support is added to
3016 the vfs in the future) as only NTLM or the much
3017 weaker LANMAN (which we do not send by default) is accepted
3018 by Samba (not sure whether other servers allow
3019 NTLMv2 password here) */
3020 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3021 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3022 (ses->server->secType == LANMAN))
3023 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3024 ses->server->secMode &
3025 SECMODE_PW_ENCRYPT ? true : false,
3026 bcc_ptr);
3027 else
3028 #endif /* CIFS_WEAK_PW_HASH */
3029 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3030 bcc_ptr);
3032 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3033 if (ses->capabilities & CAP_UNICODE) {
3034 /* must align unicode strings */
3035 *bcc_ptr = 0; /* null byte password */
3036 bcc_ptr++;
3040 if (ses->server->secMode &
3041 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3042 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3044 if (ses->capabilities & CAP_STATUS32) {
3045 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3047 if (ses->capabilities & CAP_DFS) {
3048 smb_buffer->Flags2 |= SMBFLG2_DFS;
3050 if (ses->capabilities & CAP_UNICODE) {
3051 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3052 length =
3053 cifs_strtoUCS((__le16 *) bcc_ptr, tree,
3054 6 /* max utf8 char length in bytes */ *
3055 (/* server len*/ + 256 /* share len */), nls_codepage);
3056 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3057 bcc_ptr += 2; /* skip trailing null */
3058 } else { /* ASCII */
3059 strcpy(bcc_ptr, tree);
3060 bcc_ptr += strlen(tree) + 1;
3062 strcpy(bcc_ptr, "?????");
3063 bcc_ptr += strlen("?????");
3064 bcc_ptr += 1;
3065 count = bcc_ptr - &pSMB->Password[0];
3066 pSMB->hdr.smb_buf_length += count;
3067 pSMB->ByteCount = cpu_to_le16(count);
3069 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3072 /* above now done in SendReceive */
3073 if ((rc == 0) && (tcon != NULL)) {
3074 bool is_unicode;
3076 tcon->tidStatus = CifsGood;
3077 tcon->need_reconnect = false;
3078 tcon->tid = smb_buffer_response->Tid;
3079 bcc_ptr = pByteArea(smb_buffer_response);
3080 bytes_left = get_bcc(smb_buffer_response);
3081 length = strnlen(bcc_ptr, bytes_left - 2);
3082 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3083 is_unicode = true;
3084 else
3085 is_unicode = false;
3088 /* skip service field (NB: this field is always ASCII) */
3089 if (length == 3) {
3090 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3091 (bcc_ptr[2] == 'C')) {
3092 cFYI(1, "IPC connection");
3093 tcon->ipc = 1;
3095 } else if (length == 2) {
3096 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3097 /* the most common case */
3098 cFYI(1, "disk share connection");
3101 bcc_ptr += length + 1;
3102 bytes_left -= (length + 1);
3103 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3105 /* mostly informational -- no need to fail on error here */
3106 kfree(tcon->nativeFileSystem);
3107 tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
3108 bytes_left, is_unicode,
3109 nls_codepage);
3111 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3113 if ((smb_buffer_response->WordCount == 3) ||
3114 (smb_buffer_response->WordCount == 7))
3115 /* field is in same location */
3116 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3117 else
3118 tcon->Flags = 0;
3119 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3120 } else if ((rc == 0) && tcon == NULL) {
3121 /* all we need to save for IPC$ connection */
3122 ses->ipc_tid = smb_buffer_response->Tid;
3125 cifs_buf_release(smb_buffer);
3126 return rc;
3130 cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
3132 struct rb_root *root = &cifs_sb->tlink_tree;
3133 struct rb_node *node;
3134 struct tcon_link *tlink;
3135 char *tmp;
3137 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3139 spin_lock(&cifs_sb->tlink_tree_lock);
3140 while ((node = rb_first(root))) {
3141 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3142 cifs_get_tlink(tlink);
3143 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3144 rb_erase(node, root);
3146 spin_unlock(&cifs_sb->tlink_tree_lock);
3147 cifs_put_tlink(tlink);
3148 spin_lock(&cifs_sb->tlink_tree_lock);
3150 spin_unlock(&cifs_sb->tlink_tree_lock);
3152 tmp = cifs_sb->prepath;
3153 cifs_sb->prepathlen = 0;
3154 cifs_sb->prepath = NULL;
3155 kfree(tmp);
3157 return 0;
3160 int cifs_negotiate_protocol(unsigned int xid, struct cifsSesInfo *ses)
3162 int rc = 0;
3163 struct TCP_Server_Info *server = ses->server;
3165 /* only send once per connect */
3166 if (server->maxBuf != 0)
3167 return 0;
3169 rc = CIFSSMBNegotiate(xid, ses);
3170 if (rc == -EAGAIN) {
3171 /* retry only once on 1st time connection */
3172 rc = CIFSSMBNegotiate(xid, ses);
3173 if (rc == -EAGAIN)
3174 rc = -EHOSTDOWN;
3176 if (rc == 0) {
3177 spin_lock(&GlobalMid_Lock);
3178 if (server->tcpStatus != CifsExiting)
3179 server->tcpStatus = CifsGood;
3180 else
3181 rc = -EHOSTDOWN;
3182 spin_unlock(&GlobalMid_Lock);
3186 return rc;
3190 int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses,
3191 struct nls_table *nls_info)
3193 int rc = 0;
3194 struct TCP_Server_Info *server = ses->server;
3196 ses->flags = 0;
3197 ses->capabilities = server->capabilities;
3198 if (linuxExtEnabled == 0)
3199 ses->capabilities &= (~CAP_UNIX);
3201 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3202 server->secMode, server->capabilities, server->timeAdj);
3204 rc = CIFS_SessSetup(xid, ses, nls_info);
3205 if (rc) {
3206 cERROR(1, "Send error in SessSetup = %d", rc);
3207 } else {
3208 mutex_lock(&ses->server->srv_mutex);
3209 if (!server->session_estab) {
3210 server->session_key.response = ses->auth_key.response;
3211 server->session_key.len = ses->auth_key.len;
3212 server->sequence_number = 0x2;
3213 server->session_estab = true;
3214 ses->auth_key.response = NULL;
3216 mutex_unlock(&server->srv_mutex);
3218 cFYI(1, "CIFS Session Established successfully");
3219 spin_lock(&GlobalMid_Lock);
3220 ses->status = CifsGood;
3221 ses->need_reconnect = false;
3222 spin_unlock(&GlobalMid_Lock);
3225 kfree(ses->auth_key.response);
3226 ses->auth_key.response = NULL;
3227 ses->auth_key.len = 0;
3228 kfree(ses->ntlmssp);
3229 ses->ntlmssp = NULL;
3231 return rc;
3234 static struct cifsTconInfo *
3235 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
3237 struct cifsTconInfo *master_tcon = cifs_sb_master_tcon(cifs_sb);
3238 struct cifsSesInfo *ses;
3239 struct cifsTconInfo *tcon = NULL;
3240 struct smb_vol *vol_info;
3241 char username[MAX_USERNAME_SIZE + 1];
3243 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3244 if (vol_info == NULL) {
3245 tcon = ERR_PTR(-ENOMEM);
3246 goto out;
3249 snprintf(username, MAX_USERNAME_SIZE, "krb50x%x", fsuid);
3250 vol_info->username = username;
3251 vol_info->local_nls = cifs_sb->local_nls;
3252 vol_info->linux_uid = fsuid;
3253 vol_info->cred_uid = fsuid;
3254 vol_info->UNC = master_tcon->treeName;
3255 vol_info->retry = master_tcon->retry;
3256 vol_info->nocase = master_tcon->nocase;
3257 vol_info->local_lease = master_tcon->local_lease;
3258 vol_info->no_linux_ext = !master_tcon->unix_ext;
3260 /* FIXME: allow for other secFlg settings */
3261 vol_info->secFlg = CIFSSEC_MUST_KRB5;
3263 /* get a reference for the same TCP session */
3264 spin_lock(&cifs_tcp_ses_lock);
3265 ++master_tcon->ses->server->srv_count;
3266 spin_unlock(&cifs_tcp_ses_lock);
3268 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3269 if (IS_ERR(ses)) {
3270 tcon = (struct cifsTconInfo *)ses;
3271 cifs_put_tcp_session(master_tcon->ses->server);
3272 goto out;
3275 tcon = cifs_get_tcon(ses, vol_info);
3276 if (IS_ERR(tcon)) {
3277 cifs_put_smb_ses(ses);
3278 goto out;
3281 if (ses->capabilities & CAP_UNIX)
3282 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3283 out:
3284 kfree(vol_info);
3286 return tcon;
3289 static inline struct tcon_link *
3290 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
3292 return cifs_sb->master_tlink;
3295 struct cifsTconInfo *
3296 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3298 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3301 static int
3302 cifs_sb_tcon_pending_wait(void *unused)
3304 schedule();
3305 return signal_pending(current) ? -ERESTARTSYS : 0;
3308 /* find and return a tlink with given uid */
3309 static struct tcon_link *
3310 tlink_rb_search(struct rb_root *root, uid_t uid)
3312 struct rb_node *node = root->rb_node;
3313 struct tcon_link *tlink;
3315 while (node) {
3316 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3318 if (tlink->tl_uid > uid)
3319 node = node->rb_left;
3320 else if (tlink->tl_uid < uid)
3321 node = node->rb_right;
3322 else
3323 return tlink;
3325 return NULL;
3328 /* insert a tcon_link into the tree */
3329 static void
3330 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3332 struct rb_node **new = &(root->rb_node), *parent = NULL;
3333 struct tcon_link *tlink;
3335 while (*new) {
3336 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3337 parent = *new;
3339 if (tlink->tl_uid > new_tlink->tl_uid)
3340 new = &((*new)->rb_left);
3341 else
3342 new = &((*new)->rb_right);
3345 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3346 rb_insert_color(&new_tlink->tl_rbnode, root);
3350 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3351 * current task.
3353 * If the superblock doesn't refer to a multiuser mount, then just return
3354 * the master tcon for the mount.
3356 * First, search the rbtree for an existing tcon for this fsuid. If one
3357 * exists, then check to see if it's pending construction. If it is then wait
3358 * for construction to complete. Once it's no longer pending, check to see if
3359 * it failed and either return an error or retry construction, depending on
3360 * the timeout.
3362 * If one doesn't exist then insert a new tcon_link struct into the tree and
3363 * try to construct a new one.
3365 struct tcon_link *
3366 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3368 int ret;
3369 uid_t fsuid = current_fsuid();
3370 struct tcon_link *tlink, *newtlink;
3372 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3373 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3375 spin_lock(&cifs_sb->tlink_tree_lock);
3376 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3377 if (tlink)
3378 cifs_get_tlink(tlink);
3379 spin_unlock(&cifs_sb->tlink_tree_lock);
3381 if (tlink == NULL) {
3382 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3383 if (newtlink == NULL)
3384 return ERR_PTR(-ENOMEM);
3385 newtlink->tl_uid = fsuid;
3386 newtlink->tl_tcon = ERR_PTR(-EACCES);
3387 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3388 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3389 cifs_get_tlink(newtlink);
3391 spin_lock(&cifs_sb->tlink_tree_lock);
3392 /* was one inserted after previous search? */
3393 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3394 if (tlink) {
3395 cifs_get_tlink(tlink);
3396 spin_unlock(&cifs_sb->tlink_tree_lock);
3397 kfree(newtlink);
3398 goto wait_for_construction;
3400 tlink = newtlink;
3401 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3402 spin_unlock(&cifs_sb->tlink_tree_lock);
3403 } else {
3404 wait_for_construction:
3405 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
3406 cifs_sb_tcon_pending_wait,
3407 TASK_INTERRUPTIBLE);
3408 if (ret) {
3409 cifs_put_tlink(tlink);
3410 return ERR_PTR(ret);
3413 /* if it's good, return it */
3414 if (!IS_ERR(tlink->tl_tcon))
3415 return tlink;
3417 /* return error if we tried this already recently */
3418 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
3419 cifs_put_tlink(tlink);
3420 return ERR_PTR(-EACCES);
3423 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
3424 goto wait_for_construction;
3427 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
3428 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
3429 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
3431 if (IS_ERR(tlink->tl_tcon)) {
3432 cifs_put_tlink(tlink);
3433 return ERR_PTR(-EACCES);
3436 return tlink;
3440 * periodic workqueue job that scans tcon_tree for a superblock and closes
3441 * out tcons.
3443 static void
3444 cifs_prune_tlinks(struct work_struct *work)
3446 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
3447 prune_tlinks.work);
3448 struct rb_root *root = &cifs_sb->tlink_tree;
3449 struct rb_node *node = rb_first(root);
3450 struct rb_node *tmp;
3451 struct tcon_link *tlink;
3454 * Because we drop the spinlock in the loop in order to put the tlink
3455 * it's not guarded against removal of links from the tree. The only
3456 * places that remove entries from the tree are this function and
3457 * umounts. Because this function is non-reentrant and is canceled
3458 * before umount can proceed, this is safe.
3460 spin_lock(&cifs_sb->tlink_tree_lock);
3461 node = rb_first(root);
3462 while (node != NULL) {
3463 tmp = node;
3464 node = rb_next(tmp);
3465 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
3467 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
3468 atomic_read(&tlink->tl_count) != 0 ||
3469 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
3470 continue;
3472 cifs_get_tlink(tlink);
3473 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3474 rb_erase(tmp, root);
3476 spin_unlock(&cifs_sb->tlink_tree_lock);
3477 cifs_put_tlink(tlink);
3478 spin_lock(&cifs_sb->tlink_tree_lock);
3480 spin_unlock(&cifs_sb->tlink_tree_lock);
3482 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3483 TLINK_IDLE_EXPIRE);