cifs: tune bdi.ra_pages in accordance with the rsize
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / cifs / connect.c
blobf70d87d6ba61dfb1aa738015a3556f3888889cd2
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 /* FIXME: should these be tunable? */
61 #define TLINK_ERROR_EXPIRE (1 * HZ)
62 #define TLINK_IDLE_EXPIRE (600 * HZ)
64 static int ip_connect(struct TCP_Server_Info *server);
65 static int generic_ip_connect(struct TCP_Server_Info *server);
66 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
67 static void cifs_prune_tlinks(struct work_struct *work);
68 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
69 const char *devname);
72 * cifs tcp session reconnection
74 * mark tcp session as reconnecting so temporarily locked
75 * mark all smb sessions as reconnecting for tcp session
76 * reconnect tcp session
77 * wake up waiters on reconnection? - (not needed currently)
79 static int
80 cifs_reconnect(struct TCP_Server_Info *server)
82 int rc = 0;
83 struct list_head *tmp, *tmp2;
84 struct cifs_ses *ses;
85 struct cifs_tcon *tcon;
86 struct mid_q_entry *mid_entry;
87 struct list_head retry_list;
89 spin_lock(&GlobalMid_Lock);
90 if (server->tcpStatus == CifsExiting) {
91 /* the demux thread will exit normally
92 next time through the loop */
93 spin_unlock(&GlobalMid_Lock);
94 return rc;
95 } else
96 server->tcpStatus = CifsNeedReconnect;
97 spin_unlock(&GlobalMid_Lock);
98 server->maxBuf = 0;
100 cFYI(1, "Reconnecting tcp session");
102 /* before reconnecting the tcp session, mark the smb session (uid)
103 and the tid bad so they are not used until reconnected */
104 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
105 spin_lock(&cifs_tcp_ses_lock);
106 list_for_each(tmp, &server->smb_ses_list) {
107 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
108 ses->need_reconnect = true;
109 ses->ipc_tid = 0;
110 list_for_each(tmp2, &ses->tcon_list) {
111 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
112 tcon->need_reconnect = true;
115 spin_unlock(&cifs_tcp_ses_lock);
117 /* do not want to be sending data on a socket we are freeing */
118 cFYI(1, "%s: tearing down socket", __func__);
119 mutex_lock(&server->srv_mutex);
120 if (server->ssocket) {
121 cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
122 server->ssocket->flags);
123 kernel_sock_shutdown(server->ssocket, SHUT_WR);
124 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
125 server->ssocket->state,
126 server->ssocket->flags);
127 sock_release(server->ssocket);
128 server->ssocket = NULL;
130 server->sequence_number = 0;
131 server->session_estab = false;
132 kfree(server->session_key.response);
133 server->session_key.response = NULL;
134 server->session_key.len = 0;
135 server->lstrp = jiffies;
136 mutex_unlock(&server->srv_mutex);
138 /* mark submitted MIDs for retry and issue callback */
139 INIT_LIST_HEAD(&retry_list);
140 cFYI(1, "%s: moving mids to private list", __func__);
141 spin_lock(&GlobalMid_Lock);
142 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
143 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
144 if (mid_entry->midState == MID_REQUEST_SUBMITTED)
145 mid_entry->midState = MID_RETRY_NEEDED;
146 list_move(&mid_entry->qhead, &retry_list);
148 spin_unlock(&GlobalMid_Lock);
150 cFYI(1, "%s: issuing mid callbacks", __func__);
151 list_for_each_safe(tmp, tmp2, &retry_list) {
152 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
153 list_del_init(&mid_entry->qhead);
154 mid_entry->callback(mid_entry);
157 do {
158 try_to_freeze();
160 /* we should try only the port we connected to before */
161 rc = generic_ip_connect(server);
162 if (rc) {
163 cFYI(1, "reconnect error %d", rc);
164 msleep(3000);
165 } else {
166 atomic_inc(&tcpSesReconnectCount);
167 spin_lock(&GlobalMid_Lock);
168 if (server->tcpStatus != CifsExiting)
169 server->tcpStatus = CifsNeedNegotiate;
170 spin_unlock(&GlobalMid_Lock);
172 } while (server->tcpStatus == CifsNeedReconnect);
174 return rc;
178 return codes:
179 0 not a transact2, or all data present
180 >0 transact2 with that much data missing
181 -EINVAL = invalid transact2
184 static int check2ndT2(struct smb_hdr *pSMB)
186 struct smb_t2_rsp *pSMBt;
187 int remaining;
188 __u16 total_data_size, data_in_this_rsp;
190 if (pSMB->Command != SMB_COM_TRANSACTION2)
191 return 0;
193 /* check for plausible wct, bcc and t2 data and parm sizes */
194 /* check for parm and data offset going beyond end of smb */
195 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
196 cFYI(1, "invalid transact2 word count");
197 return -EINVAL;
200 pSMBt = (struct smb_t2_rsp *)pSMB;
202 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
203 data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
205 if (total_data_size == data_in_this_rsp)
206 return 0;
207 else if (total_data_size < data_in_this_rsp) {
208 cFYI(1, "total data %d smaller than data in frame %d",
209 total_data_size, data_in_this_rsp);
210 return -EINVAL;
213 remaining = total_data_size - data_in_this_rsp;
215 cFYI(1, "missing %d bytes from transact2, check next response",
216 remaining);
217 if (total_data_size > CIFSMaxBufSize) {
218 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
219 total_data_size, CIFSMaxBufSize);
220 return -EINVAL;
222 return remaining;
225 static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
227 struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond;
228 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB;
229 char *data_area_of_target;
230 char *data_area_of_buf2;
231 int remaining;
232 unsigned int byte_count, total_in_buf;
233 __u16 total_data_size, total_in_buf2;
235 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
237 if (total_data_size !=
238 get_unaligned_le16(&pSMB2->t2_rsp.TotalDataCount))
239 cFYI(1, "total data size of primary and secondary t2 differ");
241 total_in_buf = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
243 remaining = total_data_size - total_in_buf;
245 if (remaining < 0)
246 return -EPROTO;
248 if (remaining == 0) /* nothing to do, ignore */
249 return 0;
251 total_in_buf2 = get_unaligned_le16(&pSMB2->t2_rsp.DataCount);
252 if (remaining < total_in_buf2) {
253 cFYI(1, "transact2 2nd response contains too much data");
256 /* find end of first SMB data area */
257 data_area_of_target = (char *)&pSMBt->hdr.Protocol +
258 get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
259 /* validate target area */
261 data_area_of_buf2 = (char *)&pSMB2->hdr.Protocol +
262 get_unaligned_le16(&pSMB2->t2_rsp.DataOffset);
264 data_area_of_target += total_in_buf;
266 /* copy second buffer into end of first buffer */
267 total_in_buf += total_in_buf2;
268 /* is the result too big for the field? */
269 if (total_in_buf > USHRT_MAX)
270 return -EPROTO;
271 put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount);
273 /* fix up the BCC */
274 byte_count = get_bcc(pTargetSMB);
275 byte_count += total_in_buf2;
276 /* is the result too big for the field? */
277 if (byte_count > USHRT_MAX)
278 return -EPROTO;
279 put_bcc(byte_count, pTargetSMB);
281 byte_count = be32_to_cpu(pTargetSMB->smb_buf_length);
282 byte_count += total_in_buf2;
283 /* don't allow buffer to overflow */
284 if (byte_count > CIFSMaxBufSize)
285 return -ENOBUFS;
286 pTargetSMB->smb_buf_length = cpu_to_be32(byte_count);
288 memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2);
290 if (remaining == total_in_buf2) {
291 cFYI(1, "found the last secondary response");
292 return 0; /* we are done */
293 } else /* more responses to go */
294 return 1;
297 static void
298 cifs_echo_request(struct work_struct *work)
300 int rc;
301 struct TCP_Server_Info *server = container_of(work,
302 struct TCP_Server_Info, echo.work);
305 * We cannot send an echo until the NEGOTIATE_PROTOCOL request is
306 * done, which is indicated by maxBuf != 0. Also, no need to ping if
307 * we got a response recently
309 if (server->maxBuf == 0 ||
310 time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
311 goto requeue_echo;
313 rc = CIFSSMBEcho(server);
314 if (rc)
315 cFYI(1, "Unable to send echo request to server: %s",
316 server->hostname);
318 requeue_echo:
319 queue_delayed_work(system_nrt_wq, &server->echo, SMB_ECHO_INTERVAL);
322 static bool
323 allocate_buffers(struct TCP_Server_Info *server)
325 if (!server->bigbuf) {
326 server->bigbuf = (char *)cifs_buf_get();
327 if (!server->bigbuf) {
328 cERROR(1, "No memory for large SMB response");
329 msleep(3000);
330 /* retry will check if exiting */
331 return false;
333 } else if (server->large_buf) {
334 /* we are reusing a dirty large buf, clear its start */
335 memset(server->bigbuf, 0, sizeof(struct smb_hdr));
338 if (!server->smallbuf) {
339 server->smallbuf = (char *)cifs_small_buf_get();
340 if (!server->smallbuf) {
341 cERROR(1, "No memory for SMB response");
342 msleep(1000);
343 /* retry will check if exiting */
344 return false;
346 /* beginning of smb buffer is cleared in our buf_get */
347 } else {
348 /* if existing small buf clear beginning */
349 memset(server->smallbuf, 0, sizeof(struct smb_hdr));
352 return true;
355 static bool
356 server_unresponsive(struct TCP_Server_Info *server)
358 if (echo_retries > 0 && server->tcpStatus == CifsGood &&
359 time_after(jiffies, server->lstrp +
360 (echo_retries * SMB_ECHO_INTERVAL))) {
361 cERROR(1, "Server %s has not responded in %d seconds. "
362 "Reconnecting...", server->hostname,
363 (echo_retries * SMB_ECHO_INTERVAL / HZ));
364 cifs_reconnect(server);
365 wake_up(&server->response_q);
366 return true;
369 return false;
373 * kvec_array_init - clone a kvec array, and advance into it
374 * @new: pointer to memory for cloned array
375 * @iov: pointer to original array
376 * @nr_segs: number of members in original array
377 * @bytes: number of bytes to advance into the cloned array
379 * This function will copy the array provided in iov to a section of memory
380 * and advance the specified number of bytes into the new array. It returns
381 * the number of segments in the new array. "new" must be at least as big as
382 * the original iov array.
384 static unsigned int
385 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
386 size_t bytes)
388 size_t base = 0;
390 while (bytes || !iov->iov_len) {
391 int copy = min(bytes, iov->iov_len);
393 bytes -= copy;
394 base += copy;
395 if (iov->iov_len == base) {
396 iov++;
397 nr_segs--;
398 base = 0;
401 memcpy(new, iov, sizeof(*iov) * nr_segs);
402 new->iov_base += base;
403 new->iov_len -= base;
404 return nr_segs;
407 static struct kvec *
408 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
410 struct kvec *new_iov;
412 if (server->iov && nr_segs <= server->nr_iov)
413 return server->iov;
415 /* not big enough -- allocate a new one and release the old */
416 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
417 if (new_iov) {
418 kfree(server->iov);
419 server->iov = new_iov;
420 server->nr_iov = nr_segs;
422 return new_iov;
426 cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
427 unsigned int nr_segs, unsigned int to_read)
429 int length = 0;
430 int total_read;
431 unsigned int segs;
432 struct msghdr smb_msg;
433 struct kvec *iov;
435 iov = get_server_iovec(server, nr_segs);
436 if (!iov)
437 return -ENOMEM;
439 smb_msg.msg_control = NULL;
440 smb_msg.msg_controllen = 0;
442 for (total_read = 0; to_read; total_read += length, to_read -= length) {
443 if (server_unresponsive(server)) {
444 total_read = -EAGAIN;
445 break;
448 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
450 length = kernel_recvmsg(server->ssocket, &smb_msg,
451 iov, segs, to_read, 0);
453 if (server->tcpStatus == CifsExiting) {
454 total_read = -ESHUTDOWN;
455 break;
456 } else if (server->tcpStatus == CifsNeedReconnect) {
457 cifs_reconnect(server);
458 total_read = -EAGAIN;
459 break;
460 } else if (length == -ERESTARTSYS ||
461 length == -EAGAIN ||
462 length == -EINTR) {
464 * Minimum sleep to prevent looping, allowing socket
465 * to clear and app threads to set tcpStatus
466 * CifsNeedReconnect if server hung.
468 usleep_range(1000, 2000);
469 length = 0;
470 continue;
471 } else if (length <= 0) {
472 cFYI(1, "Received no data or error: expecting %d "
473 "got %d", to_read, length);
474 cifs_reconnect(server);
475 total_read = -EAGAIN;
476 break;
479 return total_read;
483 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
484 unsigned int to_read)
486 struct kvec iov;
488 iov.iov_base = buf;
489 iov.iov_len = to_read;
491 return cifs_readv_from_socket(server, &iov, 1, to_read);
494 static bool
495 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
498 * The first byte big endian of the length field,
499 * is actually not part of the length but the type
500 * with the most common, zero, as regular data.
502 switch (type) {
503 case RFC1002_SESSION_MESSAGE:
504 /* Regular SMB response */
505 return true;
506 case RFC1002_SESSION_KEEP_ALIVE:
507 cFYI(1, "RFC 1002 session keep alive");
508 break;
509 case RFC1002_POSITIVE_SESSION_RESPONSE:
510 cFYI(1, "RFC 1002 positive session response");
511 break;
512 case RFC1002_NEGATIVE_SESSION_RESPONSE:
514 * We get this from Windows 98 instead of an error on
515 * SMB negprot response.
517 cFYI(1, "RFC 1002 negative session response");
518 /* give server a second to clean up */
519 msleep(1000);
521 * Always try 445 first on reconnect since we get NACK
522 * on some if we ever connected to port 139 (the NACK
523 * is since we do not begin with RFC1001 session
524 * initialize frame).
526 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
527 cifs_reconnect(server);
528 wake_up(&server->response_q);
529 break;
530 default:
531 cERROR(1, "RFC 1002 unknown response type 0x%x", type);
532 cifs_reconnect(server);
535 return false;
538 static struct mid_q_entry *
539 find_mid(struct TCP_Server_Info *server, struct smb_hdr *buf)
541 struct mid_q_entry *mid;
543 spin_lock(&GlobalMid_Lock);
544 list_for_each_entry(mid, &server->pending_mid_q, qhead) {
545 if (mid->mid == buf->Mid &&
546 mid->midState == MID_REQUEST_SUBMITTED &&
547 mid->command == buf->Command) {
548 spin_unlock(&GlobalMid_Lock);
549 return mid;
552 spin_unlock(&GlobalMid_Lock);
553 return NULL;
556 void
557 dequeue_mid(struct mid_q_entry *mid, bool malformed)
559 #ifdef CONFIG_CIFS_STATS2
560 mid->when_received = jiffies;
561 #endif
562 spin_lock(&GlobalMid_Lock);
563 if (!malformed)
564 mid->midState = MID_RESPONSE_RECEIVED;
565 else
566 mid->midState = MID_RESPONSE_MALFORMED;
567 list_del_init(&mid->qhead);
568 spin_unlock(&GlobalMid_Lock);
571 static void
572 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
573 struct smb_hdr *buf, int malformed)
575 if (malformed == 0 && check2ndT2(buf) > 0) {
576 mid->multiRsp = true;
577 if (mid->resp_buf) {
578 /* merge response - fix up 1st*/
579 malformed = coalesce_t2(buf, mid->resp_buf);
580 if (malformed > 0)
581 return;
583 /* All parts received or packet is malformed. */
584 mid->multiEnd = true;
585 return dequeue_mid(mid, malformed);
587 if (!server->large_buf) {
588 /*FIXME: switch to already allocated largebuf?*/
589 cERROR(1, "1st trans2 resp needs bigbuf");
590 } else {
591 /* Have first buffer */
592 mid->resp_buf = buf;
593 mid->largeBuf = true;
594 server->bigbuf = NULL;
596 return;
598 mid->resp_buf = buf;
599 mid->largeBuf = server->large_buf;
600 /* Was previous buf put in mpx struct for multi-rsp? */
601 if (!mid->multiRsp) {
602 /* smb buffer will be freed by user thread */
603 if (server->large_buf)
604 server->bigbuf = NULL;
605 else
606 server->smallbuf = NULL;
608 dequeue_mid(mid, malformed);
611 static void clean_demultiplex_info(struct TCP_Server_Info *server)
613 int length;
615 /* take it off the list, if it's not already */
616 spin_lock(&cifs_tcp_ses_lock);
617 list_del_init(&server->tcp_ses_list);
618 spin_unlock(&cifs_tcp_ses_lock);
620 spin_lock(&GlobalMid_Lock);
621 server->tcpStatus = CifsExiting;
622 spin_unlock(&GlobalMid_Lock);
623 wake_up_all(&server->response_q);
626 * Check if we have blocked requests that need to free. Note that
627 * cifs_max_pending is normally 50, but can be set at module install
628 * time to as little as two.
630 spin_lock(&GlobalMid_Lock);
631 if (atomic_read(&server->inFlight) >= cifs_max_pending)
632 atomic_set(&server->inFlight, cifs_max_pending - 1);
634 * We do not want to set the max_pending too low or we could end up
635 * with the counter going negative.
637 spin_unlock(&GlobalMid_Lock);
639 * Although there should not be any requests blocked on this queue it
640 * can not hurt to be paranoid and try to wake up requests that may
641 * haven been blocked when more than 50 at time were on the wire to the
642 * same server - they now will see the session is in exit state and get
643 * out of SendReceive.
645 wake_up_all(&server->request_q);
646 /* give those requests time to exit */
647 msleep(125);
649 if (server->ssocket) {
650 sock_release(server->ssocket);
651 server->ssocket = NULL;
654 if (!list_empty(&server->pending_mid_q)) {
655 struct list_head dispose_list;
656 struct mid_q_entry *mid_entry;
657 struct list_head *tmp, *tmp2;
659 INIT_LIST_HEAD(&dispose_list);
660 spin_lock(&GlobalMid_Lock);
661 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
662 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
663 cFYI(1, "Clearing mid 0x%x", mid_entry->mid);
664 mid_entry->midState = MID_SHUTDOWN;
665 list_move(&mid_entry->qhead, &dispose_list);
667 spin_unlock(&GlobalMid_Lock);
669 /* now walk dispose list and issue callbacks */
670 list_for_each_safe(tmp, tmp2, &dispose_list) {
671 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
672 cFYI(1, "Callback mid 0x%x", mid_entry->mid);
673 list_del_init(&mid_entry->qhead);
674 mid_entry->callback(mid_entry);
676 /* 1/8th of sec is more than enough time for them to exit */
677 msleep(125);
680 if (!list_empty(&server->pending_mid_q)) {
682 * mpx threads have not exited yet give them at least the smb
683 * send timeout time for long ops.
685 * Due to delays on oplock break requests, we need to wait at
686 * least 45 seconds before giving up on a request getting a
687 * response and going ahead and killing cifsd.
689 cFYI(1, "Wait for exit from demultiplex thread");
690 msleep(46000);
692 * If threads still have not exited they are probably never
693 * coming home not much else we can do but free the memory.
697 kfree(server->hostname);
698 kfree(server->iov);
699 kfree(server);
701 length = atomic_dec_return(&tcpSesAllocCount);
702 if (length > 0)
703 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
704 GFP_KERNEL);
707 static int
708 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
710 int length;
711 char *buf = server->smallbuf;
712 struct smb_hdr *smb_buffer = (struct smb_hdr *)buf;
713 unsigned int pdu_length = be32_to_cpu(smb_buffer->smb_buf_length);
715 /* make sure this will fit in a large buffer */
716 if (pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
717 cERROR(1, "SMB response too long (%u bytes)",
718 pdu_length);
719 cifs_reconnect(server);
720 wake_up(&server->response_q);
721 return -EAGAIN;
724 /* switch to large buffer if too big for a small one */
725 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
726 server->large_buf = true;
727 memcpy(server->bigbuf, server->smallbuf, server->total_read);
728 buf = server->bigbuf;
729 smb_buffer = (struct smb_hdr *)buf;
732 /* now read the rest */
733 length = cifs_read_from_socket(server,
734 buf + sizeof(struct smb_hdr) - 1,
735 pdu_length - sizeof(struct smb_hdr) + 1 + 4);
736 if (length < 0)
737 return length;
738 server->total_read += length;
740 dump_smb(smb_buffer, server->total_read);
743 * We know that we received enough to get to the MID as we
744 * checked the pdu_length earlier. Now check to see
745 * if the rest of the header is OK. We borrow the length
746 * var for the rest of the loop to avoid a new stack var.
748 * 48 bytes is enough to display the header and a little bit
749 * into the payload for debugging purposes.
751 length = checkSMB(smb_buffer, smb_buffer->Mid, server->total_read);
752 if (length != 0)
753 cifs_dump_mem("Bad SMB: ", buf,
754 min_t(unsigned int, server->total_read, 48));
756 if (mid)
757 handle_mid(mid, server, smb_buffer, length);
759 return length;
762 static int
763 cifs_demultiplex_thread(void *p)
765 int length;
766 struct TCP_Server_Info *server = p;
767 unsigned int pdu_length;
768 char *buf = NULL;
769 struct smb_hdr *smb_buffer = NULL;
770 struct task_struct *task_to_wake = NULL;
771 struct mid_q_entry *mid_entry;
773 current->flags |= PF_MEMALLOC;
774 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
776 length = atomic_inc_return(&tcpSesAllocCount);
777 if (length > 1)
778 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
779 GFP_KERNEL);
781 set_freezable();
782 while (server->tcpStatus != CifsExiting) {
783 if (try_to_freeze())
784 continue;
786 if (!allocate_buffers(server))
787 continue;
789 server->large_buf = false;
790 smb_buffer = (struct smb_hdr *)server->smallbuf;
791 buf = server->smallbuf;
792 pdu_length = 4; /* enough to get RFC1001 header */
794 length = cifs_read_from_socket(server, buf, pdu_length);
795 if (length < 0)
796 continue;
797 server->total_read = length;
800 * The right amount was read from socket - 4 bytes,
801 * so we can now interpret the length field.
803 pdu_length = be32_to_cpu(smb_buffer->smb_buf_length);
805 cFYI(1, "RFC1002 header 0x%x", pdu_length);
806 if (!is_smb_response(server, buf[0]))
807 continue;
809 /* make sure we have enough to get to the MID */
810 if (pdu_length < sizeof(struct smb_hdr) - 1 - 4) {
811 cERROR(1, "SMB response too short (%u bytes)",
812 pdu_length);
813 cifs_reconnect(server);
814 wake_up(&server->response_q);
815 continue;
818 /* read down to the MID */
819 length = cifs_read_from_socket(server, buf + 4,
820 sizeof(struct smb_hdr) - 1 - 4);
821 if (length < 0)
822 continue;
823 server->total_read += length;
825 mid_entry = find_mid(server, smb_buffer);
827 if (!mid_entry || !mid_entry->receive)
828 length = standard_receive3(server, mid_entry);
829 else
830 length = mid_entry->receive(server, mid_entry);
832 if (length < 0)
833 continue;
835 if (server->large_buf) {
836 buf = server->bigbuf;
837 smb_buffer = (struct smb_hdr *)buf;
840 server->lstrp = jiffies;
841 if (mid_entry != NULL) {
842 if (!mid_entry->multiRsp || mid_entry->multiEnd)
843 mid_entry->callback(mid_entry);
844 } else if (!is_valid_oplock_break(smb_buffer, server)) {
845 cERROR(1, "No task to wake, unknown frame received! "
846 "NumMids %d", atomic_read(&midCount));
847 cifs_dump_mem("Received Data is: ", buf,
848 sizeof(struct smb_hdr));
849 #ifdef CONFIG_CIFS_DEBUG2
850 cifs_dump_detail(smb_buffer);
851 cifs_dump_mids(server);
852 #endif /* CIFS_DEBUG2 */
855 } /* end while !EXITING */
857 /* buffer usually freed in free_mid - need to free it here on exit */
858 cifs_buf_release(server->bigbuf);
859 if (server->smallbuf) /* no sense logging a debug message if NULL */
860 cifs_small_buf_release(server->smallbuf);
862 task_to_wake = xchg(&server->tsk, NULL);
863 clean_demultiplex_info(server);
865 /* if server->tsk was NULL then wait for a signal before exiting */
866 if (!task_to_wake) {
867 set_current_state(TASK_INTERRUPTIBLE);
868 while (!signal_pending(current)) {
869 schedule();
870 set_current_state(TASK_INTERRUPTIBLE);
872 set_current_state(TASK_RUNNING);
875 module_put_and_exit(0);
878 /* extract the host portion of the UNC string */
879 static char *
880 extract_hostname(const char *unc)
882 const char *src;
883 char *dst, *delim;
884 unsigned int len;
886 /* skip double chars at beginning of string */
887 /* BB: check validity of these bytes? */
888 src = unc + 2;
890 /* delimiter between hostname and sharename is always '\\' now */
891 delim = strchr(src, '\\');
892 if (!delim)
893 return ERR_PTR(-EINVAL);
895 len = delim - src;
896 dst = kmalloc((len + 1), GFP_KERNEL);
897 if (dst == NULL)
898 return ERR_PTR(-ENOMEM);
900 memcpy(dst, src, len);
901 dst[len] = '\0';
903 return dst;
906 static int
907 cifs_parse_mount_options(const char *mountdata, const char *devname,
908 struct smb_vol *vol)
910 char *value, *data, *end;
911 char *mountdata_copy = NULL, *options;
912 int err;
913 unsigned int temp_len, i, j;
914 char separator[2];
915 short int override_uid = -1;
916 short int override_gid = -1;
917 bool uid_specified = false;
918 bool gid_specified = false;
919 char *nodename = utsname()->nodename;
921 separator[0] = ',';
922 separator[1] = 0;
925 * does not have to be perfect mapping since field is
926 * informational, only used for servers that do not support
927 * port 445 and it can be overridden at mount time
929 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
930 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
931 vol->source_rfc1001_name[i] = toupper(nodename[i]);
933 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
934 /* null target name indicates to use *SMBSERVR default called name
935 if we end up sending RFC1001 session initialize */
936 vol->target_rfc1001_name[0] = 0;
937 vol->cred_uid = current_uid();
938 vol->linux_uid = current_uid();
939 vol->linux_gid = current_gid();
941 /* default to only allowing write access to owner of the mount */
942 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
944 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
945 /* default is always to request posix paths. */
946 vol->posix_paths = 1;
947 /* default to using server inode numbers where available */
948 vol->server_ino = 1;
950 vol->actimeo = CIFS_DEF_ACTIMEO;
952 if (!mountdata)
953 goto cifs_parse_mount_err;
955 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
956 if (!mountdata_copy)
957 goto cifs_parse_mount_err;
959 options = mountdata_copy;
960 end = options + strlen(options);
961 if (strncmp(options, "sep=", 4) == 0) {
962 if (options[4] != 0) {
963 separator[0] = options[4];
964 options += 5;
965 } else {
966 cFYI(1, "Null separator not allowed");
969 vol->backupuid_specified = false; /* no backup intent for a user */
970 vol->backupgid_specified = false; /* no backup intent for a group */
972 while ((data = strsep(&options, separator)) != NULL) {
973 if (!*data)
974 continue;
975 if ((value = strchr(data, '=')) != NULL)
976 *value++ = '\0';
978 /* Have to parse this before we parse for "user" */
979 if (strnicmp(data, "user_xattr", 10) == 0) {
980 vol->no_xattr = 0;
981 } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
982 vol->no_xattr = 1;
983 } else if (strnicmp(data, "user", 4) == 0) {
984 if (!value) {
985 printk(KERN_WARNING
986 "CIFS: invalid or missing username\n");
987 goto cifs_parse_mount_err;
988 } else if (!*value) {
989 /* null user, ie anonymous, authentication */
990 vol->nullauth = 1;
992 if (strnlen(value, MAX_USERNAME_SIZE) <
993 MAX_USERNAME_SIZE) {
994 vol->username = kstrdup(value, GFP_KERNEL);
995 if (!vol->username) {
996 printk(KERN_WARNING "CIFS: no memory "
997 "for username\n");
998 goto cifs_parse_mount_err;
1000 } else {
1001 printk(KERN_WARNING "CIFS: username too long\n");
1002 goto cifs_parse_mount_err;
1004 } else if (strnicmp(data, "pass", 4) == 0) {
1005 if (!value) {
1006 vol->password = NULL;
1007 continue;
1008 } else if (value[0] == 0) {
1009 /* check if string begins with double comma
1010 since that would mean the password really
1011 does start with a comma, and would not
1012 indicate an empty string */
1013 if (value[1] != separator[0]) {
1014 vol->password = NULL;
1015 continue;
1018 temp_len = strlen(value);
1019 /* removed password length check, NTLM passwords
1020 can be arbitrarily long */
1022 /* if comma in password, the string will be
1023 prematurely null terminated. Commas in password are
1024 specified across the cifs mount interface by a double
1025 comma ie ,, and a comma used as in other cases ie ','
1026 as a parameter delimiter/separator is single and due
1027 to the strsep above is temporarily zeroed. */
1029 /* NB: password legally can have multiple commas and
1030 the only illegal character in a password is null */
1032 if ((value[temp_len] == 0) &&
1033 (value + temp_len < end) &&
1034 (value[temp_len+1] == separator[0])) {
1035 /* reinsert comma */
1036 value[temp_len] = separator[0];
1037 temp_len += 2; /* move after second comma */
1038 while (value[temp_len] != 0) {
1039 if (value[temp_len] == separator[0]) {
1040 if (value[temp_len+1] ==
1041 separator[0]) {
1042 /* skip second comma */
1043 temp_len++;
1044 } else {
1045 /* single comma indicating start
1046 of next parm */
1047 break;
1050 temp_len++;
1052 if (value[temp_len] == 0) {
1053 options = NULL;
1054 } else {
1055 value[temp_len] = 0;
1056 /* point option to start of next parm */
1057 options = value + temp_len + 1;
1059 /* go from value to value + temp_len condensing
1060 double commas to singles. Note that this ends up
1061 allocating a few bytes too many, which is ok */
1062 vol->password = kzalloc(temp_len, GFP_KERNEL);
1063 if (vol->password == NULL) {
1064 printk(KERN_WARNING "CIFS: no memory "
1065 "for password\n");
1066 goto cifs_parse_mount_err;
1068 for (i = 0, j = 0; i < temp_len; i++, j++) {
1069 vol->password[j] = value[i];
1070 if (value[i] == separator[0]
1071 && value[i+1] == separator[0]) {
1072 /* skip second comma */
1073 i++;
1076 vol->password[j] = 0;
1077 } else {
1078 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1079 if (vol->password == NULL) {
1080 printk(KERN_WARNING "CIFS: no memory "
1081 "for password\n");
1082 goto cifs_parse_mount_err;
1084 strcpy(vol->password, value);
1086 } else if (!strnicmp(data, "ip", 2) ||
1087 !strnicmp(data, "addr", 4)) {
1088 if (!value || !*value) {
1089 vol->UNCip = NULL;
1090 } else if (strnlen(value, INET6_ADDRSTRLEN) <
1091 INET6_ADDRSTRLEN) {
1092 vol->UNCip = kstrdup(value, GFP_KERNEL);
1093 if (!vol->UNCip) {
1094 printk(KERN_WARNING "CIFS: no memory "
1095 "for UNC IP\n");
1096 goto cifs_parse_mount_err;
1098 } else {
1099 printk(KERN_WARNING "CIFS: ip address "
1100 "too long\n");
1101 goto cifs_parse_mount_err;
1103 } else if (strnicmp(data, "sec", 3) == 0) {
1104 if (!value || !*value) {
1105 cERROR(1, "no security value specified");
1106 continue;
1107 } else if (strnicmp(value, "krb5i", 5) == 0) {
1108 vol->secFlg |= CIFSSEC_MAY_KRB5 |
1109 CIFSSEC_MUST_SIGN;
1110 } else if (strnicmp(value, "krb5p", 5) == 0) {
1111 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
1112 CIFSSEC_MAY_KRB5; */
1113 cERROR(1, "Krb5 cifs privacy not supported");
1114 goto cifs_parse_mount_err;
1115 } else if (strnicmp(value, "krb5", 4) == 0) {
1116 vol->secFlg |= CIFSSEC_MAY_KRB5;
1117 } else if (strnicmp(value, "ntlmsspi", 8) == 0) {
1118 vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
1119 CIFSSEC_MUST_SIGN;
1120 } else if (strnicmp(value, "ntlmssp", 7) == 0) {
1121 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1122 } else if (strnicmp(value, "ntlmv2i", 7) == 0) {
1123 vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
1124 CIFSSEC_MUST_SIGN;
1125 } else if (strnicmp(value, "ntlmv2", 6) == 0) {
1126 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1127 } else if (strnicmp(value, "ntlmi", 5) == 0) {
1128 vol->secFlg |= CIFSSEC_MAY_NTLM |
1129 CIFSSEC_MUST_SIGN;
1130 } else if (strnicmp(value, "ntlm", 4) == 0) {
1131 /* ntlm is default so can be turned off too */
1132 vol->secFlg |= CIFSSEC_MAY_NTLM;
1133 } else if (strnicmp(value, "nontlm", 6) == 0) {
1134 /* BB is there a better way to do this? */
1135 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1136 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1137 } else if (strnicmp(value, "lanman", 6) == 0) {
1138 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1139 #endif
1140 } else if (strnicmp(value, "none", 4) == 0) {
1141 vol->nullauth = 1;
1142 } else {
1143 cERROR(1, "bad security option: %s", value);
1144 goto cifs_parse_mount_err;
1146 } else if (strnicmp(data, "vers", 3) == 0) {
1147 if (!value || !*value) {
1148 cERROR(1, "no protocol version specified"
1149 " after vers= mount option");
1150 } else if ((strnicmp(value, "cifs", 4) == 0) ||
1151 (strnicmp(value, "1", 1) == 0)) {
1152 /* this is the default */
1153 continue;
1155 } else if ((strnicmp(data, "unc", 3) == 0)
1156 || (strnicmp(data, "target", 6) == 0)
1157 || (strnicmp(data, "path", 4) == 0)) {
1158 if (!value || !*value) {
1159 printk(KERN_WARNING "CIFS: invalid path to "
1160 "network resource\n");
1161 goto cifs_parse_mount_err;
1163 if ((temp_len = strnlen(value, 300)) < 300) {
1164 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1165 if (vol->UNC == NULL)
1166 goto cifs_parse_mount_err;
1167 strcpy(vol->UNC, value);
1168 if (strncmp(vol->UNC, "//", 2) == 0) {
1169 vol->UNC[0] = '\\';
1170 vol->UNC[1] = '\\';
1171 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1172 printk(KERN_WARNING
1173 "CIFS: UNC Path does not begin "
1174 "with // or \\\\ \n");
1175 goto cifs_parse_mount_err;
1177 } else {
1178 printk(KERN_WARNING "CIFS: UNC name too long\n");
1179 goto cifs_parse_mount_err;
1181 } else if ((strnicmp(data, "domain", 3) == 0)
1182 || (strnicmp(data, "workgroup", 5) == 0)) {
1183 if (!value || !*value) {
1184 printk(KERN_WARNING "CIFS: invalid domain name\n");
1185 goto cifs_parse_mount_err;
1187 /* BB are there cases in which a comma can be valid in
1188 a domain name and need special handling? */
1189 if (strnlen(value, 256) < 256) {
1190 vol->domainname = kstrdup(value, GFP_KERNEL);
1191 if (!vol->domainname) {
1192 printk(KERN_WARNING "CIFS: no memory "
1193 "for domainname\n");
1194 goto cifs_parse_mount_err;
1196 cFYI(1, "Domain name set");
1197 } else {
1198 printk(KERN_WARNING "CIFS: domain name too "
1199 "long\n");
1200 goto cifs_parse_mount_err;
1202 } else if (strnicmp(data, "srcaddr", 7) == 0) {
1203 vol->srcaddr.ss_family = AF_UNSPEC;
1205 if (!value || !*value) {
1206 printk(KERN_WARNING "CIFS: srcaddr value"
1207 " not specified.\n");
1208 goto cifs_parse_mount_err;
1210 i = cifs_convert_address((struct sockaddr *)&vol->srcaddr,
1211 value, strlen(value));
1212 if (i == 0) {
1213 printk(KERN_WARNING "CIFS: Could not parse"
1214 " srcaddr: %s\n",
1215 value);
1216 goto cifs_parse_mount_err;
1218 } else if (strnicmp(data, "prefixpath", 10) == 0) {
1219 if (!value || !*value) {
1220 printk(KERN_WARNING
1221 "CIFS: invalid path prefix\n");
1222 goto cifs_parse_mount_err;
1224 if ((temp_len = strnlen(value, 1024)) < 1024) {
1225 if (value[0] != '/')
1226 temp_len++; /* missing leading slash */
1227 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1228 if (vol->prepath == NULL)
1229 goto cifs_parse_mount_err;
1230 if (value[0] != '/') {
1231 vol->prepath[0] = '/';
1232 strcpy(vol->prepath+1, value);
1233 } else
1234 strcpy(vol->prepath, value);
1235 cFYI(1, "prefix path %s", vol->prepath);
1236 } else {
1237 printk(KERN_WARNING "CIFS: prefix too long\n");
1238 goto cifs_parse_mount_err;
1240 } else if (strnicmp(data, "iocharset", 9) == 0) {
1241 if (!value || !*value) {
1242 printk(KERN_WARNING "CIFS: invalid iocharset "
1243 "specified\n");
1244 goto cifs_parse_mount_err;
1246 if (strnlen(value, 65) < 65) {
1247 if (strnicmp(value, "default", 7)) {
1248 vol->iocharset = kstrdup(value,
1249 GFP_KERNEL);
1251 if (!vol->iocharset) {
1252 printk(KERN_WARNING "CIFS: no "
1253 "memory for"
1254 "charset\n");
1255 goto cifs_parse_mount_err;
1258 /* if iocharset not set then load_nls_default
1259 is used by caller */
1260 cFYI(1, "iocharset set to %s", value);
1261 } else {
1262 printk(KERN_WARNING "CIFS: iocharset name "
1263 "too long.\n");
1264 goto cifs_parse_mount_err;
1266 } else if (!strnicmp(data, "uid", 3) && value && *value) {
1267 vol->linux_uid = simple_strtoul(value, &value, 0);
1268 uid_specified = true;
1269 } else if (!strnicmp(data, "cruid", 5) && value && *value) {
1270 vol->cred_uid = simple_strtoul(value, &value, 0);
1271 } else if (!strnicmp(data, "forceuid", 8)) {
1272 override_uid = 1;
1273 } else if (!strnicmp(data, "noforceuid", 10)) {
1274 override_uid = 0;
1275 } else if (!strnicmp(data, "gid", 3) && value && *value) {
1276 vol->linux_gid = simple_strtoul(value, &value, 0);
1277 gid_specified = true;
1278 } else if (!strnicmp(data, "forcegid", 8)) {
1279 override_gid = 1;
1280 } else if (!strnicmp(data, "noforcegid", 10)) {
1281 override_gid = 0;
1282 } else if (strnicmp(data, "file_mode", 4) == 0) {
1283 if (value && *value) {
1284 vol->file_mode =
1285 simple_strtoul(value, &value, 0);
1287 } else if (strnicmp(data, "dir_mode", 4) == 0) {
1288 if (value && *value) {
1289 vol->dir_mode =
1290 simple_strtoul(value, &value, 0);
1292 } else if (strnicmp(data, "dirmode", 4) == 0) {
1293 if (value && *value) {
1294 vol->dir_mode =
1295 simple_strtoul(value, &value, 0);
1297 } else if (strnicmp(data, "port", 4) == 0) {
1298 if (value && *value) {
1299 vol->port =
1300 simple_strtoul(value, &value, 0);
1302 } else if (strnicmp(data, "rsize", 5) == 0) {
1303 if (value && *value) {
1304 vol->rsize =
1305 simple_strtoul(value, &value, 0);
1307 } else if (strnicmp(data, "wsize", 5) == 0) {
1308 if (value && *value) {
1309 vol->wsize =
1310 simple_strtoul(value, &value, 0);
1312 } else if (strnicmp(data, "sockopt", 5) == 0) {
1313 if (!value || !*value) {
1314 cERROR(1, "no socket option specified");
1315 continue;
1316 } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1317 vol->sockopt_tcp_nodelay = 1;
1319 } else if (strnicmp(data, "netbiosname", 4) == 0) {
1320 if (!value || !*value || (*value == ' ')) {
1321 cFYI(1, "invalid (empty) netbiosname");
1322 } else {
1323 memset(vol->source_rfc1001_name, 0x20,
1324 RFC1001_NAME_LEN);
1326 * FIXME: are there cases in which a comma can
1327 * be valid in workstation netbios name (and
1328 * need special handling)?
1330 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1331 /* don't ucase netbiosname for user */
1332 if (value[i] == 0)
1333 break;
1334 vol->source_rfc1001_name[i] = value[i];
1336 /* The string has 16th byte zero still from
1337 set at top of the function */
1338 if (i == RFC1001_NAME_LEN && value[i] != 0)
1339 printk(KERN_WARNING "CIFS: netbiosname"
1340 " longer than 15 truncated.\n");
1342 } else if (strnicmp(data, "servern", 7) == 0) {
1343 /* servernetbiosname specified override *SMBSERVER */
1344 if (!value || !*value || (*value == ' ')) {
1345 cFYI(1, "empty server netbiosname specified");
1346 } else {
1347 /* last byte, type, is 0x20 for servr type */
1348 memset(vol->target_rfc1001_name, 0x20,
1349 RFC1001_NAME_LEN_WITH_NULL);
1351 for (i = 0; i < 15; i++) {
1352 /* BB are there cases in which a comma can be
1353 valid in this workstation netbios name
1354 (and need special handling)? */
1356 /* user or mount helper must uppercase
1357 the netbiosname */
1358 if (value[i] == 0)
1359 break;
1360 else
1361 vol->target_rfc1001_name[i] =
1362 value[i];
1364 /* The string has 16th byte zero still from
1365 set at top of the function */
1366 if (i == RFC1001_NAME_LEN && value[i] != 0)
1367 printk(KERN_WARNING "CIFS: server net"
1368 "biosname longer than 15 truncated.\n");
1370 } else if (strnicmp(data, "actimeo", 7) == 0) {
1371 if (value && *value) {
1372 vol->actimeo = HZ * simple_strtoul(value,
1373 &value, 0);
1374 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1375 cERROR(1, "CIFS: attribute cache"
1376 "timeout too large");
1377 goto cifs_parse_mount_err;
1380 } else if (strnicmp(data, "credentials", 4) == 0) {
1381 /* ignore */
1382 } else if (strnicmp(data, "version", 3) == 0) {
1383 /* ignore */
1384 } else if (strnicmp(data, "guest", 5) == 0) {
1385 /* ignore */
1386 } else if (strnicmp(data, "rw", 2) == 0 && strlen(data) == 2) {
1387 /* ignore */
1388 } else if (strnicmp(data, "ro", 2) == 0) {
1389 /* ignore */
1390 } else if (strnicmp(data, "noblocksend", 11) == 0) {
1391 vol->noblocksnd = 1;
1392 } else if (strnicmp(data, "noautotune", 10) == 0) {
1393 vol->noautotune = 1;
1394 } else if ((strnicmp(data, "suid", 4) == 0) ||
1395 (strnicmp(data, "nosuid", 6) == 0) ||
1396 (strnicmp(data, "exec", 4) == 0) ||
1397 (strnicmp(data, "noexec", 6) == 0) ||
1398 (strnicmp(data, "nodev", 5) == 0) ||
1399 (strnicmp(data, "noauto", 6) == 0) ||
1400 (strnicmp(data, "dev", 3) == 0)) {
1401 /* The mount tool or mount.cifs helper (if present)
1402 uses these opts to set flags, and the flags are read
1403 by the kernel vfs layer before we get here (ie
1404 before read super) so there is no point trying to
1405 parse these options again and set anything and it
1406 is ok to just ignore them */
1407 continue;
1408 } else if (strnicmp(data, "hard", 4) == 0) {
1409 vol->retry = 1;
1410 } else if (strnicmp(data, "soft", 4) == 0) {
1411 vol->retry = 0;
1412 } else if (strnicmp(data, "perm", 4) == 0) {
1413 vol->noperm = 0;
1414 } else if (strnicmp(data, "noperm", 6) == 0) {
1415 vol->noperm = 1;
1416 } else if (strnicmp(data, "mapchars", 8) == 0) {
1417 vol->remap = 1;
1418 } else if (strnicmp(data, "nomapchars", 10) == 0) {
1419 vol->remap = 0;
1420 } else if (strnicmp(data, "sfu", 3) == 0) {
1421 vol->sfu_emul = 1;
1422 } else if (strnicmp(data, "nosfu", 5) == 0) {
1423 vol->sfu_emul = 0;
1424 } else if (strnicmp(data, "nodfs", 5) == 0) {
1425 vol->nodfs = 1;
1426 } else if (strnicmp(data, "posixpaths", 10) == 0) {
1427 vol->posix_paths = 1;
1428 } else if (strnicmp(data, "noposixpaths", 12) == 0) {
1429 vol->posix_paths = 0;
1430 } else if (strnicmp(data, "nounix", 6) == 0) {
1431 vol->no_linux_ext = 1;
1432 } else if (strnicmp(data, "nolinux", 7) == 0) {
1433 vol->no_linux_ext = 1;
1434 } else if ((strnicmp(data, "nocase", 6) == 0) ||
1435 (strnicmp(data, "ignorecase", 10) == 0)) {
1436 vol->nocase = 1;
1437 } else if (strnicmp(data, "mand", 4) == 0) {
1438 /* ignore */
1439 } else if (strnicmp(data, "nomand", 6) == 0) {
1440 /* ignore */
1441 } else if (strnicmp(data, "_netdev", 7) == 0) {
1442 /* ignore */
1443 } else if (strnicmp(data, "brl", 3) == 0) {
1444 vol->nobrl = 0;
1445 } else if ((strnicmp(data, "nobrl", 5) == 0) ||
1446 (strnicmp(data, "nolock", 6) == 0)) {
1447 vol->nobrl = 1;
1448 /* turn off mandatory locking in mode
1449 if remote locking is turned off since the
1450 local vfs will do advisory */
1451 if (vol->file_mode ==
1452 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1453 vol->file_mode = S_IALLUGO;
1454 } else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1455 /* will take the shorter form "forcemand" as well */
1456 /* This mount option will force use of mandatory
1457 (DOS/Windows style) byte range locks, instead of
1458 using posix advisory byte range locks, even if the
1459 Unix extensions are available and posix locks would
1460 be supported otherwise. If Unix extensions are not
1461 negotiated this has no effect since mandatory locks
1462 would be used (mandatory locks is all that those
1463 those servers support) */
1464 vol->mand_lock = 1;
1465 } else if (strnicmp(data, "setuids", 7) == 0) {
1466 vol->setuids = 1;
1467 } else if (strnicmp(data, "nosetuids", 9) == 0) {
1468 vol->setuids = 0;
1469 } else if (strnicmp(data, "dynperm", 7) == 0) {
1470 vol->dynperm = true;
1471 } else if (strnicmp(data, "nodynperm", 9) == 0) {
1472 vol->dynperm = false;
1473 } else if (strnicmp(data, "nohard", 6) == 0) {
1474 vol->retry = 0;
1475 } else if (strnicmp(data, "nosoft", 6) == 0) {
1476 vol->retry = 1;
1477 } else if (strnicmp(data, "nointr", 6) == 0) {
1478 vol->intr = 0;
1479 } else if (strnicmp(data, "intr", 4) == 0) {
1480 vol->intr = 1;
1481 } else if (strnicmp(data, "nostrictsync", 12) == 0) {
1482 vol->nostrictsync = 1;
1483 } else if (strnicmp(data, "strictsync", 10) == 0) {
1484 vol->nostrictsync = 0;
1485 } else if (strnicmp(data, "serverino", 7) == 0) {
1486 vol->server_ino = 1;
1487 } else if (strnicmp(data, "noserverino", 9) == 0) {
1488 vol->server_ino = 0;
1489 } else if (strnicmp(data, "rwpidforward", 12) == 0) {
1490 vol->rwpidforward = 1;
1491 } else if (strnicmp(data, "cifsacl", 7) == 0) {
1492 vol->cifs_acl = 1;
1493 } else if (strnicmp(data, "nocifsacl", 9) == 0) {
1494 vol->cifs_acl = 0;
1495 } else if (strnicmp(data, "acl", 3) == 0) {
1496 vol->no_psx_acl = 0;
1497 } else if (strnicmp(data, "noacl", 5) == 0) {
1498 vol->no_psx_acl = 1;
1499 } else if (strnicmp(data, "locallease", 6) == 0) {
1500 vol->local_lease = 1;
1501 } else if (strnicmp(data, "sign", 4) == 0) {
1502 vol->secFlg |= CIFSSEC_MUST_SIGN;
1503 } else if (strnicmp(data, "seal", 4) == 0) {
1504 /* we do not do the following in secFlags because seal
1505 is a per tree connection (mount) not a per socket
1506 or per-smb connection option in the protocol */
1507 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1508 vol->seal = 1;
1509 } else if (strnicmp(data, "direct", 6) == 0) {
1510 vol->direct_io = 1;
1511 } else if (strnicmp(data, "forcedirectio", 13) == 0) {
1512 vol->direct_io = 1;
1513 } else if (strnicmp(data, "strictcache", 11) == 0) {
1514 vol->strict_io = 1;
1515 } else if (strnicmp(data, "noac", 4) == 0) {
1516 printk(KERN_WARNING "CIFS: Mount option noac not "
1517 "supported. Instead set "
1518 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1519 } else if (strnicmp(data, "fsc", 3) == 0) {
1520 #ifndef CONFIG_CIFS_FSCACHE
1521 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1522 "kernel config option set");
1523 goto cifs_parse_mount_err;
1524 #endif
1525 vol->fsc = true;
1526 } else if (strnicmp(data, "mfsymlinks", 10) == 0) {
1527 vol->mfsymlinks = true;
1528 } else if (strnicmp(data, "multiuser", 8) == 0) {
1529 vol->multiuser = true;
1530 } else if (!strnicmp(data, "backupuid", 9) && value && *value) {
1531 err = kstrtouint(value, 0, &vol->backupuid);
1532 if (err < 0) {
1533 cERROR(1, "%s: Invalid backupuid value",
1534 __func__);
1535 goto cifs_parse_mount_err;
1537 vol->backupuid_specified = true;
1538 } else if (!strnicmp(data, "backupgid", 9) && value && *value) {
1539 err = kstrtouint(value, 0, &vol->backupgid);
1540 if (err < 0) {
1541 cERROR(1, "%s: Invalid backupgid value",
1542 __func__);
1543 goto cifs_parse_mount_err;
1545 vol->backupgid_specified = true;
1546 } else
1547 printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1548 data);
1550 if (vol->UNC == NULL) {
1551 if (devname == NULL) {
1552 printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1553 "target\n");
1554 goto cifs_parse_mount_err;
1556 if ((temp_len = strnlen(devname, 300)) < 300) {
1557 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1558 if (vol->UNC == NULL)
1559 goto cifs_parse_mount_err;
1560 strcpy(vol->UNC, devname);
1561 if (strncmp(vol->UNC, "//", 2) == 0) {
1562 vol->UNC[0] = '\\';
1563 vol->UNC[1] = '\\';
1564 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1565 printk(KERN_WARNING "CIFS: UNC Path does not "
1566 "begin with // or \\\\ \n");
1567 goto cifs_parse_mount_err;
1569 value = strpbrk(vol->UNC+2, "/\\");
1570 if (value)
1571 *value = '\\';
1572 } else {
1573 printk(KERN_WARNING "CIFS: UNC name too long\n");
1574 goto cifs_parse_mount_err;
1578 if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) {
1579 cERROR(1, "Multiuser mounts currently require krb5 "
1580 "authentication!");
1581 goto cifs_parse_mount_err;
1584 if (vol->UNCip == NULL)
1585 vol->UNCip = &vol->UNC[2];
1587 if (uid_specified)
1588 vol->override_uid = override_uid;
1589 else if (override_uid == 1)
1590 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1591 "specified with no uid= option.\n");
1593 if (gid_specified)
1594 vol->override_gid = override_gid;
1595 else if (override_gid == 1)
1596 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1597 "specified with no gid= option.\n");
1599 kfree(mountdata_copy);
1600 return 0;
1602 cifs_parse_mount_err:
1603 kfree(mountdata_copy);
1604 return 1;
1607 /** Returns true if srcaddr isn't specified and rhs isn't
1608 * specified, or if srcaddr is specified and
1609 * matches the IP address of the rhs argument.
1611 static bool
1612 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1614 switch (srcaddr->sa_family) {
1615 case AF_UNSPEC:
1616 return (rhs->sa_family == AF_UNSPEC);
1617 case AF_INET: {
1618 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1619 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1620 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1622 case AF_INET6: {
1623 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1624 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1625 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1627 default:
1628 WARN_ON(1);
1629 return false; /* don't expect to be here */
1634 * If no port is specified in addr structure, we try to match with 445 port
1635 * and if it fails - with 139 ports. It should be called only if address
1636 * families of server and addr are equal.
1638 static bool
1639 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1641 __be16 port, *sport;
1643 switch (addr->sa_family) {
1644 case AF_INET:
1645 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1646 port = ((struct sockaddr_in *) addr)->sin_port;
1647 break;
1648 case AF_INET6:
1649 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1650 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1651 break;
1652 default:
1653 WARN_ON(1);
1654 return false;
1657 if (!port) {
1658 port = htons(CIFS_PORT);
1659 if (port == *sport)
1660 return true;
1662 port = htons(RFC1001_PORT);
1665 return port == *sport;
1668 static bool
1669 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1670 struct sockaddr *srcaddr)
1672 switch (addr->sa_family) {
1673 case AF_INET: {
1674 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1675 struct sockaddr_in *srv_addr4 =
1676 (struct sockaddr_in *)&server->dstaddr;
1678 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1679 return false;
1680 break;
1682 case AF_INET6: {
1683 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1684 struct sockaddr_in6 *srv_addr6 =
1685 (struct sockaddr_in6 *)&server->dstaddr;
1687 if (!ipv6_addr_equal(&addr6->sin6_addr,
1688 &srv_addr6->sin6_addr))
1689 return false;
1690 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1691 return false;
1692 break;
1694 default:
1695 WARN_ON(1);
1696 return false; /* don't expect to be here */
1699 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1700 return false;
1702 return true;
1705 static bool
1706 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1708 unsigned int secFlags;
1710 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1711 secFlags = vol->secFlg;
1712 else
1713 secFlags = global_secflags | vol->secFlg;
1715 switch (server->secType) {
1716 case LANMAN:
1717 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1718 return false;
1719 break;
1720 case NTLMv2:
1721 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1722 return false;
1723 break;
1724 case NTLM:
1725 if (!(secFlags & CIFSSEC_MAY_NTLM))
1726 return false;
1727 break;
1728 case Kerberos:
1729 if (!(secFlags & CIFSSEC_MAY_KRB5))
1730 return false;
1731 break;
1732 case RawNTLMSSP:
1733 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1734 return false;
1735 break;
1736 default:
1737 /* shouldn't happen */
1738 return false;
1741 /* now check if signing mode is acceptable */
1742 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1743 (server->sec_mode & SECMODE_SIGN_REQUIRED))
1744 return false;
1745 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1746 (server->sec_mode &
1747 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1748 return false;
1750 return true;
1753 static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
1754 struct smb_vol *vol)
1756 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1757 return 0;
1759 if (!match_address(server, addr,
1760 (struct sockaddr *)&vol->srcaddr))
1761 return 0;
1763 if (!match_port(server, addr))
1764 return 0;
1766 if (!match_security(server, vol))
1767 return 0;
1769 return 1;
1772 static struct TCP_Server_Info *
1773 cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1775 struct TCP_Server_Info *server;
1777 spin_lock(&cifs_tcp_ses_lock);
1778 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1779 if (!match_server(server, addr, vol))
1780 continue;
1782 ++server->srv_count;
1783 spin_unlock(&cifs_tcp_ses_lock);
1784 cFYI(1, "Existing tcp session with server found");
1785 return server;
1787 spin_unlock(&cifs_tcp_ses_lock);
1788 return NULL;
1791 static void
1792 cifs_put_tcp_session(struct TCP_Server_Info *server)
1794 struct task_struct *task;
1796 spin_lock(&cifs_tcp_ses_lock);
1797 if (--server->srv_count > 0) {
1798 spin_unlock(&cifs_tcp_ses_lock);
1799 return;
1802 put_net(cifs_net_ns(server));
1804 list_del_init(&server->tcp_ses_list);
1805 spin_unlock(&cifs_tcp_ses_lock);
1807 cancel_delayed_work_sync(&server->echo);
1809 spin_lock(&GlobalMid_Lock);
1810 server->tcpStatus = CifsExiting;
1811 spin_unlock(&GlobalMid_Lock);
1813 cifs_crypto_shash_release(server);
1814 cifs_fscache_release_client_cookie(server);
1816 kfree(server->session_key.response);
1817 server->session_key.response = NULL;
1818 server->session_key.len = 0;
1820 task = xchg(&server->tsk, NULL);
1821 if (task)
1822 force_sig(SIGKILL, task);
1825 static struct TCP_Server_Info *
1826 cifs_get_tcp_session(struct smb_vol *volume_info)
1828 struct TCP_Server_Info *tcp_ses = NULL;
1829 struct sockaddr_storage addr;
1830 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1831 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1832 int rc;
1834 memset(&addr, 0, sizeof(struct sockaddr_storage));
1836 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
1838 if (volume_info->UNCip && volume_info->UNC) {
1839 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1840 volume_info->UNCip,
1841 strlen(volume_info->UNCip),
1842 volume_info->port);
1843 if (!rc) {
1844 /* we failed translating address */
1845 rc = -EINVAL;
1846 goto out_err;
1848 } else if (volume_info->UNCip) {
1849 /* BB using ip addr as tcp_ses name to connect to the
1850 DFS root below */
1851 cERROR(1, "Connecting to DFS root not implemented yet");
1852 rc = -EINVAL;
1853 goto out_err;
1854 } else /* which tcp_sess DFS root would we conect to */ {
1855 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1856 "unc=//192.168.1.100/public) specified");
1857 rc = -EINVAL;
1858 goto out_err;
1861 /* see if we already have a matching tcp_ses */
1862 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
1863 if (tcp_ses)
1864 return tcp_ses;
1866 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1867 if (!tcp_ses) {
1868 rc = -ENOMEM;
1869 goto out_err;
1872 rc = cifs_crypto_shash_allocate(tcp_ses);
1873 if (rc) {
1874 cERROR(1, "could not setup hash structures rc %d", rc);
1875 goto out_err;
1878 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1879 tcp_ses->hostname = extract_hostname(volume_info->UNC);
1880 if (IS_ERR(tcp_ses->hostname)) {
1881 rc = PTR_ERR(tcp_ses->hostname);
1882 goto out_err_crypto_release;
1885 tcp_ses->noblocksnd = volume_info->noblocksnd;
1886 tcp_ses->noautotune = volume_info->noautotune;
1887 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
1888 atomic_set(&tcp_ses->inFlight, 0);
1889 init_waitqueue_head(&tcp_ses->response_q);
1890 init_waitqueue_head(&tcp_ses->request_q);
1891 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1892 mutex_init(&tcp_ses->srv_mutex);
1893 memcpy(tcp_ses->workstation_RFC1001_name,
1894 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1895 memcpy(tcp_ses->server_RFC1001_name,
1896 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1897 tcp_ses->session_estab = false;
1898 tcp_ses->sequence_number = 0;
1899 tcp_ses->lstrp = jiffies;
1900 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1901 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1902 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1905 * at this point we are the only ones with the pointer
1906 * to the struct since the kernel thread not created yet
1907 * no need to spinlock this init of tcpStatus or srv_count
1909 tcp_ses->tcpStatus = CifsNew;
1910 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
1911 sizeof(tcp_ses->srcaddr));
1912 ++tcp_ses->srv_count;
1914 if (addr.ss_family == AF_INET6) {
1915 cFYI(1, "attempting ipv6 connect");
1916 /* BB should we allow ipv6 on port 139? */
1917 /* other OS never observed in Wild doing 139 with v6 */
1918 memcpy(&tcp_ses->dstaddr, sin_server6,
1919 sizeof(struct sockaddr_in6));
1920 } else
1921 memcpy(&tcp_ses->dstaddr, sin_server,
1922 sizeof(struct sockaddr_in));
1924 rc = ip_connect(tcp_ses);
1925 if (rc < 0) {
1926 cERROR(1, "Error connecting to socket. Aborting operation");
1927 goto out_err_crypto_release;
1931 * since we're in a cifs function already, we know that
1932 * this will succeed. No need for try_module_get().
1934 __module_get(THIS_MODULE);
1935 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1936 tcp_ses, "cifsd");
1937 if (IS_ERR(tcp_ses->tsk)) {
1938 rc = PTR_ERR(tcp_ses->tsk);
1939 cERROR(1, "error %d create cifsd thread", rc);
1940 module_put(THIS_MODULE);
1941 goto out_err_crypto_release;
1943 tcp_ses->tcpStatus = CifsNeedNegotiate;
1945 /* thread spawned, put it on the list */
1946 spin_lock(&cifs_tcp_ses_lock);
1947 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1948 spin_unlock(&cifs_tcp_ses_lock);
1950 cifs_fscache_get_client_cookie(tcp_ses);
1952 /* queue echo request delayed work */
1953 queue_delayed_work(system_nrt_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
1955 return tcp_ses;
1957 out_err_crypto_release:
1958 cifs_crypto_shash_release(tcp_ses);
1960 put_net(cifs_net_ns(tcp_ses));
1962 out_err:
1963 if (tcp_ses) {
1964 if (!IS_ERR(tcp_ses->hostname))
1965 kfree(tcp_ses->hostname);
1966 if (tcp_ses->ssocket)
1967 sock_release(tcp_ses->ssocket);
1968 kfree(tcp_ses);
1970 return ERR_PTR(rc);
1973 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
1975 switch (ses->server->secType) {
1976 case Kerberos:
1977 if (vol->cred_uid != ses->cred_uid)
1978 return 0;
1979 break;
1980 default:
1981 /* anything else takes username/password */
1982 if (ses->user_name == NULL)
1983 return 0;
1984 if (strncmp(ses->user_name, vol->username,
1985 MAX_USERNAME_SIZE))
1986 return 0;
1987 if (strlen(vol->username) != 0 &&
1988 ses->password != NULL &&
1989 strncmp(ses->password,
1990 vol->password ? vol->password : "",
1991 MAX_PASSWORD_SIZE))
1992 return 0;
1994 return 1;
1997 static struct cifs_ses *
1998 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2000 struct cifs_ses *ses;
2002 spin_lock(&cifs_tcp_ses_lock);
2003 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2004 if (!match_session(ses, vol))
2005 continue;
2006 ++ses->ses_count;
2007 spin_unlock(&cifs_tcp_ses_lock);
2008 return ses;
2010 spin_unlock(&cifs_tcp_ses_lock);
2011 return NULL;
2014 static void
2015 cifs_put_smb_ses(struct cifs_ses *ses)
2017 int xid;
2018 struct TCP_Server_Info *server = ses->server;
2020 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
2021 spin_lock(&cifs_tcp_ses_lock);
2022 if (--ses->ses_count > 0) {
2023 spin_unlock(&cifs_tcp_ses_lock);
2024 return;
2027 list_del_init(&ses->smb_ses_list);
2028 spin_unlock(&cifs_tcp_ses_lock);
2030 if (ses->status == CifsGood) {
2031 xid = GetXid();
2032 CIFSSMBLogoff(xid, ses);
2033 _FreeXid(xid);
2035 sesInfoFree(ses);
2036 cifs_put_tcp_session(server);
2039 static bool warned_on_ntlm; /* globals init to false automatically */
2041 static struct cifs_ses *
2042 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2044 int rc = -ENOMEM, xid;
2045 struct cifs_ses *ses;
2046 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2047 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2049 xid = GetXid();
2051 ses = cifs_find_smb_ses(server, volume_info);
2052 if (ses) {
2053 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2055 mutex_lock(&ses->session_mutex);
2056 rc = cifs_negotiate_protocol(xid, ses);
2057 if (rc) {
2058 mutex_unlock(&ses->session_mutex);
2059 /* problem -- put our ses reference */
2060 cifs_put_smb_ses(ses);
2061 FreeXid(xid);
2062 return ERR_PTR(rc);
2064 if (ses->need_reconnect) {
2065 cFYI(1, "Session needs reconnect");
2066 rc = cifs_setup_session(xid, ses,
2067 volume_info->local_nls);
2068 if (rc) {
2069 mutex_unlock(&ses->session_mutex);
2070 /* problem -- put our reference */
2071 cifs_put_smb_ses(ses);
2072 FreeXid(xid);
2073 return ERR_PTR(rc);
2076 mutex_unlock(&ses->session_mutex);
2078 /* existing SMB ses has a server reference already */
2079 cifs_put_tcp_session(server);
2080 FreeXid(xid);
2081 return ses;
2084 cFYI(1, "Existing smb sess not found");
2085 ses = sesInfoAlloc();
2086 if (ses == NULL)
2087 goto get_ses_fail;
2089 /* new SMB session uses our server ref */
2090 ses->server = server;
2091 if (server->dstaddr.ss_family == AF_INET6)
2092 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2093 else
2094 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2096 if (volume_info->username) {
2097 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2098 if (!ses->user_name)
2099 goto get_ses_fail;
2102 /* volume_info->password freed at unmount */
2103 if (volume_info->password) {
2104 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2105 if (!ses->password)
2106 goto get_ses_fail;
2108 if (volume_info->domainname) {
2109 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2110 if (!ses->domainName)
2111 goto get_ses_fail;
2113 ses->cred_uid = volume_info->cred_uid;
2114 ses->linux_uid = volume_info->linux_uid;
2116 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2117 supported for many years, time to update default security mechanism */
2118 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2119 warned_on_ntlm = true;
2120 cERROR(1, "default security mechanism requested. The default "
2121 "security mechanism will be upgraded from ntlm to "
2122 "ntlmv2 in kernel release 3.2");
2124 ses->overrideSecFlg = volume_info->secFlg;
2126 mutex_lock(&ses->session_mutex);
2127 rc = cifs_negotiate_protocol(xid, ses);
2128 if (!rc)
2129 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2130 mutex_unlock(&ses->session_mutex);
2131 if (rc)
2132 goto get_ses_fail;
2134 /* success, put it on the list */
2135 spin_lock(&cifs_tcp_ses_lock);
2136 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2137 spin_unlock(&cifs_tcp_ses_lock);
2139 FreeXid(xid);
2140 return ses;
2142 get_ses_fail:
2143 sesInfoFree(ses);
2144 FreeXid(xid);
2145 return ERR_PTR(rc);
2148 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2150 if (tcon->tidStatus == CifsExiting)
2151 return 0;
2152 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2153 return 0;
2154 return 1;
2157 static struct cifs_tcon *
2158 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2160 struct list_head *tmp;
2161 struct cifs_tcon *tcon;
2163 spin_lock(&cifs_tcp_ses_lock);
2164 list_for_each(tmp, &ses->tcon_list) {
2165 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2166 if (!match_tcon(tcon, unc))
2167 continue;
2168 ++tcon->tc_count;
2169 spin_unlock(&cifs_tcp_ses_lock);
2170 return tcon;
2172 spin_unlock(&cifs_tcp_ses_lock);
2173 return NULL;
2176 static void
2177 cifs_put_tcon(struct cifs_tcon *tcon)
2179 int xid;
2180 struct cifs_ses *ses = tcon->ses;
2182 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2183 spin_lock(&cifs_tcp_ses_lock);
2184 if (--tcon->tc_count > 0) {
2185 spin_unlock(&cifs_tcp_ses_lock);
2186 return;
2189 list_del_init(&tcon->tcon_list);
2190 spin_unlock(&cifs_tcp_ses_lock);
2192 xid = GetXid();
2193 CIFSSMBTDis(xid, tcon);
2194 _FreeXid(xid);
2196 cifs_fscache_release_super_cookie(tcon);
2197 tconInfoFree(tcon);
2198 cifs_put_smb_ses(ses);
2201 static struct cifs_tcon *
2202 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2204 int rc, xid;
2205 struct cifs_tcon *tcon;
2207 tcon = cifs_find_tcon(ses, volume_info->UNC);
2208 if (tcon) {
2209 cFYI(1, "Found match on UNC path");
2210 /* existing tcon already has a reference */
2211 cifs_put_smb_ses(ses);
2212 if (tcon->seal != volume_info->seal)
2213 cERROR(1, "transport encryption setting "
2214 "conflicts with existing tid");
2215 return tcon;
2218 tcon = tconInfoAlloc();
2219 if (tcon == NULL) {
2220 rc = -ENOMEM;
2221 goto out_fail;
2224 tcon->ses = ses;
2225 if (volume_info->password) {
2226 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2227 if (!tcon->password) {
2228 rc = -ENOMEM;
2229 goto out_fail;
2233 if (strchr(volume_info->UNC + 3, '\\') == NULL
2234 && strchr(volume_info->UNC + 3, '/') == NULL) {
2235 cERROR(1, "Missing share name");
2236 rc = -ENODEV;
2237 goto out_fail;
2240 /* BB Do we need to wrap session_mutex around
2241 * this TCon call and Unix SetFS as
2242 * we do on SessSetup and reconnect? */
2243 xid = GetXid();
2244 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2245 FreeXid(xid);
2246 cFYI(1, "CIFS Tcon rc = %d", rc);
2247 if (rc)
2248 goto out_fail;
2250 if (volume_info->nodfs) {
2251 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2252 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2254 tcon->seal = volume_info->seal;
2255 /* we can have only one retry value for a connection
2256 to a share so for resources mounted more than once
2257 to the same server share the last value passed in
2258 for the retry flag is used */
2259 tcon->retry = volume_info->retry;
2260 tcon->nocase = volume_info->nocase;
2261 tcon->local_lease = volume_info->local_lease;
2263 spin_lock(&cifs_tcp_ses_lock);
2264 list_add(&tcon->tcon_list, &ses->tcon_list);
2265 spin_unlock(&cifs_tcp_ses_lock);
2267 cifs_fscache_get_super_cookie(tcon);
2269 return tcon;
2271 out_fail:
2272 tconInfoFree(tcon);
2273 return ERR_PTR(rc);
2276 void
2277 cifs_put_tlink(struct tcon_link *tlink)
2279 if (!tlink || IS_ERR(tlink))
2280 return;
2282 if (!atomic_dec_and_test(&tlink->tl_count) ||
2283 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2284 tlink->tl_time = jiffies;
2285 return;
2288 if (!IS_ERR(tlink_tcon(tlink)))
2289 cifs_put_tcon(tlink_tcon(tlink));
2290 kfree(tlink);
2291 return;
2294 static inline struct tcon_link *
2295 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2297 return cifs_sb->master_tlink;
2300 static int
2301 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2303 struct cifs_sb_info *old = CIFS_SB(sb);
2304 struct cifs_sb_info *new = mnt_data->cifs_sb;
2306 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2307 return 0;
2309 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2310 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2311 return 0;
2314 * We want to share sb only if we don't specify an r/wsize or
2315 * specified r/wsize is greater than or equal to existing one.
2317 if (new->wsize && new->wsize < old->wsize)
2318 return 0;
2320 if (new->rsize && new->rsize < old->rsize)
2321 return 0;
2323 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2324 return 0;
2326 if (old->mnt_file_mode != new->mnt_file_mode ||
2327 old->mnt_dir_mode != new->mnt_dir_mode)
2328 return 0;
2330 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2331 return 0;
2333 if (old->actimeo != new->actimeo)
2334 return 0;
2336 return 1;
2340 cifs_match_super(struct super_block *sb, void *data)
2342 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2343 struct smb_vol *volume_info;
2344 struct cifs_sb_info *cifs_sb;
2345 struct TCP_Server_Info *tcp_srv;
2346 struct cifs_ses *ses;
2347 struct cifs_tcon *tcon;
2348 struct tcon_link *tlink;
2349 struct sockaddr_storage addr;
2350 int rc = 0;
2352 memset(&addr, 0, sizeof(struct sockaddr_storage));
2354 spin_lock(&cifs_tcp_ses_lock);
2355 cifs_sb = CIFS_SB(sb);
2356 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2357 if (IS_ERR(tlink)) {
2358 spin_unlock(&cifs_tcp_ses_lock);
2359 return rc;
2361 tcon = tlink_tcon(tlink);
2362 ses = tcon->ses;
2363 tcp_srv = ses->server;
2365 volume_info = mnt_data->vol;
2367 if (!volume_info->UNCip || !volume_info->UNC)
2368 goto out;
2370 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2371 volume_info->UNCip,
2372 strlen(volume_info->UNCip),
2373 volume_info->port);
2374 if (!rc)
2375 goto out;
2377 if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2378 !match_session(ses, volume_info) ||
2379 !match_tcon(tcon, volume_info->UNC)) {
2380 rc = 0;
2381 goto out;
2384 rc = compare_mount_options(sb, mnt_data);
2385 out:
2386 spin_unlock(&cifs_tcp_ses_lock);
2387 cifs_put_tlink(tlink);
2388 return rc;
2392 get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path,
2393 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
2394 struct dfs_info3_param **preferrals, int remap)
2396 char *temp_unc;
2397 int rc = 0;
2399 *pnum_referrals = 0;
2400 *preferrals = NULL;
2402 if (pSesInfo->ipc_tid == 0) {
2403 temp_unc = kmalloc(2 /* for slashes */ +
2404 strnlen(pSesInfo->serverName,
2405 SERVER_NAME_LEN_WITH_NULL * 2)
2406 + 1 + 4 /* slash IPC$ */ + 2,
2407 GFP_KERNEL);
2408 if (temp_unc == NULL)
2409 return -ENOMEM;
2410 temp_unc[0] = '\\';
2411 temp_unc[1] = '\\';
2412 strcpy(temp_unc + 2, pSesInfo->serverName);
2413 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2414 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
2415 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
2416 kfree(temp_unc);
2418 if (rc == 0)
2419 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
2420 pnum_referrals, nls_codepage, remap);
2421 /* BB map targetUNCs to dfs_info3 structures, here or
2422 in CIFSGetDFSRefer BB */
2424 return rc;
2427 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2428 static struct lock_class_key cifs_key[2];
2429 static struct lock_class_key cifs_slock_key[2];
2431 static inline void
2432 cifs_reclassify_socket4(struct socket *sock)
2434 struct sock *sk = sock->sk;
2435 BUG_ON(sock_owned_by_user(sk));
2436 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2437 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2440 static inline void
2441 cifs_reclassify_socket6(struct socket *sock)
2443 struct sock *sk = sock->sk;
2444 BUG_ON(sock_owned_by_user(sk));
2445 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2446 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2448 #else
2449 static inline void
2450 cifs_reclassify_socket4(struct socket *sock)
2454 static inline void
2455 cifs_reclassify_socket6(struct socket *sock)
2458 #endif
2460 /* See RFC1001 section 14 on representation of Netbios names */
2461 static void rfc1002mangle(char *target, char *source, unsigned int length)
2463 unsigned int i, j;
2465 for (i = 0, j = 0; i < (length); i++) {
2466 /* mask a nibble at a time and encode */
2467 target[j] = 'A' + (0x0F & (source[i] >> 4));
2468 target[j+1] = 'A' + (0x0F & source[i]);
2469 j += 2;
2474 static int
2475 bind_socket(struct TCP_Server_Info *server)
2477 int rc = 0;
2478 if (server->srcaddr.ss_family != AF_UNSPEC) {
2479 /* Bind to the specified local IP address */
2480 struct socket *socket = server->ssocket;
2481 rc = socket->ops->bind(socket,
2482 (struct sockaddr *) &server->srcaddr,
2483 sizeof(server->srcaddr));
2484 if (rc < 0) {
2485 struct sockaddr_in *saddr4;
2486 struct sockaddr_in6 *saddr6;
2487 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2488 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2489 if (saddr6->sin6_family == AF_INET6)
2490 cERROR(1, "cifs: "
2491 "Failed to bind to: %pI6c, error: %d\n",
2492 &saddr6->sin6_addr, rc);
2493 else
2494 cERROR(1, "cifs: "
2495 "Failed to bind to: %pI4, error: %d\n",
2496 &saddr4->sin_addr.s_addr, rc);
2499 return rc;
2502 static int
2503 ip_rfc1001_connect(struct TCP_Server_Info *server)
2505 int rc = 0;
2507 * some servers require RFC1001 sessinit before sending
2508 * negprot - BB check reconnection in case where second
2509 * sessinit is sent but no second negprot
2511 struct rfc1002_session_packet *ses_init_buf;
2512 struct smb_hdr *smb_buf;
2513 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2514 GFP_KERNEL);
2515 if (ses_init_buf) {
2516 ses_init_buf->trailer.session_req.called_len = 32;
2518 if (server->server_RFC1001_name &&
2519 server->server_RFC1001_name[0] != 0)
2520 rfc1002mangle(ses_init_buf->trailer.
2521 session_req.called_name,
2522 server->server_RFC1001_name,
2523 RFC1001_NAME_LEN_WITH_NULL);
2524 else
2525 rfc1002mangle(ses_init_buf->trailer.
2526 session_req.called_name,
2527 DEFAULT_CIFS_CALLED_NAME,
2528 RFC1001_NAME_LEN_WITH_NULL);
2530 ses_init_buf->trailer.session_req.calling_len = 32;
2533 * calling name ends in null (byte 16) from old smb
2534 * convention.
2536 if (server->workstation_RFC1001_name &&
2537 server->workstation_RFC1001_name[0] != 0)
2538 rfc1002mangle(ses_init_buf->trailer.
2539 session_req.calling_name,
2540 server->workstation_RFC1001_name,
2541 RFC1001_NAME_LEN_WITH_NULL);
2542 else
2543 rfc1002mangle(ses_init_buf->trailer.
2544 session_req.calling_name,
2545 "LINUX_CIFS_CLNT",
2546 RFC1001_NAME_LEN_WITH_NULL);
2548 ses_init_buf->trailer.session_req.scope1 = 0;
2549 ses_init_buf->trailer.session_req.scope2 = 0;
2550 smb_buf = (struct smb_hdr *)ses_init_buf;
2552 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2553 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2554 rc = smb_send(server, smb_buf, 0x44);
2555 kfree(ses_init_buf);
2557 * RFC1001 layer in at least one server
2558 * requires very short break before negprot
2559 * presumably because not expecting negprot
2560 * to follow so fast. This is a simple
2561 * solution that works without
2562 * complicating the code and causes no
2563 * significant slowing down on mount
2564 * for everyone else
2566 usleep_range(1000, 2000);
2569 * else the negprot may still work without this
2570 * even though malloc failed
2573 return rc;
2576 static int
2577 generic_ip_connect(struct TCP_Server_Info *server)
2579 int rc = 0;
2580 __be16 sport;
2581 int slen, sfamily;
2582 struct socket *socket = server->ssocket;
2583 struct sockaddr *saddr;
2585 saddr = (struct sockaddr *) &server->dstaddr;
2587 if (server->dstaddr.ss_family == AF_INET6) {
2588 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2589 slen = sizeof(struct sockaddr_in6);
2590 sfamily = AF_INET6;
2591 } else {
2592 sport = ((struct sockaddr_in *) saddr)->sin_port;
2593 slen = sizeof(struct sockaddr_in);
2594 sfamily = AF_INET;
2597 if (socket == NULL) {
2598 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2599 IPPROTO_TCP, &socket, 1);
2600 if (rc < 0) {
2601 cERROR(1, "Error %d creating socket", rc);
2602 server->ssocket = NULL;
2603 return rc;
2606 /* BB other socket options to set KEEPALIVE, NODELAY? */
2607 cFYI(1, "Socket created");
2608 server->ssocket = socket;
2609 socket->sk->sk_allocation = GFP_NOFS;
2610 if (sfamily == AF_INET6)
2611 cifs_reclassify_socket6(socket);
2612 else
2613 cifs_reclassify_socket4(socket);
2616 rc = bind_socket(server);
2617 if (rc < 0)
2618 return rc;
2621 * Eventually check for other socket options to change from
2622 * the default. sock_setsockopt not used because it expects
2623 * user space buffer
2625 socket->sk->sk_rcvtimeo = 7 * HZ;
2626 socket->sk->sk_sndtimeo = 5 * HZ;
2628 /* make the bufsizes depend on wsize/rsize and max requests */
2629 if (server->noautotune) {
2630 if (socket->sk->sk_sndbuf < (200 * 1024))
2631 socket->sk->sk_sndbuf = 200 * 1024;
2632 if (socket->sk->sk_rcvbuf < (140 * 1024))
2633 socket->sk->sk_rcvbuf = 140 * 1024;
2636 if (server->tcp_nodelay) {
2637 int val = 1;
2638 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2639 (char *)&val, sizeof(val));
2640 if (rc)
2641 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
2644 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2645 socket->sk->sk_sndbuf,
2646 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2648 rc = socket->ops->connect(socket, saddr, slen, 0);
2649 if (rc < 0) {
2650 cFYI(1, "Error %d connecting to server", rc);
2651 sock_release(socket);
2652 server->ssocket = NULL;
2653 return rc;
2656 if (sport == htons(RFC1001_PORT))
2657 rc = ip_rfc1001_connect(server);
2659 return rc;
2662 static int
2663 ip_connect(struct TCP_Server_Info *server)
2665 __be16 *sport;
2666 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2667 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2669 if (server->dstaddr.ss_family == AF_INET6)
2670 sport = &addr6->sin6_port;
2671 else
2672 sport = &addr->sin_port;
2674 if (*sport == 0) {
2675 int rc;
2677 /* try with 445 port at first */
2678 *sport = htons(CIFS_PORT);
2680 rc = generic_ip_connect(server);
2681 if (rc >= 0)
2682 return rc;
2684 /* if it failed, try with 139 port */
2685 *sport = htons(RFC1001_PORT);
2688 return generic_ip_connect(server);
2691 void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
2692 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
2694 /* if we are reconnecting then should we check to see if
2695 * any requested capabilities changed locally e.g. via
2696 * remount but we can not do much about it here
2697 * if they have (even if we could detect it by the following)
2698 * Perhaps we could add a backpointer to array of sb from tcon
2699 * or if we change to make all sb to same share the same
2700 * sb as NFS - then we only have one backpointer to sb.
2701 * What if we wanted to mount the server share twice once with
2702 * and once without posixacls or posix paths? */
2703 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2705 if (vol_info && vol_info->no_linux_ext) {
2706 tcon->fsUnixInfo.Capability = 0;
2707 tcon->unix_ext = 0; /* Unix Extensions disabled */
2708 cFYI(1, "Linux protocol extensions disabled");
2709 return;
2710 } else if (vol_info)
2711 tcon->unix_ext = 1; /* Unix Extensions supported */
2713 if (tcon->unix_ext == 0) {
2714 cFYI(1, "Unix extensions disabled so not set on reconnect");
2715 return;
2718 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2719 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2720 cFYI(1, "unix caps which server supports %lld", cap);
2721 /* check for reconnect case in which we do not
2722 want to change the mount behavior if we can avoid it */
2723 if (vol_info == NULL) {
2724 /* turn off POSIX ACL and PATHNAMES if not set
2725 originally at mount time */
2726 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2727 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2728 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2729 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2730 cERROR(1, "POSIXPATH support change");
2731 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2732 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2733 cERROR(1, "possible reconnect error");
2734 cERROR(1, "server disabled POSIX path support");
2738 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2739 cERROR(1, "per-share encryption not supported yet");
2741 cap &= CIFS_UNIX_CAP_MASK;
2742 if (vol_info && vol_info->no_psx_acl)
2743 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2744 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2745 cFYI(1, "negotiated posix acl support");
2746 if (cifs_sb)
2747 cifs_sb->mnt_cifs_flags |=
2748 CIFS_MOUNT_POSIXACL;
2751 if (vol_info && vol_info->posix_paths == 0)
2752 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2753 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2754 cFYI(1, "negotiate posix pathnames");
2755 if (cifs_sb)
2756 cifs_sb->mnt_cifs_flags |=
2757 CIFS_MOUNT_POSIX_PATHS;
2760 cFYI(1, "Negotiate caps 0x%x", (int)cap);
2761 #ifdef CONFIG_CIFS_DEBUG2
2762 if (cap & CIFS_UNIX_FCNTL_CAP)
2763 cFYI(1, "FCNTL cap");
2764 if (cap & CIFS_UNIX_EXTATTR_CAP)
2765 cFYI(1, "EXTATTR cap");
2766 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2767 cFYI(1, "POSIX path cap");
2768 if (cap & CIFS_UNIX_XATTR_CAP)
2769 cFYI(1, "XATTR cap");
2770 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2771 cFYI(1, "POSIX ACL cap");
2772 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2773 cFYI(1, "very large read cap");
2774 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2775 cFYI(1, "very large write cap");
2776 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2777 cFYI(1, "transport encryption cap");
2778 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2779 cFYI(1, "mandatory transport encryption cap");
2780 #endif /* CIFS_DEBUG2 */
2781 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2782 if (vol_info == NULL) {
2783 cFYI(1, "resetting capabilities failed");
2784 } else
2785 cERROR(1, "Negotiating Unix capabilities "
2786 "with the server failed. Consider "
2787 "mounting with the Unix Extensions\n"
2788 "disabled, if problems are found, "
2789 "by specifying the nounix mount "
2790 "option.");
2796 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
2797 struct cifs_sb_info *cifs_sb)
2799 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2801 spin_lock_init(&cifs_sb->tlink_tree_lock);
2802 cifs_sb->tlink_tree = RB_ROOT;
2805 * Temporarily set r/wsize for matching superblock. If we end up using
2806 * new sb then client will later negotiate it downward if needed.
2808 cifs_sb->rsize = pvolume_info->rsize;
2809 cifs_sb->wsize = pvolume_info->wsize;
2811 cifs_sb->mnt_uid = pvolume_info->linux_uid;
2812 cifs_sb->mnt_gid = pvolume_info->linux_gid;
2813 if (pvolume_info->backupuid_specified)
2814 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
2815 if (pvolume_info->backupgid_specified)
2816 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
2817 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2818 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
2819 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2820 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
2822 cifs_sb->actimeo = pvolume_info->actimeo;
2823 cifs_sb->local_nls = pvolume_info->local_nls;
2825 if (pvolume_info->noperm)
2826 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
2827 if (pvolume_info->setuids)
2828 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
2829 if (pvolume_info->server_ino)
2830 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
2831 if (pvolume_info->remap)
2832 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
2833 if (pvolume_info->no_xattr)
2834 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
2835 if (pvolume_info->sfu_emul)
2836 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
2837 if (pvolume_info->nobrl)
2838 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
2839 if (pvolume_info->nostrictsync)
2840 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
2841 if (pvolume_info->mand_lock)
2842 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
2843 if (pvolume_info->rwpidforward)
2844 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
2845 if (pvolume_info->cifs_acl)
2846 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
2847 if (pvolume_info->backupuid_specified)
2848 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
2849 if (pvolume_info->backupgid_specified)
2850 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
2851 if (pvolume_info->override_uid)
2852 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
2853 if (pvolume_info->override_gid)
2854 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
2855 if (pvolume_info->dynperm)
2856 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
2857 if (pvolume_info->fsc)
2858 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
2859 if (pvolume_info->multiuser)
2860 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
2861 CIFS_MOUNT_NO_PERM);
2862 if (pvolume_info->strict_io)
2863 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
2864 if (pvolume_info->direct_io) {
2865 cFYI(1, "mounting share using direct i/o");
2866 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2868 if (pvolume_info->mfsymlinks) {
2869 if (pvolume_info->sfu_emul) {
2870 cERROR(1, "mount option mfsymlinks ignored if sfu "
2871 "mount option is used");
2872 } else {
2873 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
2877 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
2878 cERROR(1, "mount option dynperm ignored if cifsacl "
2879 "mount option supported");
2883 * When the server supports very large reads and writes via POSIX extensions,
2884 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
2885 * including the RFC1001 length.
2887 * Note that this might make for "interesting" allocation problems during
2888 * writeback however as we have to allocate an array of pointers for the
2889 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
2891 * For reads, there is a similar problem as we need to allocate an array
2892 * of kvecs to handle the receive, though that should only need to be done
2893 * once.
2895 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
2896 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
2899 * When the server doesn't allow large posix writes, only allow a rsize/wsize
2900 * of 2^17-1 minus the size of the call header. That allows for a read or
2901 * write up to the maximum size described by RFC1002.
2903 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
2904 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
2907 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
2908 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
2909 * a single wsize request with a single call.
2911 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
2914 * Windows only supports a max of 60k reads. Default to that when posix
2915 * extensions aren't in force.
2917 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
2919 static unsigned int
2920 cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
2922 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2923 struct TCP_Server_Info *server = tcon->ses->server;
2924 unsigned int wsize = pvolume_info->wsize ? pvolume_info->wsize :
2925 CIFS_DEFAULT_IOSIZE;
2927 /* can server support 24-bit write sizes? (via UNIX extensions) */
2928 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
2929 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
2932 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
2933 * Limit it to max buffer offered by the server, minus the size of the
2934 * WRITEX header, not including the 4 byte RFC1001 length.
2936 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
2937 (!(server->capabilities & CAP_UNIX) &&
2938 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
2939 wsize = min_t(unsigned int, wsize,
2940 server->maxBuf - sizeof(WRITE_REQ) + 4);
2942 /* hard limit of CIFS_MAX_WSIZE */
2943 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
2945 return wsize;
2948 static unsigned int
2949 cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
2951 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2952 struct TCP_Server_Info *server = tcon->ses->server;
2953 unsigned int rsize, defsize;
2956 * Set default value...
2958 * HACK alert! Ancient servers have very small buffers. Even though
2959 * MS-CIFS indicates that servers are only limited by the client's
2960 * bufsize for reads, testing against win98se shows that it throws
2961 * INVALID_PARAMETER errors if you try to request too large a read.
2963 * If the server advertises a MaxBufferSize of less than one page,
2964 * assume that it also can't satisfy reads larger than that either.
2966 * FIXME: Is there a better heuristic for this?
2968 if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP))
2969 defsize = CIFS_DEFAULT_IOSIZE;
2970 else if (server->capabilities & CAP_LARGE_READ_X)
2971 defsize = CIFS_DEFAULT_NON_POSIX_RSIZE;
2972 else if (server->maxBuf >= PAGE_CACHE_SIZE)
2973 defsize = CIFSMaxBufSize;
2974 else
2975 defsize = server->maxBuf - sizeof(READ_RSP);
2977 rsize = pvolume_info->rsize ? pvolume_info->rsize : defsize;
2980 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
2981 * the client's MaxBufferSize.
2983 if (!(server->capabilities & CAP_LARGE_READ_X))
2984 rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
2986 /* hard limit of CIFS_MAX_RSIZE */
2987 rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
2989 return rsize;
2992 static int
2993 is_path_accessible(int xid, struct cifs_tcon *tcon,
2994 struct cifs_sb_info *cifs_sb, const char *full_path)
2996 int rc;
2997 FILE_ALL_INFO *pfile_info;
2999 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
3000 if (pfile_info == NULL)
3001 return -ENOMEM;
3003 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
3004 0 /* not legacy */, cifs_sb->local_nls,
3005 cifs_sb->mnt_cifs_flags &
3006 CIFS_MOUNT_MAP_SPECIAL_CHR);
3008 if (rc == -EOPNOTSUPP || rc == -EINVAL)
3009 rc = SMBQueryInformation(xid, tcon, full_path, pfile_info,
3010 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
3011 CIFS_MOUNT_MAP_SPECIAL_CHR);
3012 kfree(pfile_info);
3013 return rc;
3016 static void
3017 cleanup_volume_info_contents(struct smb_vol *volume_info)
3019 kfree(volume_info->username);
3020 kzfree(volume_info->password);
3021 kfree(volume_info->UNC);
3022 if (volume_info->UNCip != volume_info->UNC + 2)
3023 kfree(volume_info->UNCip);
3024 kfree(volume_info->domainname);
3025 kfree(volume_info->iocharset);
3026 kfree(volume_info->prepath);
3029 void
3030 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3032 if (!volume_info)
3033 return;
3034 cleanup_volume_info_contents(volume_info);
3035 kfree(volume_info);
3039 #ifdef CONFIG_CIFS_DFS_UPCALL
3040 /* build_path_to_root returns full path to root when
3041 * we do not have an exiting connection (tcon) */
3042 static char *
3043 build_unc_path_to_root(const struct smb_vol *vol,
3044 const struct cifs_sb_info *cifs_sb)
3046 char *full_path, *pos;
3047 unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
3048 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3050 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3051 if (full_path == NULL)
3052 return ERR_PTR(-ENOMEM);
3054 strncpy(full_path, vol->UNC, unc_len);
3055 pos = full_path + unc_len;
3057 if (pplen) {
3058 strncpy(pos, vol->prepath, pplen);
3059 pos += pplen;
3062 *pos = '\0'; /* add trailing null */
3063 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3064 cFYI(1, "%s: full_path=%s", __func__, full_path);
3065 return full_path;
3069 * Perform a dfs referral query for a share and (optionally) prefix
3071 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3072 * to a string containing updated options for the submount. Otherwise it
3073 * will be left untouched.
3075 * Returns the rc from get_dfs_path to the caller, which can be used to
3076 * determine whether there were referrals.
3078 static int
3079 expand_dfs_referral(int xid, struct cifs_ses *pSesInfo,
3080 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3081 int check_prefix)
3083 int rc;
3084 unsigned int num_referrals = 0;
3085 struct dfs_info3_param *referrals = NULL;
3086 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3088 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3089 if (IS_ERR(full_path))
3090 return PTR_ERR(full_path);
3092 /* For DFS paths, skip the first '\' of the UNC */
3093 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3095 rc = get_dfs_path(xid, pSesInfo , ref_path, cifs_sb->local_nls,
3096 &num_referrals, &referrals,
3097 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3099 if (!rc && num_referrals > 0) {
3100 char *fake_devname = NULL;
3102 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3103 full_path + 1, referrals,
3104 &fake_devname);
3106 free_dfs_info_array(referrals, num_referrals);
3108 if (IS_ERR(mdata)) {
3109 rc = PTR_ERR(mdata);
3110 mdata = NULL;
3111 } else {
3112 cleanup_volume_info_contents(volume_info);
3113 memset(volume_info, '\0', sizeof(*volume_info));
3114 rc = cifs_setup_volume_info(volume_info, mdata,
3115 fake_devname);
3117 kfree(fake_devname);
3118 kfree(cifs_sb->mountdata);
3119 cifs_sb->mountdata = mdata;
3121 kfree(full_path);
3122 return rc;
3124 #endif
3126 static int
3127 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3128 const char *devname)
3130 int rc = 0;
3132 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3133 return -EINVAL;
3135 if (volume_info->nullauth) {
3136 cFYI(1, "null user");
3137 volume_info->username = kzalloc(1, GFP_KERNEL);
3138 if (volume_info->username == NULL)
3139 return -ENOMEM;
3140 } else if (volume_info->username) {
3141 /* BB fixme parse for domain name here */
3142 cFYI(1, "Username: %s", volume_info->username);
3143 } else {
3144 cifserror("No username specified");
3145 /* In userspace mount helper we can get user name from alternate
3146 locations such as env variables and files on disk */
3147 return -EINVAL;
3150 /* this is needed for ASCII cp to Unicode converts */
3151 if (volume_info->iocharset == NULL) {
3152 /* load_nls_default cannot return null */
3153 volume_info->local_nls = load_nls_default();
3154 } else {
3155 volume_info->local_nls = load_nls(volume_info->iocharset);
3156 if (volume_info->local_nls == NULL) {
3157 cERROR(1, "CIFS mount error: iocharset %s not found",
3158 volume_info->iocharset);
3159 return -ELIBACC;
3163 return rc;
3166 struct smb_vol *
3167 cifs_get_volume_info(char *mount_data, const char *devname)
3169 int rc;
3170 struct smb_vol *volume_info;
3172 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3173 if (!volume_info)
3174 return ERR_PTR(-ENOMEM);
3176 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3177 if (rc) {
3178 cifs_cleanup_volume_info(volume_info);
3179 volume_info = ERR_PTR(rc);
3182 return volume_info;
3185 /* make sure ra_pages is a multiple of rsize */
3186 static inline unsigned int
3187 cifs_ra_pages(struct cifs_sb_info *cifs_sb)
3189 unsigned int reads;
3190 unsigned int rsize_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3192 if (rsize_pages >= default_backing_dev_info.ra_pages)
3193 return default_backing_dev_info.ra_pages;
3194 else if (rsize_pages == 0)
3195 return rsize_pages;
3197 reads = default_backing_dev_info.ra_pages / rsize_pages;
3198 return reads * rsize_pages;
3202 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3204 int rc = 0;
3205 int xid;
3206 struct cifs_ses *pSesInfo;
3207 struct cifs_tcon *tcon;
3208 struct TCP_Server_Info *srvTcp;
3209 char *full_path;
3210 struct tcon_link *tlink;
3211 #ifdef CONFIG_CIFS_DFS_UPCALL
3212 int referral_walks_count = 0;
3213 #endif
3215 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3216 if (rc)
3217 return rc;
3219 #ifdef CONFIG_CIFS_DFS_UPCALL
3220 try_mount_again:
3221 /* cleanup activities if we're chasing a referral */
3222 if (referral_walks_count) {
3223 if (tcon)
3224 cifs_put_tcon(tcon);
3225 else if (pSesInfo)
3226 cifs_put_smb_ses(pSesInfo);
3228 FreeXid(xid);
3230 #endif
3231 tcon = NULL;
3232 pSesInfo = NULL;
3233 srvTcp = NULL;
3234 full_path = NULL;
3235 tlink = NULL;
3237 xid = GetXid();
3239 /* get a reference to a tcp session */
3240 srvTcp = cifs_get_tcp_session(volume_info);
3241 if (IS_ERR(srvTcp)) {
3242 rc = PTR_ERR(srvTcp);
3243 bdi_destroy(&cifs_sb->bdi);
3244 goto out;
3247 /* get a reference to a SMB session */
3248 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
3249 if (IS_ERR(pSesInfo)) {
3250 rc = PTR_ERR(pSesInfo);
3251 pSesInfo = NULL;
3252 goto mount_fail_check;
3255 /* search for existing tcon to this server share */
3256 tcon = cifs_get_tcon(pSesInfo, volume_info);
3257 if (IS_ERR(tcon)) {
3258 rc = PTR_ERR(tcon);
3259 tcon = NULL;
3260 goto remote_path_check;
3263 /* tell server which Unix caps we support */
3264 if (tcon->ses->capabilities & CAP_UNIX) {
3265 /* reset of caps checks mount to see if unix extensions
3266 disabled for just this mount */
3267 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3268 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3269 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3270 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3271 rc = -EACCES;
3272 goto mount_fail_check;
3274 } else
3275 tcon->unix_ext = 0; /* server does not support them */
3277 /* do not care if following two calls succeed - informational */
3278 if (!tcon->ipc) {
3279 CIFSSMBQFSDeviceInfo(xid, tcon);
3280 CIFSSMBQFSAttributeInfo(xid, tcon);
3283 cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3284 cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info);
3286 /* tune readahead according to rsize */
3287 cifs_sb->bdi.ra_pages = cifs_ra_pages(cifs_sb);
3289 remote_path_check:
3290 #ifdef CONFIG_CIFS_DFS_UPCALL
3292 * Perform an unconditional check for whether there are DFS
3293 * referrals for this path without prefix, to provide support
3294 * for DFS referrals from w2k8 servers which don't seem to respond
3295 * with PATH_NOT_COVERED to requests that include the prefix.
3296 * Chase the referral if found, otherwise continue normally.
3298 if (referral_walks_count == 0) {
3299 int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
3300 cifs_sb, false);
3301 if (!refrc) {
3302 referral_walks_count++;
3303 goto try_mount_again;
3306 #endif
3308 /* check if a whole path is not remote */
3309 if (!rc && tcon) {
3310 /* build_path_to_root works only when we have a valid tcon */
3311 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3312 if (full_path == NULL) {
3313 rc = -ENOMEM;
3314 goto mount_fail_check;
3316 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
3317 if (rc != 0 && rc != -EREMOTE) {
3318 kfree(full_path);
3319 goto mount_fail_check;
3321 kfree(full_path);
3324 /* get referral if needed */
3325 if (rc == -EREMOTE) {
3326 #ifdef CONFIG_CIFS_DFS_UPCALL
3327 if (referral_walks_count > MAX_NESTED_LINKS) {
3329 * BB: when we implement proper loop detection,
3330 * we will remove this check. But now we need it
3331 * to prevent an indefinite loop if 'DFS tree' is
3332 * misconfigured (i.e. has loops).
3334 rc = -ELOOP;
3335 goto mount_fail_check;
3338 rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb,
3339 true);
3341 if (!rc) {
3342 referral_walks_count++;
3343 goto try_mount_again;
3345 goto mount_fail_check;
3346 #else /* No DFS support, return error on mount */
3347 rc = -EOPNOTSUPP;
3348 #endif
3351 if (rc)
3352 goto mount_fail_check;
3354 /* now, hang the tcon off of the superblock */
3355 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3356 if (tlink == NULL) {
3357 rc = -ENOMEM;
3358 goto mount_fail_check;
3361 tlink->tl_uid = pSesInfo->linux_uid;
3362 tlink->tl_tcon = tcon;
3363 tlink->tl_time = jiffies;
3364 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3365 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3367 cifs_sb->master_tlink = tlink;
3368 spin_lock(&cifs_sb->tlink_tree_lock);
3369 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3370 spin_unlock(&cifs_sb->tlink_tree_lock);
3372 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3373 TLINK_IDLE_EXPIRE);
3375 mount_fail_check:
3376 /* on error free sesinfo and tcon struct if needed */
3377 if (rc) {
3378 /* If find_unc succeeded then rc == 0 so we can not end */
3379 /* up accidentally freeing someone elses tcon struct */
3380 if (tcon)
3381 cifs_put_tcon(tcon);
3382 else if (pSesInfo)
3383 cifs_put_smb_ses(pSesInfo);
3384 else
3385 cifs_put_tcp_session(srvTcp);
3386 bdi_destroy(&cifs_sb->bdi);
3389 out:
3390 FreeXid(xid);
3391 return rc;
3395 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3396 * pointer may be NULL.
3399 CIFSTCon(unsigned int xid, struct cifs_ses *ses,
3400 const char *tree, struct cifs_tcon *tcon,
3401 const struct nls_table *nls_codepage)
3403 struct smb_hdr *smb_buffer;
3404 struct smb_hdr *smb_buffer_response;
3405 TCONX_REQ *pSMB;
3406 TCONX_RSP *pSMBr;
3407 unsigned char *bcc_ptr;
3408 int rc = 0;
3409 int length;
3410 __u16 bytes_left, count;
3412 if (ses == NULL)
3413 return -EIO;
3415 smb_buffer = cifs_buf_get();
3416 if (smb_buffer == NULL)
3417 return -ENOMEM;
3419 smb_buffer_response = smb_buffer;
3421 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3422 NULL /*no tid */ , 4 /*wct */ );
3424 smb_buffer->Mid = GetNextMid(ses->server);
3425 smb_buffer->Uid = ses->Suid;
3426 pSMB = (TCONX_REQ *) smb_buffer;
3427 pSMBr = (TCONX_RSP *) smb_buffer_response;
3429 pSMB->AndXCommand = 0xFF;
3430 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3431 bcc_ptr = &pSMB->Password[0];
3432 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3433 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3434 *bcc_ptr = 0; /* password is null byte */
3435 bcc_ptr++; /* skip password */
3436 /* already aligned so no need to do it below */
3437 } else {
3438 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3439 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3440 specified as required (when that support is added to
3441 the vfs in the future) as only NTLM or the much
3442 weaker LANMAN (which we do not send by default) is accepted
3443 by Samba (not sure whether other servers allow
3444 NTLMv2 password here) */
3445 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3446 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3447 (ses->server->secType == LANMAN))
3448 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3449 ses->server->sec_mode &
3450 SECMODE_PW_ENCRYPT ? true : false,
3451 bcc_ptr);
3452 else
3453 #endif /* CIFS_WEAK_PW_HASH */
3454 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3455 bcc_ptr);
3457 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3458 if (ses->capabilities & CAP_UNICODE) {
3459 /* must align unicode strings */
3460 *bcc_ptr = 0; /* null byte password */
3461 bcc_ptr++;
3465 if (ses->server->sec_mode &
3466 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3467 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3469 if (ses->capabilities & CAP_STATUS32) {
3470 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3472 if (ses->capabilities & CAP_DFS) {
3473 smb_buffer->Flags2 |= SMBFLG2_DFS;
3475 if (ses->capabilities & CAP_UNICODE) {
3476 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3477 length =
3478 cifs_strtoUCS((__le16 *) bcc_ptr, tree,
3479 6 /* max utf8 char length in bytes */ *
3480 (/* server len*/ + 256 /* share len */), nls_codepage);
3481 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3482 bcc_ptr += 2; /* skip trailing null */
3483 } else { /* ASCII */
3484 strcpy(bcc_ptr, tree);
3485 bcc_ptr += strlen(tree) + 1;
3487 strcpy(bcc_ptr, "?????");
3488 bcc_ptr += strlen("?????");
3489 bcc_ptr += 1;
3490 count = bcc_ptr - &pSMB->Password[0];
3491 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3492 pSMB->hdr.smb_buf_length) + count);
3493 pSMB->ByteCount = cpu_to_le16(count);
3495 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3498 /* above now done in SendReceive */
3499 if ((rc == 0) && (tcon != NULL)) {
3500 bool is_unicode;
3502 tcon->tidStatus = CifsGood;
3503 tcon->need_reconnect = false;
3504 tcon->tid = smb_buffer_response->Tid;
3505 bcc_ptr = pByteArea(smb_buffer_response);
3506 bytes_left = get_bcc(smb_buffer_response);
3507 length = strnlen(bcc_ptr, bytes_left - 2);
3508 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3509 is_unicode = true;
3510 else
3511 is_unicode = false;
3514 /* skip service field (NB: this field is always ASCII) */
3515 if (length == 3) {
3516 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3517 (bcc_ptr[2] == 'C')) {
3518 cFYI(1, "IPC connection");
3519 tcon->ipc = 1;
3521 } else if (length == 2) {
3522 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3523 /* the most common case */
3524 cFYI(1, "disk share connection");
3527 bcc_ptr += length + 1;
3528 bytes_left -= (length + 1);
3529 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3531 /* mostly informational -- no need to fail on error here */
3532 kfree(tcon->nativeFileSystem);
3533 tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
3534 bytes_left, is_unicode,
3535 nls_codepage);
3537 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3539 if ((smb_buffer_response->WordCount == 3) ||
3540 (smb_buffer_response->WordCount == 7))
3541 /* field is in same location */
3542 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3543 else
3544 tcon->Flags = 0;
3545 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3546 } else if ((rc == 0) && tcon == NULL) {
3547 /* all we need to save for IPC$ connection */
3548 ses->ipc_tid = smb_buffer_response->Tid;
3551 cifs_buf_release(smb_buffer);
3552 return rc;
3555 void
3556 cifs_umount(struct cifs_sb_info *cifs_sb)
3558 struct rb_root *root = &cifs_sb->tlink_tree;
3559 struct rb_node *node;
3560 struct tcon_link *tlink;
3562 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3564 spin_lock(&cifs_sb->tlink_tree_lock);
3565 while ((node = rb_first(root))) {
3566 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3567 cifs_get_tlink(tlink);
3568 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3569 rb_erase(node, root);
3571 spin_unlock(&cifs_sb->tlink_tree_lock);
3572 cifs_put_tlink(tlink);
3573 spin_lock(&cifs_sb->tlink_tree_lock);
3575 spin_unlock(&cifs_sb->tlink_tree_lock);
3577 bdi_destroy(&cifs_sb->bdi);
3578 kfree(cifs_sb->mountdata);
3579 unload_nls(cifs_sb->local_nls);
3580 kfree(cifs_sb);
3583 int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses)
3585 int rc = 0;
3586 struct TCP_Server_Info *server = ses->server;
3588 /* only send once per connect */
3589 if (server->maxBuf != 0)
3590 return 0;
3592 rc = CIFSSMBNegotiate(xid, ses);
3593 if (rc == -EAGAIN) {
3594 /* retry only once on 1st time connection */
3595 rc = CIFSSMBNegotiate(xid, ses);
3596 if (rc == -EAGAIN)
3597 rc = -EHOSTDOWN;
3599 if (rc == 0) {
3600 spin_lock(&GlobalMid_Lock);
3601 if (server->tcpStatus == CifsNeedNegotiate)
3602 server->tcpStatus = CifsGood;
3603 else
3604 rc = -EHOSTDOWN;
3605 spin_unlock(&GlobalMid_Lock);
3609 return rc;
3613 int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
3614 struct nls_table *nls_info)
3616 int rc = 0;
3617 struct TCP_Server_Info *server = ses->server;
3619 ses->flags = 0;
3620 ses->capabilities = server->capabilities;
3621 if (linuxExtEnabled == 0)
3622 ses->capabilities &= (~CAP_UNIX);
3624 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3625 server->sec_mode, server->capabilities, server->timeAdj);
3627 rc = CIFS_SessSetup(xid, ses, nls_info);
3628 if (rc) {
3629 cERROR(1, "Send error in SessSetup = %d", rc);
3630 } else {
3631 mutex_lock(&ses->server->srv_mutex);
3632 if (!server->session_estab) {
3633 server->session_key.response = ses->auth_key.response;
3634 server->session_key.len = ses->auth_key.len;
3635 server->sequence_number = 0x2;
3636 server->session_estab = true;
3637 ses->auth_key.response = NULL;
3639 mutex_unlock(&server->srv_mutex);
3641 cFYI(1, "CIFS Session Established successfully");
3642 spin_lock(&GlobalMid_Lock);
3643 ses->status = CifsGood;
3644 ses->need_reconnect = false;
3645 spin_unlock(&GlobalMid_Lock);
3648 kfree(ses->auth_key.response);
3649 ses->auth_key.response = NULL;
3650 ses->auth_key.len = 0;
3651 kfree(ses->ntlmssp);
3652 ses->ntlmssp = NULL;
3654 return rc;
3657 static struct cifs_tcon *
3658 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
3660 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3661 struct cifs_ses *ses;
3662 struct cifs_tcon *tcon = NULL;
3663 struct smb_vol *vol_info;
3664 char username[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */
3665 /* We used to have this as MAX_USERNAME which is */
3666 /* way too big now (256 instead of 32) */
3668 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3669 if (vol_info == NULL) {
3670 tcon = ERR_PTR(-ENOMEM);
3671 goto out;
3674 snprintf(username, sizeof(username), "krb50x%x", fsuid);
3675 vol_info->username = username;
3676 vol_info->local_nls = cifs_sb->local_nls;
3677 vol_info->linux_uid = fsuid;
3678 vol_info->cred_uid = fsuid;
3679 vol_info->UNC = master_tcon->treeName;
3680 vol_info->retry = master_tcon->retry;
3681 vol_info->nocase = master_tcon->nocase;
3682 vol_info->local_lease = master_tcon->local_lease;
3683 vol_info->no_linux_ext = !master_tcon->unix_ext;
3685 /* FIXME: allow for other secFlg settings */
3686 vol_info->secFlg = CIFSSEC_MUST_KRB5;
3688 /* get a reference for the same TCP session */
3689 spin_lock(&cifs_tcp_ses_lock);
3690 ++master_tcon->ses->server->srv_count;
3691 spin_unlock(&cifs_tcp_ses_lock);
3693 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3694 if (IS_ERR(ses)) {
3695 tcon = (struct cifs_tcon *)ses;
3696 cifs_put_tcp_session(master_tcon->ses->server);
3697 goto out;
3700 tcon = cifs_get_tcon(ses, vol_info);
3701 if (IS_ERR(tcon)) {
3702 cifs_put_smb_ses(ses);
3703 goto out;
3706 if (ses->capabilities & CAP_UNIX)
3707 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3708 out:
3709 kfree(vol_info);
3711 return tcon;
3714 struct cifs_tcon *
3715 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3717 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3720 static int
3721 cifs_sb_tcon_pending_wait(void *unused)
3723 schedule();
3724 return signal_pending(current) ? -ERESTARTSYS : 0;
3727 /* find and return a tlink with given uid */
3728 static struct tcon_link *
3729 tlink_rb_search(struct rb_root *root, uid_t uid)
3731 struct rb_node *node = root->rb_node;
3732 struct tcon_link *tlink;
3734 while (node) {
3735 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3737 if (tlink->tl_uid > uid)
3738 node = node->rb_left;
3739 else if (tlink->tl_uid < uid)
3740 node = node->rb_right;
3741 else
3742 return tlink;
3744 return NULL;
3747 /* insert a tcon_link into the tree */
3748 static void
3749 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3751 struct rb_node **new = &(root->rb_node), *parent = NULL;
3752 struct tcon_link *tlink;
3754 while (*new) {
3755 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3756 parent = *new;
3758 if (tlink->tl_uid > new_tlink->tl_uid)
3759 new = &((*new)->rb_left);
3760 else
3761 new = &((*new)->rb_right);
3764 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3765 rb_insert_color(&new_tlink->tl_rbnode, root);
3769 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3770 * current task.
3772 * If the superblock doesn't refer to a multiuser mount, then just return
3773 * the master tcon for the mount.
3775 * First, search the rbtree for an existing tcon for this fsuid. If one
3776 * exists, then check to see if it's pending construction. If it is then wait
3777 * for construction to complete. Once it's no longer pending, check to see if
3778 * it failed and either return an error or retry construction, depending on
3779 * the timeout.
3781 * If one doesn't exist then insert a new tcon_link struct into the tree and
3782 * try to construct a new one.
3784 struct tcon_link *
3785 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3787 int ret;
3788 uid_t fsuid = current_fsuid();
3789 struct tcon_link *tlink, *newtlink;
3791 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3792 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3794 spin_lock(&cifs_sb->tlink_tree_lock);
3795 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3796 if (tlink)
3797 cifs_get_tlink(tlink);
3798 spin_unlock(&cifs_sb->tlink_tree_lock);
3800 if (tlink == NULL) {
3801 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3802 if (newtlink == NULL)
3803 return ERR_PTR(-ENOMEM);
3804 newtlink->tl_uid = fsuid;
3805 newtlink->tl_tcon = ERR_PTR(-EACCES);
3806 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3807 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3808 cifs_get_tlink(newtlink);
3810 spin_lock(&cifs_sb->tlink_tree_lock);
3811 /* was one inserted after previous search? */
3812 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3813 if (tlink) {
3814 cifs_get_tlink(tlink);
3815 spin_unlock(&cifs_sb->tlink_tree_lock);
3816 kfree(newtlink);
3817 goto wait_for_construction;
3819 tlink = newtlink;
3820 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3821 spin_unlock(&cifs_sb->tlink_tree_lock);
3822 } else {
3823 wait_for_construction:
3824 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
3825 cifs_sb_tcon_pending_wait,
3826 TASK_INTERRUPTIBLE);
3827 if (ret) {
3828 cifs_put_tlink(tlink);
3829 return ERR_PTR(ret);
3832 /* if it's good, return it */
3833 if (!IS_ERR(tlink->tl_tcon))
3834 return tlink;
3836 /* return error if we tried this already recently */
3837 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
3838 cifs_put_tlink(tlink);
3839 return ERR_PTR(-EACCES);
3842 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
3843 goto wait_for_construction;
3846 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
3847 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
3848 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
3850 if (IS_ERR(tlink->tl_tcon)) {
3851 cifs_put_tlink(tlink);
3852 return ERR_PTR(-EACCES);
3855 return tlink;
3859 * periodic workqueue job that scans tcon_tree for a superblock and closes
3860 * out tcons.
3862 static void
3863 cifs_prune_tlinks(struct work_struct *work)
3865 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
3866 prune_tlinks.work);
3867 struct rb_root *root = &cifs_sb->tlink_tree;
3868 struct rb_node *node = rb_first(root);
3869 struct rb_node *tmp;
3870 struct tcon_link *tlink;
3873 * Because we drop the spinlock in the loop in order to put the tlink
3874 * it's not guarded against removal of links from the tree. The only
3875 * places that remove entries from the tree are this function and
3876 * umounts. Because this function is non-reentrant and is canceled
3877 * before umount can proceed, this is safe.
3879 spin_lock(&cifs_sb->tlink_tree_lock);
3880 node = rb_first(root);
3881 while (node != NULL) {
3882 tmp = node;
3883 node = rb_next(tmp);
3884 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
3886 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
3887 atomic_read(&tlink->tl_count) != 0 ||
3888 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
3889 continue;
3891 cifs_get_tlink(tlink);
3892 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3893 rb_erase(tmp, root);
3895 spin_unlock(&cifs_sb->tlink_tree_lock);
3896 cifs_put_tlink(tlink);
3897 spin_lock(&cifs_sb->tlink_tree_lock);
3899 spin_unlock(&cifs_sb->tlink_tree_lock);
3901 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3902 TLINK_IDLE_EXPIRE);