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
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>
43 #include "cifsproto.h"
44 #include "cifs_unicode.h"
45 #include "cifs_debug.h"
46 #include "cifs_fs_sb.h"
49 #include "rfc1002pdu.h"
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,
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)
80 cifs_reconnect(struct TCP_Server_Info *server)
83 struct list_head *tmp, *tmp2;
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);
96 server->tcpStatus = CifsNeedReconnect;
97 spin_unlock(&GlobalMid_Lock);
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;
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);
160 /* we should try only the port we connected to before */
161 rc = generic_ip_connect(server);
163 cFYI(1, "reconnect error %d", rc);
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);
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;
188 __u16 total_data_size, data_in_this_rsp;
190 if (pSMB->Command != SMB_COM_TRANSACTION2)
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");
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)
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);
213 remaining = total_data_size - data_in_this_rsp;
215 cFYI(1, "missing %d bytes from transact2, check next response",
217 if (total_data_size > CIFSMaxBufSize) {
218 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
219 total_data_size, CIFSMaxBufSize);
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;
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;
248 if (remaining == 0) /* nothing to do, ignore */
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)
271 put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount);
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)
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)
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 */
298 cifs_echo_request(struct work_struct *work)
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))
313 rc = CIFSSMBEcho(server);
315 cFYI(1, "Unable to send echo request to server: %s",
319 queue_delayed_work(system_nrt_wq, &server->echo, SMB_ECHO_INTERVAL);
323 allocate_buffers(char **bigbuf, char **smallbuf, unsigned int size,
326 char *bbuf = *bigbuf, *sbuf = *smallbuf;
329 bbuf = (char *)cifs_buf_get();
331 cERROR(1, "No memory for large SMB response");
333 /* retry will check if exiting */
336 } else if (is_large_buf) {
337 /* we are reusing a dirty large buf, clear its start */
338 memset(bbuf, 0, size);
342 sbuf = (char *)cifs_small_buf_get();
344 cERROR(1, "No memory for SMB response");
346 /* retry will check if exiting */
349 /* beginning of smb buffer is cleared in our buf_get */
351 /* if existing small buf clear beginning */
352 memset(sbuf, 0, size);
362 server_unresponsive(struct TCP_Server_Info *server)
364 if (echo_retries > 0 && server->tcpStatus == CifsGood &&
365 time_after(jiffies, server->lstrp +
366 (echo_retries * SMB_ECHO_INTERVAL))) {
367 cERROR(1, "Server %s has not responded in %d seconds. "
368 "Reconnecting...", server->hostname,
369 (echo_retries * SMB_ECHO_INTERVAL / HZ));
370 cifs_reconnect(server);
371 wake_up(&server->response_q);
379 * kvec_array_init - clone a kvec array, and advance into it
380 * @new: pointer to memory for cloned array
381 * @iov: pointer to original array
382 * @nr_segs: number of members in original array
383 * @bytes: number of bytes to advance into the cloned array
385 * This function will copy the array provided in iov to a section of memory
386 * and advance the specified number of bytes into the new array. It returns
387 * the number of segments in the new array. "new" must be at least as big as
388 * the original iov array.
391 kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
396 while (bytes || !iov->iov_len) {
397 int copy = min(bytes, iov->iov_len);
401 if (iov->iov_len == base) {
407 memcpy(new, iov, sizeof(*iov) * nr_segs);
408 new->iov_base += base;
409 new->iov_len -= base;
414 get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
416 struct kvec *new_iov;
418 if (server->iov && nr_segs <= server->nr_iov)
421 /* not big enough -- allocate a new one and release the old */
422 new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
425 server->iov = new_iov;
426 server->nr_iov = nr_segs;
432 readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
433 unsigned int nr_segs, unsigned int to_read)
438 struct msghdr smb_msg;
441 iov = get_server_iovec(server, nr_segs);
445 smb_msg.msg_control = NULL;
446 smb_msg.msg_controllen = 0;
448 for (total_read = 0; to_read; total_read += length, to_read -= length) {
449 if (server_unresponsive(server)) {
450 total_read = -EAGAIN;
454 segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
456 length = kernel_recvmsg(server->ssocket, &smb_msg,
457 iov, segs, to_read, 0);
459 if (server->tcpStatus == CifsExiting) {
460 total_read = -ESHUTDOWN;
462 } else if (server->tcpStatus == CifsNeedReconnect) {
463 cifs_reconnect(server);
464 total_read = -EAGAIN;
466 } else if (length == -ERESTARTSYS ||
470 * Minimum sleep to prevent looping, allowing socket
471 * to clear and app threads to set tcpStatus
472 * CifsNeedReconnect if server hung.
474 usleep_range(1000, 2000);
477 } else if (length <= 0) {
478 cFYI(1, "Received no data or error: expecting %d "
479 "got %d", to_read, length);
480 cifs_reconnect(server);
481 total_read = -EAGAIN;
489 read_from_socket(struct TCP_Server_Info *server, char *buf,
490 unsigned int to_read)
495 iov.iov_len = to_read;
497 return readv_from_socket(server, &iov, 1, to_read);
501 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
504 * The first byte big endian of the length field,
505 * is actually not part of the length but the type
506 * with the most common, zero, as regular data.
509 case RFC1002_SESSION_MESSAGE:
510 /* Regular SMB response */
512 case RFC1002_SESSION_KEEP_ALIVE:
513 cFYI(1, "RFC 1002 session keep alive");
515 case RFC1002_POSITIVE_SESSION_RESPONSE:
516 cFYI(1, "RFC 1002 positive session response");
518 case RFC1002_NEGATIVE_SESSION_RESPONSE:
520 * We get this from Windows 98 instead of an error on
521 * SMB negprot response.
523 cFYI(1, "RFC 1002 negative session response");
524 /* give server a second to clean up */
527 * Always try 445 first on reconnect since we get NACK
528 * on some if we ever connected to port 139 (the NACK
529 * is since we do not begin with RFC1001 session
532 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
533 cifs_reconnect(server);
534 wake_up(&server->response_q);
537 cERROR(1, "RFC 1002 unknown response type 0x%x", type);
538 cifs_reconnect(server);
544 static struct mid_q_entry *
545 find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
546 int *length, bool is_large_buf, bool *is_multi_rsp, char **bigbuf)
548 struct mid_q_entry *mid = NULL, *tmp_mid, *ret = NULL;
550 spin_lock(&GlobalMid_Lock);
551 list_for_each_entry_safe(mid, tmp_mid, &server->pending_mid_q, qhead) {
552 if (mid->mid != buf->Mid ||
553 mid->midState != MID_REQUEST_SUBMITTED ||
554 mid->command != buf->Command)
557 if (*length == 0 && check2ndT2(buf) > 0) {
558 /* We have a multipart transact2 resp */
559 *is_multi_rsp = true;
561 /* merge response - fix up 1st*/
562 *length = coalesce_t2(buf, mid->resp_buf);
565 mid->multiRsp = true;
568 /* All parts received or packet is malformed. */
569 mid->multiEnd = true;
573 /*FIXME: switch to already allocated largebuf?*/
574 cERROR(1, "1st trans2 resp needs bigbuf");
576 /* Have first buffer */
578 mid->largeBuf = true;
584 mid->largeBuf = is_large_buf;
587 mid->midState = MID_RESPONSE_RECEIVED;
589 mid->midState = MID_RESPONSE_MALFORMED;
590 #ifdef CONFIG_CIFS_STATS2
591 mid->when_received = jiffies;
593 list_del_init(&mid->qhead);
597 spin_unlock(&GlobalMid_Lock);
602 static void clean_demultiplex_info(struct TCP_Server_Info *server)
606 /* take it off the list, if it's not already */
607 spin_lock(&cifs_tcp_ses_lock);
608 list_del_init(&server->tcp_ses_list);
609 spin_unlock(&cifs_tcp_ses_lock);
611 spin_lock(&GlobalMid_Lock);
612 server->tcpStatus = CifsExiting;
613 spin_unlock(&GlobalMid_Lock);
614 wake_up_all(&server->response_q);
617 * Check if we have blocked requests that need to free. Note that
618 * cifs_max_pending is normally 50, but can be set at module install
619 * time to as little as two.
621 spin_lock(&GlobalMid_Lock);
622 if (atomic_read(&server->inFlight) >= cifs_max_pending)
623 atomic_set(&server->inFlight, cifs_max_pending - 1);
625 * We do not want to set the max_pending too low or we could end up
626 * with the counter going negative.
628 spin_unlock(&GlobalMid_Lock);
630 * Although there should not be any requests blocked on this queue it
631 * can not hurt to be paranoid and try to wake up requests that may
632 * haven been blocked when more than 50 at time were on the wire to the
633 * same server - they now will see the session is in exit state and get
634 * out of SendReceive.
636 wake_up_all(&server->request_q);
637 /* give those requests time to exit */
640 if (server->ssocket) {
641 sock_release(server->ssocket);
642 server->ssocket = NULL;
645 if (!list_empty(&server->pending_mid_q)) {
646 struct list_head dispose_list;
647 struct mid_q_entry *mid_entry;
648 struct list_head *tmp, *tmp2;
650 INIT_LIST_HEAD(&dispose_list);
651 spin_lock(&GlobalMid_Lock);
652 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
653 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
654 cFYI(1, "Clearing mid 0x%x", mid_entry->mid);
655 mid_entry->midState = MID_SHUTDOWN;
656 list_move(&mid_entry->qhead, &dispose_list);
658 spin_unlock(&GlobalMid_Lock);
660 /* now walk dispose list and issue callbacks */
661 list_for_each_safe(tmp, tmp2, &dispose_list) {
662 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
663 cFYI(1, "Callback mid 0x%x", mid_entry->mid);
664 list_del_init(&mid_entry->qhead);
665 mid_entry->callback(mid_entry);
667 /* 1/8th of sec is more than enough time for them to exit */
671 if (!list_empty(&server->pending_mid_q)) {
673 * mpx threads have not exited yet give them at least the smb
674 * send timeout time for long ops.
676 * Due to delays on oplock break requests, we need to wait at
677 * least 45 seconds before giving up on a request getting a
678 * response and going ahead and killing cifsd.
680 cFYI(1, "Wait for exit from demultiplex thread");
683 * If threads still have not exited they are probably never
684 * coming home not much else we can do but free the memory.
688 kfree(server->hostname);
692 length = atomic_dec_return(&tcpSesAllocCount);
694 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
699 cifs_demultiplex_thread(void *p)
702 struct TCP_Server_Info *server = p;
703 unsigned int pdu_length, total_read;
704 char *buf = NULL, *bigbuf = NULL, *smallbuf = NULL;
705 struct smb_hdr *smb_buffer = NULL;
706 struct task_struct *task_to_wake = NULL;
707 struct mid_q_entry *mid_entry;
708 bool isLargeBuf = false;
709 bool isMultiRsp = false;
711 current->flags |= PF_MEMALLOC;
712 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
714 length = atomic_inc_return(&tcpSesAllocCount);
716 mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
720 while (server->tcpStatus != CifsExiting) {
724 if (!allocate_buffers(&bigbuf, &smallbuf,
725 sizeof(struct smb_hdr), isLargeBuf))
730 smb_buffer = (struct smb_hdr *)smallbuf;
732 pdu_length = 4; /* enough to get RFC1001 header */
734 length = read_from_socket(server, buf, pdu_length);
740 * The right amount was read from socket - 4 bytes,
741 * so we can now interpret the length field.
743 pdu_length = be32_to_cpu(smb_buffer->smb_buf_length);
745 cFYI(1, "RFC1002 header 0x%x", pdu_length);
746 if (!is_smb_response(server, buf[0]))
749 /* check the length */
750 if ((pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) ||
751 (pdu_length < sizeof(struct smb_hdr) - 1 - 4)) {
752 cERROR(1, "Invalid size SMB length %d pdu_length %d",
754 cifs_reconnect(server);
755 wake_up(&server->response_q);
760 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
762 memcpy(bigbuf, smallbuf, 4);
763 smb_buffer = (struct smb_hdr *)bigbuf;
767 length = read_from_socket(server, buf + 4, pdu_length);
770 total_read += length;
772 dump_smb(smb_buffer, total_read);
775 * We know that we received enough to get to the MID as we
776 * checked the pdu_length earlier. Now check to see
777 * if the rest of the header is OK. We borrow the length
778 * var for the rest of the loop to avoid a new stack var.
780 * 48 bytes is enough to display the header and a little bit
781 * into the payload for debugging purposes.
783 length = checkSMB(smb_buffer, smb_buffer->Mid, total_read);
785 cifs_dump_mem("Bad SMB: ", buf,
786 min_t(unsigned int, total_read, 48));
788 server->lstrp = jiffies;
790 mid_entry = find_cifs_mid(server, smb_buffer, &length,
791 isLargeBuf, &isMultiRsp, &bigbuf);
792 if (mid_entry != NULL) {
793 mid_entry->callback(mid_entry);
794 /* Was previous buf put in mpx struct for multi-rsp? */
796 /* smb buffer will be freed by user thread */
802 } else if (length != 0) {
803 /* response sanity checks failed */
805 } else if (!is_valid_oplock_break(smb_buffer, server) &&
807 cERROR(1, "No task to wake, unknown frame received! "
808 "NumMids %d", atomic_read(&midCount));
809 cifs_dump_mem("Received Data is: ", buf,
810 sizeof(struct smb_hdr));
811 #ifdef CONFIG_CIFS_DEBUG2
812 cifs_dump_detail(smb_buffer);
813 cifs_dump_mids(server);
814 #endif /* CIFS_DEBUG2 */
817 } /* end while !EXITING */
819 /* buffer usually freed in free_mid - need to free it here on exit */
820 cifs_buf_release(bigbuf);
821 if (smallbuf) /* no sense logging a debug message if NULL */
822 cifs_small_buf_release(smallbuf);
824 task_to_wake = xchg(&server->tsk, NULL);
825 clean_demultiplex_info(server);
827 /* if server->tsk was NULL then wait for a signal before exiting */
829 set_current_state(TASK_INTERRUPTIBLE);
830 while (!signal_pending(current)) {
832 set_current_state(TASK_INTERRUPTIBLE);
834 set_current_state(TASK_RUNNING);
837 module_put_and_exit(0);
840 /* extract the host portion of the UNC string */
842 extract_hostname(const char *unc)
848 /* skip double chars at beginning of string */
849 /* BB: check validity of these bytes? */
852 /* delimiter between hostname and sharename is always '\\' now */
853 delim = strchr(src, '\\');
855 return ERR_PTR(-EINVAL);
858 dst = kmalloc((len + 1), GFP_KERNEL);
860 return ERR_PTR(-ENOMEM);
862 memcpy(dst, src, len);
869 cifs_parse_mount_options(const char *mountdata, const char *devname,
872 char *value, *data, *end;
873 char *mountdata_copy = NULL, *options;
875 unsigned int temp_len, i, j;
877 short int override_uid = -1;
878 short int override_gid = -1;
879 bool uid_specified = false;
880 bool gid_specified = false;
881 char *nodename = utsname()->nodename;
887 * does not have to be perfect mapping since field is
888 * informational, only used for servers that do not support
889 * port 445 and it can be overridden at mount time
891 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
892 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
893 vol->source_rfc1001_name[i] = toupper(nodename[i]);
895 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
896 /* null target name indicates to use *SMBSERVR default called name
897 if we end up sending RFC1001 session initialize */
898 vol->target_rfc1001_name[0] = 0;
899 vol->cred_uid = current_uid();
900 vol->linux_uid = current_uid();
901 vol->linux_gid = current_gid();
903 /* default to only allowing write access to owner of the mount */
904 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
906 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
907 /* default is always to request posix paths. */
908 vol->posix_paths = 1;
909 /* default to using server inode numbers where available */
912 vol->actimeo = CIFS_DEF_ACTIMEO;
915 goto cifs_parse_mount_err;
917 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
919 goto cifs_parse_mount_err;
921 options = mountdata_copy;
922 end = options + strlen(options);
923 if (strncmp(options, "sep=", 4) == 0) {
924 if (options[4] != 0) {
925 separator[0] = options[4];
928 cFYI(1, "Null separator not allowed");
931 vol->backupuid_specified = false; /* no backup intent for a user */
932 vol->backupgid_specified = false; /* no backup intent for a group */
934 while ((data = strsep(&options, separator)) != NULL) {
937 if ((value = strchr(data, '=')) != NULL)
940 /* Have to parse this before we parse for "user" */
941 if (strnicmp(data, "user_xattr", 10) == 0) {
943 } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
945 } else if (strnicmp(data, "user", 4) == 0) {
948 "CIFS: invalid or missing username\n");
949 goto cifs_parse_mount_err;
950 } else if (!*value) {
951 /* null user, ie anonymous, authentication */
954 if (strnlen(value, MAX_USERNAME_SIZE) <
956 vol->username = kstrdup(value, GFP_KERNEL);
957 if (!vol->username) {
958 printk(KERN_WARNING "CIFS: no memory "
960 goto cifs_parse_mount_err;
963 printk(KERN_WARNING "CIFS: username too long\n");
964 goto cifs_parse_mount_err;
966 } else if (strnicmp(data, "pass", 4) == 0) {
968 vol->password = NULL;
970 } else if (value[0] == 0) {
971 /* check if string begins with double comma
972 since that would mean the password really
973 does start with a comma, and would not
974 indicate an empty string */
975 if (value[1] != separator[0]) {
976 vol->password = NULL;
980 temp_len = strlen(value);
981 /* removed password length check, NTLM passwords
982 can be arbitrarily long */
984 /* if comma in password, the string will be
985 prematurely null terminated. Commas in password are
986 specified across the cifs mount interface by a double
987 comma ie ,, and a comma used as in other cases ie ','
988 as a parameter delimiter/separator is single and due
989 to the strsep above is temporarily zeroed. */
991 /* NB: password legally can have multiple commas and
992 the only illegal character in a password is null */
994 if ((value[temp_len] == 0) &&
995 (value + temp_len < end) &&
996 (value[temp_len+1] == separator[0])) {
998 value[temp_len] = separator[0];
999 temp_len += 2; /* move after second comma */
1000 while (value[temp_len] != 0) {
1001 if (value[temp_len] == separator[0]) {
1002 if (value[temp_len+1] ==
1004 /* skip second comma */
1007 /* single comma indicating start
1014 if (value[temp_len] == 0) {
1017 value[temp_len] = 0;
1018 /* point option to start of next parm */
1019 options = value + temp_len + 1;
1021 /* go from value to value + temp_len condensing
1022 double commas to singles. Note that this ends up
1023 allocating a few bytes too many, which is ok */
1024 vol->password = kzalloc(temp_len, GFP_KERNEL);
1025 if (vol->password == NULL) {
1026 printk(KERN_WARNING "CIFS: no memory "
1028 goto cifs_parse_mount_err;
1030 for (i = 0, j = 0; i < temp_len; i++, j++) {
1031 vol->password[j] = value[i];
1032 if (value[i] == separator[0]
1033 && value[i+1] == separator[0]) {
1034 /* skip second comma */
1038 vol->password[j] = 0;
1040 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1041 if (vol->password == NULL) {
1042 printk(KERN_WARNING "CIFS: no memory "
1044 goto cifs_parse_mount_err;
1046 strcpy(vol->password, value);
1048 } else if (!strnicmp(data, "ip", 2) ||
1049 !strnicmp(data, "addr", 4)) {
1050 if (!value || !*value) {
1052 } else if (strnlen(value, INET6_ADDRSTRLEN) <
1054 vol->UNCip = kstrdup(value, GFP_KERNEL);
1056 printk(KERN_WARNING "CIFS: no memory "
1058 goto cifs_parse_mount_err;
1061 printk(KERN_WARNING "CIFS: ip address "
1063 goto cifs_parse_mount_err;
1065 } else if (strnicmp(data, "sec", 3) == 0) {
1066 if (!value || !*value) {
1067 cERROR(1, "no security value specified");
1069 } else if (strnicmp(value, "krb5i", 5) == 0) {
1070 vol->secFlg |= CIFSSEC_MAY_KRB5 |
1072 } else if (strnicmp(value, "krb5p", 5) == 0) {
1073 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
1074 CIFSSEC_MAY_KRB5; */
1075 cERROR(1, "Krb5 cifs privacy not supported");
1076 goto cifs_parse_mount_err;
1077 } else if (strnicmp(value, "krb5", 4) == 0) {
1078 vol->secFlg |= CIFSSEC_MAY_KRB5;
1079 } else if (strnicmp(value, "ntlmsspi", 8) == 0) {
1080 vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
1082 } else if (strnicmp(value, "ntlmssp", 7) == 0) {
1083 vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1084 } else if (strnicmp(value, "ntlmv2i", 7) == 0) {
1085 vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
1087 } else if (strnicmp(value, "ntlmv2", 6) == 0) {
1088 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1089 } else if (strnicmp(value, "ntlmi", 5) == 0) {
1090 vol->secFlg |= CIFSSEC_MAY_NTLM |
1092 } else if (strnicmp(value, "ntlm", 4) == 0) {
1093 /* ntlm is default so can be turned off too */
1094 vol->secFlg |= CIFSSEC_MAY_NTLM;
1095 } else if (strnicmp(value, "nontlm", 6) == 0) {
1096 /* BB is there a better way to do this? */
1097 vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1098 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1099 } else if (strnicmp(value, "lanman", 6) == 0) {
1100 vol->secFlg |= CIFSSEC_MAY_LANMAN;
1102 } else if (strnicmp(value, "none", 4) == 0) {
1105 cERROR(1, "bad security option: %s", value);
1106 goto cifs_parse_mount_err;
1108 } else if (strnicmp(data, "vers", 3) == 0) {
1109 if (!value || !*value) {
1110 cERROR(1, "no protocol version specified"
1111 " after vers= mount option");
1112 } else if ((strnicmp(value, "cifs", 4) == 0) ||
1113 (strnicmp(value, "1", 1) == 0)) {
1114 /* this is the default */
1117 } else if ((strnicmp(data, "unc", 3) == 0)
1118 || (strnicmp(data, "target", 6) == 0)
1119 || (strnicmp(data, "path", 4) == 0)) {
1120 if (!value || !*value) {
1121 printk(KERN_WARNING "CIFS: invalid path to "
1122 "network resource\n");
1123 goto cifs_parse_mount_err;
1125 if ((temp_len = strnlen(value, 300)) < 300) {
1126 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1127 if (vol->UNC == NULL)
1128 goto cifs_parse_mount_err;
1129 strcpy(vol->UNC, value);
1130 if (strncmp(vol->UNC, "//", 2) == 0) {
1133 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1135 "CIFS: UNC Path does not begin "
1136 "with // or \\\\ \n");
1137 goto cifs_parse_mount_err;
1140 printk(KERN_WARNING "CIFS: UNC name too long\n");
1141 goto cifs_parse_mount_err;
1143 } else if ((strnicmp(data, "domain", 3) == 0)
1144 || (strnicmp(data, "workgroup", 5) == 0)) {
1145 if (!value || !*value) {
1146 printk(KERN_WARNING "CIFS: invalid domain name\n");
1147 goto cifs_parse_mount_err;
1149 /* BB are there cases in which a comma can be valid in
1150 a domain name and need special handling? */
1151 if (strnlen(value, 256) < 256) {
1152 vol->domainname = kstrdup(value, GFP_KERNEL);
1153 if (!vol->domainname) {
1154 printk(KERN_WARNING "CIFS: no memory "
1155 "for domainname\n");
1156 goto cifs_parse_mount_err;
1158 cFYI(1, "Domain name set");
1160 printk(KERN_WARNING "CIFS: domain name too "
1162 goto cifs_parse_mount_err;
1164 } else if (strnicmp(data, "srcaddr", 7) == 0) {
1165 vol->srcaddr.ss_family = AF_UNSPEC;
1167 if (!value || !*value) {
1168 printk(KERN_WARNING "CIFS: srcaddr value"
1169 " not specified.\n");
1170 goto cifs_parse_mount_err;
1172 i = cifs_convert_address((struct sockaddr *)&vol->srcaddr,
1173 value, strlen(value));
1175 printk(KERN_WARNING "CIFS: Could not parse"
1178 goto cifs_parse_mount_err;
1180 } else if (strnicmp(data, "prefixpath", 10) == 0) {
1181 if (!value || !*value) {
1183 "CIFS: invalid path prefix\n");
1184 goto cifs_parse_mount_err;
1186 if ((temp_len = strnlen(value, 1024)) < 1024) {
1187 if (value[0] != '/')
1188 temp_len++; /* missing leading slash */
1189 vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1190 if (vol->prepath == NULL)
1191 goto cifs_parse_mount_err;
1192 if (value[0] != '/') {
1193 vol->prepath[0] = '/';
1194 strcpy(vol->prepath+1, value);
1196 strcpy(vol->prepath, value);
1197 cFYI(1, "prefix path %s", vol->prepath);
1199 printk(KERN_WARNING "CIFS: prefix too long\n");
1200 goto cifs_parse_mount_err;
1202 } else if (strnicmp(data, "iocharset", 9) == 0) {
1203 if (!value || !*value) {
1204 printk(KERN_WARNING "CIFS: invalid iocharset "
1206 goto cifs_parse_mount_err;
1208 if (strnlen(value, 65) < 65) {
1209 if (strnicmp(value, "default", 7)) {
1210 vol->iocharset = kstrdup(value,
1213 if (!vol->iocharset) {
1214 printk(KERN_WARNING "CIFS: no "
1217 goto cifs_parse_mount_err;
1220 /* if iocharset not set then load_nls_default
1221 is used by caller */
1222 cFYI(1, "iocharset set to %s", value);
1224 printk(KERN_WARNING "CIFS: iocharset name "
1226 goto cifs_parse_mount_err;
1228 } else if (!strnicmp(data, "uid", 3) && value && *value) {
1229 vol->linux_uid = simple_strtoul(value, &value, 0);
1230 uid_specified = true;
1231 } else if (!strnicmp(data, "cruid", 5) && value && *value) {
1232 vol->cred_uid = simple_strtoul(value, &value, 0);
1233 } else if (!strnicmp(data, "forceuid", 8)) {
1235 } else if (!strnicmp(data, "noforceuid", 10)) {
1237 } else if (!strnicmp(data, "gid", 3) && value && *value) {
1238 vol->linux_gid = simple_strtoul(value, &value, 0);
1239 gid_specified = true;
1240 } else if (!strnicmp(data, "forcegid", 8)) {
1242 } else if (!strnicmp(data, "noforcegid", 10)) {
1244 } else if (strnicmp(data, "file_mode", 4) == 0) {
1245 if (value && *value) {
1247 simple_strtoul(value, &value, 0);
1249 } else if (strnicmp(data, "dir_mode", 4) == 0) {
1250 if (value && *value) {
1252 simple_strtoul(value, &value, 0);
1254 } else if (strnicmp(data, "dirmode", 4) == 0) {
1255 if (value && *value) {
1257 simple_strtoul(value, &value, 0);
1259 } else if (strnicmp(data, "port", 4) == 0) {
1260 if (value && *value) {
1262 simple_strtoul(value, &value, 0);
1264 } else if (strnicmp(data, "rsize", 5) == 0) {
1265 if (value && *value) {
1267 simple_strtoul(value, &value, 0);
1269 } else if (strnicmp(data, "wsize", 5) == 0) {
1270 if (value && *value) {
1272 simple_strtoul(value, &value, 0);
1274 } else if (strnicmp(data, "sockopt", 5) == 0) {
1275 if (!value || !*value) {
1276 cERROR(1, "no socket option specified");
1278 } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1279 vol->sockopt_tcp_nodelay = 1;
1281 } else if (strnicmp(data, "netbiosname", 4) == 0) {
1282 if (!value || !*value || (*value == ' ')) {
1283 cFYI(1, "invalid (empty) netbiosname");
1285 memset(vol->source_rfc1001_name, 0x20,
1288 * FIXME: are there cases in which a comma can
1289 * be valid in workstation netbios name (and
1290 * need special handling)?
1292 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1293 /* don't ucase netbiosname for user */
1296 vol->source_rfc1001_name[i] = value[i];
1298 /* The string has 16th byte zero still from
1299 set at top of the function */
1300 if (i == RFC1001_NAME_LEN && value[i] != 0)
1301 printk(KERN_WARNING "CIFS: netbiosname"
1302 " longer than 15 truncated.\n");
1304 } else if (strnicmp(data, "servern", 7) == 0) {
1305 /* servernetbiosname specified override *SMBSERVER */
1306 if (!value || !*value || (*value == ' ')) {
1307 cFYI(1, "empty server netbiosname specified");
1309 /* last byte, type, is 0x20 for servr type */
1310 memset(vol->target_rfc1001_name, 0x20,
1311 RFC1001_NAME_LEN_WITH_NULL);
1313 for (i = 0; i < 15; i++) {
1314 /* BB are there cases in which a comma can be
1315 valid in this workstation netbios name
1316 (and need special handling)? */
1318 /* user or mount helper must uppercase
1323 vol->target_rfc1001_name[i] =
1326 /* The string has 16th byte zero still from
1327 set at top of the function */
1328 if (i == RFC1001_NAME_LEN && value[i] != 0)
1329 printk(KERN_WARNING "CIFS: server net"
1330 "biosname longer than 15 truncated.\n");
1332 } else if (strnicmp(data, "actimeo", 7) == 0) {
1333 if (value && *value) {
1334 vol->actimeo = HZ * simple_strtoul(value,
1336 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1337 cERROR(1, "CIFS: attribute cache"
1338 "timeout too large");
1339 goto cifs_parse_mount_err;
1342 } else if (strnicmp(data, "credentials", 4) == 0) {
1344 } else if (strnicmp(data, "version", 3) == 0) {
1346 } else if (strnicmp(data, "guest", 5) == 0) {
1348 } else if (strnicmp(data, "rw", 2) == 0 && strlen(data) == 2) {
1350 } else if (strnicmp(data, "ro", 2) == 0) {
1352 } else if (strnicmp(data, "noblocksend", 11) == 0) {
1353 vol->noblocksnd = 1;
1354 } else if (strnicmp(data, "noautotune", 10) == 0) {
1355 vol->noautotune = 1;
1356 } else if ((strnicmp(data, "suid", 4) == 0) ||
1357 (strnicmp(data, "nosuid", 6) == 0) ||
1358 (strnicmp(data, "exec", 4) == 0) ||
1359 (strnicmp(data, "noexec", 6) == 0) ||
1360 (strnicmp(data, "nodev", 5) == 0) ||
1361 (strnicmp(data, "noauto", 6) == 0) ||
1362 (strnicmp(data, "dev", 3) == 0)) {
1363 /* The mount tool or mount.cifs helper (if present)
1364 uses these opts to set flags, and the flags are read
1365 by the kernel vfs layer before we get here (ie
1366 before read super) so there is no point trying to
1367 parse these options again and set anything and it
1368 is ok to just ignore them */
1370 } else if (strnicmp(data, "hard", 4) == 0) {
1372 } else if (strnicmp(data, "soft", 4) == 0) {
1374 } else if (strnicmp(data, "perm", 4) == 0) {
1376 } else if (strnicmp(data, "noperm", 6) == 0) {
1378 } else if (strnicmp(data, "mapchars", 8) == 0) {
1380 } else if (strnicmp(data, "nomapchars", 10) == 0) {
1382 } else if (strnicmp(data, "sfu", 3) == 0) {
1384 } else if (strnicmp(data, "nosfu", 5) == 0) {
1386 } else if (strnicmp(data, "nodfs", 5) == 0) {
1388 } else if (strnicmp(data, "posixpaths", 10) == 0) {
1389 vol->posix_paths = 1;
1390 } else if (strnicmp(data, "noposixpaths", 12) == 0) {
1391 vol->posix_paths = 0;
1392 } else if (strnicmp(data, "nounix", 6) == 0) {
1393 vol->no_linux_ext = 1;
1394 } else if (strnicmp(data, "nolinux", 7) == 0) {
1395 vol->no_linux_ext = 1;
1396 } else if ((strnicmp(data, "nocase", 6) == 0) ||
1397 (strnicmp(data, "ignorecase", 10) == 0)) {
1399 } else if (strnicmp(data, "mand", 4) == 0) {
1401 } else if (strnicmp(data, "nomand", 6) == 0) {
1403 } else if (strnicmp(data, "_netdev", 7) == 0) {
1405 } else if (strnicmp(data, "brl", 3) == 0) {
1407 } else if ((strnicmp(data, "nobrl", 5) == 0) ||
1408 (strnicmp(data, "nolock", 6) == 0)) {
1410 /* turn off mandatory locking in mode
1411 if remote locking is turned off since the
1412 local vfs will do advisory */
1413 if (vol->file_mode ==
1414 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1415 vol->file_mode = S_IALLUGO;
1416 } else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1417 /* will take the shorter form "forcemand" as well */
1418 /* This mount option will force use of mandatory
1419 (DOS/Windows style) byte range locks, instead of
1420 using posix advisory byte range locks, even if the
1421 Unix extensions are available and posix locks would
1422 be supported otherwise. If Unix extensions are not
1423 negotiated this has no effect since mandatory locks
1424 would be used (mandatory locks is all that those
1425 those servers support) */
1427 } else if (strnicmp(data, "setuids", 7) == 0) {
1429 } else if (strnicmp(data, "nosetuids", 9) == 0) {
1431 } else if (strnicmp(data, "dynperm", 7) == 0) {
1432 vol->dynperm = true;
1433 } else if (strnicmp(data, "nodynperm", 9) == 0) {
1434 vol->dynperm = false;
1435 } else if (strnicmp(data, "nohard", 6) == 0) {
1437 } else if (strnicmp(data, "nosoft", 6) == 0) {
1439 } else if (strnicmp(data, "nointr", 6) == 0) {
1441 } else if (strnicmp(data, "intr", 4) == 0) {
1443 } else if (strnicmp(data, "nostrictsync", 12) == 0) {
1444 vol->nostrictsync = 1;
1445 } else if (strnicmp(data, "strictsync", 10) == 0) {
1446 vol->nostrictsync = 0;
1447 } else if (strnicmp(data, "serverino", 7) == 0) {
1448 vol->server_ino = 1;
1449 } else if (strnicmp(data, "noserverino", 9) == 0) {
1450 vol->server_ino = 0;
1451 } else if (strnicmp(data, "rwpidforward", 12) == 0) {
1452 vol->rwpidforward = 1;
1453 } else if (strnicmp(data, "cifsacl", 7) == 0) {
1455 } else if (strnicmp(data, "nocifsacl", 9) == 0) {
1457 } else if (strnicmp(data, "acl", 3) == 0) {
1458 vol->no_psx_acl = 0;
1459 } else if (strnicmp(data, "noacl", 5) == 0) {
1460 vol->no_psx_acl = 1;
1461 } else if (strnicmp(data, "locallease", 6) == 0) {
1462 vol->local_lease = 1;
1463 } else if (strnicmp(data, "sign", 4) == 0) {
1464 vol->secFlg |= CIFSSEC_MUST_SIGN;
1465 } else if (strnicmp(data, "seal", 4) == 0) {
1466 /* we do not do the following in secFlags because seal
1467 is a per tree connection (mount) not a per socket
1468 or per-smb connection option in the protocol */
1469 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1471 } else if (strnicmp(data, "direct", 6) == 0) {
1473 } else if (strnicmp(data, "forcedirectio", 13) == 0) {
1475 } else if (strnicmp(data, "strictcache", 11) == 0) {
1477 } else if (strnicmp(data, "noac", 4) == 0) {
1478 printk(KERN_WARNING "CIFS: Mount option noac not "
1479 "supported. Instead set "
1480 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1481 } else if (strnicmp(data, "fsc", 3) == 0) {
1482 #ifndef CONFIG_CIFS_FSCACHE
1483 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1484 "kernel config option set");
1485 goto cifs_parse_mount_err;
1488 } else if (strnicmp(data, "mfsymlinks", 10) == 0) {
1489 vol->mfsymlinks = true;
1490 } else if (strnicmp(data, "multiuser", 8) == 0) {
1491 vol->multiuser = true;
1492 } else if (!strnicmp(data, "backupuid", 9) && value && *value) {
1493 err = kstrtouint(value, 0, &vol->backupuid);
1495 cERROR(1, "%s: Invalid backupuid value",
1497 goto cifs_parse_mount_err;
1499 vol->backupuid_specified = true;
1500 } else if (!strnicmp(data, "backupgid", 9) && value && *value) {
1501 err = kstrtouint(value, 0, &vol->backupgid);
1503 cERROR(1, "%s: Invalid backupgid value",
1505 goto cifs_parse_mount_err;
1507 vol->backupgid_specified = true;
1509 printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1512 if (vol->UNC == NULL) {
1513 if (devname == NULL) {
1514 printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1516 goto cifs_parse_mount_err;
1518 if ((temp_len = strnlen(devname, 300)) < 300) {
1519 vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1520 if (vol->UNC == NULL)
1521 goto cifs_parse_mount_err;
1522 strcpy(vol->UNC, devname);
1523 if (strncmp(vol->UNC, "//", 2) == 0) {
1526 } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1527 printk(KERN_WARNING "CIFS: UNC Path does not "
1528 "begin with // or \\\\ \n");
1529 goto cifs_parse_mount_err;
1531 value = strpbrk(vol->UNC+2, "/\\");
1535 printk(KERN_WARNING "CIFS: UNC name too long\n");
1536 goto cifs_parse_mount_err;
1540 if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) {
1541 cERROR(1, "Multiuser mounts currently require krb5 "
1543 goto cifs_parse_mount_err;
1546 if (vol->UNCip == NULL)
1547 vol->UNCip = &vol->UNC[2];
1550 vol->override_uid = override_uid;
1551 else if (override_uid == 1)
1552 printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1553 "specified with no uid= option.\n");
1556 vol->override_gid = override_gid;
1557 else if (override_gid == 1)
1558 printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1559 "specified with no gid= option.\n");
1561 kfree(mountdata_copy);
1564 cifs_parse_mount_err:
1565 kfree(mountdata_copy);
1569 /** Returns true if srcaddr isn't specified and rhs isn't
1570 * specified, or if srcaddr is specified and
1571 * matches the IP address of the rhs argument.
1574 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1576 switch (srcaddr->sa_family) {
1578 return (rhs->sa_family == AF_UNSPEC);
1580 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1581 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1582 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1585 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1586 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1587 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1591 return false; /* don't expect to be here */
1596 * If no port is specified in addr structure, we try to match with 445 port
1597 * and if it fails - with 139 ports. It should be called only if address
1598 * families of server and addr are equal.
1601 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1603 __be16 port, *sport;
1605 switch (addr->sa_family) {
1607 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1608 port = ((struct sockaddr_in *) addr)->sin_port;
1611 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1612 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1620 port = htons(CIFS_PORT);
1624 port = htons(RFC1001_PORT);
1627 return port == *sport;
1631 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1632 struct sockaddr *srcaddr)
1634 switch (addr->sa_family) {
1636 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1637 struct sockaddr_in *srv_addr4 =
1638 (struct sockaddr_in *)&server->dstaddr;
1640 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1645 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1646 struct sockaddr_in6 *srv_addr6 =
1647 (struct sockaddr_in6 *)&server->dstaddr;
1649 if (!ipv6_addr_equal(&addr6->sin6_addr,
1650 &srv_addr6->sin6_addr))
1652 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1658 return false; /* don't expect to be here */
1661 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1668 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1670 unsigned int secFlags;
1672 if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1673 secFlags = vol->secFlg;
1675 secFlags = global_secflags | vol->secFlg;
1677 switch (server->secType) {
1679 if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1683 if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1687 if (!(secFlags & CIFSSEC_MAY_NTLM))
1691 if (!(secFlags & CIFSSEC_MAY_KRB5))
1695 if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1699 /* shouldn't happen */
1703 /* now check if signing mode is acceptable */
1704 if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1705 (server->sec_mode & SECMODE_SIGN_REQUIRED))
1707 else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1709 (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1715 static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
1716 struct smb_vol *vol)
1718 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1721 if (!match_address(server, addr,
1722 (struct sockaddr *)&vol->srcaddr))
1725 if (!match_port(server, addr))
1728 if (!match_security(server, vol))
1734 static struct TCP_Server_Info *
1735 cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1737 struct TCP_Server_Info *server;
1739 spin_lock(&cifs_tcp_ses_lock);
1740 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1741 if (!match_server(server, addr, vol))
1744 ++server->srv_count;
1745 spin_unlock(&cifs_tcp_ses_lock);
1746 cFYI(1, "Existing tcp session with server found");
1749 spin_unlock(&cifs_tcp_ses_lock);
1754 cifs_put_tcp_session(struct TCP_Server_Info *server)
1756 struct task_struct *task;
1758 spin_lock(&cifs_tcp_ses_lock);
1759 if (--server->srv_count > 0) {
1760 spin_unlock(&cifs_tcp_ses_lock);
1764 put_net(cifs_net_ns(server));
1766 list_del_init(&server->tcp_ses_list);
1767 spin_unlock(&cifs_tcp_ses_lock);
1769 cancel_delayed_work_sync(&server->echo);
1771 spin_lock(&GlobalMid_Lock);
1772 server->tcpStatus = CifsExiting;
1773 spin_unlock(&GlobalMid_Lock);
1775 cifs_crypto_shash_release(server);
1776 cifs_fscache_release_client_cookie(server);
1778 kfree(server->session_key.response);
1779 server->session_key.response = NULL;
1780 server->session_key.len = 0;
1782 task = xchg(&server->tsk, NULL);
1784 force_sig(SIGKILL, task);
1787 static struct TCP_Server_Info *
1788 cifs_get_tcp_session(struct smb_vol *volume_info)
1790 struct TCP_Server_Info *tcp_ses = NULL;
1791 struct sockaddr_storage addr;
1792 struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1793 struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1796 memset(&addr, 0, sizeof(struct sockaddr_storage));
1798 cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
1800 if (volume_info->UNCip && volume_info->UNC) {
1801 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1803 strlen(volume_info->UNCip),
1806 /* we failed translating address */
1810 } else if (volume_info->UNCip) {
1811 /* BB using ip addr as tcp_ses name to connect to the
1813 cERROR(1, "Connecting to DFS root not implemented yet");
1816 } else /* which tcp_sess DFS root would we conect to */ {
1817 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1818 "unc=//192.168.1.100/public) specified");
1823 /* see if we already have a matching tcp_ses */
1824 tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
1828 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1834 rc = cifs_crypto_shash_allocate(tcp_ses);
1836 cERROR(1, "could not setup hash structures rc %d", rc);
1840 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1841 tcp_ses->hostname = extract_hostname(volume_info->UNC);
1842 if (IS_ERR(tcp_ses->hostname)) {
1843 rc = PTR_ERR(tcp_ses->hostname);
1844 goto out_err_crypto_release;
1847 tcp_ses->noblocksnd = volume_info->noblocksnd;
1848 tcp_ses->noautotune = volume_info->noautotune;
1849 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
1850 atomic_set(&tcp_ses->inFlight, 0);
1851 init_waitqueue_head(&tcp_ses->response_q);
1852 init_waitqueue_head(&tcp_ses->request_q);
1853 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1854 mutex_init(&tcp_ses->srv_mutex);
1855 memcpy(tcp_ses->workstation_RFC1001_name,
1856 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1857 memcpy(tcp_ses->server_RFC1001_name,
1858 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1859 tcp_ses->session_estab = false;
1860 tcp_ses->sequence_number = 0;
1861 tcp_ses->lstrp = jiffies;
1862 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1863 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1864 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1867 * at this point we are the only ones with the pointer
1868 * to the struct since the kernel thread not created yet
1869 * no need to spinlock this init of tcpStatus or srv_count
1871 tcp_ses->tcpStatus = CifsNew;
1872 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
1873 sizeof(tcp_ses->srcaddr));
1874 ++tcp_ses->srv_count;
1876 if (addr.ss_family == AF_INET6) {
1877 cFYI(1, "attempting ipv6 connect");
1878 /* BB should we allow ipv6 on port 139? */
1879 /* other OS never observed in Wild doing 139 with v6 */
1880 memcpy(&tcp_ses->dstaddr, sin_server6,
1881 sizeof(struct sockaddr_in6));
1883 memcpy(&tcp_ses->dstaddr, sin_server,
1884 sizeof(struct sockaddr_in));
1886 rc = ip_connect(tcp_ses);
1888 cERROR(1, "Error connecting to socket. Aborting operation");
1889 goto out_err_crypto_release;
1893 * since we're in a cifs function already, we know that
1894 * this will succeed. No need for try_module_get().
1896 __module_get(THIS_MODULE);
1897 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1899 if (IS_ERR(tcp_ses->tsk)) {
1900 rc = PTR_ERR(tcp_ses->tsk);
1901 cERROR(1, "error %d create cifsd thread", rc);
1902 module_put(THIS_MODULE);
1903 goto out_err_crypto_release;
1905 tcp_ses->tcpStatus = CifsNeedNegotiate;
1907 /* thread spawned, put it on the list */
1908 spin_lock(&cifs_tcp_ses_lock);
1909 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1910 spin_unlock(&cifs_tcp_ses_lock);
1912 cifs_fscache_get_client_cookie(tcp_ses);
1914 /* queue echo request delayed work */
1915 queue_delayed_work(system_nrt_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
1919 out_err_crypto_release:
1920 cifs_crypto_shash_release(tcp_ses);
1922 put_net(cifs_net_ns(tcp_ses));
1926 if (!IS_ERR(tcp_ses->hostname))
1927 kfree(tcp_ses->hostname);
1928 if (tcp_ses->ssocket)
1929 sock_release(tcp_ses->ssocket);
1935 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
1937 switch (ses->server->secType) {
1939 if (vol->cred_uid != ses->cred_uid)
1943 /* anything else takes username/password */
1944 if (ses->user_name == NULL)
1946 if (strncmp(ses->user_name, vol->username,
1949 if (strlen(vol->username) != 0 &&
1950 ses->password != NULL &&
1951 strncmp(ses->password,
1952 vol->password ? vol->password : "",
1959 static struct cifs_ses *
1960 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
1962 struct cifs_ses *ses;
1964 spin_lock(&cifs_tcp_ses_lock);
1965 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1966 if (!match_session(ses, vol))
1969 spin_unlock(&cifs_tcp_ses_lock);
1972 spin_unlock(&cifs_tcp_ses_lock);
1977 cifs_put_smb_ses(struct cifs_ses *ses)
1980 struct TCP_Server_Info *server = ses->server;
1982 cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
1983 spin_lock(&cifs_tcp_ses_lock);
1984 if (--ses->ses_count > 0) {
1985 spin_unlock(&cifs_tcp_ses_lock);
1989 list_del_init(&ses->smb_ses_list);
1990 spin_unlock(&cifs_tcp_ses_lock);
1992 if (ses->status == CifsGood) {
1994 CIFSSMBLogoff(xid, ses);
1998 cifs_put_tcp_session(server);
2001 static bool warned_on_ntlm; /* globals init to false automatically */
2003 static struct cifs_ses *
2004 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2006 int rc = -ENOMEM, xid;
2007 struct cifs_ses *ses;
2008 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2009 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2013 ses = cifs_find_smb_ses(server, volume_info);
2015 cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2017 mutex_lock(&ses->session_mutex);
2018 rc = cifs_negotiate_protocol(xid, ses);
2020 mutex_unlock(&ses->session_mutex);
2021 /* problem -- put our ses reference */
2022 cifs_put_smb_ses(ses);
2026 if (ses->need_reconnect) {
2027 cFYI(1, "Session needs reconnect");
2028 rc = cifs_setup_session(xid, ses,
2029 volume_info->local_nls);
2031 mutex_unlock(&ses->session_mutex);
2032 /* problem -- put our reference */
2033 cifs_put_smb_ses(ses);
2038 mutex_unlock(&ses->session_mutex);
2040 /* existing SMB ses has a server reference already */
2041 cifs_put_tcp_session(server);
2046 cFYI(1, "Existing smb sess not found");
2047 ses = sesInfoAlloc();
2051 /* new SMB session uses our server ref */
2052 ses->server = server;
2053 if (server->dstaddr.ss_family == AF_INET6)
2054 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2056 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2058 if (volume_info->username) {
2059 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2060 if (!ses->user_name)
2064 /* volume_info->password freed at unmount */
2065 if (volume_info->password) {
2066 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2070 if (volume_info->domainname) {
2071 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2072 if (!ses->domainName)
2075 ses->cred_uid = volume_info->cred_uid;
2076 ses->linux_uid = volume_info->linux_uid;
2078 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2079 supported for many years, time to update default security mechanism */
2080 if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2081 warned_on_ntlm = true;
2082 cERROR(1, "default security mechanism requested. The default "
2083 "security mechanism will be upgraded from ntlm to "
2084 "ntlmv2 in kernel release 3.2");
2086 ses->overrideSecFlg = volume_info->secFlg;
2088 mutex_lock(&ses->session_mutex);
2089 rc = cifs_negotiate_protocol(xid, ses);
2091 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2092 mutex_unlock(&ses->session_mutex);
2096 /* success, put it on the list */
2097 spin_lock(&cifs_tcp_ses_lock);
2098 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2099 spin_unlock(&cifs_tcp_ses_lock);
2110 static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2112 if (tcon->tidStatus == CifsExiting)
2114 if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2119 static struct cifs_tcon *
2120 cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2122 struct list_head *tmp;
2123 struct cifs_tcon *tcon;
2125 spin_lock(&cifs_tcp_ses_lock);
2126 list_for_each(tmp, &ses->tcon_list) {
2127 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2128 if (!match_tcon(tcon, unc))
2131 spin_unlock(&cifs_tcp_ses_lock);
2134 spin_unlock(&cifs_tcp_ses_lock);
2139 cifs_put_tcon(struct cifs_tcon *tcon)
2142 struct cifs_ses *ses = tcon->ses;
2144 cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2145 spin_lock(&cifs_tcp_ses_lock);
2146 if (--tcon->tc_count > 0) {
2147 spin_unlock(&cifs_tcp_ses_lock);
2151 list_del_init(&tcon->tcon_list);
2152 spin_unlock(&cifs_tcp_ses_lock);
2155 CIFSSMBTDis(xid, tcon);
2158 cifs_fscache_release_super_cookie(tcon);
2160 cifs_put_smb_ses(ses);
2163 static struct cifs_tcon *
2164 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2167 struct cifs_tcon *tcon;
2169 tcon = cifs_find_tcon(ses, volume_info->UNC);
2171 cFYI(1, "Found match on UNC path");
2172 /* existing tcon already has a reference */
2173 cifs_put_smb_ses(ses);
2174 if (tcon->seal != volume_info->seal)
2175 cERROR(1, "transport encryption setting "
2176 "conflicts with existing tid");
2180 tcon = tconInfoAlloc();
2187 if (volume_info->password) {
2188 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2189 if (!tcon->password) {
2195 if (strchr(volume_info->UNC + 3, '\\') == NULL
2196 && strchr(volume_info->UNC + 3, '/') == NULL) {
2197 cERROR(1, "Missing share name");
2202 /* BB Do we need to wrap session_mutex around
2203 * this TCon call and Unix SetFS as
2204 * we do on SessSetup and reconnect? */
2206 rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2208 cFYI(1, "CIFS Tcon rc = %d", rc);
2212 if (volume_info->nodfs) {
2213 tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2214 cFYI(1, "DFS disabled (%d)", tcon->Flags);
2216 tcon->seal = volume_info->seal;
2217 /* we can have only one retry value for a connection
2218 to a share so for resources mounted more than once
2219 to the same server share the last value passed in
2220 for the retry flag is used */
2221 tcon->retry = volume_info->retry;
2222 tcon->nocase = volume_info->nocase;
2223 tcon->local_lease = volume_info->local_lease;
2225 spin_lock(&cifs_tcp_ses_lock);
2226 list_add(&tcon->tcon_list, &ses->tcon_list);
2227 spin_unlock(&cifs_tcp_ses_lock);
2229 cifs_fscache_get_super_cookie(tcon);
2239 cifs_put_tlink(struct tcon_link *tlink)
2241 if (!tlink || IS_ERR(tlink))
2244 if (!atomic_dec_and_test(&tlink->tl_count) ||
2245 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2246 tlink->tl_time = jiffies;
2250 if (!IS_ERR(tlink_tcon(tlink)))
2251 cifs_put_tcon(tlink_tcon(tlink));
2256 static inline struct tcon_link *
2257 cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2259 return cifs_sb->master_tlink;
2263 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2265 struct cifs_sb_info *old = CIFS_SB(sb);
2266 struct cifs_sb_info *new = mnt_data->cifs_sb;
2268 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2271 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2272 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2275 if (old->rsize != new->rsize)
2279 * We want to share sb only if we don't specify wsize or specified wsize
2280 * is greater or equal than existing one.
2282 if (new->wsize && new->wsize < old->wsize)
2285 if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2288 if (old->mnt_file_mode != new->mnt_file_mode ||
2289 old->mnt_dir_mode != new->mnt_dir_mode)
2292 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2295 if (old->actimeo != new->actimeo)
2302 cifs_match_super(struct super_block *sb, void *data)
2304 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2305 struct smb_vol *volume_info;
2306 struct cifs_sb_info *cifs_sb;
2307 struct TCP_Server_Info *tcp_srv;
2308 struct cifs_ses *ses;
2309 struct cifs_tcon *tcon;
2310 struct tcon_link *tlink;
2311 struct sockaddr_storage addr;
2314 memset(&addr, 0, sizeof(struct sockaddr_storage));
2316 spin_lock(&cifs_tcp_ses_lock);
2317 cifs_sb = CIFS_SB(sb);
2318 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2319 if (IS_ERR(tlink)) {
2320 spin_unlock(&cifs_tcp_ses_lock);
2323 tcon = tlink_tcon(tlink);
2325 tcp_srv = ses->server;
2327 volume_info = mnt_data->vol;
2329 if (!volume_info->UNCip || !volume_info->UNC)
2332 rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2334 strlen(volume_info->UNCip),
2339 if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2340 !match_session(ses, volume_info) ||
2341 !match_tcon(tcon, volume_info->UNC)) {
2346 rc = compare_mount_options(sb, mnt_data);
2348 spin_unlock(&cifs_tcp_ses_lock);
2349 cifs_put_tlink(tlink);
2354 get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path,
2355 const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
2356 struct dfs_info3_param **preferrals, int remap)
2361 *pnum_referrals = 0;
2364 if (pSesInfo->ipc_tid == 0) {
2365 temp_unc = kmalloc(2 /* for slashes */ +
2366 strnlen(pSesInfo->serverName,
2367 SERVER_NAME_LEN_WITH_NULL * 2)
2368 + 1 + 4 /* slash IPC$ */ + 2,
2370 if (temp_unc == NULL)
2374 strcpy(temp_unc + 2, pSesInfo->serverName);
2375 strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2376 rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
2377 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
2381 rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
2382 pnum_referrals, nls_codepage, remap);
2383 /* BB map targetUNCs to dfs_info3 structures, here or
2384 in CIFSGetDFSRefer BB */
2389 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2390 static struct lock_class_key cifs_key[2];
2391 static struct lock_class_key cifs_slock_key[2];
2394 cifs_reclassify_socket4(struct socket *sock)
2396 struct sock *sk = sock->sk;
2397 BUG_ON(sock_owned_by_user(sk));
2398 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2399 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2403 cifs_reclassify_socket6(struct socket *sock)
2405 struct sock *sk = sock->sk;
2406 BUG_ON(sock_owned_by_user(sk));
2407 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2408 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2412 cifs_reclassify_socket4(struct socket *sock)
2417 cifs_reclassify_socket6(struct socket *sock)
2422 /* See RFC1001 section 14 on representation of Netbios names */
2423 static void rfc1002mangle(char *target, char *source, unsigned int length)
2427 for (i = 0, j = 0; i < (length); i++) {
2428 /* mask a nibble at a time and encode */
2429 target[j] = 'A' + (0x0F & (source[i] >> 4));
2430 target[j+1] = 'A' + (0x0F & source[i]);
2437 bind_socket(struct TCP_Server_Info *server)
2440 if (server->srcaddr.ss_family != AF_UNSPEC) {
2441 /* Bind to the specified local IP address */
2442 struct socket *socket = server->ssocket;
2443 rc = socket->ops->bind(socket,
2444 (struct sockaddr *) &server->srcaddr,
2445 sizeof(server->srcaddr));
2447 struct sockaddr_in *saddr4;
2448 struct sockaddr_in6 *saddr6;
2449 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2450 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2451 if (saddr6->sin6_family == AF_INET6)
2453 "Failed to bind to: %pI6c, error: %d\n",
2454 &saddr6->sin6_addr, rc);
2457 "Failed to bind to: %pI4, error: %d\n",
2458 &saddr4->sin_addr.s_addr, rc);
2465 ip_rfc1001_connect(struct TCP_Server_Info *server)
2469 * some servers require RFC1001 sessinit before sending
2470 * negprot - BB check reconnection in case where second
2471 * sessinit is sent but no second negprot
2473 struct rfc1002_session_packet *ses_init_buf;
2474 struct smb_hdr *smb_buf;
2475 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2478 ses_init_buf->trailer.session_req.called_len = 32;
2480 if (server->server_RFC1001_name &&
2481 server->server_RFC1001_name[0] != 0)
2482 rfc1002mangle(ses_init_buf->trailer.
2483 session_req.called_name,
2484 server->server_RFC1001_name,
2485 RFC1001_NAME_LEN_WITH_NULL);
2487 rfc1002mangle(ses_init_buf->trailer.
2488 session_req.called_name,
2489 DEFAULT_CIFS_CALLED_NAME,
2490 RFC1001_NAME_LEN_WITH_NULL);
2492 ses_init_buf->trailer.session_req.calling_len = 32;
2495 * calling name ends in null (byte 16) from old smb
2498 if (server->workstation_RFC1001_name &&
2499 server->workstation_RFC1001_name[0] != 0)
2500 rfc1002mangle(ses_init_buf->trailer.
2501 session_req.calling_name,
2502 server->workstation_RFC1001_name,
2503 RFC1001_NAME_LEN_WITH_NULL);
2505 rfc1002mangle(ses_init_buf->trailer.
2506 session_req.calling_name,
2508 RFC1001_NAME_LEN_WITH_NULL);
2510 ses_init_buf->trailer.session_req.scope1 = 0;
2511 ses_init_buf->trailer.session_req.scope2 = 0;
2512 smb_buf = (struct smb_hdr *)ses_init_buf;
2514 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2515 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2516 rc = smb_send(server, smb_buf, 0x44);
2517 kfree(ses_init_buf);
2519 * RFC1001 layer in at least one server
2520 * requires very short break before negprot
2521 * presumably because not expecting negprot
2522 * to follow so fast. This is a simple
2523 * solution that works without
2524 * complicating the code and causes no
2525 * significant slowing down on mount
2528 usleep_range(1000, 2000);
2531 * else the negprot may still work without this
2532 * even though malloc failed
2539 generic_ip_connect(struct TCP_Server_Info *server)
2544 struct socket *socket = server->ssocket;
2545 struct sockaddr *saddr;
2547 saddr = (struct sockaddr *) &server->dstaddr;
2549 if (server->dstaddr.ss_family == AF_INET6) {
2550 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2551 slen = sizeof(struct sockaddr_in6);
2554 sport = ((struct sockaddr_in *) saddr)->sin_port;
2555 slen = sizeof(struct sockaddr_in);
2559 if (socket == NULL) {
2560 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2561 IPPROTO_TCP, &socket, 1);
2563 cERROR(1, "Error %d creating socket", rc);
2564 server->ssocket = NULL;
2568 /* BB other socket options to set KEEPALIVE, NODELAY? */
2569 cFYI(1, "Socket created");
2570 server->ssocket = socket;
2571 socket->sk->sk_allocation = GFP_NOFS;
2572 if (sfamily == AF_INET6)
2573 cifs_reclassify_socket6(socket);
2575 cifs_reclassify_socket4(socket);
2578 rc = bind_socket(server);
2583 * Eventually check for other socket options to change from
2584 * the default. sock_setsockopt not used because it expects
2587 socket->sk->sk_rcvtimeo = 7 * HZ;
2588 socket->sk->sk_sndtimeo = 5 * HZ;
2590 /* make the bufsizes depend on wsize/rsize and max requests */
2591 if (server->noautotune) {
2592 if (socket->sk->sk_sndbuf < (200 * 1024))
2593 socket->sk->sk_sndbuf = 200 * 1024;
2594 if (socket->sk->sk_rcvbuf < (140 * 1024))
2595 socket->sk->sk_rcvbuf = 140 * 1024;
2598 if (server->tcp_nodelay) {
2600 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2601 (char *)&val, sizeof(val));
2603 cFYI(1, "set TCP_NODELAY socket option error %d", rc);
2606 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2607 socket->sk->sk_sndbuf,
2608 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2610 rc = socket->ops->connect(socket, saddr, slen, 0);
2612 cFYI(1, "Error %d connecting to server", rc);
2613 sock_release(socket);
2614 server->ssocket = NULL;
2618 if (sport == htons(RFC1001_PORT))
2619 rc = ip_rfc1001_connect(server);
2625 ip_connect(struct TCP_Server_Info *server)
2628 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2629 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2631 if (server->dstaddr.ss_family == AF_INET6)
2632 sport = &addr6->sin6_port;
2634 sport = &addr->sin_port;
2639 /* try with 445 port at first */
2640 *sport = htons(CIFS_PORT);
2642 rc = generic_ip_connect(server);
2646 /* if it failed, try with 139 port */
2647 *sport = htons(RFC1001_PORT);
2650 return generic_ip_connect(server);
2653 void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
2654 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
2656 /* if we are reconnecting then should we check to see if
2657 * any requested capabilities changed locally e.g. via
2658 * remount but we can not do much about it here
2659 * if they have (even if we could detect it by the following)
2660 * Perhaps we could add a backpointer to array of sb from tcon
2661 * or if we change to make all sb to same share the same
2662 * sb as NFS - then we only have one backpointer to sb.
2663 * What if we wanted to mount the server share twice once with
2664 * and once without posixacls or posix paths? */
2665 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2667 if (vol_info && vol_info->no_linux_ext) {
2668 tcon->fsUnixInfo.Capability = 0;
2669 tcon->unix_ext = 0; /* Unix Extensions disabled */
2670 cFYI(1, "Linux protocol extensions disabled");
2672 } else if (vol_info)
2673 tcon->unix_ext = 1; /* Unix Extensions supported */
2675 if (tcon->unix_ext == 0) {
2676 cFYI(1, "Unix extensions disabled so not set on reconnect");
2680 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2681 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2682 cFYI(1, "unix caps which server supports %lld", cap);
2683 /* check for reconnect case in which we do not
2684 want to change the mount behavior if we can avoid it */
2685 if (vol_info == NULL) {
2686 /* turn off POSIX ACL and PATHNAMES if not set
2687 originally at mount time */
2688 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2689 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2690 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2691 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2692 cERROR(1, "POSIXPATH support change");
2693 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2694 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2695 cERROR(1, "possible reconnect error");
2696 cERROR(1, "server disabled POSIX path support");
2700 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2701 cERROR(1, "per-share encryption not supported yet");
2703 cap &= CIFS_UNIX_CAP_MASK;
2704 if (vol_info && vol_info->no_psx_acl)
2705 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2706 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2707 cFYI(1, "negotiated posix acl support");
2709 cifs_sb->mnt_cifs_flags |=
2710 CIFS_MOUNT_POSIXACL;
2713 if (vol_info && vol_info->posix_paths == 0)
2714 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2715 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2716 cFYI(1, "negotiate posix pathnames");
2718 cifs_sb->mnt_cifs_flags |=
2719 CIFS_MOUNT_POSIX_PATHS;
2722 if (cifs_sb && (cifs_sb->rsize > 127 * 1024)) {
2723 if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) {
2724 cifs_sb->rsize = 127 * 1024;
2725 cFYI(DBG2, "larger reads not supported by srv");
2730 cFYI(1, "Negotiate caps 0x%x", (int)cap);
2731 #ifdef CONFIG_CIFS_DEBUG2
2732 if (cap & CIFS_UNIX_FCNTL_CAP)
2733 cFYI(1, "FCNTL cap");
2734 if (cap & CIFS_UNIX_EXTATTR_CAP)
2735 cFYI(1, "EXTATTR cap");
2736 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2737 cFYI(1, "POSIX path cap");
2738 if (cap & CIFS_UNIX_XATTR_CAP)
2739 cFYI(1, "XATTR cap");
2740 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2741 cFYI(1, "POSIX ACL cap");
2742 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2743 cFYI(1, "very large read cap");
2744 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2745 cFYI(1, "very large write cap");
2746 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2747 cFYI(1, "transport encryption cap");
2748 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2749 cFYI(1, "mandatory transport encryption cap");
2750 #endif /* CIFS_DEBUG2 */
2751 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2752 if (vol_info == NULL) {
2753 cFYI(1, "resetting capabilities failed");
2755 cERROR(1, "Negotiating Unix capabilities "
2756 "with the server failed. Consider "
2757 "mounting with the Unix Extensions\n"
2758 "disabled, if problems are found, "
2759 "by specifying the nounix mount "
2766 void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
2767 struct cifs_sb_info *cifs_sb)
2769 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2771 spin_lock_init(&cifs_sb->tlink_tree_lock);
2772 cifs_sb->tlink_tree = RB_ROOT;
2774 if (pvolume_info->rsize > CIFSMaxBufSize) {
2775 cERROR(1, "rsize %d too large, using MaxBufSize",
2776 pvolume_info->rsize);
2777 cifs_sb->rsize = CIFSMaxBufSize;
2778 } else if ((pvolume_info->rsize) &&
2779 (pvolume_info->rsize <= CIFSMaxBufSize))
2780 cifs_sb->rsize = pvolume_info->rsize;
2782 cifs_sb->rsize = CIFSMaxBufSize;
2784 if (cifs_sb->rsize < 2048) {
2785 cifs_sb->rsize = 2048;
2786 /* Windows ME may prefer this */
2787 cFYI(1, "readsize set to minimum: 2048");
2791 * Temporarily set wsize for matching superblock. If we end up using
2792 * new sb then cifs_negotiate_wsize will later negotiate it downward
2795 cifs_sb->wsize = pvolume_info->wsize;
2797 cifs_sb->mnt_uid = pvolume_info->linux_uid;
2798 cifs_sb->mnt_gid = pvolume_info->linux_gid;
2799 if (pvolume_info->backupuid_specified)
2800 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
2801 if (pvolume_info->backupgid_specified)
2802 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
2803 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2804 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
2805 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2806 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
2808 cifs_sb->actimeo = pvolume_info->actimeo;
2809 cifs_sb->local_nls = pvolume_info->local_nls;
2811 if (pvolume_info->noperm)
2812 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
2813 if (pvolume_info->setuids)
2814 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
2815 if (pvolume_info->server_ino)
2816 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
2817 if (pvolume_info->remap)
2818 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
2819 if (pvolume_info->no_xattr)
2820 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
2821 if (pvolume_info->sfu_emul)
2822 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
2823 if (pvolume_info->nobrl)
2824 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
2825 if (pvolume_info->nostrictsync)
2826 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
2827 if (pvolume_info->mand_lock)
2828 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
2829 if (pvolume_info->rwpidforward)
2830 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
2831 if (pvolume_info->cifs_acl)
2832 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
2833 if (pvolume_info->backupuid_specified)
2834 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
2835 if (pvolume_info->backupgid_specified)
2836 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
2837 if (pvolume_info->override_uid)
2838 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
2839 if (pvolume_info->override_gid)
2840 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
2841 if (pvolume_info->dynperm)
2842 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
2843 if (pvolume_info->fsc)
2844 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
2845 if (pvolume_info->multiuser)
2846 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
2847 CIFS_MOUNT_NO_PERM);
2848 if (pvolume_info->strict_io)
2849 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
2850 if (pvolume_info->direct_io) {
2851 cFYI(1, "mounting share using direct i/o");
2852 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2854 if (pvolume_info->mfsymlinks) {
2855 if (pvolume_info->sfu_emul) {
2856 cERROR(1, "mount option mfsymlinks ignored if sfu "
2857 "mount option is used");
2859 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
2863 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
2864 cERROR(1, "mount option dynperm ignored if cifsacl "
2865 "mount option supported");
2869 * When the server supports very large writes via POSIX extensions, we can
2870 * allow up to 2^24-1, minus the size of a WRITE_AND_X header, not including
2871 * the RFC1001 length.
2873 * Note that this might make for "interesting" allocation problems during
2874 * writeback however as we have to allocate an array of pointers for the
2875 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
2877 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
2880 * When the server doesn't allow large posix writes, only allow a wsize of
2881 * 2^17-1 minus the size of the WRITE_AND_X header. That allows for a write up
2882 * to the maximum size described by RFC1002.
2884 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
2887 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
2888 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
2889 * a single wsize request with a single call.
2891 #define CIFS_DEFAULT_WSIZE (1024 * 1024)
2894 cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
2896 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2897 struct TCP_Server_Info *server = tcon->ses->server;
2898 unsigned int wsize = pvolume_info->wsize ? pvolume_info->wsize :
2901 /* can server support 24-bit write sizes? (via UNIX extensions) */
2902 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
2903 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
2906 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
2907 * Limit it to max buffer offered by the server, minus the size of the
2908 * WRITEX header, not including the 4 byte RFC1001 length.
2910 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
2911 (!(server->capabilities & CAP_UNIX) &&
2912 (server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
2913 wsize = min_t(unsigned int, wsize,
2914 server->maxBuf - sizeof(WRITE_REQ) + 4);
2916 /* hard limit of CIFS_MAX_WSIZE */
2917 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
2923 is_path_accessible(int xid, struct cifs_tcon *tcon,
2924 struct cifs_sb_info *cifs_sb, const char *full_path)
2927 FILE_ALL_INFO *pfile_info;
2929 pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
2930 if (pfile_info == NULL)
2933 rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
2934 0 /* not legacy */, cifs_sb->local_nls,
2935 cifs_sb->mnt_cifs_flags &
2936 CIFS_MOUNT_MAP_SPECIAL_CHR);
2938 if (rc == -EOPNOTSUPP || rc == -EINVAL)
2939 rc = SMBQueryInformation(xid, tcon, full_path, pfile_info,
2940 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
2941 CIFS_MOUNT_MAP_SPECIAL_CHR);
2947 cleanup_volume_info_contents(struct smb_vol *volume_info)
2949 kfree(volume_info->username);
2950 kzfree(volume_info->password);
2951 kfree(volume_info->UNC);
2952 if (volume_info->UNCip != volume_info->UNC + 2)
2953 kfree(volume_info->UNCip);
2954 kfree(volume_info->domainname);
2955 kfree(volume_info->iocharset);
2956 kfree(volume_info->prepath);
2960 cifs_cleanup_volume_info(struct smb_vol *volume_info)
2964 cleanup_volume_info_contents(volume_info);
2969 #ifdef CONFIG_CIFS_DFS_UPCALL
2970 /* build_path_to_root returns full path to root when
2971 * we do not have an exiting connection (tcon) */
2973 build_unc_path_to_root(const struct smb_vol *vol,
2974 const struct cifs_sb_info *cifs_sb)
2976 char *full_path, *pos;
2977 unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
2978 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
2980 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
2981 if (full_path == NULL)
2982 return ERR_PTR(-ENOMEM);
2984 strncpy(full_path, vol->UNC, unc_len);
2985 pos = full_path + unc_len;
2988 strncpy(pos, vol->prepath, pplen);
2992 *pos = '\0'; /* add trailing null */
2993 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
2994 cFYI(1, "%s: full_path=%s", __func__, full_path);
2999 * Perform a dfs referral query for a share and (optionally) prefix
3001 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3002 * to a string containing updated options for the submount. Otherwise it
3003 * will be left untouched.
3005 * Returns the rc from get_dfs_path to the caller, which can be used to
3006 * determine whether there were referrals.
3009 expand_dfs_referral(int xid, struct cifs_ses *pSesInfo,
3010 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3014 unsigned int num_referrals = 0;
3015 struct dfs_info3_param *referrals = NULL;
3016 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3018 full_path = build_unc_path_to_root(volume_info, cifs_sb);
3019 if (IS_ERR(full_path))
3020 return PTR_ERR(full_path);
3022 /* For DFS paths, skip the first '\' of the UNC */
3023 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3025 rc = get_dfs_path(xid, pSesInfo , ref_path, cifs_sb->local_nls,
3026 &num_referrals, &referrals,
3027 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3029 if (!rc && num_referrals > 0) {
3030 char *fake_devname = NULL;
3032 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3033 full_path + 1, referrals,
3036 free_dfs_info_array(referrals, num_referrals);
3038 if (IS_ERR(mdata)) {
3039 rc = PTR_ERR(mdata);
3042 cleanup_volume_info_contents(volume_info);
3043 memset(volume_info, '\0', sizeof(*volume_info));
3044 rc = cifs_setup_volume_info(volume_info, mdata,
3047 kfree(fake_devname);
3048 kfree(cifs_sb->mountdata);
3049 cifs_sb->mountdata = mdata;
3057 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3058 const char *devname)
3062 if (cifs_parse_mount_options(mount_data, devname, volume_info))
3065 if (volume_info->nullauth) {
3066 cFYI(1, "null user");
3067 volume_info->username = kzalloc(1, GFP_KERNEL);
3068 if (volume_info->username == NULL)
3070 } else if (volume_info->username) {
3071 /* BB fixme parse for domain name here */
3072 cFYI(1, "Username: %s", volume_info->username);
3074 cifserror("No username specified");
3075 /* In userspace mount helper we can get user name from alternate
3076 locations such as env variables and files on disk */
3080 /* this is needed for ASCII cp to Unicode converts */
3081 if (volume_info->iocharset == NULL) {
3082 /* load_nls_default cannot return null */
3083 volume_info->local_nls = load_nls_default();
3085 volume_info->local_nls = load_nls(volume_info->iocharset);
3086 if (volume_info->local_nls == NULL) {
3087 cERROR(1, "CIFS mount error: iocharset %s not found",
3088 volume_info->iocharset);
3097 cifs_get_volume_info(char *mount_data, const char *devname)
3100 struct smb_vol *volume_info;
3102 volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3104 return ERR_PTR(-ENOMEM);
3106 rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3108 cifs_cleanup_volume_info(volume_info);
3109 volume_info = ERR_PTR(rc);
3116 cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3120 struct cifs_ses *pSesInfo;
3121 struct cifs_tcon *tcon;
3122 struct TCP_Server_Info *srvTcp;
3124 struct tcon_link *tlink;
3125 #ifdef CONFIG_CIFS_DFS_UPCALL
3126 int referral_walks_count = 0;
3129 rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3133 cifs_sb->bdi.ra_pages = default_backing_dev_info.ra_pages;
3135 #ifdef CONFIG_CIFS_DFS_UPCALL
3137 /* cleanup activities if we're chasing a referral */
3138 if (referral_walks_count) {
3140 cifs_put_tcon(tcon);
3142 cifs_put_smb_ses(pSesInfo);
3155 /* get a reference to a tcp session */
3156 srvTcp = cifs_get_tcp_session(volume_info);
3157 if (IS_ERR(srvTcp)) {
3158 rc = PTR_ERR(srvTcp);
3159 bdi_destroy(&cifs_sb->bdi);
3163 /* get a reference to a SMB session */
3164 pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
3165 if (IS_ERR(pSesInfo)) {
3166 rc = PTR_ERR(pSesInfo);
3168 goto mount_fail_check;
3171 /* search for existing tcon to this server share */
3172 tcon = cifs_get_tcon(pSesInfo, volume_info);
3176 goto remote_path_check;
3179 /* tell server which Unix caps we support */
3180 if (tcon->ses->capabilities & CAP_UNIX) {
3181 /* reset of caps checks mount to see if unix extensions
3182 disabled for just this mount */
3183 reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3184 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3185 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3186 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3188 goto mount_fail_check;
3191 tcon->unix_ext = 0; /* server does not support them */
3193 /* do not care if following two calls succeed - informational */
3195 CIFSSMBQFSDeviceInfo(xid, tcon);
3196 CIFSSMBQFSAttributeInfo(xid, tcon);
3199 if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
3200 cifs_sb->rsize = 1024 * 127;
3201 cFYI(DBG2, "no very large read support, rsize now 127K");
3203 if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
3204 cifs_sb->rsize = min(cifs_sb->rsize, CIFSMaxBufSize);
3206 cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3209 #ifdef CONFIG_CIFS_DFS_UPCALL
3211 * Perform an unconditional check for whether there are DFS
3212 * referrals for this path without prefix, to provide support
3213 * for DFS referrals from w2k8 servers which don't seem to respond
3214 * with PATH_NOT_COVERED to requests that include the prefix.
3215 * Chase the referral if found, otherwise continue normally.
3217 if (referral_walks_count == 0) {
3218 int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
3221 referral_walks_count++;
3222 goto try_mount_again;
3227 /* check if a whole path is not remote */
3229 /* build_path_to_root works only when we have a valid tcon */
3230 full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3231 if (full_path == NULL) {
3233 goto mount_fail_check;
3235 rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
3236 if (rc != 0 && rc != -EREMOTE) {
3238 goto mount_fail_check;
3243 /* get referral if needed */
3244 if (rc == -EREMOTE) {
3245 #ifdef CONFIG_CIFS_DFS_UPCALL
3246 if (referral_walks_count > MAX_NESTED_LINKS) {
3248 * BB: when we implement proper loop detection,
3249 * we will remove this check. But now we need it
3250 * to prevent an indefinite loop if 'DFS tree' is
3251 * misconfigured (i.e. has loops).
3254 goto mount_fail_check;
3257 rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb,
3261 referral_walks_count++;
3262 goto try_mount_again;
3264 goto mount_fail_check;
3265 #else /* No DFS support, return error on mount */
3271 goto mount_fail_check;
3273 /* now, hang the tcon off of the superblock */
3274 tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3275 if (tlink == NULL) {
3277 goto mount_fail_check;
3280 tlink->tl_uid = pSesInfo->linux_uid;
3281 tlink->tl_tcon = tcon;
3282 tlink->tl_time = jiffies;
3283 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3284 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3286 cifs_sb->master_tlink = tlink;
3287 spin_lock(&cifs_sb->tlink_tree_lock);
3288 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3289 spin_unlock(&cifs_sb->tlink_tree_lock);
3291 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3295 /* on error free sesinfo and tcon struct if needed */
3297 /* If find_unc succeeded then rc == 0 so we can not end */
3298 /* up accidentally freeing someone elses tcon struct */
3300 cifs_put_tcon(tcon);
3302 cifs_put_smb_ses(pSesInfo);
3304 cifs_put_tcp_session(srvTcp);
3305 bdi_destroy(&cifs_sb->bdi);
3314 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3315 * pointer may be NULL.
3318 CIFSTCon(unsigned int xid, struct cifs_ses *ses,
3319 const char *tree, struct cifs_tcon *tcon,
3320 const struct nls_table *nls_codepage)
3322 struct smb_hdr *smb_buffer;
3323 struct smb_hdr *smb_buffer_response;
3326 unsigned char *bcc_ptr;
3329 __u16 bytes_left, count;
3334 smb_buffer = cifs_buf_get();
3335 if (smb_buffer == NULL)
3338 smb_buffer_response = smb_buffer;
3340 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3341 NULL /*no tid */ , 4 /*wct */ );
3343 smb_buffer->Mid = GetNextMid(ses->server);
3344 smb_buffer->Uid = ses->Suid;
3345 pSMB = (TCONX_REQ *) smb_buffer;
3346 pSMBr = (TCONX_RSP *) smb_buffer_response;
3348 pSMB->AndXCommand = 0xFF;
3349 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3350 bcc_ptr = &pSMB->Password[0];
3351 if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3352 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3353 *bcc_ptr = 0; /* password is null byte */
3354 bcc_ptr++; /* skip password */
3355 /* already aligned so no need to do it below */
3357 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3358 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3359 specified as required (when that support is added to
3360 the vfs in the future) as only NTLM or the much
3361 weaker LANMAN (which we do not send by default) is accepted
3362 by Samba (not sure whether other servers allow
3363 NTLMv2 password here) */
3364 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3365 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3366 (ses->server->secType == LANMAN))
3367 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3368 ses->server->sec_mode &
3369 SECMODE_PW_ENCRYPT ? true : false,
3372 #endif /* CIFS_WEAK_PW_HASH */
3373 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3376 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3377 if (ses->capabilities & CAP_UNICODE) {
3378 /* must align unicode strings */
3379 *bcc_ptr = 0; /* null byte password */
3384 if (ses->server->sec_mode &
3385 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3386 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3388 if (ses->capabilities & CAP_STATUS32) {
3389 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3391 if (ses->capabilities & CAP_DFS) {
3392 smb_buffer->Flags2 |= SMBFLG2_DFS;
3394 if (ses->capabilities & CAP_UNICODE) {
3395 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3397 cifs_strtoUCS((__le16 *) bcc_ptr, tree,
3398 6 /* max utf8 char length in bytes */ *
3399 (/* server len*/ + 256 /* share len */), nls_codepage);
3400 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3401 bcc_ptr += 2; /* skip trailing null */
3402 } else { /* ASCII */
3403 strcpy(bcc_ptr, tree);
3404 bcc_ptr += strlen(tree) + 1;
3406 strcpy(bcc_ptr, "?????");
3407 bcc_ptr += strlen("?????");
3409 count = bcc_ptr - &pSMB->Password[0];
3410 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3411 pSMB->hdr.smb_buf_length) + count);
3412 pSMB->ByteCount = cpu_to_le16(count);
3414 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3417 /* above now done in SendReceive */
3418 if ((rc == 0) && (tcon != NULL)) {
3421 tcon->tidStatus = CifsGood;
3422 tcon->need_reconnect = false;
3423 tcon->tid = smb_buffer_response->Tid;
3424 bcc_ptr = pByteArea(smb_buffer_response);
3425 bytes_left = get_bcc(smb_buffer_response);
3426 length = strnlen(bcc_ptr, bytes_left - 2);
3427 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3433 /* skip service field (NB: this field is always ASCII) */
3435 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3436 (bcc_ptr[2] == 'C')) {
3437 cFYI(1, "IPC connection");
3440 } else if (length == 2) {
3441 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3442 /* the most common case */
3443 cFYI(1, "disk share connection");
3446 bcc_ptr += length + 1;
3447 bytes_left -= (length + 1);
3448 strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3450 /* mostly informational -- no need to fail on error here */
3451 kfree(tcon->nativeFileSystem);
3452 tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
3453 bytes_left, is_unicode,
3456 cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3458 if ((smb_buffer_response->WordCount == 3) ||
3459 (smb_buffer_response->WordCount == 7))
3460 /* field is in same location */
3461 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3464 cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3465 } else if ((rc == 0) && tcon == NULL) {
3466 /* all we need to save for IPC$ connection */
3467 ses->ipc_tid = smb_buffer_response->Tid;
3470 cifs_buf_release(smb_buffer);
3475 cifs_umount(struct cifs_sb_info *cifs_sb)
3477 struct rb_root *root = &cifs_sb->tlink_tree;
3478 struct rb_node *node;
3479 struct tcon_link *tlink;
3481 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3483 spin_lock(&cifs_sb->tlink_tree_lock);
3484 while ((node = rb_first(root))) {
3485 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3486 cifs_get_tlink(tlink);
3487 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3488 rb_erase(node, root);
3490 spin_unlock(&cifs_sb->tlink_tree_lock);
3491 cifs_put_tlink(tlink);
3492 spin_lock(&cifs_sb->tlink_tree_lock);
3494 spin_unlock(&cifs_sb->tlink_tree_lock);
3496 bdi_destroy(&cifs_sb->bdi);
3497 kfree(cifs_sb->mountdata);
3498 unload_nls(cifs_sb->local_nls);
3502 int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses)
3505 struct TCP_Server_Info *server = ses->server;
3507 /* only send once per connect */
3508 if (server->maxBuf != 0)
3511 rc = CIFSSMBNegotiate(xid, ses);
3512 if (rc == -EAGAIN) {
3513 /* retry only once on 1st time connection */
3514 rc = CIFSSMBNegotiate(xid, ses);
3519 spin_lock(&GlobalMid_Lock);
3520 if (server->tcpStatus == CifsNeedNegotiate)
3521 server->tcpStatus = CifsGood;
3524 spin_unlock(&GlobalMid_Lock);
3532 int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
3533 struct nls_table *nls_info)
3536 struct TCP_Server_Info *server = ses->server;
3539 ses->capabilities = server->capabilities;
3540 if (linuxExtEnabled == 0)
3541 ses->capabilities &= (~CAP_UNIX);
3543 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3544 server->sec_mode, server->capabilities, server->timeAdj);
3546 rc = CIFS_SessSetup(xid, ses, nls_info);
3548 cERROR(1, "Send error in SessSetup = %d", rc);
3550 mutex_lock(&ses->server->srv_mutex);
3551 if (!server->session_estab) {
3552 server->session_key.response = ses->auth_key.response;
3553 server->session_key.len = ses->auth_key.len;
3554 server->sequence_number = 0x2;
3555 server->session_estab = true;
3556 ses->auth_key.response = NULL;
3558 mutex_unlock(&server->srv_mutex);
3560 cFYI(1, "CIFS Session Established successfully");
3561 spin_lock(&GlobalMid_Lock);
3562 ses->status = CifsGood;
3563 ses->need_reconnect = false;
3564 spin_unlock(&GlobalMid_Lock);
3567 kfree(ses->auth_key.response);
3568 ses->auth_key.response = NULL;
3569 ses->auth_key.len = 0;
3570 kfree(ses->ntlmssp);
3571 ses->ntlmssp = NULL;
3576 static struct cifs_tcon *
3577 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
3579 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3580 struct cifs_ses *ses;
3581 struct cifs_tcon *tcon = NULL;
3582 struct smb_vol *vol_info;
3583 char username[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */
3584 /* We used to have this as MAX_USERNAME which is */
3585 /* way too big now (256 instead of 32) */
3587 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3588 if (vol_info == NULL) {
3589 tcon = ERR_PTR(-ENOMEM);
3593 snprintf(username, sizeof(username), "krb50x%x", fsuid);
3594 vol_info->username = username;
3595 vol_info->local_nls = cifs_sb->local_nls;
3596 vol_info->linux_uid = fsuid;
3597 vol_info->cred_uid = fsuid;
3598 vol_info->UNC = master_tcon->treeName;
3599 vol_info->retry = master_tcon->retry;
3600 vol_info->nocase = master_tcon->nocase;
3601 vol_info->local_lease = master_tcon->local_lease;
3602 vol_info->no_linux_ext = !master_tcon->unix_ext;
3604 /* FIXME: allow for other secFlg settings */
3605 vol_info->secFlg = CIFSSEC_MUST_KRB5;
3607 /* get a reference for the same TCP session */
3608 spin_lock(&cifs_tcp_ses_lock);
3609 ++master_tcon->ses->server->srv_count;
3610 spin_unlock(&cifs_tcp_ses_lock);
3612 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3614 tcon = (struct cifs_tcon *)ses;
3615 cifs_put_tcp_session(master_tcon->ses->server);
3619 tcon = cifs_get_tcon(ses, vol_info);
3621 cifs_put_smb_ses(ses);
3625 if (ses->capabilities & CAP_UNIX)
3626 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3634 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3636 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3640 cifs_sb_tcon_pending_wait(void *unused)
3643 return signal_pending(current) ? -ERESTARTSYS : 0;
3646 /* find and return a tlink with given uid */
3647 static struct tcon_link *
3648 tlink_rb_search(struct rb_root *root, uid_t uid)
3650 struct rb_node *node = root->rb_node;
3651 struct tcon_link *tlink;
3654 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3656 if (tlink->tl_uid > uid)
3657 node = node->rb_left;
3658 else if (tlink->tl_uid < uid)
3659 node = node->rb_right;
3666 /* insert a tcon_link into the tree */
3668 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3670 struct rb_node **new = &(root->rb_node), *parent = NULL;
3671 struct tcon_link *tlink;
3674 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3677 if (tlink->tl_uid > new_tlink->tl_uid)
3678 new = &((*new)->rb_left);
3680 new = &((*new)->rb_right);
3683 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3684 rb_insert_color(&new_tlink->tl_rbnode, root);
3688 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3691 * If the superblock doesn't refer to a multiuser mount, then just return
3692 * the master tcon for the mount.
3694 * First, search the rbtree for an existing tcon for this fsuid. If one
3695 * exists, then check to see if it's pending construction. If it is then wait
3696 * for construction to complete. Once it's no longer pending, check to see if
3697 * it failed and either return an error or retry construction, depending on
3700 * If one doesn't exist then insert a new tcon_link struct into the tree and
3701 * try to construct a new one.
3704 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3707 uid_t fsuid = current_fsuid();
3708 struct tcon_link *tlink, *newtlink;
3710 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3711 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3713 spin_lock(&cifs_sb->tlink_tree_lock);
3714 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3716 cifs_get_tlink(tlink);
3717 spin_unlock(&cifs_sb->tlink_tree_lock);
3719 if (tlink == NULL) {
3720 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3721 if (newtlink == NULL)
3722 return ERR_PTR(-ENOMEM);
3723 newtlink->tl_uid = fsuid;
3724 newtlink->tl_tcon = ERR_PTR(-EACCES);
3725 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3726 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3727 cifs_get_tlink(newtlink);
3729 spin_lock(&cifs_sb->tlink_tree_lock);
3730 /* was one inserted after previous search? */
3731 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3733 cifs_get_tlink(tlink);
3734 spin_unlock(&cifs_sb->tlink_tree_lock);
3736 goto wait_for_construction;
3739 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3740 spin_unlock(&cifs_sb->tlink_tree_lock);
3742 wait_for_construction:
3743 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
3744 cifs_sb_tcon_pending_wait,
3745 TASK_INTERRUPTIBLE);
3747 cifs_put_tlink(tlink);
3748 return ERR_PTR(ret);
3751 /* if it's good, return it */
3752 if (!IS_ERR(tlink->tl_tcon))
3755 /* return error if we tried this already recently */
3756 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
3757 cifs_put_tlink(tlink);
3758 return ERR_PTR(-EACCES);
3761 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
3762 goto wait_for_construction;
3765 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
3766 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
3767 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
3769 if (IS_ERR(tlink->tl_tcon)) {
3770 cifs_put_tlink(tlink);
3771 return ERR_PTR(-EACCES);
3778 * periodic workqueue job that scans tcon_tree for a superblock and closes
3782 cifs_prune_tlinks(struct work_struct *work)
3784 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
3786 struct rb_root *root = &cifs_sb->tlink_tree;
3787 struct rb_node *node = rb_first(root);
3788 struct rb_node *tmp;
3789 struct tcon_link *tlink;
3792 * Because we drop the spinlock in the loop in order to put the tlink
3793 * it's not guarded against removal of links from the tree. The only
3794 * places that remove entries from the tree are this function and
3795 * umounts. Because this function is non-reentrant and is canceled
3796 * before umount can proceed, this is safe.
3798 spin_lock(&cifs_sb->tlink_tree_lock);
3799 node = rb_first(root);
3800 while (node != NULL) {
3802 node = rb_next(tmp);
3803 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
3805 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
3806 atomic_read(&tlink->tl_count) != 0 ||
3807 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
3810 cifs_get_tlink(tlink);
3811 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3812 rb_erase(tmp, root);
3814 spin_unlock(&cifs_sb->tlink_tree_lock);
3815 cifs_put_tlink(tlink);
3816 spin_lock(&cifs_sb->tlink_tree_lock);
3818 spin_unlock(&cifs_sb->tlink_tree_lock);
3820 queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,