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(struct TCP_Server_Info
*server
)
325 if (!server
->bigbuf
) {
326 server
->bigbuf
= (char *)cifs_buf_get();
327 if (!server
->bigbuf
) {
328 cERROR(1, "No memory for large SMB response");
330 /* retry will check if exiting */
333 } else if (server
->large_buf
) {
334 /* we are reusing a dirty large buf, clear its start */
335 memset(server
->bigbuf
, 0, sizeof(struct smb_hdr
));
338 if (!server
->smallbuf
) {
339 server
->smallbuf
= (char *)cifs_small_buf_get();
340 if (!server
->smallbuf
) {
341 cERROR(1, "No memory for SMB response");
343 /* retry will check if exiting */
346 /* beginning of smb buffer is cleared in our buf_get */
348 /* if existing small buf clear beginning */
349 memset(server
->smallbuf
, 0, sizeof(struct smb_hdr
));
356 server_unresponsive(struct TCP_Server_Info
*server
)
358 if (echo_retries
> 0 && server
->tcpStatus
== CifsGood
&&
359 time_after(jiffies
, server
->lstrp
+
360 (echo_retries
* SMB_ECHO_INTERVAL
))) {
361 cERROR(1, "Server %s has not responded in %d seconds. "
362 "Reconnecting...", server
->hostname
,
363 (echo_retries
* SMB_ECHO_INTERVAL
/ HZ
));
364 cifs_reconnect(server
);
365 wake_up(&server
->response_q
);
373 * kvec_array_init - clone a kvec array, and advance into it
374 * @new: pointer to memory for cloned array
375 * @iov: pointer to original array
376 * @nr_segs: number of members in original array
377 * @bytes: number of bytes to advance into the cloned array
379 * This function will copy the array provided in iov to a section of memory
380 * and advance the specified number of bytes into the new array. It returns
381 * the number of segments in the new array. "new" must be at least as big as
382 * the original iov array.
385 kvec_array_init(struct kvec
*new, struct kvec
*iov
, unsigned int nr_segs
,
390 while (bytes
|| !iov
->iov_len
) {
391 int copy
= min(bytes
, iov
->iov_len
);
395 if (iov
->iov_len
== base
) {
401 memcpy(new, iov
, sizeof(*iov
) * nr_segs
);
402 new->iov_base
+= base
;
403 new->iov_len
-= base
;
408 get_server_iovec(struct TCP_Server_Info
*server
, unsigned int nr_segs
)
410 struct kvec
*new_iov
;
412 if (server
->iov
&& nr_segs
<= server
->nr_iov
)
415 /* not big enough -- allocate a new one and release the old */
416 new_iov
= kmalloc(sizeof(*new_iov
) * nr_segs
, GFP_NOFS
);
419 server
->iov
= new_iov
;
420 server
->nr_iov
= nr_segs
;
426 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct kvec
*iov_orig
,
427 unsigned int nr_segs
, unsigned int to_read
)
432 struct msghdr smb_msg
;
435 iov
= get_server_iovec(server
, nr_segs
);
439 smb_msg
.msg_control
= NULL
;
440 smb_msg
.msg_controllen
= 0;
442 for (total_read
= 0; to_read
; total_read
+= length
, to_read
-= length
) {
443 if (server_unresponsive(server
)) {
444 total_read
= -EAGAIN
;
448 segs
= kvec_array_init(iov
, iov_orig
, nr_segs
, total_read
);
450 length
= kernel_recvmsg(server
->ssocket
, &smb_msg
,
451 iov
, segs
, to_read
, 0);
453 if (server
->tcpStatus
== CifsExiting
) {
454 total_read
= -ESHUTDOWN
;
456 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
457 cifs_reconnect(server
);
458 total_read
= -EAGAIN
;
460 } else if (length
== -ERESTARTSYS
||
464 * Minimum sleep to prevent looping, allowing socket
465 * to clear and app threads to set tcpStatus
466 * CifsNeedReconnect if server hung.
468 usleep_range(1000, 2000);
471 } else if (length
<= 0) {
472 cFYI(1, "Received no data or error: expecting %d "
473 "got %d", to_read
, length
);
474 cifs_reconnect(server
);
475 total_read
= -EAGAIN
;
483 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
484 unsigned int to_read
)
489 iov
.iov_len
= to_read
;
491 return cifs_readv_from_socket(server
, &iov
, 1, to_read
);
495 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
498 * The first byte big endian of the length field,
499 * is actually not part of the length but the type
500 * with the most common, zero, as regular data.
503 case RFC1002_SESSION_MESSAGE
:
504 /* Regular SMB response */
506 case RFC1002_SESSION_KEEP_ALIVE
:
507 cFYI(1, "RFC 1002 session keep alive");
509 case RFC1002_POSITIVE_SESSION_RESPONSE
:
510 cFYI(1, "RFC 1002 positive session response");
512 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
514 * We get this from Windows 98 instead of an error on
515 * SMB negprot response.
517 cFYI(1, "RFC 1002 negative session response");
518 /* give server a second to clean up */
521 * Always try 445 first on reconnect since we get NACK
522 * on some if we ever connected to port 139 (the NACK
523 * is since we do not begin with RFC1001 session
526 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
527 cifs_reconnect(server
);
528 wake_up(&server
->response_q
);
531 cERROR(1, "RFC 1002 unknown response type 0x%x", type
);
532 cifs_reconnect(server
);
538 static struct mid_q_entry
*
539 find_mid(struct TCP_Server_Info
*server
, struct smb_hdr
*buf
)
541 struct mid_q_entry
*mid
;
543 spin_lock(&GlobalMid_Lock
);
544 list_for_each_entry(mid
, &server
->pending_mid_q
, qhead
) {
545 if (mid
->mid
== buf
->Mid
&&
546 mid
->midState
== MID_REQUEST_SUBMITTED
&&
547 mid
->command
== buf
->Command
) {
548 spin_unlock(&GlobalMid_Lock
);
552 spin_unlock(&GlobalMid_Lock
);
557 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
559 #ifdef CONFIG_CIFS_STATS2
560 mid
->when_received
= jiffies
;
562 spin_lock(&GlobalMid_Lock
);
564 mid
->midState
= MID_RESPONSE_RECEIVED
;
566 mid
->midState
= MID_RESPONSE_MALFORMED
;
567 list_del_init(&mid
->qhead
);
568 spin_unlock(&GlobalMid_Lock
);
572 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
573 struct smb_hdr
*buf
, int malformed
)
575 if (malformed
== 0 && check2ndT2(buf
) > 0) {
576 mid
->multiRsp
= true;
578 /* merge response - fix up 1st*/
579 malformed
= coalesce_t2(buf
, mid
->resp_buf
);
583 /* All parts received or packet is malformed. */
584 mid
->multiEnd
= true;
585 return dequeue_mid(mid
, malformed
);
587 if (!server
->large_buf
) {
588 /*FIXME: switch to already allocated largebuf?*/
589 cERROR(1, "1st trans2 resp needs bigbuf");
591 /* Have first buffer */
593 mid
->largeBuf
= true;
594 server
->bigbuf
= NULL
;
599 mid
->largeBuf
= server
->large_buf
;
600 /* Was previous buf put in mpx struct for multi-rsp? */
601 if (!mid
->multiRsp
) {
602 /* smb buffer will be freed by user thread */
603 if (server
->large_buf
)
604 server
->bigbuf
= NULL
;
606 server
->smallbuf
= NULL
;
608 dequeue_mid(mid
, malformed
);
611 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
615 /* take it off the list, if it's not already */
616 spin_lock(&cifs_tcp_ses_lock
);
617 list_del_init(&server
->tcp_ses_list
);
618 spin_unlock(&cifs_tcp_ses_lock
);
620 spin_lock(&GlobalMid_Lock
);
621 server
->tcpStatus
= CifsExiting
;
622 spin_unlock(&GlobalMid_Lock
);
623 wake_up_all(&server
->response_q
);
626 * Check if we have blocked requests that need to free. Note that
627 * cifs_max_pending is normally 50, but can be set at module install
628 * time to as little as two.
630 spin_lock(&GlobalMid_Lock
);
631 if (atomic_read(&server
->inFlight
) >= cifs_max_pending
)
632 atomic_set(&server
->inFlight
, cifs_max_pending
- 1);
634 * We do not want to set the max_pending too low or we could end up
635 * with the counter going negative.
637 spin_unlock(&GlobalMid_Lock
);
639 * Although there should not be any requests blocked on this queue it
640 * can not hurt to be paranoid and try to wake up requests that may
641 * haven been blocked when more than 50 at time were on the wire to the
642 * same server - they now will see the session is in exit state and get
643 * out of SendReceive.
645 wake_up_all(&server
->request_q
);
646 /* give those requests time to exit */
649 if (server
->ssocket
) {
650 sock_release(server
->ssocket
);
651 server
->ssocket
= NULL
;
654 if (!list_empty(&server
->pending_mid_q
)) {
655 struct list_head dispose_list
;
656 struct mid_q_entry
*mid_entry
;
657 struct list_head
*tmp
, *tmp2
;
659 INIT_LIST_HEAD(&dispose_list
);
660 spin_lock(&GlobalMid_Lock
);
661 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
662 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
663 cFYI(1, "Clearing mid 0x%x", mid_entry
->mid
);
664 mid_entry
->midState
= MID_SHUTDOWN
;
665 list_move(&mid_entry
->qhead
, &dispose_list
);
667 spin_unlock(&GlobalMid_Lock
);
669 /* now walk dispose list and issue callbacks */
670 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
671 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
672 cFYI(1, "Callback mid 0x%x", mid_entry
->mid
);
673 list_del_init(&mid_entry
->qhead
);
674 mid_entry
->callback(mid_entry
);
676 /* 1/8th of sec is more than enough time for them to exit */
680 if (!list_empty(&server
->pending_mid_q
)) {
682 * mpx threads have not exited yet give them at least the smb
683 * send timeout time for long ops.
685 * Due to delays on oplock break requests, we need to wait at
686 * least 45 seconds before giving up on a request getting a
687 * response and going ahead and killing cifsd.
689 cFYI(1, "Wait for exit from demultiplex thread");
692 * If threads still have not exited they are probably never
693 * coming home not much else we can do but free the memory.
697 kfree(server
->hostname
);
701 length
= atomic_dec_return(&tcpSesAllocCount
);
703 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
708 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
711 char *buf
= server
->smallbuf
;
712 struct smb_hdr
*smb_buffer
= (struct smb_hdr
*)buf
;
713 unsigned int pdu_length
= be32_to_cpu(smb_buffer
->smb_buf_length
);
715 /* make sure this will fit in a large buffer */
716 if (pdu_length
> CIFSMaxBufSize
+ MAX_CIFS_HDR_SIZE
- 4) {
717 cERROR(1, "SMB response too long (%u bytes)",
719 cifs_reconnect(server
);
720 wake_up(&server
->response_q
);
724 /* switch to large buffer if too big for a small one */
725 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
726 server
->large_buf
= true;
727 memcpy(server
->bigbuf
, server
->smallbuf
, server
->total_read
);
728 buf
= server
->bigbuf
;
729 smb_buffer
= (struct smb_hdr
*)buf
;
732 /* now read the rest */
733 length
= cifs_read_from_socket(server
,
734 buf
+ sizeof(struct smb_hdr
) - 1,
735 pdu_length
- sizeof(struct smb_hdr
) + 1 + 4);
738 server
->total_read
+= length
;
740 dump_smb(smb_buffer
, server
->total_read
);
743 * We know that we received enough to get to the MID as we
744 * checked the pdu_length earlier. Now check to see
745 * if the rest of the header is OK. We borrow the length
746 * var for the rest of the loop to avoid a new stack var.
748 * 48 bytes is enough to display the header and a little bit
749 * into the payload for debugging purposes.
751 length
= checkSMB(smb_buffer
, smb_buffer
->Mid
, server
->total_read
);
753 cifs_dump_mem("Bad SMB: ", buf
,
754 min_t(unsigned int, server
->total_read
, 48));
757 handle_mid(mid
, server
, smb_buffer
, length
);
763 cifs_demultiplex_thread(void *p
)
766 struct TCP_Server_Info
*server
= p
;
767 unsigned int pdu_length
;
769 struct smb_hdr
*smb_buffer
= NULL
;
770 struct task_struct
*task_to_wake
= NULL
;
771 struct mid_q_entry
*mid_entry
;
773 current
->flags
|= PF_MEMALLOC
;
774 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current
));
776 length
= atomic_inc_return(&tcpSesAllocCount
);
778 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
782 while (server
->tcpStatus
!= CifsExiting
) {
786 if (!allocate_buffers(server
))
789 server
->large_buf
= false;
790 smb_buffer
= (struct smb_hdr
*)server
->smallbuf
;
791 buf
= server
->smallbuf
;
792 pdu_length
= 4; /* enough to get RFC1001 header */
794 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
797 server
->total_read
= length
;
800 * The right amount was read from socket - 4 bytes,
801 * so we can now interpret the length field.
803 pdu_length
= be32_to_cpu(smb_buffer
->smb_buf_length
);
805 cFYI(1, "RFC1002 header 0x%x", pdu_length
);
806 if (!is_smb_response(server
, buf
[0]))
809 /* make sure we have enough to get to the MID */
810 if (pdu_length
< sizeof(struct smb_hdr
) - 1 - 4) {
811 cERROR(1, "SMB response too short (%u bytes)",
813 cifs_reconnect(server
);
814 wake_up(&server
->response_q
);
818 /* read down to the MID */
819 length
= cifs_read_from_socket(server
, buf
+ 4,
820 sizeof(struct smb_hdr
) - 1 - 4);
823 server
->total_read
+= length
;
825 mid_entry
= find_mid(server
, smb_buffer
);
827 if (!mid_entry
|| !mid_entry
->receive
)
828 length
= standard_receive3(server
, mid_entry
);
830 length
= mid_entry
->receive(server
, mid_entry
);
835 if (server
->large_buf
) {
836 buf
= server
->bigbuf
;
837 smb_buffer
= (struct smb_hdr
*)buf
;
840 server
->lstrp
= jiffies
;
841 if (mid_entry
!= NULL
) {
842 if (!mid_entry
->multiRsp
|| mid_entry
->multiEnd
)
843 mid_entry
->callback(mid_entry
);
844 } else if (!is_valid_oplock_break(smb_buffer
, server
)) {
845 cERROR(1, "No task to wake, unknown frame received! "
846 "NumMids %d", atomic_read(&midCount
));
847 cifs_dump_mem("Received Data is: ", buf
,
848 sizeof(struct smb_hdr
));
849 #ifdef CONFIG_CIFS_DEBUG2
850 cifs_dump_detail(smb_buffer
);
851 cifs_dump_mids(server
);
852 #endif /* CIFS_DEBUG2 */
855 } /* end while !EXITING */
857 /* buffer usually freed in free_mid - need to free it here on exit */
858 cifs_buf_release(server
->bigbuf
);
859 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
860 cifs_small_buf_release(server
->smallbuf
);
862 task_to_wake
= xchg(&server
->tsk
, NULL
);
863 clean_demultiplex_info(server
);
865 /* if server->tsk was NULL then wait for a signal before exiting */
867 set_current_state(TASK_INTERRUPTIBLE
);
868 while (!signal_pending(current
)) {
870 set_current_state(TASK_INTERRUPTIBLE
);
872 set_current_state(TASK_RUNNING
);
875 module_put_and_exit(0);
878 /* extract the host portion of the UNC string */
880 extract_hostname(const char *unc
)
886 /* skip double chars at beginning of string */
887 /* BB: check validity of these bytes? */
890 /* delimiter between hostname and sharename is always '\\' now */
891 delim
= strchr(src
, '\\');
893 return ERR_PTR(-EINVAL
);
896 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
898 return ERR_PTR(-ENOMEM
);
900 memcpy(dst
, src
, len
);
907 cifs_parse_mount_options(const char *mountdata
, const char *devname
,
910 char *value
, *data
, *end
;
911 char *mountdata_copy
= NULL
, *options
;
913 unsigned int temp_len
, i
, j
;
915 short int override_uid
= -1;
916 short int override_gid
= -1;
917 bool uid_specified
= false;
918 bool gid_specified
= false;
919 char *nodename
= utsname()->nodename
;
925 * does not have to be perfect mapping since field is
926 * informational, only used for servers that do not support
927 * port 445 and it can be overridden at mount time
929 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
930 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
931 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
933 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
934 /* null target name indicates to use *SMBSERVR default called name
935 if we end up sending RFC1001 session initialize */
936 vol
->target_rfc1001_name
[0] = 0;
937 vol
->cred_uid
= current_uid();
938 vol
->linux_uid
= current_uid();
939 vol
->linux_gid
= current_gid();
941 /* default to only allowing write access to owner of the mount */
942 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
944 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
945 /* default is always to request posix paths. */
946 vol
->posix_paths
= 1;
947 /* default to using server inode numbers where available */
950 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
953 goto cifs_parse_mount_err
;
955 mountdata_copy
= kstrndup(mountdata
, PAGE_SIZE
, GFP_KERNEL
);
957 goto cifs_parse_mount_err
;
959 options
= mountdata_copy
;
960 end
= options
+ strlen(options
);
961 if (strncmp(options
, "sep=", 4) == 0) {
962 if (options
[4] != 0) {
963 separator
[0] = options
[4];
966 cFYI(1, "Null separator not allowed");
969 vol
->backupuid_specified
= false; /* no backup intent for a user */
970 vol
->backupgid_specified
= false; /* no backup intent for a group */
972 while ((data
= strsep(&options
, separator
)) != NULL
) {
975 if ((value
= strchr(data
, '=')) != NULL
)
978 /* Have to parse this before we parse for "user" */
979 if (strnicmp(data
, "user_xattr", 10) == 0) {
981 } else if (strnicmp(data
, "nouser_xattr", 12) == 0) {
983 } else if (strnicmp(data
, "user", 4) == 0) {
986 "CIFS: invalid or missing username\n");
987 goto cifs_parse_mount_err
;
988 } else if (!*value
) {
989 /* null user, ie anonymous, authentication */
992 if (strnlen(value
, MAX_USERNAME_SIZE
) <
994 vol
->username
= kstrdup(value
, GFP_KERNEL
);
995 if (!vol
->username
) {
996 printk(KERN_WARNING
"CIFS: no memory "
998 goto cifs_parse_mount_err
;
1001 printk(KERN_WARNING
"CIFS: username too long\n");
1002 goto cifs_parse_mount_err
;
1004 } else if (strnicmp(data
, "pass", 4) == 0) {
1006 vol
->password
= NULL
;
1008 } else if (value
[0] == 0) {
1009 /* check if string begins with double comma
1010 since that would mean the password really
1011 does start with a comma, and would not
1012 indicate an empty string */
1013 if (value
[1] != separator
[0]) {
1014 vol
->password
= NULL
;
1018 temp_len
= strlen(value
);
1019 /* removed password length check, NTLM passwords
1020 can be arbitrarily long */
1022 /* if comma in password, the string will be
1023 prematurely null terminated. Commas in password are
1024 specified across the cifs mount interface by a double
1025 comma ie ,, and a comma used as in other cases ie ','
1026 as a parameter delimiter/separator is single and due
1027 to the strsep above is temporarily zeroed. */
1029 /* NB: password legally can have multiple commas and
1030 the only illegal character in a password is null */
1032 if ((value
[temp_len
] == 0) &&
1033 (value
+ temp_len
< end
) &&
1034 (value
[temp_len
+1] == separator
[0])) {
1035 /* reinsert comma */
1036 value
[temp_len
] = separator
[0];
1037 temp_len
+= 2; /* move after second comma */
1038 while (value
[temp_len
] != 0) {
1039 if (value
[temp_len
] == separator
[0]) {
1040 if (value
[temp_len
+1] ==
1042 /* skip second comma */
1045 /* single comma indicating start
1052 if (value
[temp_len
] == 0) {
1055 value
[temp_len
] = 0;
1056 /* point option to start of next parm */
1057 options
= value
+ temp_len
+ 1;
1059 /* go from value to value + temp_len condensing
1060 double commas to singles. Note that this ends up
1061 allocating a few bytes too many, which is ok */
1062 vol
->password
= kzalloc(temp_len
, GFP_KERNEL
);
1063 if (vol
->password
== NULL
) {
1064 printk(KERN_WARNING
"CIFS: no memory "
1066 goto cifs_parse_mount_err
;
1068 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
1069 vol
->password
[j
] = value
[i
];
1070 if (value
[i
] == separator
[0]
1071 && value
[i
+1] == separator
[0]) {
1072 /* skip second comma */
1076 vol
->password
[j
] = 0;
1078 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
1079 if (vol
->password
== NULL
) {
1080 printk(KERN_WARNING
"CIFS: no memory "
1082 goto cifs_parse_mount_err
;
1084 strcpy(vol
->password
, value
);
1086 } else if (!strnicmp(data
, "ip", 2) ||
1087 !strnicmp(data
, "addr", 4)) {
1088 if (!value
|| !*value
) {
1090 } else if (strnlen(value
, INET6_ADDRSTRLEN
) <
1092 vol
->UNCip
= kstrdup(value
, GFP_KERNEL
);
1094 printk(KERN_WARNING
"CIFS: no memory "
1096 goto cifs_parse_mount_err
;
1099 printk(KERN_WARNING
"CIFS: ip address "
1101 goto cifs_parse_mount_err
;
1103 } else if (strnicmp(data
, "sec", 3) == 0) {
1104 if (!value
|| !*value
) {
1105 cERROR(1, "no security value specified");
1107 } else if (strnicmp(value
, "krb5i", 5) == 0) {
1108 vol
->secFlg
|= CIFSSEC_MAY_KRB5
|
1110 } else if (strnicmp(value
, "krb5p", 5) == 0) {
1111 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
1112 CIFSSEC_MAY_KRB5; */
1113 cERROR(1, "Krb5 cifs privacy not supported");
1114 goto cifs_parse_mount_err
;
1115 } else if (strnicmp(value
, "krb5", 4) == 0) {
1116 vol
->secFlg
|= CIFSSEC_MAY_KRB5
;
1117 } else if (strnicmp(value
, "ntlmsspi", 8) == 0) {
1118 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
|
1120 } else if (strnicmp(value
, "ntlmssp", 7) == 0) {
1121 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
;
1122 } else if (strnicmp(value
, "ntlmv2i", 7) == 0) {
1123 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
|
1125 } else if (strnicmp(value
, "ntlmv2", 6) == 0) {
1126 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1127 } else if (strnicmp(value
, "ntlmi", 5) == 0) {
1128 vol
->secFlg
|= CIFSSEC_MAY_NTLM
|
1130 } else if (strnicmp(value
, "ntlm", 4) == 0) {
1131 /* ntlm is default so can be turned off too */
1132 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1133 } else if (strnicmp(value
, "nontlm", 6) == 0) {
1134 /* BB is there a better way to do this? */
1135 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1136 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1137 } else if (strnicmp(value
, "lanman", 6) == 0) {
1138 vol
->secFlg
|= CIFSSEC_MAY_LANMAN
;
1140 } else if (strnicmp(value
, "none", 4) == 0) {
1143 cERROR(1, "bad security option: %s", value
);
1144 goto cifs_parse_mount_err
;
1146 } else if (strnicmp(data
, "vers", 3) == 0) {
1147 if (!value
|| !*value
) {
1148 cERROR(1, "no protocol version specified"
1149 " after vers= mount option");
1150 } else if ((strnicmp(value
, "cifs", 4) == 0) ||
1151 (strnicmp(value
, "1", 1) == 0)) {
1152 /* this is the default */
1155 } else if ((strnicmp(data
, "unc", 3) == 0)
1156 || (strnicmp(data
, "target", 6) == 0)
1157 || (strnicmp(data
, "path", 4) == 0)) {
1158 if (!value
|| !*value
) {
1159 printk(KERN_WARNING
"CIFS: invalid path to "
1160 "network resource\n");
1161 goto cifs_parse_mount_err
;
1163 if ((temp_len
= strnlen(value
, 300)) < 300) {
1164 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1165 if (vol
->UNC
== NULL
)
1166 goto cifs_parse_mount_err
;
1167 strcpy(vol
->UNC
, value
);
1168 if (strncmp(vol
->UNC
, "//", 2) == 0) {
1171 } else if (strncmp(vol
->UNC
, "\\\\", 2) != 0) {
1173 "CIFS: UNC Path does not begin "
1174 "with // or \\\\ \n");
1175 goto cifs_parse_mount_err
;
1178 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1179 goto cifs_parse_mount_err
;
1181 } else if ((strnicmp(data
, "domain", 3) == 0)
1182 || (strnicmp(data
, "workgroup", 5) == 0)) {
1183 if (!value
|| !*value
) {
1184 printk(KERN_WARNING
"CIFS: invalid domain name\n");
1185 goto cifs_parse_mount_err
;
1187 /* BB are there cases in which a comma can be valid in
1188 a domain name and need special handling? */
1189 if (strnlen(value
, 256) < 256) {
1190 vol
->domainname
= kstrdup(value
, GFP_KERNEL
);
1191 if (!vol
->domainname
) {
1192 printk(KERN_WARNING
"CIFS: no memory "
1193 "for domainname\n");
1194 goto cifs_parse_mount_err
;
1196 cFYI(1, "Domain name set");
1198 printk(KERN_WARNING
"CIFS: domain name too "
1200 goto cifs_parse_mount_err
;
1202 } else if (strnicmp(data
, "srcaddr", 7) == 0) {
1203 vol
->srcaddr
.ss_family
= AF_UNSPEC
;
1205 if (!value
|| !*value
) {
1206 printk(KERN_WARNING
"CIFS: srcaddr value"
1207 " not specified.\n");
1208 goto cifs_parse_mount_err
;
1210 i
= cifs_convert_address((struct sockaddr
*)&vol
->srcaddr
,
1211 value
, strlen(value
));
1213 printk(KERN_WARNING
"CIFS: Could not parse"
1216 goto cifs_parse_mount_err
;
1218 } else if (strnicmp(data
, "prefixpath", 10) == 0) {
1219 if (!value
|| !*value
) {
1221 "CIFS: invalid path prefix\n");
1222 goto cifs_parse_mount_err
;
1224 if ((temp_len
= strnlen(value
, 1024)) < 1024) {
1225 if (value
[0] != '/')
1226 temp_len
++; /* missing leading slash */
1227 vol
->prepath
= kmalloc(temp_len
+1, GFP_KERNEL
);
1228 if (vol
->prepath
== NULL
)
1229 goto cifs_parse_mount_err
;
1230 if (value
[0] != '/') {
1231 vol
->prepath
[0] = '/';
1232 strcpy(vol
->prepath
+1, value
);
1234 strcpy(vol
->prepath
, value
);
1235 cFYI(1, "prefix path %s", vol
->prepath
);
1237 printk(KERN_WARNING
"CIFS: prefix too long\n");
1238 goto cifs_parse_mount_err
;
1240 } else if (strnicmp(data
, "iocharset", 9) == 0) {
1241 if (!value
|| !*value
) {
1242 printk(KERN_WARNING
"CIFS: invalid iocharset "
1244 goto cifs_parse_mount_err
;
1246 if (strnlen(value
, 65) < 65) {
1247 if (strnicmp(value
, "default", 7)) {
1248 vol
->iocharset
= kstrdup(value
,
1251 if (!vol
->iocharset
) {
1252 printk(KERN_WARNING
"CIFS: no "
1255 goto cifs_parse_mount_err
;
1258 /* if iocharset not set then load_nls_default
1259 is used by caller */
1260 cFYI(1, "iocharset set to %s", value
);
1262 printk(KERN_WARNING
"CIFS: iocharset name "
1264 goto cifs_parse_mount_err
;
1266 } else if (!strnicmp(data
, "uid", 3) && value
&& *value
) {
1267 vol
->linux_uid
= simple_strtoul(value
, &value
, 0);
1268 uid_specified
= true;
1269 } else if (!strnicmp(data
, "cruid", 5) && value
&& *value
) {
1270 vol
->cred_uid
= simple_strtoul(value
, &value
, 0);
1271 } else if (!strnicmp(data
, "forceuid", 8)) {
1273 } else if (!strnicmp(data
, "noforceuid", 10)) {
1275 } else if (!strnicmp(data
, "gid", 3) && value
&& *value
) {
1276 vol
->linux_gid
= simple_strtoul(value
, &value
, 0);
1277 gid_specified
= true;
1278 } else if (!strnicmp(data
, "forcegid", 8)) {
1280 } else if (!strnicmp(data
, "noforcegid", 10)) {
1282 } else if (strnicmp(data
, "file_mode", 4) == 0) {
1283 if (value
&& *value
) {
1285 simple_strtoul(value
, &value
, 0);
1287 } else if (strnicmp(data
, "dir_mode", 4) == 0) {
1288 if (value
&& *value
) {
1290 simple_strtoul(value
, &value
, 0);
1292 } else if (strnicmp(data
, "dirmode", 4) == 0) {
1293 if (value
&& *value
) {
1295 simple_strtoul(value
, &value
, 0);
1297 } else if (strnicmp(data
, "port", 4) == 0) {
1298 if (value
&& *value
) {
1300 simple_strtoul(value
, &value
, 0);
1302 } else if (strnicmp(data
, "rsize", 5) == 0) {
1303 if (value
&& *value
) {
1305 simple_strtoul(value
, &value
, 0);
1307 } else if (strnicmp(data
, "wsize", 5) == 0) {
1308 if (value
&& *value
) {
1310 simple_strtoul(value
, &value
, 0);
1312 } else if (strnicmp(data
, "sockopt", 5) == 0) {
1313 if (!value
|| !*value
) {
1314 cERROR(1, "no socket option specified");
1316 } else if (strnicmp(value
, "TCP_NODELAY", 11) == 0) {
1317 vol
->sockopt_tcp_nodelay
= 1;
1319 } else if (strnicmp(data
, "netbiosname", 4) == 0) {
1320 if (!value
|| !*value
|| (*value
== ' ')) {
1321 cFYI(1, "invalid (empty) netbiosname");
1323 memset(vol
->source_rfc1001_name
, 0x20,
1326 * FIXME: are there cases in which a comma can
1327 * be valid in workstation netbios name (and
1328 * need special handling)?
1330 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1331 /* don't ucase netbiosname for user */
1334 vol
->source_rfc1001_name
[i
] = value
[i
];
1336 /* The string has 16th byte zero still from
1337 set at top of the function */
1338 if (i
== RFC1001_NAME_LEN
&& value
[i
] != 0)
1339 printk(KERN_WARNING
"CIFS: netbiosname"
1340 " longer than 15 truncated.\n");
1342 } else if (strnicmp(data
, "servern", 7) == 0) {
1343 /* servernetbiosname specified override *SMBSERVER */
1344 if (!value
|| !*value
|| (*value
== ' ')) {
1345 cFYI(1, "empty server netbiosname specified");
1347 /* last byte, type, is 0x20 for servr type */
1348 memset(vol
->target_rfc1001_name
, 0x20,
1349 RFC1001_NAME_LEN_WITH_NULL
);
1351 for (i
= 0; i
< 15; i
++) {
1352 /* BB are there cases in which a comma can be
1353 valid in this workstation netbios name
1354 (and need special handling)? */
1356 /* user or mount helper must uppercase
1361 vol
->target_rfc1001_name
[i
] =
1364 /* The string has 16th byte zero still from
1365 set at top of the function */
1366 if (i
== RFC1001_NAME_LEN
&& value
[i
] != 0)
1367 printk(KERN_WARNING
"CIFS: server net"
1368 "biosname longer than 15 truncated.\n");
1370 } else if (strnicmp(data
, "actimeo", 7) == 0) {
1371 if (value
&& *value
) {
1372 vol
->actimeo
= HZ
* simple_strtoul(value
,
1374 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1375 cERROR(1, "CIFS: attribute cache"
1376 "timeout too large");
1377 goto cifs_parse_mount_err
;
1380 } else if (strnicmp(data
, "credentials", 4) == 0) {
1382 } else if (strnicmp(data
, "version", 3) == 0) {
1384 } else if (strnicmp(data
, "guest", 5) == 0) {
1386 } else if (strnicmp(data
, "rw", 2) == 0 && strlen(data
) == 2) {
1388 } else if (strnicmp(data
, "ro", 2) == 0) {
1390 } else if (strnicmp(data
, "noblocksend", 11) == 0) {
1391 vol
->noblocksnd
= 1;
1392 } else if (strnicmp(data
, "noautotune", 10) == 0) {
1393 vol
->noautotune
= 1;
1394 } else if ((strnicmp(data
, "suid", 4) == 0) ||
1395 (strnicmp(data
, "nosuid", 6) == 0) ||
1396 (strnicmp(data
, "exec", 4) == 0) ||
1397 (strnicmp(data
, "noexec", 6) == 0) ||
1398 (strnicmp(data
, "nodev", 5) == 0) ||
1399 (strnicmp(data
, "noauto", 6) == 0) ||
1400 (strnicmp(data
, "dev", 3) == 0)) {
1401 /* The mount tool or mount.cifs helper (if present)
1402 uses these opts to set flags, and the flags are read
1403 by the kernel vfs layer before we get here (ie
1404 before read super) so there is no point trying to
1405 parse these options again and set anything and it
1406 is ok to just ignore them */
1408 } else if (strnicmp(data
, "hard", 4) == 0) {
1410 } else if (strnicmp(data
, "soft", 4) == 0) {
1412 } else if (strnicmp(data
, "perm", 4) == 0) {
1414 } else if (strnicmp(data
, "noperm", 6) == 0) {
1416 } else if (strnicmp(data
, "mapchars", 8) == 0) {
1418 } else if (strnicmp(data
, "nomapchars", 10) == 0) {
1420 } else if (strnicmp(data
, "sfu", 3) == 0) {
1422 } else if (strnicmp(data
, "nosfu", 5) == 0) {
1424 } else if (strnicmp(data
, "nodfs", 5) == 0) {
1426 } else if (strnicmp(data
, "posixpaths", 10) == 0) {
1427 vol
->posix_paths
= 1;
1428 } else if (strnicmp(data
, "noposixpaths", 12) == 0) {
1429 vol
->posix_paths
= 0;
1430 } else if (strnicmp(data
, "nounix", 6) == 0) {
1431 vol
->no_linux_ext
= 1;
1432 } else if (strnicmp(data
, "nolinux", 7) == 0) {
1433 vol
->no_linux_ext
= 1;
1434 } else if ((strnicmp(data
, "nocase", 6) == 0) ||
1435 (strnicmp(data
, "ignorecase", 10) == 0)) {
1437 } else if (strnicmp(data
, "mand", 4) == 0) {
1439 } else if (strnicmp(data
, "nomand", 6) == 0) {
1441 } else if (strnicmp(data
, "_netdev", 7) == 0) {
1443 } else if (strnicmp(data
, "brl", 3) == 0) {
1445 } else if ((strnicmp(data
, "nobrl", 5) == 0) ||
1446 (strnicmp(data
, "nolock", 6) == 0)) {
1448 /* turn off mandatory locking in mode
1449 if remote locking is turned off since the
1450 local vfs will do advisory */
1451 if (vol
->file_mode
==
1452 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1453 vol
->file_mode
= S_IALLUGO
;
1454 } else if (strnicmp(data
, "forcemandatorylock", 9) == 0) {
1455 /* will take the shorter form "forcemand" as well */
1456 /* This mount option will force use of mandatory
1457 (DOS/Windows style) byte range locks, instead of
1458 using posix advisory byte range locks, even if the
1459 Unix extensions are available and posix locks would
1460 be supported otherwise. If Unix extensions are not
1461 negotiated this has no effect since mandatory locks
1462 would be used (mandatory locks is all that those
1463 those servers support) */
1465 } else if (strnicmp(data
, "setuids", 7) == 0) {
1467 } else if (strnicmp(data
, "nosetuids", 9) == 0) {
1469 } else if (strnicmp(data
, "dynperm", 7) == 0) {
1470 vol
->dynperm
= true;
1471 } else if (strnicmp(data
, "nodynperm", 9) == 0) {
1472 vol
->dynperm
= false;
1473 } else if (strnicmp(data
, "nohard", 6) == 0) {
1475 } else if (strnicmp(data
, "nosoft", 6) == 0) {
1477 } else if (strnicmp(data
, "nointr", 6) == 0) {
1479 } else if (strnicmp(data
, "intr", 4) == 0) {
1481 } else if (strnicmp(data
, "nostrictsync", 12) == 0) {
1482 vol
->nostrictsync
= 1;
1483 } else if (strnicmp(data
, "strictsync", 10) == 0) {
1484 vol
->nostrictsync
= 0;
1485 } else if (strnicmp(data
, "serverino", 7) == 0) {
1486 vol
->server_ino
= 1;
1487 } else if (strnicmp(data
, "noserverino", 9) == 0) {
1488 vol
->server_ino
= 0;
1489 } else if (strnicmp(data
, "rwpidforward", 12) == 0) {
1490 vol
->rwpidforward
= 1;
1491 } else if (strnicmp(data
, "cifsacl", 7) == 0) {
1493 } else if (strnicmp(data
, "nocifsacl", 9) == 0) {
1495 } else if (strnicmp(data
, "acl", 3) == 0) {
1496 vol
->no_psx_acl
= 0;
1497 } else if (strnicmp(data
, "noacl", 5) == 0) {
1498 vol
->no_psx_acl
= 1;
1499 } else if (strnicmp(data
, "locallease", 6) == 0) {
1500 vol
->local_lease
= 1;
1501 } else if (strnicmp(data
, "sign", 4) == 0) {
1502 vol
->secFlg
|= CIFSSEC_MUST_SIGN
;
1503 } else if (strnicmp(data
, "seal", 4) == 0) {
1504 /* we do not do the following in secFlags because seal
1505 is a per tree connection (mount) not a per socket
1506 or per-smb connection option in the protocol */
1507 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1509 } else if (strnicmp(data
, "direct", 6) == 0) {
1511 } else if (strnicmp(data
, "forcedirectio", 13) == 0) {
1513 } else if (strnicmp(data
, "strictcache", 11) == 0) {
1515 } else if (strnicmp(data
, "noac", 4) == 0) {
1516 printk(KERN_WARNING
"CIFS: Mount option noac not "
1517 "supported. Instead set "
1518 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1519 } else if (strnicmp(data
, "fsc", 3) == 0) {
1520 #ifndef CONFIG_CIFS_FSCACHE
1521 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1522 "kernel config option set");
1523 goto cifs_parse_mount_err
;
1526 } else if (strnicmp(data
, "mfsymlinks", 10) == 0) {
1527 vol
->mfsymlinks
= true;
1528 } else if (strnicmp(data
, "multiuser", 8) == 0) {
1529 vol
->multiuser
= true;
1530 } else if (!strnicmp(data
, "backupuid", 9) && value
&& *value
) {
1531 err
= kstrtouint(value
, 0, &vol
->backupuid
);
1533 cERROR(1, "%s: Invalid backupuid value",
1535 goto cifs_parse_mount_err
;
1537 vol
->backupuid_specified
= true;
1538 } else if (!strnicmp(data
, "backupgid", 9) && value
&& *value
) {
1539 err
= kstrtouint(value
, 0, &vol
->backupgid
);
1541 cERROR(1, "%s: Invalid backupgid value",
1543 goto cifs_parse_mount_err
;
1545 vol
->backupgid_specified
= true;
1547 printk(KERN_WARNING
"CIFS: Unknown mount option %s\n",
1550 if (vol
->UNC
== NULL
) {
1551 if (devname
== NULL
) {
1552 printk(KERN_WARNING
"CIFS: Missing UNC name for mount "
1554 goto cifs_parse_mount_err
;
1556 if ((temp_len
= strnlen(devname
, 300)) < 300) {
1557 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1558 if (vol
->UNC
== NULL
)
1559 goto cifs_parse_mount_err
;
1560 strcpy(vol
->UNC
, devname
);
1561 if (strncmp(vol
->UNC
, "//", 2) == 0) {
1564 } else if (strncmp(vol
->UNC
, "\\\\", 2) != 0) {
1565 printk(KERN_WARNING
"CIFS: UNC Path does not "
1566 "begin with // or \\\\ \n");
1567 goto cifs_parse_mount_err
;
1569 value
= strpbrk(vol
->UNC
+2, "/\\");
1573 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1574 goto cifs_parse_mount_err
;
1578 if (vol
->multiuser
&& !(vol
->secFlg
& CIFSSEC_MAY_KRB5
)) {
1579 cERROR(1, "Multiuser mounts currently require krb5 "
1581 goto cifs_parse_mount_err
;
1584 if (vol
->UNCip
== NULL
)
1585 vol
->UNCip
= &vol
->UNC
[2];
1588 vol
->override_uid
= override_uid
;
1589 else if (override_uid
== 1)
1590 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1591 "specified with no uid= option.\n");
1594 vol
->override_gid
= override_gid
;
1595 else if (override_gid
== 1)
1596 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1597 "specified with no gid= option.\n");
1599 kfree(mountdata_copy
);
1602 cifs_parse_mount_err
:
1603 kfree(mountdata_copy
);
1607 /** Returns true if srcaddr isn't specified and rhs isn't
1608 * specified, or if srcaddr is specified and
1609 * matches the IP address of the rhs argument.
1612 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1614 switch (srcaddr
->sa_family
) {
1616 return (rhs
->sa_family
== AF_UNSPEC
);
1618 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1619 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1620 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1623 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1624 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)&rhs
;
1625 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1629 return false; /* don't expect to be here */
1634 * If no port is specified in addr structure, we try to match with 445 port
1635 * and if it fails - with 139 ports. It should be called only if address
1636 * families of server and addr are equal.
1639 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1641 __be16 port
, *sport
;
1643 switch (addr
->sa_family
) {
1645 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1646 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1649 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1650 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
1658 port
= htons(CIFS_PORT
);
1662 port
= htons(RFC1001_PORT
);
1665 return port
== *sport
;
1669 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1670 struct sockaddr
*srcaddr
)
1672 switch (addr
->sa_family
) {
1674 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
1675 struct sockaddr_in
*srv_addr4
=
1676 (struct sockaddr_in
*)&server
->dstaddr
;
1678 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
1683 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
1684 struct sockaddr_in6
*srv_addr6
=
1685 (struct sockaddr_in6
*)&server
->dstaddr
;
1687 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
1688 &srv_addr6
->sin6_addr
))
1690 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
1696 return false; /* don't expect to be here */
1699 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
1706 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
1708 unsigned int secFlags
;
1710 if (vol
->secFlg
& (~(CIFSSEC_MUST_SIGN
| CIFSSEC_MUST_SEAL
)))
1711 secFlags
= vol
->secFlg
;
1713 secFlags
= global_secflags
| vol
->secFlg
;
1715 switch (server
->secType
) {
1717 if (!(secFlags
& (CIFSSEC_MAY_LANMAN
|CIFSSEC_MAY_PLNTXT
)))
1721 if (!(secFlags
& CIFSSEC_MAY_NTLMV2
))
1725 if (!(secFlags
& CIFSSEC_MAY_NTLM
))
1729 if (!(secFlags
& CIFSSEC_MAY_KRB5
))
1733 if (!(secFlags
& CIFSSEC_MAY_NTLMSSP
))
1737 /* shouldn't happen */
1741 /* now check if signing mode is acceptable */
1742 if ((secFlags
& CIFSSEC_MAY_SIGN
) == 0 &&
1743 (server
->sec_mode
& SECMODE_SIGN_REQUIRED
))
1745 else if (((secFlags
& CIFSSEC_MUST_SIGN
) == CIFSSEC_MUST_SIGN
) &&
1747 (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
)) == 0)
1753 static int match_server(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1754 struct smb_vol
*vol
)
1756 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
1759 if (!match_address(server
, addr
,
1760 (struct sockaddr
*)&vol
->srcaddr
))
1763 if (!match_port(server
, addr
))
1766 if (!match_security(server
, vol
))
1772 static struct TCP_Server_Info
*
1773 cifs_find_tcp_session(struct sockaddr
*addr
, struct smb_vol
*vol
)
1775 struct TCP_Server_Info
*server
;
1777 spin_lock(&cifs_tcp_ses_lock
);
1778 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
1779 if (!match_server(server
, addr
, vol
))
1782 ++server
->srv_count
;
1783 spin_unlock(&cifs_tcp_ses_lock
);
1784 cFYI(1, "Existing tcp session with server found");
1787 spin_unlock(&cifs_tcp_ses_lock
);
1792 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
1794 struct task_struct
*task
;
1796 spin_lock(&cifs_tcp_ses_lock
);
1797 if (--server
->srv_count
> 0) {
1798 spin_unlock(&cifs_tcp_ses_lock
);
1802 put_net(cifs_net_ns(server
));
1804 list_del_init(&server
->tcp_ses_list
);
1805 spin_unlock(&cifs_tcp_ses_lock
);
1807 cancel_delayed_work_sync(&server
->echo
);
1809 spin_lock(&GlobalMid_Lock
);
1810 server
->tcpStatus
= CifsExiting
;
1811 spin_unlock(&GlobalMid_Lock
);
1813 cifs_crypto_shash_release(server
);
1814 cifs_fscache_release_client_cookie(server
);
1816 kfree(server
->session_key
.response
);
1817 server
->session_key
.response
= NULL
;
1818 server
->session_key
.len
= 0;
1820 task
= xchg(&server
->tsk
, NULL
);
1822 force_sig(SIGKILL
, task
);
1825 static struct TCP_Server_Info
*
1826 cifs_get_tcp_session(struct smb_vol
*volume_info
)
1828 struct TCP_Server_Info
*tcp_ses
= NULL
;
1829 struct sockaddr_storage addr
;
1830 struct sockaddr_in
*sin_server
= (struct sockaddr_in
*) &addr
;
1831 struct sockaddr_in6
*sin_server6
= (struct sockaddr_in6
*) &addr
;
1834 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
1836 cFYI(1, "UNC: %s ip: %s", volume_info
->UNC
, volume_info
->UNCip
);
1838 if (volume_info
->UNCip
&& volume_info
->UNC
) {
1839 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
1841 strlen(volume_info
->UNCip
),
1844 /* we failed translating address */
1848 } else if (volume_info
->UNCip
) {
1849 /* BB using ip addr as tcp_ses name to connect to the
1851 cERROR(1, "Connecting to DFS root not implemented yet");
1854 } else /* which tcp_sess DFS root would we conect to */ {
1855 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1856 "unc=//192.168.1.100/public) specified");
1861 /* see if we already have a matching tcp_ses */
1862 tcp_ses
= cifs_find_tcp_session((struct sockaddr
*)&addr
, volume_info
);
1866 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
1872 rc
= cifs_crypto_shash_allocate(tcp_ses
);
1874 cERROR(1, "could not setup hash structures rc %d", rc
);
1878 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
1879 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
1880 if (IS_ERR(tcp_ses
->hostname
)) {
1881 rc
= PTR_ERR(tcp_ses
->hostname
);
1882 goto out_err_crypto_release
;
1885 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
1886 tcp_ses
->noautotune
= volume_info
->noautotune
;
1887 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
1888 atomic_set(&tcp_ses
->inFlight
, 0);
1889 init_waitqueue_head(&tcp_ses
->response_q
);
1890 init_waitqueue_head(&tcp_ses
->request_q
);
1891 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
1892 mutex_init(&tcp_ses
->srv_mutex
);
1893 memcpy(tcp_ses
->workstation_RFC1001_name
,
1894 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1895 memcpy(tcp_ses
->server_RFC1001_name
,
1896 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1897 tcp_ses
->session_estab
= false;
1898 tcp_ses
->sequence_number
= 0;
1899 tcp_ses
->lstrp
= jiffies
;
1900 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
1901 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
1902 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
1905 * at this point we are the only ones with the pointer
1906 * to the struct since the kernel thread not created yet
1907 * no need to spinlock this init of tcpStatus or srv_count
1909 tcp_ses
->tcpStatus
= CifsNew
;
1910 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
1911 sizeof(tcp_ses
->srcaddr
));
1912 ++tcp_ses
->srv_count
;
1914 if (addr
.ss_family
== AF_INET6
) {
1915 cFYI(1, "attempting ipv6 connect");
1916 /* BB should we allow ipv6 on port 139? */
1917 /* other OS never observed in Wild doing 139 with v6 */
1918 memcpy(&tcp_ses
->dstaddr
, sin_server6
,
1919 sizeof(struct sockaddr_in6
));
1921 memcpy(&tcp_ses
->dstaddr
, sin_server
,
1922 sizeof(struct sockaddr_in
));
1924 rc
= ip_connect(tcp_ses
);
1926 cERROR(1, "Error connecting to socket. Aborting operation");
1927 goto out_err_crypto_release
;
1931 * since we're in a cifs function already, we know that
1932 * this will succeed. No need for try_module_get().
1934 __module_get(THIS_MODULE
);
1935 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
1937 if (IS_ERR(tcp_ses
->tsk
)) {
1938 rc
= PTR_ERR(tcp_ses
->tsk
);
1939 cERROR(1, "error %d create cifsd thread", rc
);
1940 module_put(THIS_MODULE
);
1941 goto out_err_crypto_release
;
1943 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
1945 /* thread spawned, put it on the list */
1946 spin_lock(&cifs_tcp_ses_lock
);
1947 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
1948 spin_unlock(&cifs_tcp_ses_lock
);
1950 cifs_fscache_get_client_cookie(tcp_ses
);
1952 /* queue echo request delayed work */
1953 queue_delayed_work(system_nrt_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
1957 out_err_crypto_release
:
1958 cifs_crypto_shash_release(tcp_ses
);
1960 put_net(cifs_net_ns(tcp_ses
));
1964 if (!IS_ERR(tcp_ses
->hostname
))
1965 kfree(tcp_ses
->hostname
);
1966 if (tcp_ses
->ssocket
)
1967 sock_release(tcp_ses
->ssocket
);
1973 static int match_session(struct cifs_ses
*ses
, struct smb_vol
*vol
)
1975 switch (ses
->server
->secType
) {
1977 if (vol
->cred_uid
!= ses
->cred_uid
)
1981 /* anything else takes username/password */
1982 if (ses
->user_name
== NULL
)
1984 if (strncmp(ses
->user_name
, vol
->username
,
1987 if (strlen(vol
->username
) != 0 &&
1988 ses
->password
!= NULL
&&
1989 strncmp(ses
->password
,
1990 vol
->password
? vol
->password
: "",
1997 static struct cifs_ses
*
1998 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
2000 struct cifs_ses
*ses
;
2002 spin_lock(&cifs_tcp_ses_lock
);
2003 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
2004 if (!match_session(ses
, vol
))
2007 spin_unlock(&cifs_tcp_ses_lock
);
2010 spin_unlock(&cifs_tcp_ses_lock
);
2015 cifs_put_smb_ses(struct cifs_ses
*ses
)
2018 struct TCP_Server_Info
*server
= ses
->server
;
2020 cFYI(1, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
2021 spin_lock(&cifs_tcp_ses_lock
);
2022 if (--ses
->ses_count
> 0) {
2023 spin_unlock(&cifs_tcp_ses_lock
);
2027 list_del_init(&ses
->smb_ses_list
);
2028 spin_unlock(&cifs_tcp_ses_lock
);
2030 if (ses
->status
== CifsGood
) {
2032 CIFSSMBLogoff(xid
, ses
);
2036 cifs_put_tcp_session(server
);
2039 static bool warned_on_ntlm
; /* globals init to false automatically */
2041 static struct cifs_ses
*
2042 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
2044 int rc
= -ENOMEM
, xid
;
2045 struct cifs_ses
*ses
;
2046 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2047 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2051 ses
= cifs_find_smb_ses(server
, volume_info
);
2053 cFYI(1, "Existing smb sess found (status=%d)", ses
->status
);
2055 mutex_lock(&ses
->session_mutex
);
2056 rc
= cifs_negotiate_protocol(xid
, ses
);
2058 mutex_unlock(&ses
->session_mutex
);
2059 /* problem -- put our ses reference */
2060 cifs_put_smb_ses(ses
);
2064 if (ses
->need_reconnect
) {
2065 cFYI(1, "Session needs reconnect");
2066 rc
= cifs_setup_session(xid
, ses
,
2067 volume_info
->local_nls
);
2069 mutex_unlock(&ses
->session_mutex
);
2070 /* problem -- put our reference */
2071 cifs_put_smb_ses(ses
);
2076 mutex_unlock(&ses
->session_mutex
);
2078 /* existing SMB ses has a server reference already */
2079 cifs_put_tcp_session(server
);
2084 cFYI(1, "Existing smb sess not found");
2085 ses
= sesInfoAlloc();
2089 /* new SMB session uses our server ref */
2090 ses
->server
= server
;
2091 if (server
->dstaddr
.ss_family
== AF_INET6
)
2092 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
2094 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
2096 if (volume_info
->username
) {
2097 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
2098 if (!ses
->user_name
)
2102 /* volume_info->password freed at unmount */
2103 if (volume_info
->password
) {
2104 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2108 if (volume_info
->domainname
) {
2109 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
2110 if (!ses
->domainName
)
2113 ses
->cred_uid
= volume_info
->cred_uid
;
2114 ses
->linux_uid
= volume_info
->linux_uid
;
2116 /* ntlmv2 is much stronger than ntlm security, and has been broadly
2117 supported for many years, time to update default security mechanism */
2118 if ((volume_info
->secFlg
== 0) && warned_on_ntlm
== false) {
2119 warned_on_ntlm
= true;
2120 cERROR(1, "default security mechanism requested. The default "
2121 "security mechanism will be upgraded from ntlm to "
2122 "ntlmv2 in kernel release 3.2");
2124 ses
->overrideSecFlg
= volume_info
->secFlg
;
2126 mutex_lock(&ses
->session_mutex
);
2127 rc
= cifs_negotiate_protocol(xid
, ses
);
2129 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
2130 mutex_unlock(&ses
->session_mutex
);
2134 /* success, put it on the list */
2135 spin_lock(&cifs_tcp_ses_lock
);
2136 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
2137 spin_unlock(&cifs_tcp_ses_lock
);
2148 static int match_tcon(struct cifs_tcon
*tcon
, const char *unc
)
2150 if (tcon
->tidStatus
== CifsExiting
)
2152 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
2157 static struct cifs_tcon
*
2158 cifs_find_tcon(struct cifs_ses
*ses
, const char *unc
)
2160 struct list_head
*tmp
;
2161 struct cifs_tcon
*tcon
;
2163 spin_lock(&cifs_tcp_ses_lock
);
2164 list_for_each(tmp
, &ses
->tcon_list
) {
2165 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
2166 if (!match_tcon(tcon
, unc
))
2169 spin_unlock(&cifs_tcp_ses_lock
);
2172 spin_unlock(&cifs_tcp_ses_lock
);
2177 cifs_put_tcon(struct cifs_tcon
*tcon
)
2180 struct cifs_ses
*ses
= tcon
->ses
;
2182 cFYI(1, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
2183 spin_lock(&cifs_tcp_ses_lock
);
2184 if (--tcon
->tc_count
> 0) {
2185 spin_unlock(&cifs_tcp_ses_lock
);
2189 list_del_init(&tcon
->tcon_list
);
2190 spin_unlock(&cifs_tcp_ses_lock
);
2193 CIFSSMBTDis(xid
, tcon
);
2196 cifs_fscache_release_super_cookie(tcon
);
2198 cifs_put_smb_ses(ses
);
2201 static struct cifs_tcon
*
2202 cifs_get_tcon(struct cifs_ses
*ses
, struct smb_vol
*volume_info
)
2205 struct cifs_tcon
*tcon
;
2207 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2209 cFYI(1, "Found match on UNC path");
2210 /* existing tcon already has a reference */
2211 cifs_put_smb_ses(ses
);
2212 if (tcon
->seal
!= volume_info
->seal
)
2213 cERROR(1, "transport encryption setting "
2214 "conflicts with existing tid");
2218 tcon
= tconInfoAlloc();
2225 if (volume_info
->password
) {
2226 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2227 if (!tcon
->password
) {
2233 if (strchr(volume_info
->UNC
+ 3, '\\') == NULL
2234 && strchr(volume_info
->UNC
+ 3, '/') == NULL
) {
2235 cERROR(1, "Missing share name");
2240 /* BB Do we need to wrap session_mutex around
2241 * this TCon call and Unix SetFS as
2242 * we do on SessSetup and reconnect? */
2244 rc
= CIFSTCon(xid
, ses
, volume_info
->UNC
, tcon
, volume_info
->local_nls
);
2246 cFYI(1, "CIFS Tcon rc = %d", rc
);
2250 if (volume_info
->nodfs
) {
2251 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2252 cFYI(1, "DFS disabled (%d)", tcon
->Flags
);
2254 tcon
->seal
= volume_info
->seal
;
2255 /* we can have only one retry value for a connection
2256 to a share so for resources mounted more than once
2257 to the same server share the last value passed in
2258 for the retry flag is used */
2259 tcon
->retry
= volume_info
->retry
;
2260 tcon
->nocase
= volume_info
->nocase
;
2261 tcon
->local_lease
= volume_info
->local_lease
;
2263 spin_lock(&cifs_tcp_ses_lock
);
2264 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2265 spin_unlock(&cifs_tcp_ses_lock
);
2267 cifs_fscache_get_super_cookie(tcon
);
2277 cifs_put_tlink(struct tcon_link
*tlink
)
2279 if (!tlink
|| IS_ERR(tlink
))
2282 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2283 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2284 tlink
->tl_time
= jiffies
;
2288 if (!IS_ERR(tlink_tcon(tlink
)))
2289 cifs_put_tcon(tlink_tcon(tlink
));
2294 static inline struct tcon_link
*
2295 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
2297 return cifs_sb
->master_tlink
;
2301 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2303 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2304 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2306 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2309 if ((old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
) !=
2310 (new->mnt_cifs_flags
& CIFS_MOUNT_MASK
))
2314 * We want to share sb only if we don't specify an r/wsize or
2315 * specified r/wsize is greater than or equal to existing one.
2317 if (new->wsize
&& new->wsize
< old
->wsize
)
2320 if (new->rsize
&& new->rsize
< old
->rsize
)
2323 if (old
->mnt_uid
!= new->mnt_uid
|| old
->mnt_gid
!= new->mnt_gid
)
2326 if (old
->mnt_file_mode
!= new->mnt_file_mode
||
2327 old
->mnt_dir_mode
!= new->mnt_dir_mode
)
2330 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2333 if (old
->actimeo
!= new->actimeo
)
2340 cifs_match_super(struct super_block
*sb
, void *data
)
2342 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2343 struct smb_vol
*volume_info
;
2344 struct cifs_sb_info
*cifs_sb
;
2345 struct TCP_Server_Info
*tcp_srv
;
2346 struct cifs_ses
*ses
;
2347 struct cifs_tcon
*tcon
;
2348 struct tcon_link
*tlink
;
2349 struct sockaddr_storage addr
;
2352 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
2354 spin_lock(&cifs_tcp_ses_lock
);
2355 cifs_sb
= CIFS_SB(sb
);
2356 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2357 if (IS_ERR(tlink
)) {
2358 spin_unlock(&cifs_tcp_ses_lock
);
2361 tcon
= tlink_tcon(tlink
);
2363 tcp_srv
= ses
->server
;
2365 volume_info
= mnt_data
->vol
;
2367 if (!volume_info
->UNCip
|| !volume_info
->UNC
)
2370 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
2372 strlen(volume_info
->UNCip
),
2377 if (!match_server(tcp_srv
, (struct sockaddr
*)&addr
, volume_info
) ||
2378 !match_session(ses
, volume_info
) ||
2379 !match_tcon(tcon
, volume_info
->UNC
)) {
2384 rc
= compare_mount_options(sb
, mnt_data
);
2386 spin_unlock(&cifs_tcp_ses_lock
);
2387 cifs_put_tlink(tlink
);
2392 get_dfs_path(int xid
, struct cifs_ses
*pSesInfo
, const char *old_path
,
2393 const struct nls_table
*nls_codepage
, unsigned int *pnum_referrals
,
2394 struct dfs_info3_param
**preferrals
, int remap
)
2399 *pnum_referrals
= 0;
2402 if (pSesInfo
->ipc_tid
== 0) {
2403 temp_unc
= kmalloc(2 /* for slashes */ +
2404 strnlen(pSesInfo
->serverName
,
2405 SERVER_NAME_LEN_WITH_NULL
* 2)
2406 + 1 + 4 /* slash IPC$ */ + 2,
2408 if (temp_unc
== NULL
)
2412 strcpy(temp_unc
+ 2, pSesInfo
->serverName
);
2413 strcpy(temp_unc
+ 2 + strlen(pSesInfo
->serverName
), "\\IPC$");
2414 rc
= CIFSTCon(xid
, pSesInfo
, temp_unc
, NULL
, nls_codepage
);
2415 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc
, pSesInfo
->ipc_tid
);
2419 rc
= CIFSGetDFSRefer(xid
, pSesInfo
, old_path
, preferrals
,
2420 pnum_referrals
, nls_codepage
, remap
);
2421 /* BB map targetUNCs to dfs_info3 structures, here or
2422 in CIFSGetDFSRefer BB */
2427 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2428 static struct lock_class_key cifs_key
[2];
2429 static struct lock_class_key cifs_slock_key
[2];
2432 cifs_reclassify_socket4(struct socket
*sock
)
2434 struct sock
*sk
= sock
->sk
;
2435 BUG_ON(sock_owned_by_user(sk
));
2436 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2437 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2441 cifs_reclassify_socket6(struct socket
*sock
)
2443 struct sock
*sk
= sock
->sk
;
2444 BUG_ON(sock_owned_by_user(sk
));
2445 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2446 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2450 cifs_reclassify_socket4(struct socket
*sock
)
2455 cifs_reclassify_socket6(struct socket
*sock
)
2460 /* See RFC1001 section 14 on representation of Netbios names */
2461 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2465 for (i
= 0, j
= 0; i
< (length
); i
++) {
2466 /* mask a nibble at a time and encode */
2467 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2468 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2475 bind_socket(struct TCP_Server_Info
*server
)
2478 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2479 /* Bind to the specified local IP address */
2480 struct socket
*socket
= server
->ssocket
;
2481 rc
= socket
->ops
->bind(socket
,
2482 (struct sockaddr
*) &server
->srcaddr
,
2483 sizeof(server
->srcaddr
));
2485 struct sockaddr_in
*saddr4
;
2486 struct sockaddr_in6
*saddr6
;
2487 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2488 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2489 if (saddr6
->sin6_family
== AF_INET6
)
2491 "Failed to bind to: %pI6c, error: %d\n",
2492 &saddr6
->sin6_addr
, rc
);
2495 "Failed to bind to: %pI4, error: %d\n",
2496 &saddr4
->sin_addr
.s_addr
, rc
);
2503 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2507 * some servers require RFC1001 sessinit before sending
2508 * negprot - BB check reconnection in case where second
2509 * sessinit is sent but no second negprot
2511 struct rfc1002_session_packet
*ses_init_buf
;
2512 struct smb_hdr
*smb_buf
;
2513 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2516 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2518 if (server
->server_RFC1001_name
&&
2519 server
->server_RFC1001_name
[0] != 0)
2520 rfc1002mangle(ses_init_buf
->trailer
.
2521 session_req
.called_name
,
2522 server
->server_RFC1001_name
,
2523 RFC1001_NAME_LEN_WITH_NULL
);
2525 rfc1002mangle(ses_init_buf
->trailer
.
2526 session_req
.called_name
,
2527 DEFAULT_CIFS_CALLED_NAME
,
2528 RFC1001_NAME_LEN_WITH_NULL
);
2530 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2533 * calling name ends in null (byte 16) from old smb
2536 if (server
->workstation_RFC1001_name
&&
2537 server
->workstation_RFC1001_name
[0] != 0)
2538 rfc1002mangle(ses_init_buf
->trailer
.
2539 session_req
.calling_name
,
2540 server
->workstation_RFC1001_name
,
2541 RFC1001_NAME_LEN_WITH_NULL
);
2543 rfc1002mangle(ses_init_buf
->trailer
.
2544 session_req
.calling_name
,
2546 RFC1001_NAME_LEN_WITH_NULL
);
2548 ses_init_buf
->trailer
.session_req
.scope1
= 0;
2549 ses_init_buf
->trailer
.session_req
.scope2
= 0;
2550 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
2552 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2553 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
2554 rc
= smb_send(server
, smb_buf
, 0x44);
2555 kfree(ses_init_buf
);
2557 * RFC1001 layer in at least one server
2558 * requires very short break before negprot
2559 * presumably because not expecting negprot
2560 * to follow so fast. This is a simple
2561 * solution that works without
2562 * complicating the code and causes no
2563 * significant slowing down on mount
2566 usleep_range(1000, 2000);
2569 * else the negprot may still work without this
2570 * even though malloc failed
2577 generic_ip_connect(struct TCP_Server_Info
*server
)
2582 struct socket
*socket
= server
->ssocket
;
2583 struct sockaddr
*saddr
;
2585 saddr
= (struct sockaddr
*) &server
->dstaddr
;
2587 if (server
->dstaddr
.ss_family
== AF_INET6
) {
2588 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
2589 slen
= sizeof(struct sockaddr_in6
);
2592 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
2593 slen
= sizeof(struct sockaddr_in
);
2597 if (socket
== NULL
) {
2598 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
2599 IPPROTO_TCP
, &socket
, 1);
2601 cERROR(1, "Error %d creating socket", rc
);
2602 server
->ssocket
= NULL
;
2606 /* BB other socket options to set KEEPALIVE, NODELAY? */
2607 cFYI(1, "Socket created");
2608 server
->ssocket
= socket
;
2609 socket
->sk
->sk_allocation
= GFP_NOFS
;
2610 if (sfamily
== AF_INET6
)
2611 cifs_reclassify_socket6(socket
);
2613 cifs_reclassify_socket4(socket
);
2616 rc
= bind_socket(server
);
2621 * Eventually check for other socket options to change from
2622 * the default. sock_setsockopt not used because it expects
2625 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
2626 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
2628 /* make the bufsizes depend on wsize/rsize and max requests */
2629 if (server
->noautotune
) {
2630 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
2631 socket
->sk
->sk_sndbuf
= 200 * 1024;
2632 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
2633 socket
->sk
->sk_rcvbuf
= 140 * 1024;
2636 if (server
->tcp_nodelay
) {
2638 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
2639 (char *)&val
, sizeof(val
));
2641 cFYI(1, "set TCP_NODELAY socket option error %d", rc
);
2644 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2645 socket
->sk
->sk_sndbuf
,
2646 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
2648 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
2650 cFYI(1, "Error %d connecting to server", rc
);
2651 sock_release(socket
);
2652 server
->ssocket
= NULL
;
2656 if (sport
== htons(RFC1001_PORT
))
2657 rc
= ip_rfc1001_connect(server
);
2663 ip_connect(struct TCP_Server_Info
*server
)
2666 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2667 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2669 if (server
->dstaddr
.ss_family
== AF_INET6
)
2670 sport
= &addr6
->sin6_port
;
2672 sport
= &addr
->sin_port
;
2677 /* try with 445 port at first */
2678 *sport
= htons(CIFS_PORT
);
2680 rc
= generic_ip_connect(server
);
2684 /* if it failed, try with 139 port */
2685 *sport
= htons(RFC1001_PORT
);
2688 return generic_ip_connect(server
);
2691 void reset_cifs_unix_caps(int xid
, struct cifs_tcon
*tcon
,
2692 struct cifs_sb_info
*cifs_sb
, struct smb_vol
*vol_info
)
2694 /* if we are reconnecting then should we check to see if
2695 * any requested capabilities changed locally e.g. via
2696 * remount but we can not do much about it here
2697 * if they have (even if we could detect it by the following)
2698 * Perhaps we could add a backpointer to array of sb from tcon
2699 * or if we change to make all sb to same share the same
2700 * sb as NFS - then we only have one backpointer to sb.
2701 * What if we wanted to mount the server share twice once with
2702 * and once without posixacls or posix paths? */
2703 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2705 if (vol_info
&& vol_info
->no_linux_ext
) {
2706 tcon
->fsUnixInfo
.Capability
= 0;
2707 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
2708 cFYI(1, "Linux protocol extensions disabled");
2710 } else if (vol_info
)
2711 tcon
->unix_ext
= 1; /* Unix Extensions supported */
2713 if (tcon
->unix_ext
== 0) {
2714 cFYI(1, "Unix extensions disabled so not set on reconnect");
2718 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
2719 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2720 cFYI(1, "unix caps which server supports %lld", cap
);
2721 /* check for reconnect case in which we do not
2722 want to change the mount behavior if we can avoid it */
2723 if (vol_info
== NULL
) {
2724 /* turn off POSIX ACL and PATHNAMES if not set
2725 originally at mount time */
2726 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
2727 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2728 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2729 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2730 cERROR(1, "POSIXPATH support change");
2731 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2732 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2733 cERROR(1, "possible reconnect error");
2734 cERROR(1, "server disabled POSIX path support");
2738 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
2739 cERROR(1, "per-share encryption not supported yet");
2741 cap
&= CIFS_UNIX_CAP_MASK
;
2742 if (vol_info
&& vol_info
->no_psx_acl
)
2743 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2744 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
2745 cFYI(1, "negotiated posix acl support");
2747 cifs_sb
->mnt_cifs_flags
|=
2748 CIFS_MOUNT_POSIXACL
;
2751 if (vol_info
&& vol_info
->posix_paths
== 0)
2752 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2753 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
2754 cFYI(1, "negotiate posix pathnames");
2756 cifs_sb
->mnt_cifs_flags
|=
2757 CIFS_MOUNT_POSIX_PATHS
;
2760 cFYI(1, "Negotiate caps 0x%x", (int)cap
);
2761 #ifdef CONFIG_CIFS_DEBUG2
2762 if (cap
& CIFS_UNIX_FCNTL_CAP
)
2763 cFYI(1, "FCNTL cap");
2764 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
2765 cFYI(1, "EXTATTR cap");
2766 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2767 cFYI(1, "POSIX path cap");
2768 if (cap
& CIFS_UNIX_XATTR_CAP
)
2769 cFYI(1, "XATTR cap");
2770 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
2771 cFYI(1, "POSIX ACL cap");
2772 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
2773 cFYI(1, "very large read cap");
2774 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
2775 cFYI(1, "very large write cap");
2776 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
2777 cFYI(1, "transport encryption cap");
2778 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
2779 cFYI(1, "mandatory transport encryption cap");
2780 #endif /* CIFS_DEBUG2 */
2781 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
2782 if (vol_info
== NULL
) {
2783 cFYI(1, "resetting capabilities failed");
2785 cERROR(1, "Negotiating Unix capabilities "
2786 "with the server failed. Consider "
2787 "mounting with the Unix Extensions\n"
2788 "disabled, if problems are found, "
2789 "by specifying the nounix mount "
2796 void cifs_setup_cifs_sb(struct smb_vol
*pvolume_info
,
2797 struct cifs_sb_info
*cifs_sb
)
2799 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
2801 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
2802 cifs_sb
->tlink_tree
= RB_ROOT
;
2805 * Temporarily set r/wsize for matching superblock. If we end up using
2806 * new sb then client will later negotiate it downward if needed.
2808 cifs_sb
->rsize
= pvolume_info
->rsize
;
2809 cifs_sb
->wsize
= pvolume_info
->wsize
;
2811 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
2812 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
2813 if (pvolume_info
->backupuid_specified
)
2814 cifs_sb
->mnt_backupuid
= pvolume_info
->backupuid
;
2815 if (pvolume_info
->backupgid_specified
)
2816 cifs_sb
->mnt_backupgid
= pvolume_info
->backupgid
;
2817 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
2818 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
2819 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2820 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
2822 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
2823 cifs_sb
->local_nls
= pvolume_info
->local_nls
;
2825 if (pvolume_info
->noperm
)
2826 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
2827 if (pvolume_info
->setuids
)
2828 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
2829 if (pvolume_info
->server_ino
)
2830 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
2831 if (pvolume_info
->remap
)
2832 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
2833 if (pvolume_info
->no_xattr
)
2834 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
2835 if (pvolume_info
->sfu_emul
)
2836 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
2837 if (pvolume_info
->nobrl
)
2838 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
2839 if (pvolume_info
->nostrictsync
)
2840 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
2841 if (pvolume_info
->mand_lock
)
2842 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
2843 if (pvolume_info
->rwpidforward
)
2844 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RWPIDFORWARD
;
2845 if (pvolume_info
->cifs_acl
)
2846 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
2847 if (pvolume_info
->backupuid_specified
)
2848 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPUID
;
2849 if (pvolume_info
->backupgid_specified
)
2850 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_BACKUPGID
;
2851 if (pvolume_info
->override_uid
)
2852 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
2853 if (pvolume_info
->override_gid
)
2854 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
2855 if (pvolume_info
->dynperm
)
2856 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
2857 if (pvolume_info
->fsc
)
2858 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
2859 if (pvolume_info
->multiuser
)
2860 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
2861 CIFS_MOUNT_NO_PERM
);
2862 if (pvolume_info
->strict_io
)
2863 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
2864 if (pvolume_info
->direct_io
) {
2865 cFYI(1, "mounting share using direct i/o");
2866 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
2868 if (pvolume_info
->mfsymlinks
) {
2869 if (pvolume_info
->sfu_emul
) {
2870 cERROR(1, "mount option mfsymlinks ignored if sfu "
2871 "mount option is used");
2873 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
2877 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
2878 cERROR(1, "mount option dynperm ignored if cifsacl "
2879 "mount option supported");
2883 * When the server supports very large reads and writes via POSIX extensions,
2884 * we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
2885 * including the RFC1001 length.
2887 * Note that this might make for "interesting" allocation problems during
2888 * writeback however as we have to allocate an array of pointers for the
2889 * pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
2891 * For reads, there is a similar problem as we need to allocate an array
2892 * of kvecs to handle the receive, though that should only need to be done
2895 #define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
2896 #define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
2899 * When the server doesn't allow large posix writes, only allow a rsize/wsize
2900 * of 2^17-1 minus the size of the call header. That allows for a read or
2901 * write up to the maximum size described by RFC1002.
2903 #define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
2904 #define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
2907 * The default wsize is 1M. find_get_pages seems to return a maximum of 256
2908 * pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
2909 * a single wsize request with a single call.
2911 #define CIFS_DEFAULT_IOSIZE (1024 * 1024)
2914 * Windows only supports a max of 60k reads. Default to that when posix
2915 * extensions aren't in force.
2917 #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
2920 cifs_negotiate_wsize(struct cifs_tcon
*tcon
, struct smb_vol
*pvolume_info
)
2922 __u64 unix_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2923 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
2924 unsigned int wsize
= pvolume_info
->wsize
? pvolume_info
->wsize
:
2925 CIFS_DEFAULT_IOSIZE
;
2927 /* can server support 24-bit write sizes? (via UNIX extensions) */
2928 if (!tcon
->unix_ext
|| !(unix_cap
& CIFS_UNIX_LARGE_WRITE_CAP
))
2929 wsize
= min_t(unsigned int, wsize
, CIFS_MAX_RFC1002_WSIZE
);
2932 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
2933 * Limit it to max buffer offered by the server, minus the size of the
2934 * WRITEX header, not including the 4 byte RFC1001 length.
2936 if (!(server
->capabilities
& CAP_LARGE_WRITE_X
) ||
2937 (!(server
->capabilities
& CAP_UNIX
) &&
2938 (server
->sec_mode
& (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
))))
2939 wsize
= min_t(unsigned int, wsize
,
2940 server
->maxBuf
- sizeof(WRITE_REQ
) + 4);
2942 /* hard limit of CIFS_MAX_WSIZE */
2943 wsize
= min_t(unsigned int, wsize
, CIFS_MAX_WSIZE
);
2949 cifs_negotiate_rsize(struct cifs_tcon
*tcon
, struct smb_vol
*pvolume_info
)
2951 __u64 unix_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2952 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
2953 unsigned int rsize
, defsize
;
2956 * Set default value...
2958 * HACK alert! Ancient servers have very small buffers. Even though
2959 * MS-CIFS indicates that servers are only limited by the client's
2960 * bufsize for reads, testing against win98se shows that it throws
2961 * INVALID_PARAMETER errors if you try to request too large a read.
2963 * If the server advertises a MaxBufferSize of less than one page,
2964 * assume that it also can't satisfy reads larger than that either.
2966 * FIXME: Is there a better heuristic for this?
2968 if (tcon
->unix_ext
&& (unix_cap
& CIFS_UNIX_LARGE_READ_CAP
))
2969 defsize
= CIFS_DEFAULT_IOSIZE
;
2970 else if (server
->capabilities
& CAP_LARGE_READ_X
)
2971 defsize
= CIFS_DEFAULT_NON_POSIX_RSIZE
;
2972 else if (server
->maxBuf
>= PAGE_CACHE_SIZE
)
2973 defsize
= CIFSMaxBufSize
;
2975 defsize
= server
->maxBuf
- sizeof(READ_RSP
);
2977 rsize
= pvolume_info
->rsize
? pvolume_info
->rsize
: defsize
;
2980 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
2981 * the client's MaxBufferSize.
2983 if (!(server
->capabilities
& CAP_LARGE_READ_X
))
2984 rsize
= min_t(unsigned int, CIFSMaxBufSize
, rsize
);
2986 /* hard limit of CIFS_MAX_RSIZE */
2987 rsize
= min_t(unsigned int, rsize
, CIFS_MAX_RSIZE
);
2993 is_path_accessible(int xid
, struct cifs_tcon
*tcon
,
2994 struct cifs_sb_info
*cifs_sb
, const char *full_path
)
2997 FILE_ALL_INFO
*pfile_info
;
2999 pfile_info
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
3000 if (pfile_info
== NULL
)
3003 rc
= CIFSSMBQPathInfo(xid
, tcon
, full_path
, pfile_info
,
3004 0 /* not legacy */, cifs_sb
->local_nls
,
3005 cifs_sb
->mnt_cifs_flags
&
3006 CIFS_MOUNT_MAP_SPECIAL_CHR
);
3008 if (rc
== -EOPNOTSUPP
|| rc
== -EINVAL
)
3009 rc
= SMBQueryInformation(xid
, tcon
, full_path
, pfile_info
,
3010 cifs_sb
->local_nls
, cifs_sb
->mnt_cifs_flags
&
3011 CIFS_MOUNT_MAP_SPECIAL_CHR
);
3017 cleanup_volume_info_contents(struct smb_vol
*volume_info
)
3019 kfree(volume_info
->username
);
3020 kzfree(volume_info
->password
);
3021 if (volume_info
->UNCip
!= volume_info
->UNC
+ 2)
3022 kfree(volume_info
->UNCip
);
3023 kfree(volume_info
->UNC
);
3024 kfree(volume_info
->domainname
);
3025 kfree(volume_info
->iocharset
);
3026 kfree(volume_info
->prepath
);
3030 cifs_cleanup_volume_info(struct smb_vol
*volume_info
)
3034 cleanup_volume_info_contents(volume_info
);
3039 #ifdef CONFIG_CIFS_DFS_UPCALL
3040 /* build_path_to_root returns full path to root when
3041 * we do not have an exiting connection (tcon) */
3043 build_unc_path_to_root(const struct smb_vol
*vol
,
3044 const struct cifs_sb_info
*cifs_sb
)
3046 char *full_path
, *pos
;
3047 unsigned int pplen
= vol
->prepath
? strlen(vol
->prepath
) : 0;
3048 unsigned int unc_len
= strnlen(vol
->UNC
, MAX_TREE_SIZE
+ 1);
3050 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
3051 if (full_path
== NULL
)
3052 return ERR_PTR(-ENOMEM
);
3054 strncpy(full_path
, vol
->UNC
, unc_len
);
3055 pos
= full_path
+ unc_len
;
3058 strncpy(pos
, vol
->prepath
, pplen
);
3062 *pos
= '\0'; /* add trailing null */
3063 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
3064 cFYI(1, "%s: full_path=%s", __func__
, full_path
);
3069 * Perform a dfs referral query for a share and (optionally) prefix
3071 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3072 * to a string containing updated options for the submount. Otherwise it
3073 * will be left untouched.
3075 * Returns the rc from get_dfs_path to the caller, which can be used to
3076 * determine whether there were referrals.
3079 expand_dfs_referral(int xid
, struct cifs_ses
*pSesInfo
,
3080 struct smb_vol
*volume_info
, struct cifs_sb_info
*cifs_sb
,
3084 unsigned int num_referrals
= 0;
3085 struct dfs_info3_param
*referrals
= NULL
;
3086 char *full_path
= NULL
, *ref_path
= NULL
, *mdata
= NULL
;
3088 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
3089 if (IS_ERR(full_path
))
3090 return PTR_ERR(full_path
);
3092 /* For DFS paths, skip the first '\' of the UNC */
3093 ref_path
= check_prefix
? full_path
+ 1 : volume_info
->UNC
+ 1;
3095 rc
= get_dfs_path(xid
, pSesInfo
, ref_path
, cifs_sb
->local_nls
,
3096 &num_referrals
, &referrals
,
3097 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
3099 if (!rc
&& num_referrals
> 0) {
3100 char *fake_devname
= NULL
;
3102 mdata
= cifs_compose_mount_options(cifs_sb
->mountdata
,
3103 full_path
+ 1, referrals
,
3106 free_dfs_info_array(referrals
, num_referrals
);
3108 if (IS_ERR(mdata
)) {
3109 rc
= PTR_ERR(mdata
);
3112 cleanup_volume_info_contents(volume_info
);
3113 memset(volume_info
, '\0', sizeof(*volume_info
));
3114 rc
= cifs_setup_volume_info(volume_info
, mdata
,
3117 kfree(fake_devname
);
3118 kfree(cifs_sb
->mountdata
);
3119 cifs_sb
->mountdata
= mdata
;
3127 cifs_setup_volume_info(struct smb_vol
*volume_info
, char *mount_data
,
3128 const char *devname
)
3132 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
))
3135 if (volume_info
->nullauth
) {
3136 cFYI(1, "null user");
3137 volume_info
->username
= kzalloc(1, GFP_KERNEL
);
3138 if (volume_info
->username
== NULL
)
3140 } else if (volume_info
->username
) {
3141 /* BB fixme parse for domain name here */
3142 cFYI(1, "Username: %s", volume_info
->username
);
3144 cifserror("No username specified");
3145 /* In userspace mount helper we can get user name from alternate
3146 locations such as env variables and files on disk */
3150 /* this is needed for ASCII cp to Unicode converts */
3151 if (volume_info
->iocharset
== NULL
) {
3152 /* load_nls_default cannot return null */
3153 volume_info
->local_nls
= load_nls_default();
3155 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
3156 if (volume_info
->local_nls
== NULL
) {
3157 cERROR(1, "CIFS mount error: iocharset %s not found",
3158 volume_info
->iocharset
);
3167 cifs_get_volume_info(char *mount_data
, const char *devname
)
3170 struct smb_vol
*volume_info
;
3172 volume_info
= kzalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
3174 return ERR_PTR(-ENOMEM
);
3176 rc
= cifs_setup_volume_info(volume_info
, mount_data
, devname
);
3178 cifs_cleanup_volume_info(volume_info
);
3179 volume_info
= ERR_PTR(rc
);
3185 /* make sure ra_pages is a multiple of rsize */
3186 static inline unsigned int
3187 cifs_ra_pages(struct cifs_sb_info
*cifs_sb
)
3190 unsigned int rsize_pages
= cifs_sb
->rsize
/ PAGE_CACHE_SIZE
;
3192 if (rsize_pages
>= default_backing_dev_info
.ra_pages
)
3193 return default_backing_dev_info
.ra_pages
;
3194 else if (rsize_pages
== 0)
3197 reads
= default_backing_dev_info
.ra_pages
/ rsize_pages
;
3198 return reads
* rsize_pages
;
3202 cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb_vol
*volume_info
)
3206 struct cifs_ses
*pSesInfo
;
3207 struct cifs_tcon
*tcon
;
3208 struct TCP_Server_Info
*srvTcp
;
3210 struct tcon_link
*tlink
;
3211 #ifdef CONFIG_CIFS_DFS_UPCALL
3212 int referral_walks_count
= 0;
3215 rc
= bdi_setup_and_register(&cifs_sb
->bdi
, "cifs", BDI_CAP_MAP_COPY
);
3219 #ifdef CONFIG_CIFS_DFS_UPCALL
3221 /* cleanup activities if we're chasing a referral */
3222 if (referral_walks_count
) {
3224 cifs_put_tcon(tcon
);
3226 cifs_put_smb_ses(pSesInfo
);
3239 /* get a reference to a tcp session */
3240 srvTcp
= cifs_get_tcp_session(volume_info
);
3241 if (IS_ERR(srvTcp
)) {
3242 rc
= PTR_ERR(srvTcp
);
3243 bdi_destroy(&cifs_sb
->bdi
);
3247 /* get a reference to a SMB session */
3248 pSesInfo
= cifs_get_smb_ses(srvTcp
, volume_info
);
3249 if (IS_ERR(pSesInfo
)) {
3250 rc
= PTR_ERR(pSesInfo
);
3252 goto mount_fail_check
;
3255 /* search for existing tcon to this server share */
3256 tcon
= cifs_get_tcon(pSesInfo
, volume_info
);
3260 goto remote_path_check
;
3263 /* tell server which Unix caps we support */
3264 if (tcon
->ses
->capabilities
& CAP_UNIX
) {
3265 /* reset of caps checks mount to see if unix extensions
3266 disabled for just this mount */
3267 reset_cifs_unix_caps(xid
, tcon
, cifs_sb
, volume_info
);
3268 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
3269 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
3270 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)) {
3272 goto mount_fail_check
;
3275 tcon
->unix_ext
= 0; /* server does not support them */
3277 /* do not care if following two calls succeed - informational */
3279 CIFSSMBQFSDeviceInfo(xid
, tcon
);
3280 CIFSSMBQFSAttributeInfo(xid
, tcon
);
3283 cifs_sb
->wsize
= cifs_negotiate_wsize(tcon
, volume_info
);
3284 cifs_sb
->rsize
= cifs_negotiate_rsize(tcon
, volume_info
);
3286 /* tune readahead according to rsize */
3287 cifs_sb
->bdi
.ra_pages
= cifs_ra_pages(cifs_sb
);
3290 #ifdef CONFIG_CIFS_DFS_UPCALL
3292 * Perform an unconditional check for whether there are DFS
3293 * referrals for this path without prefix, to provide support
3294 * for DFS referrals from w2k8 servers which don't seem to respond
3295 * with PATH_NOT_COVERED to requests that include the prefix.
3296 * Chase the referral if found, otherwise continue normally.
3298 if (referral_walks_count
== 0) {
3299 int refrc
= expand_dfs_referral(xid
, pSesInfo
, volume_info
,
3302 referral_walks_count
++;
3303 goto try_mount_again
;
3308 /* check if a whole path is not remote */
3310 /* build_path_to_root works only when we have a valid tcon */
3311 full_path
= cifs_build_path_to_root(volume_info
, cifs_sb
, tcon
);
3312 if (full_path
== NULL
) {
3314 goto mount_fail_check
;
3316 rc
= is_path_accessible(xid
, tcon
, cifs_sb
, full_path
);
3317 if (rc
!= 0 && rc
!= -EREMOTE
) {
3319 goto mount_fail_check
;
3324 /* get referral if needed */
3325 if (rc
== -EREMOTE
) {
3326 #ifdef CONFIG_CIFS_DFS_UPCALL
3327 if (referral_walks_count
> MAX_NESTED_LINKS
) {
3329 * BB: when we implement proper loop detection,
3330 * we will remove this check. But now we need it
3331 * to prevent an indefinite loop if 'DFS tree' is
3332 * misconfigured (i.e. has loops).
3335 goto mount_fail_check
;
3338 rc
= expand_dfs_referral(xid
, pSesInfo
, volume_info
, cifs_sb
,
3342 referral_walks_count
++;
3343 goto try_mount_again
;
3345 goto mount_fail_check
;
3346 #else /* No DFS support, return error on mount */
3352 goto mount_fail_check
;
3354 /* now, hang the tcon off of the superblock */
3355 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
3356 if (tlink
== NULL
) {
3358 goto mount_fail_check
;
3361 tlink
->tl_uid
= pSesInfo
->linux_uid
;
3362 tlink
->tl_tcon
= tcon
;
3363 tlink
->tl_time
= jiffies
;
3364 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
3365 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3367 cifs_sb
->master_tlink
= tlink
;
3368 spin_lock(&cifs_sb
->tlink_tree_lock
);
3369 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3370 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3372 queue_delayed_work(system_nrt_wq
, &cifs_sb
->prune_tlinks
,
3376 /* on error free sesinfo and tcon struct if needed */
3378 /* If find_unc succeeded then rc == 0 so we can not end */
3379 /* up accidentally freeing someone elses tcon struct */
3381 cifs_put_tcon(tcon
);
3383 cifs_put_smb_ses(pSesInfo
);
3385 cifs_put_tcp_session(srvTcp
);
3386 bdi_destroy(&cifs_sb
->bdi
);
3395 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3396 * pointer may be NULL.
3399 CIFSTCon(unsigned int xid
, struct cifs_ses
*ses
,
3400 const char *tree
, struct cifs_tcon
*tcon
,
3401 const struct nls_table
*nls_codepage
)
3403 struct smb_hdr
*smb_buffer
;
3404 struct smb_hdr
*smb_buffer_response
;
3407 unsigned char *bcc_ptr
;
3410 __u16 bytes_left
, count
;
3415 smb_buffer
= cifs_buf_get();
3416 if (smb_buffer
== NULL
)
3419 smb_buffer_response
= smb_buffer
;
3421 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3422 NULL
/*no tid */ , 4 /*wct */ );
3424 smb_buffer
->Mid
= GetNextMid(ses
->server
);
3425 smb_buffer
->Uid
= ses
->Suid
;
3426 pSMB
= (TCONX_REQ
*) smb_buffer
;
3427 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3429 pSMB
->AndXCommand
= 0xFF;
3430 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3431 bcc_ptr
= &pSMB
->Password
[0];
3432 if (!tcon
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3433 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3434 *bcc_ptr
= 0; /* password is null byte */
3435 bcc_ptr
++; /* skip password */
3436 /* already aligned so no need to do it below */
3438 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3439 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3440 specified as required (when that support is added to
3441 the vfs in the future) as only NTLM or the much
3442 weaker LANMAN (which we do not send by default) is accepted
3443 by Samba (not sure whether other servers allow
3444 NTLMv2 password here) */
3445 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3446 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3447 (ses
->server
->secType
== LANMAN
))
3448 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3449 ses
->server
->sec_mode
&
3450 SECMODE_PW_ENCRYPT
? true : false,
3453 #endif /* CIFS_WEAK_PW_HASH */
3454 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3457 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3458 if (ses
->capabilities
& CAP_UNICODE
) {
3459 /* must align unicode strings */
3460 *bcc_ptr
= 0; /* null byte password */
3465 if (ses
->server
->sec_mode
&
3466 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
3467 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3469 if (ses
->capabilities
& CAP_STATUS32
) {
3470 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3472 if (ses
->capabilities
& CAP_DFS
) {
3473 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3475 if (ses
->capabilities
& CAP_UNICODE
) {
3476 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3478 cifs_strtoUCS((__le16
*) bcc_ptr
, tree
,
3479 6 /* max utf8 char length in bytes */ *
3480 (/* server len*/ + 256 /* share len */), nls_codepage
);
3481 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3482 bcc_ptr
+= 2; /* skip trailing null */
3483 } else { /* ASCII */
3484 strcpy(bcc_ptr
, tree
);
3485 bcc_ptr
+= strlen(tree
) + 1;
3487 strcpy(bcc_ptr
, "?????");
3488 bcc_ptr
+= strlen("?????");
3490 count
= bcc_ptr
- &pSMB
->Password
[0];
3491 pSMB
->hdr
.smb_buf_length
= cpu_to_be32(be32_to_cpu(
3492 pSMB
->hdr
.smb_buf_length
) + count
);
3493 pSMB
->ByteCount
= cpu_to_le16(count
);
3495 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3498 /* above now done in SendReceive */
3499 if ((rc
== 0) && (tcon
!= NULL
)) {
3502 tcon
->tidStatus
= CifsGood
;
3503 tcon
->need_reconnect
= false;
3504 tcon
->tid
= smb_buffer_response
->Tid
;
3505 bcc_ptr
= pByteArea(smb_buffer_response
);
3506 bytes_left
= get_bcc(smb_buffer_response
);
3507 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3508 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3514 /* skip service field (NB: this field is always ASCII) */
3516 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3517 (bcc_ptr
[2] == 'C')) {
3518 cFYI(1, "IPC connection");
3521 } else if (length
== 2) {
3522 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3523 /* the most common case */
3524 cFYI(1, "disk share connection");
3527 bcc_ptr
+= length
+ 1;
3528 bytes_left
-= (length
+ 1);
3529 strncpy(tcon
->treeName
, tree
, MAX_TREE_SIZE
);
3531 /* mostly informational -- no need to fail on error here */
3532 kfree(tcon
->nativeFileSystem
);
3533 tcon
->nativeFileSystem
= cifs_strndup_from_ucs(bcc_ptr
,
3534 bytes_left
, is_unicode
,
3537 cFYI(1, "nativeFileSystem=%s", tcon
->nativeFileSystem
);
3539 if ((smb_buffer_response
->WordCount
== 3) ||
3540 (smb_buffer_response
->WordCount
== 7))
3541 /* field is in same location */
3542 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3545 cFYI(1, "Tcon flags: 0x%x ", tcon
->Flags
);
3546 } else if ((rc
== 0) && tcon
== NULL
) {
3547 /* all we need to save for IPC$ connection */
3548 ses
->ipc_tid
= smb_buffer_response
->Tid
;
3551 cifs_buf_release(smb_buffer
);
3556 cifs_umount(struct cifs_sb_info
*cifs_sb
)
3558 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3559 struct rb_node
*node
;
3560 struct tcon_link
*tlink
;
3562 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3564 spin_lock(&cifs_sb
->tlink_tree_lock
);
3565 while ((node
= rb_first(root
))) {
3566 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3567 cifs_get_tlink(tlink
);
3568 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3569 rb_erase(node
, root
);
3571 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3572 cifs_put_tlink(tlink
);
3573 spin_lock(&cifs_sb
->tlink_tree_lock
);
3575 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3577 bdi_destroy(&cifs_sb
->bdi
);
3578 kfree(cifs_sb
->mountdata
);
3579 unload_nls(cifs_sb
->local_nls
);
3583 int cifs_negotiate_protocol(unsigned int xid
, struct cifs_ses
*ses
)
3586 struct TCP_Server_Info
*server
= ses
->server
;
3588 /* only send once per connect */
3589 if (server
->maxBuf
!= 0)
3592 rc
= CIFSSMBNegotiate(xid
, ses
);
3593 if (rc
== -EAGAIN
) {
3594 /* retry only once on 1st time connection */
3595 rc
= CIFSSMBNegotiate(xid
, ses
);
3600 spin_lock(&GlobalMid_Lock
);
3601 if (server
->tcpStatus
== CifsNeedNegotiate
)
3602 server
->tcpStatus
= CifsGood
;
3605 spin_unlock(&GlobalMid_Lock
);
3613 int cifs_setup_session(unsigned int xid
, struct cifs_ses
*ses
,
3614 struct nls_table
*nls_info
)
3617 struct TCP_Server_Info
*server
= ses
->server
;
3620 ses
->capabilities
= server
->capabilities
;
3621 if (linuxExtEnabled
== 0)
3622 ses
->capabilities
&= (~CAP_UNIX
);
3624 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3625 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
3627 rc
= CIFS_SessSetup(xid
, ses
, nls_info
);
3629 cERROR(1, "Send error in SessSetup = %d", rc
);
3631 mutex_lock(&ses
->server
->srv_mutex
);
3632 if (!server
->session_estab
) {
3633 server
->session_key
.response
= ses
->auth_key
.response
;
3634 server
->session_key
.len
= ses
->auth_key
.len
;
3635 server
->sequence_number
= 0x2;
3636 server
->session_estab
= true;
3637 ses
->auth_key
.response
= NULL
;
3639 mutex_unlock(&server
->srv_mutex
);
3641 cFYI(1, "CIFS Session Established successfully");
3642 spin_lock(&GlobalMid_Lock
);
3643 ses
->status
= CifsGood
;
3644 ses
->need_reconnect
= false;
3645 spin_unlock(&GlobalMid_Lock
);
3648 kfree(ses
->auth_key
.response
);
3649 ses
->auth_key
.response
= NULL
;
3650 ses
->auth_key
.len
= 0;
3651 kfree(ses
->ntlmssp
);
3652 ses
->ntlmssp
= NULL
;
3657 static struct cifs_tcon
*
3658 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, uid_t fsuid
)
3660 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3661 struct cifs_ses
*ses
;
3662 struct cifs_tcon
*tcon
= NULL
;
3663 struct smb_vol
*vol_info
;
3664 char username
[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */
3665 /* We used to have this as MAX_USERNAME which is */
3666 /* way too big now (256 instead of 32) */
3668 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
3669 if (vol_info
== NULL
) {
3670 tcon
= ERR_PTR(-ENOMEM
);
3674 snprintf(username
, sizeof(username
), "krb50x%x", fsuid
);
3675 vol_info
->username
= username
;
3676 vol_info
->local_nls
= cifs_sb
->local_nls
;
3677 vol_info
->linux_uid
= fsuid
;
3678 vol_info
->cred_uid
= fsuid
;
3679 vol_info
->UNC
= master_tcon
->treeName
;
3680 vol_info
->retry
= master_tcon
->retry
;
3681 vol_info
->nocase
= master_tcon
->nocase
;
3682 vol_info
->local_lease
= master_tcon
->local_lease
;
3683 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
3685 /* FIXME: allow for other secFlg settings */
3686 vol_info
->secFlg
= CIFSSEC_MUST_KRB5
;
3688 /* get a reference for the same TCP session */
3689 spin_lock(&cifs_tcp_ses_lock
);
3690 ++master_tcon
->ses
->server
->srv_count
;
3691 spin_unlock(&cifs_tcp_ses_lock
);
3693 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
3695 tcon
= (struct cifs_tcon
*)ses
;
3696 cifs_put_tcp_session(master_tcon
->ses
->server
);
3700 tcon
= cifs_get_tcon(ses
, vol_info
);
3702 cifs_put_smb_ses(ses
);
3706 if (ses
->capabilities
& CAP_UNIX
)
3707 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
3715 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
3717 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
3721 cifs_sb_tcon_pending_wait(void *unused
)
3724 return signal_pending(current
) ? -ERESTARTSYS
: 0;
3727 /* find and return a tlink with given uid */
3728 static struct tcon_link
*
3729 tlink_rb_search(struct rb_root
*root
, uid_t uid
)
3731 struct rb_node
*node
= root
->rb_node
;
3732 struct tcon_link
*tlink
;
3735 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3737 if (tlink
->tl_uid
> uid
)
3738 node
= node
->rb_left
;
3739 else if (tlink
->tl_uid
< uid
)
3740 node
= node
->rb_right
;
3747 /* insert a tcon_link into the tree */
3749 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
3751 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
3752 struct tcon_link
*tlink
;
3755 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
3758 if (tlink
->tl_uid
> new_tlink
->tl_uid
)
3759 new = &((*new)->rb_left
);
3761 new = &((*new)->rb_right
);
3764 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
3765 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
3769 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3772 * If the superblock doesn't refer to a multiuser mount, then just return
3773 * the master tcon for the mount.
3775 * First, search the rbtree for an existing tcon for this fsuid. If one
3776 * exists, then check to see if it's pending construction. If it is then wait
3777 * for construction to complete. Once it's no longer pending, check to see if
3778 * it failed and either return an error or retry construction, depending on
3781 * If one doesn't exist then insert a new tcon_link struct into the tree and
3782 * try to construct a new one.
3785 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
3788 uid_t fsuid
= current_fsuid();
3789 struct tcon_link
*tlink
, *newtlink
;
3791 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
3792 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
3794 spin_lock(&cifs_sb
->tlink_tree_lock
);
3795 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3797 cifs_get_tlink(tlink
);
3798 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3800 if (tlink
== NULL
) {
3801 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
3802 if (newtlink
== NULL
)
3803 return ERR_PTR(-ENOMEM
);
3804 newtlink
->tl_uid
= fsuid
;
3805 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
3806 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
3807 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
3808 cifs_get_tlink(newtlink
);
3810 spin_lock(&cifs_sb
->tlink_tree_lock
);
3811 /* was one inserted after previous search? */
3812 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3814 cifs_get_tlink(tlink
);
3815 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3817 goto wait_for_construction
;
3820 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3821 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3823 wait_for_construction
:
3824 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
3825 cifs_sb_tcon_pending_wait
,
3826 TASK_INTERRUPTIBLE
);
3828 cifs_put_tlink(tlink
);
3829 return ERR_PTR(ret
);
3832 /* if it's good, return it */
3833 if (!IS_ERR(tlink
->tl_tcon
))
3836 /* return error if we tried this already recently */
3837 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
3838 cifs_put_tlink(tlink
);
3839 return ERR_PTR(-EACCES
);
3842 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
3843 goto wait_for_construction
;
3846 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
3847 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
3848 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
3850 if (IS_ERR(tlink
->tl_tcon
)) {
3851 cifs_put_tlink(tlink
);
3852 return ERR_PTR(-EACCES
);
3859 * periodic workqueue job that scans tcon_tree for a superblock and closes
3863 cifs_prune_tlinks(struct work_struct
*work
)
3865 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
3867 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3868 struct rb_node
*node
= rb_first(root
);
3869 struct rb_node
*tmp
;
3870 struct tcon_link
*tlink
;
3873 * Because we drop the spinlock in the loop in order to put the tlink
3874 * it's not guarded against removal of links from the tree. The only
3875 * places that remove entries from the tree are this function and
3876 * umounts. Because this function is non-reentrant and is canceled
3877 * before umount can proceed, this is safe.
3879 spin_lock(&cifs_sb
->tlink_tree_lock
);
3880 node
= rb_first(root
);
3881 while (node
!= NULL
) {
3883 node
= rb_next(tmp
);
3884 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
3886 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
3887 atomic_read(&tlink
->tl_count
) != 0 ||
3888 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
3891 cifs_get_tlink(tlink
);
3892 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3893 rb_erase(tmp
, root
);
3895 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3896 cifs_put_tlink(tlink
);
3897 spin_lock(&cifs_sb
->tlink_tree_lock
);
3899 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3901 queue_delayed_work(system_nrt_wq
, &cifs_sb
->prune_tlinks
,