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
;
66 char *iocharset
; /* local code page for mapping to and from Unicode */
67 char source_rfc1001_name
[RFC1001_NAME_LEN_WITH_NULL
]; /* clnt nb name */
68 char target_rfc1001_name
[RFC1001_NAME_LEN_WITH_NULL
]; /* srvr nb name */
82 bool no_psx_acl
:1; /* set if posix acl support should be disabled */
84 bool no_xattr
:1; /* set if xattr (EA) support should be disabled*/
85 bool server_ino
:1; /* use inode numbers from server ie UniqueId */
87 bool strict_io
:1; /* strict cache behavior */
88 bool remap
:1; /* set to remap seven reserved chars in filenames */
89 bool posix_paths
:1; /* unset to not ask for posix pathnames. */
92 bool nullauth
:1; /* attempt to authenticate with null user */
93 bool nocase
:1; /* request case insensitive filenames */
94 bool nobrl
:1; /* disable sending byte range locks to srv */
95 bool mand_lock
:1; /* send mandatory not posix byte range lock reqs */
96 bool seal
:1; /* request transport encryption on share */
97 bool nodfs
:1; /* Do not request DFS, even if available */
98 bool local_lease
:1; /* check leases only on local system, not remote */
101 bool nostrictsync
:1; /* do not force expensive SMBflush on every sync */
102 bool fsc
:1; /* enable fscache */
103 bool mfsymlinks
:1; /* use Minshall+French Symlinks */
107 bool sockopt_tcp_nodelay
:1;
108 unsigned short int port
;
109 unsigned long actimeo
; /* attribute cache timeout (jiffies) */
111 struct sockaddr_storage srcaddr
; /* allow binding to a local IP */
112 struct nls_table
*local_nls
;
115 /* FIXME: should these be tunable? */
116 #define TLINK_ERROR_EXPIRE (1 * HZ)
117 #define TLINK_IDLE_EXPIRE (600 * HZ)
119 static int ip_connect(struct TCP_Server_Info
*server
);
120 static int generic_ip_connect(struct TCP_Server_Info
*server
);
121 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
122 static void cifs_prune_tlinks(struct work_struct
*work
);
125 * cifs tcp session reconnection
127 * mark tcp session as reconnecting so temporarily locked
128 * mark all smb sessions as reconnecting for tcp session
129 * reconnect tcp session
130 * wake up waiters on reconnection? - (not needed currently)
133 cifs_reconnect(struct TCP_Server_Info
*server
)
136 struct list_head
*tmp
, *tmp2
;
137 struct cifsSesInfo
*ses
;
138 struct cifsTconInfo
*tcon
;
139 struct mid_q_entry
*mid_entry
;
141 spin_lock(&GlobalMid_Lock
);
142 if (server
->tcpStatus
== CifsExiting
) {
143 /* the demux thread will exit normally
144 next time through the loop */
145 spin_unlock(&GlobalMid_Lock
);
148 server
->tcpStatus
= CifsNeedReconnect
;
149 spin_unlock(&GlobalMid_Lock
);
152 cFYI(1, "Reconnecting tcp session");
154 /* before reconnecting the tcp session, mark the smb session (uid)
155 and the tid bad so they are not used until reconnected */
156 cFYI(1, "%s: marking sessions and tcons for reconnect", __func__
);
157 spin_lock(&cifs_tcp_ses_lock
);
158 list_for_each(tmp
, &server
->smb_ses_list
) {
159 ses
= list_entry(tmp
, struct cifsSesInfo
, smb_ses_list
);
160 ses
->need_reconnect
= true;
162 list_for_each(tmp2
, &ses
->tcon_list
) {
163 tcon
= list_entry(tmp2
, struct cifsTconInfo
, tcon_list
);
164 tcon
->need_reconnect
= true;
167 spin_unlock(&cifs_tcp_ses_lock
);
169 /* do not want to be sending data on a socket we are freeing */
170 cFYI(1, "%s: tearing down socket", __func__
);
171 mutex_lock(&server
->srv_mutex
);
172 if (server
->ssocket
) {
173 cFYI(1, "State: 0x%x Flags: 0x%lx", server
->ssocket
->state
,
174 server
->ssocket
->flags
);
175 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
176 cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
177 server
->ssocket
->state
,
178 server
->ssocket
->flags
);
179 sock_release(server
->ssocket
);
180 server
->ssocket
= NULL
;
182 server
->sequence_number
= 0;
183 server
->session_estab
= false;
184 kfree(server
->session_key
.response
);
185 server
->session_key
.response
= NULL
;
186 server
->session_key
.len
= 0;
187 server
->lstrp
= jiffies
;
188 mutex_unlock(&server
->srv_mutex
);
190 /* mark submitted MIDs for retry and issue callback */
191 cFYI(1, "%s: issuing mid callbacks", __func__
);
192 spin_lock(&GlobalMid_Lock
);
193 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
194 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
195 if (mid_entry
->midState
== MID_REQUEST_SUBMITTED
)
196 mid_entry
->midState
= MID_RETRY_NEEDED
;
197 list_del_init(&mid_entry
->qhead
);
198 mid_entry
->callback(mid_entry
);
200 spin_unlock(&GlobalMid_Lock
);
202 while (server
->tcpStatus
== CifsNeedReconnect
) {
205 /* we should try only the port we connected to before */
206 rc
= generic_ip_connect(server
);
208 cFYI(1, "reconnect error %d", rc
);
211 atomic_inc(&tcpSesReconnectCount
);
212 spin_lock(&GlobalMid_Lock
);
213 if (server
->tcpStatus
!= CifsExiting
)
214 server
->tcpStatus
= CifsNeedNegotiate
;
215 spin_unlock(&GlobalMid_Lock
);
224 0 not a transact2, or all data present
225 >0 transact2 with that much data missing
226 -EINVAL = invalid transact2
229 static int check2ndT2(struct smb_hdr
*pSMB
, unsigned int maxBufSize
)
231 struct smb_t2_rsp
*pSMBt
;
233 __u16 total_data_size
, data_in_this_rsp
;
235 if (pSMB
->Command
!= SMB_COM_TRANSACTION2
)
238 /* check for plausible wct, bcc and t2 data and parm sizes */
239 /* check for parm and data offset going beyond end of smb */
240 if (pSMB
->WordCount
!= 10) { /* coalesce_t2 depends on this */
241 cFYI(1, "invalid transact2 word count");
245 pSMBt
= (struct smb_t2_rsp
*)pSMB
;
247 total_data_size
= get_unaligned_le16(&pSMBt
->t2_rsp
.TotalDataCount
);
248 data_in_this_rsp
= get_unaligned_le16(&pSMBt
->t2_rsp
.DataCount
);
250 if (total_data_size
== data_in_this_rsp
)
252 else if (total_data_size
< data_in_this_rsp
) {
253 cFYI(1, "total data %d smaller than data in frame %d",
254 total_data_size
, data_in_this_rsp
);
258 remaining
= total_data_size
- data_in_this_rsp
;
260 cFYI(1, "missing %d bytes from transact2, check next response",
262 if (total_data_size
> maxBufSize
) {
263 cERROR(1, "TotalDataSize %d is over maximum buffer %d",
264 total_data_size
, maxBufSize
);
270 static int coalesce_t2(struct smb_hdr
*psecond
, struct smb_hdr
*pTargetSMB
)
272 struct smb_t2_rsp
*pSMB2
= (struct smb_t2_rsp
*)psecond
;
273 struct smb_t2_rsp
*pSMBt
= (struct smb_t2_rsp
*)pTargetSMB
;
274 char *data_area_of_target
;
275 char *data_area_of_buf2
;
277 __u16 byte_count
, total_data_size
, total_in_buf
, total_in_buf2
;
279 total_data_size
= get_unaligned_le16(&pSMBt
->t2_rsp
.TotalDataCount
);
281 if (total_data_size
!=
282 get_unaligned_le16(&pSMB2
->t2_rsp
.TotalDataCount
))
283 cFYI(1, "total data size of primary and secondary t2 differ");
285 total_in_buf
= get_unaligned_le16(&pSMBt
->t2_rsp
.DataCount
);
287 remaining
= total_data_size
- total_in_buf
;
292 if (remaining
== 0) /* nothing to do, ignore */
295 total_in_buf2
= get_unaligned_le16(&pSMB2
->t2_rsp
.DataCount
);
296 if (remaining
< total_in_buf2
) {
297 cFYI(1, "transact2 2nd response contains too much data");
300 /* find end of first SMB data area */
301 data_area_of_target
= (char *)&pSMBt
->hdr
.Protocol
+
302 get_unaligned_le16(&pSMBt
->t2_rsp
.DataOffset
);
303 /* validate target area */
305 data_area_of_buf2
= (char *)&pSMB2
->hdr
.Protocol
+
306 get_unaligned_le16(&pSMB2
->t2_rsp
.DataOffset
);
308 data_area_of_target
+= total_in_buf
;
310 /* copy second buffer into end of first buffer */
311 memcpy(data_area_of_target
, data_area_of_buf2
, total_in_buf2
);
312 total_in_buf
+= total_in_buf2
;
313 put_unaligned_le16(total_in_buf
, &pSMBt
->t2_rsp
.DataCount
);
314 byte_count
= get_bcc_le(pTargetSMB
);
315 byte_count
+= total_in_buf2
;
316 put_bcc_le(byte_count
, pTargetSMB
);
318 byte_count
= pTargetSMB
->smb_buf_length
;
319 byte_count
+= total_in_buf2
;
321 /* BB also add check that we are not beyond maximum buffer size */
323 pTargetSMB
->smb_buf_length
= byte_count
;
325 if (remaining
== total_in_buf2
) {
326 cFYI(1, "found the last secondary response");
327 return 0; /* we are done */
328 } else /* more responses to go */
333 cifs_echo_request(struct work_struct
*work
)
336 struct TCP_Server_Info
*server
= container_of(work
,
337 struct TCP_Server_Info
, echo
.work
);
340 * We cannot send an echo until the NEGOTIATE_PROTOCOL request is
341 * done, which is indicated by maxBuf != 0. Also, no need to ping if
342 * we got a response recently
344 if (server
->maxBuf
== 0 ||
345 time_before(jiffies
, server
->lstrp
+ SMB_ECHO_INTERVAL
- HZ
))
348 rc
= CIFSSMBEcho(server
);
350 cFYI(1, "Unable to send echo request to server: %s",
354 queue_delayed_work(system_nrt_wq
, &server
->echo
, SMB_ECHO_INTERVAL
);
358 cifs_demultiplex_thread(struct TCP_Server_Info
*server
)
361 unsigned int pdu_length
, total_read
;
362 struct smb_hdr
*smb_buffer
= NULL
;
363 struct smb_hdr
*bigbuf
= NULL
;
364 struct smb_hdr
*smallbuf
= NULL
;
365 struct msghdr smb_msg
;
367 struct socket
*csocket
= server
->ssocket
;
368 struct list_head
*tmp
, *tmp2
;
369 struct task_struct
*task_to_wake
= NULL
;
370 struct mid_q_entry
*mid_entry
;
372 bool isLargeBuf
= false;
376 current
->flags
|= PF_MEMALLOC
;
377 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current
));
379 length
= atomic_inc_return(&tcpSesAllocCount
);
381 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
385 while (server
->tcpStatus
!= CifsExiting
) {
388 if (bigbuf
== NULL
) {
389 bigbuf
= cifs_buf_get();
391 cERROR(1, "No memory for large SMB response");
393 /* retry will check if exiting */
396 } else if (isLargeBuf
) {
397 /* we are reusing a dirty large buf, clear its start */
398 memset(bigbuf
, 0, sizeof(struct smb_hdr
));
401 if (smallbuf
== NULL
) {
402 smallbuf
= cifs_small_buf_get();
404 cERROR(1, "No memory for SMB response");
406 /* retry will check if exiting */
409 /* beginning of smb buffer is cleared in our buf_get */
410 } else /* if existing small buf clear beginning */
411 memset(smallbuf
, 0, sizeof(struct smb_hdr
));
415 smb_buffer
= smallbuf
;
416 iov
.iov_base
= smb_buffer
;
418 smb_msg
.msg_control
= NULL
;
419 smb_msg
.msg_controllen
= 0;
420 pdu_length
= 4; /* enough to get RFC1001 header */
423 if (echo_retries
> 0 && server
->tcpStatus
== CifsGood
&&
424 time_after(jiffies
, server
->lstrp
+
425 (echo_retries
* SMB_ECHO_INTERVAL
))) {
426 cERROR(1, "Server %s has not responded in %d seconds. "
427 "Reconnecting...", server
->hostname
,
428 (echo_retries
* SMB_ECHO_INTERVAL
/ HZ
));
429 cifs_reconnect(server
);
430 csocket
= server
->ssocket
;
431 wake_up(&server
->response_q
);
436 kernel_recvmsg(csocket
, &smb_msg
,
437 &iov
, 1, pdu_length
, 0 /* BB other flags? */);
439 if (server
->tcpStatus
== CifsExiting
) {
441 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
442 cFYI(1, "Reconnect after server stopped responding");
443 cifs_reconnect(server
);
444 cFYI(1, "call to reconnect done");
445 csocket
= server
->ssocket
;
447 } else if (length
== -ERESTARTSYS
||
450 msleep(1); /* minimum sleep to prevent looping
451 allowing socket to clear and app threads to set
452 tcpStatus CifsNeedReconnect if server hung */
453 if (pdu_length
< 4) {
454 iov
.iov_base
= (4 - pdu_length
) +
456 iov
.iov_len
= pdu_length
;
457 smb_msg
.msg_control
= NULL
;
458 smb_msg
.msg_controllen
= 0;
462 } else if (length
<= 0) {
463 cFYI(1, "Reconnect after unexpected peek error %d",
465 cifs_reconnect(server
);
466 csocket
= server
->ssocket
;
467 wake_up(&server
->response_q
);
469 } else if (length
< pdu_length
) {
470 cFYI(1, "requested %d bytes but only got %d bytes",
472 pdu_length
-= length
;
477 /* The right amount was read from socket - 4 bytes */
478 /* so we can now interpret the length field */
480 /* the first byte big endian of the length field,
481 is actually not part of the length but the type
482 with the most common, zero, as regular data */
483 temp
= *((char *) smb_buffer
);
485 /* Note that FC 1001 length is big endian on the wire,
486 but we convert it here so it is always manipulated
487 as host byte order */
488 pdu_length
= be32_to_cpu((__force __be32
)smb_buffer
->smb_buf_length
);
489 smb_buffer
->smb_buf_length
= pdu_length
;
491 cFYI(1, "rfc1002 length 0x%x", pdu_length
+4);
493 if (temp
== (char) RFC1002_SESSION_KEEP_ALIVE
) {
495 } else if (temp
== (char)RFC1002_POSITIVE_SESSION_RESPONSE
) {
496 cFYI(1, "Good RFC 1002 session rsp");
498 } else if (temp
== (char)RFC1002_NEGATIVE_SESSION_RESPONSE
) {
499 /* we get this from Windows 98 instead of
500 an error on SMB negprot response */
501 cFYI(1, "Negative RFC1002 Session Response Error 0x%x)",
503 /* give server a second to clean up */
505 /* always try 445 first on reconnect since we get NACK
506 * on some if we ever connected to port 139 (the NACK
507 * is since we do not begin with RFC1001 session
510 cifs_set_port((struct sockaddr
*)
511 &server
->dstaddr
, CIFS_PORT
);
512 cifs_reconnect(server
);
513 csocket
= server
->ssocket
;
514 wake_up(&server
->response_q
);
516 } else if (temp
!= (char) 0) {
517 cERROR(1, "Unknown RFC 1002 frame");
518 cifs_dump_mem(" Received Data: ", (char *)smb_buffer
,
520 cifs_reconnect(server
);
521 csocket
= server
->ssocket
;
525 /* else we have an SMB response */
526 if ((pdu_length
> CIFSMaxBufSize
+ MAX_CIFS_HDR_SIZE
- 4) ||
527 (pdu_length
< sizeof(struct smb_hdr
) - 1 - 4)) {
528 cERROR(1, "Invalid size SMB length %d pdu_length %d",
529 length
, pdu_length
+4);
530 cifs_reconnect(server
);
531 csocket
= server
->ssocket
;
532 wake_up(&server
->response_q
);
539 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
541 memcpy(bigbuf
, smallbuf
, 4);
545 iov
.iov_base
= 4 + (char *)smb_buffer
;
546 iov
.iov_len
= pdu_length
;
547 for (total_read
= 0; total_read
< pdu_length
;
548 total_read
+= length
) {
549 length
= kernel_recvmsg(csocket
, &smb_msg
, &iov
, 1,
550 pdu_length
- total_read
, 0);
551 if (server
->tcpStatus
== CifsExiting
) {
555 } else if (server
->tcpStatus
== CifsNeedReconnect
) {
556 cifs_reconnect(server
);
557 csocket
= server
->ssocket
;
558 /* Reconnect wakes up rspns q */
559 /* Now we will reread sock */
562 } else if (length
== -ERESTARTSYS
||
565 msleep(1); /* minimum sleep to prevent looping,
566 allowing socket to clear and app
567 threads to set tcpStatus
568 CifsNeedReconnect if server hung*/
571 } else if (length
<= 0) {
572 cERROR(1, "Received no data, expecting %d",
573 pdu_length
- total_read
);
574 cifs_reconnect(server
);
575 csocket
= server
->ssocket
;
582 else if (reconnect
== 1)
585 total_read
+= 4; /* account for rfc1002 hdr */
587 dump_smb(smb_buffer
, total_read
);
590 * We know that we received enough to get to the MID as we
591 * checked the pdu_length earlier. Now check to see
592 * if the rest of the header is OK. We borrow the length
593 * var for the rest of the loop to avoid a new stack var.
595 * 48 bytes is enough to display the header and a little bit
596 * into the payload for debugging purposes.
598 length
= checkSMB(smb_buffer
, smb_buffer
->Mid
, total_read
);
600 cifs_dump_mem("Bad SMB: ", smb_buffer
,
601 min_t(unsigned int, total_read
, 48));
604 server
->lstrp
= jiffies
;
606 spin_lock(&GlobalMid_Lock
);
607 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
608 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
610 if ((mid_entry
->mid
== smb_buffer
->Mid
) &&
611 (mid_entry
->midState
== MID_REQUEST_SUBMITTED
) &&
612 (mid_entry
->command
== smb_buffer
->Command
)) {
614 check2ndT2(smb_buffer
, server
->maxBuf
) > 0) {
615 /* We have a multipart transact2 resp */
617 if (mid_entry
->resp_buf
) {
618 /* merge response - fix up 1st*/
619 if (coalesce_t2(smb_buffer
,
620 mid_entry
->resp_buf
)) {
621 mid_entry
->multiRsp
=
625 /* all parts received */
626 mid_entry
->multiEnd
=
632 cERROR(1, "1st trans2 resp needs bigbuf");
633 /* BB maybe we can fix this up, switch
634 to already allocated large buffer? */
636 /* Have first buffer */
637 mid_entry
->resp_buf
=
639 mid_entry
->largeBuf
=
646 mid_entry
->resp_buf
= smb_buffer
;
647 mid_entry
->largeBuf
= isLargeBuf
;
650 mid_entry
->midState
=
651 MID_RESPONSE_RECEIVED
;
653 mid_entry
->midState
=
654 MID_RESPONSE_MALFORMED
;
655 #ifdef CONFIG_CIFS_STATS2
656 mid_entry
->when_received
= jiffies
;
658 list_del_init(&mid_entry
->qhead
);
659 mid_entry
->callback(mid_entry
);
664 spin_unlock(&GlobalMid_Lock
);
666 if (mid_entry
!= NULL
) {
667 /* Was previous buf put in mpx struct for multi-rsp? */
669 /* smb buffer will be freed by user thread */
675 } else if (length
!= 0) {
676 /* response sanity checks failed */
678 } else if (!is_valid_oplock_break(smb_buffer
, server
) &&
680 cERROR(1, "No task to wake, unknown frame received! "
681 "NumMids %d", atomic_read(&midCount
));
682 cifs_dump_mem("Received Data is: ", (char *)smb_buffer
,
683 sizeof(struct smb_hdr
));
684 #ifdef CONFIG_CIFS_DEBUG2
685 cifs_dump_detail(smb_buffer
);
686 cifs_dump_mids(server
);
687 #endif /* CIFS_DEBUG2 */
690 } /* end while !EXITING */
692 /* take it off the list, if it's not already */
693 spin_lock(&cifs_tcp_ses_lock
);
694 list_del_init(&server
->tcp_ses_list
);
695 spin_unlock(&cifs_tcp_ses_lock
);
697 spin_lock(&GlobalMid_Lock
);
698 server
->tcpStatus
= CifsExiting
;
699 spin_unlock(&GlobalMid_Lock
);
700 wake_up_all(&server
->response_q
);
702 /* check if we have blocked requests that need to free */
703 /* Note that cifs_max_pending is normally 50, but
704 can be set at module install time to as little as two */
705 spin_lock(&GlobalMid_Lock
);
706 if (atomic_read(&server
->inFlight
) >= cifs_max_pending
)
707 atomic_set(&server
->inFlight
, cifs_max_pending
- 1);
708 /* We do not want to set the max_pending too low or we
709 could end up with the counter going negative */
710 spin_unlock(&GlobalMid_Lock
);
711 /* Although there should not be any requests blocked on
712 this queue it can not hurt to be paranoid and try to wake up requests
713 that may haven been blocked when more than 50 at time were on the wire
714 to the same server - they now will see the session is in exit state
715 and get out of SendReceive. */
716 wake_up_all(&server
->request_q
);
717 /* give those requests time to exit */
720 if (server
->ssocket
) {
721 sock_release(csocket
);
722 server
->ssocket
= NULL
;
724 /* buffer usuallly freed in free_mid - need to free it here on exit */
725 cifs_buf_release(bigbuf
);
726 if (smallbuf
) /* no sense logging a debug message if NULL */
727 cifs_small_buf_release(smallbuf
);
729 if (!list_empty(&server
->pending_mid_q
)) {
730 spin_lock(&GlobalMid_Lock
);
731 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
732 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
733 cFYI(1, "Clearing Mid 0x%x - issuing callback",
735 list_del_init(&mid_entry
->qhead
);
736 mid_entry
->callback(mid_entry
);
738 spin_unlock(&GlobalMid_Lock
);
739 /* 1/8th of sec is more than enough time for them to exit */
743 if (!list_empty(&server
->pending_mid_q
)) {
744 /* mpx threads have not exited yet give them
745 at least the smb send timeout time for long ops */
746 /* due to delays on oplock break requests, we need
747 to wait at least 45 seconds before giving up
748 on a request getting a response and going ahead
750 cFYI(1, "Wait for exit from demultiplex thread");
752 /* if threads still have not exited they are probably never
753 coming home not much else we can do but free the memory */
756 kfree(server
->hostname
);
757 task_to_wake
= xchg(&server
->tsk
, NULL
);
760 length
= atomic_dec_return(&tcpSesAllocCount
);
762 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
,
765 /* if server->tsk was NULL then wait for a signal before exiting */
767 set_current_state(TASK_INTERRUPTIBLE
);
768 while (!signal_pending(current
)) {
770 set_current_state(TASK_INTERRUPTIBLE
);
772 set_current_state(TASK_RUNNING
);
775 module_put_and_exit(0);
778 /* extract the host portion of the UNC string */
780 extract_hostname(const char *unc
)
786 /* skip double chars at beginning of string */
787 /* BB: check validity of these bytes? */
790 /* delimiter between hostname and sharename is always '\\' now */
791 delim
= strchr(src
, '\\');
793 return ERR_PTR(-EINVAL
);
796 dst
= kmalloc((len
+ 1), GFP_KERNEL
);
798 return ERR_PTR(-ENOMEM
);
800 memcpy(dst
, src
, len
);
807 cifs_parse_mount_options(char *options
, const char *devname
,
810 char *value
, *data
, *end
;
811 unsigned int temp_len
, i
, j
;
813 short int override_uid
= -1;
814 short int override_gid
= -1;
815 bool uid_specified
= false;
816 bool gid_specified
= false;
817 char *nodename
= utsname()->nodename
;
823 * does not have to be perfect mapping since field is
824 * informational, only used for servers that do not support
825 * port 445 and it can be overridden at mount time
827 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
828 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
829 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
831 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
832 /* null target name indicates to use *SMBSERVR default called name
833 if we end up sending RFC1001 session initialize */
834 vol
->target_rfc1001_name
[0] = 0;
835 vol
->cred_uid
= current_uid();
836 vol
->linux_uid
= current_uid();
837 vol
->linux_gid
= current_gid();
839 /* default to only allowing write access to owner of the mount */
840 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
842 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
843 /* default is always to request posix paths. */
844 vol
->posix_paths
= 1;
845 /* default to using server inode numbers where available */
848 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
853 end
= options
+ strlen(options
);
854 if (strncmp(options
, "sep=", 4) == 0) {
855 if (options
[4] != 0) {
856 separator
[0] = options
[4];
859 cFYI(1, "Null separator not allowed");
863 while ((data
= strsep(&options
, separator
)) != NULL
) {
866 if ((value
= strchr(data
, '=')) != NULL
)
869 /* Have to parse this before we parse for "user" */
870 if (strnicmp(data
, "user_xattr", 10) == 0) {
872 } else if (strnicmp(data
, "nouser_xattr", 12) == 0) {
874 } else if (strnicmp(data
, "user", 4) == 0) {
877 "CIFS: invalid or missing username\n");
878 return 1; /* needs_arg; */
879 } else if (!*value
) {
880 /* null user, ie anonymous, authentication */
883 if (strnlen(value
, MAX_USERNAME_SIZE
) <
885 vol
->username
= value
;
887 printk(KERN_WARNING
"CIFS: username too long\n");
890 } else if (strnicmp(data
, "pass", 4) == 0) {
892 vol
->password
= NULL
;
894 } else if (value
[0] == 0) {
895 /* check if string begins with double comma
896 since that would mean the password really
897 does start with a comma, and would not
898 indicate an empty string */
899 if (value
[1] != separator
[0]) {
900 vol
->password
= NULL
;
904 temp_len
= strlen(value
);
905 /* removed password length check, NTLM passwords
906 can be arbitrarily long */
908 /* if comma in password, the string will be
909 prematurely null terminated. Commas in password are
910 specified across the cifs mount interface by a double
911 comma ie ,, and a comma used as in other cases ie ','
912 as a parameter delimiter/separator is single and due
913 to the strsep above is temporarily zeroed. */
915 /* NB: password legally can have multiple commas and
916 the only illegal character in a password is null */
918 if ((value
[temp_len
] == 0) &&
919 (value
+ temp_len
< end
) &&
920 (value
[temp_len
+1] == separator
[0])) {
922 value
[temp_len
] = separator
[0];
923 temp_len
+= 2; /* move after second comma */
924 while (value
[temp_len
] != 0) {
925 if (value
[temp_len
] == separator
[0]) {
926 if (value
[temp_len
+1] ==
928 /* skip second comma */
931 /* single comma indicating start
938 if (value
[temp_len
] == 0) {
942 /* point option to start of next parm */
943 options
= value
+ temp_len
+ 1;
945 /* go from value to value + temp_len condensing
946 double commas to singles. Note that this ends up
947 allocating a few bytes too many, which is ok */
948 vol
->password
= kzalloc(temp_len
, GFP_KERNEL
);
949 if (vol
->password
== NULL
) {
950 printk(KERN_WARNING
"CIFS: no memory "
954 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
955 vol
->password
[j
] = value
[i
];
956 if (value
[i
] == separator
[0]
957 && value
[i
+1] == separator
[0]) {
958 /* skip second comma */
962 vol
->password
[j
] = 0;
964 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
965 if (vol
->password
== NULL
) {
966 printk(KERN_WARNING
"CIFS: no memory "
970 strcpy(vol
->password
, value
);
972 } else if (!strnicmp(data
, "ip", 2) ||
973 !strnicmp(data
, "addr", 4)) {
974 if (!value
|| !*value
) {
976 } else if (strnlen(value
, INET6_ADDRSTRLEN
) <
980 printk(KERN_WARNING
"CIFS: ip address "
984 } else if (strnicmp(data
, "sec", 3) == 0) {
985 if (!value
|| !*value
) {
986 cERROR(1, "no security value specified");
988 } else if (strnicmp(value
, "krb5i", 5) == 0) {
989 vol
->secFlg
|= CIFSSEC_MAY_KRB5
|
991 } else if (strnicmp(value
, "krb5p", 5) == 0) {
992 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
994 cERROR(1, "Krb5 cifs privacy not supported");
996 } else if (strnicmp(value
, "krb5", 4) == 0) {
997 vol
->secFlg
|= CIFSSEC_MAY_KRB5
;
998 } else if (strnicmp(value
, "ntlmsspi", 8) == 0) {
999 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
|
1001 } else if (strnicmp(value
, "ntlmssp", 7) == 0) {
1002 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
;
1003 } else if (strnicmp(value
, "ntlmv2i", 7) == 0) {
1004 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
|
1006 } else if (strnicmp(value
, "ntlmv2", 6) == 0) {
1007 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1008 } else if (strnicmp(value
, "ntlmi", 5) == 0) {
1009 vol
->secFlg
|= CIFSSEC_MAY_NTLM
|
1011 } else if (strnicmp(value
, "ntlm", 4) == 0) {
1012 /* ntlm is default so can be turned off too */
1013 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1014 } else if (strnicmp(value
, "nontlm", 6) == 0) {
1015 /* BB is there a better way to do this? */
1016 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1017 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1018 } else if (strnicmp(value
, "lanman", 6) == 0) {
1019 vol
->secFlg
|= CIFSSEC_MAY_LANMAN
;
1021 } else if (strnicmp(value
, "none", 4) == 0) {
1024 cERROR(1, "bad security option: %s", value
);
1027 } else if ((strnicmp(data
, "unc", 3) == 0)
1028 || (strnicmp(data
, "target", 6) == 0)
1029 || (strnicmp(data
, "path", 4) == 0)) {
1030 if (!value
|| !*value
) {
1031 printk(KERN_WARNING
"CIFS: invalid path to "
1032 "network resource\n");
1033 return 1; /* needs_arg; */
1035 if ((temp_len
= strnlen(value
, 300)) < 300) {
1036 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1037 if (vol
->UNC
== NULL
)
1039 strcpy(vol
->UNC
, value
);
1040 if (strncmp(vol
->UNC
, "//", 2) == 0) {
1043 } else if (strncmp(vol
->UNC
, "\\\\", 2) != 0) {
1045 "CIFS: UNC Path does not begin "
1046 "with // or \\\\ \n");
1050 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1053 } else if ((strnicmp(data
, "domain", 3) == 0)
1054 || (strnicmp(data
, "workgroup", 5) == 0)) {
1055 if (!value
|| !*value
) {
1056 printk(KERN_WARNING
"CIFS: invalid domain name\n");
1057 return 1; /* needs_arg; */
1059 /* BB are there cases in which a comma can be valid in
1060 a domain name and need special handling? */
1061 if (strnlen(value
, 256) < 256) {
1062 vol
->domainname
= value
;
1063 cFYI(1, "Domain name set");
1065 printk(KERN_WARNING
"CIFS: domain name too "
1069 } else if (strnicmp(data
, "srcaddr", 7) == 0) {
1070 vol
->srcaddr
.ss_family
= AF_UNSPEC
;
1072 if (!value
|| !*value
) {
1073 printk(KERN_WARNING
"CIFS: srcaddr value"
1074 " not specified.\n");
1075 return 1; /* needs_arg; */
1077 i
= cifs_convert_address((struct sockaddr
*)&vol
->srcaddr
,
1078 value
, strlen(value
));
1080 printk(KERN_WARNING
"CIFS: Could not parse"
1085 } else if (strnicmp(data
, "prefixpath", 10) == 0) {
1086 if (!value
|| !*value
) {
1088 "CIFS: invalid path prefix\n");
1089 return 1; /* needs_argument */
1091 if ((temp_len
= strnlen(value
, 1024)) < 1024) {
1092 if (value
[0] != '/')
1093 temp_len
++; /* missing leading slash */
1094 vol
->prepath
= kmalloc(temp_len
+1, GFP_KERNEL
);
1095 if (vol
->prepath
== NULL
)
1097 if (value
[0] != '/') {
1098 vol
->prepath
[0] = '/';
1099 strcpy(vol
->prepath
+1, value
);
1101 strcpy(vol
->prepath
, value
);
1102 cFYI(1, "prefix path %s", vol
->prepath
);
1104 printk(KERN_WARNING
"CIFS: prefix too long\n");
1107 } else if (strnicmp(data
, "iocharset", 9) == 0) {
1108 if (!value
|| !*value
) {
1109 printk(KERN_WARNING
"CIFS: invalid iocharset "
1111 return 1; /* needs_arg; */
1113 if (strnlen(value
, 65) < 65) {
1114 if (strnicmp(value
, "default", 7))
1115 vol
->iocharset
= value
;
1116 /* if iocharset not set then load_nls_default
1117 is used by caller */
1118 cFYI(1, "iocharset set to %s", value
);
1120 printk(KERN_WARNING
"CIFS: iocharset name "
1124 } else if (!strnicmp(data
, "uid", 3) && value
&& *value
) {
1125 vol
->linux_uid
= simple_strtoul(value
, &value
, 0);
1126 uid_specified
= true;
1127 } else if (!strnicmp(data
, "cruid", 5) && value
&& *value
) {
1128 vol
->cred_uid
= simple_strtoul(value
, &value
, 0);
1129 } else if (!strnicmp(data
, "forceuid", 8)) {
1131 } else if (!strnicmp(data
, "noforceuid", 10)) {
1133 } else if (!strnicmp(data
, "gid", 3) && value
&& *value
) {
1134 vol
->linux_gid
= simple_strtoul(value
, &value
, 0);
1135 gid_specified
= true;
1136 } else if (!strnicmp(data
, "forcegid", 8)) {
1138 } else if (!strnicmp(data
, "noforcegid", 10)) {
1140 } else if (strnicmp(data
, "file_mode", 4) == 0) {
1141 if (value
&& *value
) {
1143 simple_strtoul(value
, &value
, 0);
1145 } else if (strnicmp(data
, "dir_mode", 4) == 0) {
1146 if (value
&& *value
) {
1148 simple_strtoul(value
, &value
, 0);
1150 } else if (strnicmp(data
, "dirmode", 4) == 0) {
1151 if (value
&& *value
) {
1153 simple_strtoul(value
, &value
, 0);
1155 } else if (strnicmp(data
, "port", 4) == 0) {
1156 if (value
&& *value
) {
1158 simple_strtoul(value
, &value
, 0);
1160 } else if (strnicmp(data
, "rsize", 5) == 0) {
1161 if (value
&& *value
) {
1163 simple_strtoul(value
, &value
, 0);
1165 } else if (strnicmp(data
, "wsize", 5) == 0) {
1166 if (value
&& *value
) {
1168 simple_strtoul(value
, &value
, 0);
1170 } else if (strnicmp(data
, "sockopt", 5) == 0) {
1171 if (!value
|| !*value
) {
1172 cERROR(1, "no socket option specified");
1174 } else if (strnicmp(value
, "TCP_NODELAY", 11) == 0) {
1175 vol
->sockopt_tcp_nodelay
= 1;
1177 } else if (strnicmp(data
, "netbiosname", 4) == 0) {
1178 if (!value
|| !*value
|| (*value
== ' ')) {
1179 cFYI(1, "invalid (empty) netbiosname");
1181 memset(vol
->source_rfc1001_name
, 0x20,
1184 * FIXME: are there cases in which a comma can
1185 * be valid in workstation netbios name (and
1186 * need special handling)?
1188 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1189 /* don't ucase netbiosname for user */
1192 vol
->source_rfc1001_name
[i
] = value
[i
];
1194 /* The string has 16th byte zero still from
1195 set at top of the function */
1196 if (i
== RFC1001_NAME_LEN
&& value
[i
] != 0)
1197 printk(KERN_WARNING
"CIFS: netbiosname"
1198 " longer than 15 truncated.\n");
1200 } else if (strnicmp(data
, "servern", 7) == 0) {
1201 /* servernetbiosname specified override *SMBSERVER */
1202 if (!value
|| !*value
|| (*value
== ' ')) {
1203 cFYI(1, "empty server netbiosname specified");
1205 /* last byte, type, is 0x20 for servr type */
1206 memset(vol
->target_rfc1001_name
, 0x20,
1207 RFC1001_NAME_LEN_WITH_NULL
);
1209 for (i
= 0; i
< 15; i
++) {
1210 /* BB are there cases in which a comma can be
1211 valid in this workstation netbios name
1212 (and need special handling)? */
1214 /* user or mount helper must uppercase
1219 vol
->target_rfc1001_name
[i
] =
1222 /* The string has 16th byte zero still from
1223 set at top of the function */
1224 if (i
== RFC1001_NAME_LEN
&& value
[i
] != 0)
1225 printk(KERN_WARNING
"CIFS: server net"
1226 "biosname longer than 15 truncated.\n");
1228 } else if (strnicmp(data
, "actimeo", 7) == 0) {
1229 if (value
&& *value
) {
1230 vol
->actimeo
= HZ
* simple_strtoul(value
,
1232 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1233 cERROR(1, "CIFS: attribute cache"
1234 "timeout too large");
1238 } else if (strnicmp(data
, "credentials", 4) == 0) {
1240 } else if (strnicmp(data
, "version", 3) == 0) {
1242 } else if (strnicmp(data
, "guest", 5) == 0) {
1244 } else if (strnicmp(data
, "rw", 2) == 0) {
1246 } else if (strnicmp(data
, "ro", 2) == 0) {
1248 } else if (strnicmp(data
, "noblocksend", 11) == 0) {
1249 vol
->noblocksnd
= 1;
1250 } else if (strnicmp(data
, "noautotune", 10) == 0) {
1251 vol
->noautotune
= 1;
1252 } else if ((strnicmp(data
, "suid", 4) == 0) ||
1253 (strnicmp(data
, "nosuid", 6) == 0) ||
1254 (strnicmp(data
, "exec", 4) == 0) ||
1255 (strnicmp(data
, "noexec", 6) == 0) ||
1256 (strnicmp(data
, "nodev", 5) == 0) ||
1257 (strnicmp(data
, "noauto", 6) == 0) ||
1258 (strnicmp(data
, "dev", 3) == 0)) {
1259 /* The mount tool or mount.cifs helper (if present)
1260 uses these opts to set flags, and the flags are read
1261 by the kernel vfs layer before we get here (ie
1262 before read super) so there is no point trying to
1263 parse these options again and set anything and it
1264 is ok to just ignore them */
1266 } else if (strnicmp(data
, "hard", 4) == 0) {
1268 } else if (strnicmp(data
, "soft", 4) == 0) {
1270 } else if (strnicmp(data
, "perm", 4) == 0) {
1272 } else if (strnicmp(data
, "noperm", 6) == 0) {
1274 } else if (strnicmp(data
, "mapchars", 8) == 0) {
1276 } else if (strnicmp(data
, "nomapchars", 10) == 0) {
1278 } else if (strnicmp(data
, "sfu", 3) == 0) {
1280 } else if (strnicmp(data
, "nosfu", 5) == 0) {
1282 } else if (strnicmp(data
, "nodfs", 5) == 0) {
1284 } else if (strnicmp(data
, "posixpaths", 10) == 0) {
1285 vol
->posix_paths
= 1;
1286 } else if (strnicmp(data
, "noposixpaths", 12) == 0) {
1287 vol
->posix_paths
= 0;
1288 } else if (strnicmp(data
, "nounix", 6) == 0) {
1289 vol
->no_linux_ext
= 1;
1290 } else if (strnicmp(data
, "nolinux", 7) == 0) {
1291 vol
->no_linux_ext
= 1;
1292 } else if ((strnicmp(data
, "nocase", 6) == 0) ||
1293 (strnicmp(data
, "ignorecase", 10) == 0)) {
1295 } else if (strnicmp(data
, "mand", 4) == 0) {
1297 } else if (strnicmp(data
, "nomand", 6) == 0) {
1299 } else if (strnicmp(data
, "_netdev", 7) == 0) {
1301 } else if (strnicmp(data
, "brl", 3) == 0) {
1303 } else if ((strnicmp(data
, "nobrl", 5) == 0) ||
1304 (strnicmp(data
, "nolock", 6) == 0)) {
1306 /* turn off mandatory locking in mode
1307 if remote locking is turned off since the
1308 local vfs will do advisory */
1309 if (vol
->file_mode
==
1310 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1311 vol
->file_mode
= S_IALLUGO
;
1312 } else if (strnicmp(data
, "forcemandatorylock", 9) == 0) {
1313 /* will take the shorter form "forcemand" as well */
1314 /* This mount option will force use of mandatory
1315 (DOS/Windows style) byte range locks, instead of
1316 using posix advisory byte range locks, even if the
1317 Unix extensions are available and posix locks would
1318 be supported otherwise. If Unix extensions are not
1319 negotiated this has no effect since mandatory locks
1320 would be used (mandatory locks is all that those
1321 those servers support) */
1323 } else if (strnicmp(data
, "setuids", 7) == 0) {
1325 } else if (strnicmp(data
, "nosetuids", 9) == 0) {
1327 } else if (strnicmp(data
, "dynperm", 7) == 0) {
1328 vol
->dynperm
= true;
1329 } else if (strnicmp(data
, "nodynperm", 9) == 0) {
1330 vol
->dynperm
= false;
1331 } else if (strnicmp(data
, "nohard", 6) == 0) {
1333 } else if (strnicmp(data
, "nosoft", 6) == 0) {
1335 } else if (strnicmp(data
, "nointr", 6) == 0) {
1337 } else if (strnicmp(data
, "intr", 4) == 0) {
1339 } else if (strnicmp(data
, "nostrictsync", 12) == 0) {
1340 vol
->nostrictsync
= 1;
1341 } else if (strnicmp(data
, "strictsync", 10) == 0) {
1342 vol
->nostrictsync
= 0;
1343 } else if (strnicmp(data
, "serverino", 7) == 0) {
1344 vol
->server_ino
= 1;
1345 } else if (strnicmp(data
, "noserverino", 9) == 0) {
1346 vol
->server_ino
= 0;
1347 } else if (strnicmp(data
, "cifsacl", 7) == 0) {
1349 } else if (strnicmp(data
, "nocifsacl", 9) == 0) {
1351 } else if (strnicmp(data
, "acl", 3) == 0) {
1352 vol
->no_psx_acl
= 0;
1353 } else if (strnicmp(data
, "noacl", 5) == 0) {
1354 vol
->no_psx_acl
= 1;
1355 } else if (strnicmp(data
, "locallease", 6) == 0) {
1356 vol
->local_lease
= 1;
1357 } else if (strnicmp(data
, "sign", 4) == 0) {
1358 vol
->secFlg
|= CIFSSEC_MUST_SIGN
;
1359 } else if (strnicmp(data
, "seal", 4) == 0) {
1360 /* we do not do the following in secFlags because seal
1361 is a per tree connection (mount) not a per socket
1362 or per-smb connection option in the protocol */
1363 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1365 } else if (strnicmp(data
, "direct", 6) == 0) {
1367 } else if (strnicmp(data
, "forcedirectio", 13) == 0) {
1369 } else if (strnicmp(data
, "strictcache", 11) == 0) {
1371 } else if (strnicmp(data
, "noac", 4) == 0) {
1372 printk(KERN_WARNING
"CIFS: Mount option noac not "
1373 "supported. Instead set "
1374 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1375 } else if (strnicmp(data
, "fsc", 3) == 0) {
1376 #ifndef CONFIG_CIFS_FSCACHE
1377 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE"
1378 "kernel config option set");
1382 } else if (strnicmp(data
, "mfsymlinks", 10) == 0) {
1383 vol
->mfsymlinks
= true;
1384 } else if (strnicmp(data
, "multiuser", 8) == 0) {
1385 vol
->multiuser
= true;
1387 printk(KERN_WARNING
"CIFS: Unknown mount option %s\n",
1390 if (vol
->UNC
== NULL
) {
1391 if (devname
== NULL
) {
1392 printk(KERN_WARNING
"CIFS: Missing UNC name for mount "
1396 if ((temp_len
= strnlen(devname
, 300)) < 300) {
1397 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1398 if (vol
->UNC
== NULL
)
1400 strcpy(vol
->UNC
, devname
);
1401 if (strncmp(vol
->UNC
, "//", 2) == 0) {
1404 } else if (strncmp(vol
->UNC
, "\\\\", 2) != 0) {
1405 printk(KERN_WARNING
"CIFS: UNC Path does not "
1406 "begin with // or \\\\ \n");
1409 value
= strpbrk(vol
->UNC
+2, "/\\");
1413 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1418 if (vol
->multiuser
&& !(vol
->secFlg
& CIFSSEC_MAY_KRB5
)) {
1419 cERROR(1, "Multiuser mounts currently require krb5 "
1424 if (vol
->UNCip
== NULL
)
1425 vol
->UNCip
= &vol
->UNC
[2];
1428 vol
->override_uid
= override_uid
;
1429 else if (override_uid
== 1)
1430 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1431 "specified with no uid= option.\n");
1434 vol
->override_gid
= override_gid
;
1435 else if (override_gid
== 1)
1436 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1437 "specified with no gid= option.\n");
1442 /** Returns true if srcaddr isn't specified and rhs isn't
1443 * specified, or if srcaddr is specified and
1444 * matches the IP address of the rhs argument.
1447 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1449 switch (srcaddr
->sa_family
) {
1451 return (rhs
->sa_family
== AF_UNSPEC
);
1453 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1454 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1455 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1458 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1459 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)&rhs
;
1460 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1464 return false; /* don't expect to be here */
1469 * If no port is specified in addr structure, we try to match with 445 port
1470 * and if it fails - with 139 ports. It should be called only if address
1471 * families of server and addr are equal.
1474 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1476 __be16 port
, *sport
;
1478 switch (addr
->sa_family
) {
1480 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1481 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1484 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1485 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
1493 port
= htons(CIFS_PORT
);
1497 port
= htons(RFC1001_PORT
);
1500 return port
== *sport
;
1504 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1505 struct sockaddr
*srcaddr
)
1507 switch (addr
->sa_family
) {
1509 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
1510 struct sockaddr_in
*srv_addr4
=
1511 (struct sockaddr_in
*)&server
->dstaddr
;
1513 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
1518 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
1519 struct sockaddr_in6
*srv_addr6
=
1520 (struct sockaddr_in6
*)&server
->dstaddr
;
1522 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
1523 &srv_addr6
->sin6_addr
))
1525 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
1531 return false; /* don't expect to be here */
1534 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
1541 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
1543 unsigned int secFlags
;
1545 if (vol
->secFlg
& (~(CIFSSEC_MUST_SIGN
| CIFSSEC_MUST_SEAL
)))
1546 secFlags
= vol
->secFlg
;
1548 secFlags
= global_secflags
| vol
->secFlg
;
1550 switch (server
->secType
) {
1552 if (!(secFlags
& (CIFSSEC_MAY_LANMAN
|CIFSSEC_MAY_PLNTXT
)))
1556 if (!(secFlags
& CIFSSEC_MAY_NTLMV2
))
1560 if (!(secFlags
& CIFSSEC_MAY_NTLM
))
1564 if (!(secFlags
& CIFSSEC_MAY_KRB5
))
1568 if (!(secFlags
& CIFSSEC_MAY_NTLMSSP
))
1572 /* shouldn't happen */
1576 /* now check if signing mode is acceptable */
1577 if ((secFlags
& CIFSSEC_MAY_SIGN
) == 0 &&
1578 (server
->secMode
& SECMODE_SIGN_REQUIRED
))
1580 else if (((secFlags
& CIFSSEC_MUST_SIGN
) == CIFSSEC_MUST_SIGN
) &&
1582 (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
)) == 0)
1588 static struct TCP_Server_Info
*
1589 cifs_find_tcp_session(struct sockaddr
*addr
, struct smb_vol
*vol
)
1591 struct TCP_Server_Info
*server
;
1593 spin_lock(&cifs_tcp_ses_lock
);
1594 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
1595 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
1598 if (!match_address(server
, addr
,
1599 (struct sockaddr
*)&vol
->srcaddr
))
1602 if (!match_port(server
, addr
))
1605 if (!match_security(server
, vol
))
1608 ++server
->srv_count
;
1609 spin_unlock(&cifs_tcp_ses_lock
);
1610 cFYI(1, "Existing tcp session with server found");
1613 spin_unlock(&cifs_tcp_ses_lock
);
1618 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
1620 struct task_struct
*task
;
1622 spin_lock(&cifs_tcp_ses_lock
);
1623 if (--server
->srv_count
> 0) {
1624 spin_unlock(&cifs_tcp_ses_lock
);
1628 put_net(cifs_net_ns(server
));
1630 list_del_init(&server
->tcp_ses_list
);
1631 spin_unlock(&cifs_tcp_ses_lock
);
1633 cancel_delayed_work_sync(&server
->echo
);
1635 spin_lock(&GlobalMid_Lock
);
1636 server
->tcpStatus
= CifsExiting
;
1637 spin_unlock(&GlobalMid_Lock
);
1639 cifs_crypto_shash_release(server
);
1640 cifs_fscache_release_client_cookie(server
);
1642 kfree(server
->session_key
.response
);
1643 server
->session_key
.response
= NULL
;
1644 server
->session_key
.len
= 0;
1646 task
= xchg(&server
->tsk
, NULL
);
1648 force_sig(SIGKILL
, task
);
1651 static struct TCP_Server_Info
*
1652 cifs_get_tcp_session(struct smb_vol
*volume_info
)
1654 struct TCP_Server_Info
*tcp_ses
= NULL
;
1655 struct sockaddr_storage addr
;
1656 struct sockaddr_in
*sin_server
= (struct sockaddr_in
*) &addr
;
1657 struct sockaddr_in6
*sin_server6
= (struct sockaddr_in6
*) &addr
;
1660 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
1662 cFYI(1, "UNC: %s ip: %s", volume_info
->UNC
, volume_info
->UNCip
);
1664 if (volume_info
->UNCip
&& volume_info
->UNC
) {
1665 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
1667 strlen(volume_info
->UNCip
),
1670 /* we failed translating address */
1674 } else if (volume_info
->UNCip
) {
1675 /* BB using ip addr as tcp_ses name to connect to the
1677 cERROR(1, "Connecting to DFS root not implemented yet");
1680 } else /* which tcp_sess DFS root would we conect to */ {
1681 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1682 "unc=//192.168.1.100/public) specified");
1687 /* see if we already have a matching tcp_ses */
1688 tcp_ses
= cifs_find_tcp_session((struct sockaddr
*)&addr
, volume_info
);
1692 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
1698 rc
= cifs_crypto_shash_allocate(tcp_ses
);
1700 cERROR(1, "could not setup hash structures rc %d", rc
);
1704 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
1705 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
1706 if (IS_ERR(tcp_ses
->hostname
)) {
1707 rc
= PTR_ERR(tcp_ses
->hostname
);
1708 goto out_err_crypto_release
;
1711 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
1712 tcp_ses
->noautotune
= volume_info
->noautotune
;
1713 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
1714 atomic_set(&tcp_ses
->inFlight
, 0);
1715 init_waitqueue_head(&tcp_ses
->response_q
);
1716 init_waitqueue_head(&tcp_ses
->request_q
);
1717 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
1718 mutex_init(&tcp_ses
->srv_mutex
);
1719 memcpy(tcp_ses
->workstation_RFC1001_name
,
1720 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1721 memcpy(tcp_ses
->server_RFC1001_name
,
1722 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1723 tcp_ses
->session_estab
= false;
1724 tcp_ses
->sequence_number
= 0;
1725 tcp_ses
->lstrp
= jiffies
;
1726 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
1727 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
1728 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
1731 * at this point we are the only ones with the pointer
1732 * to the struct since the kernel thread not created yet
1733 * no need to spinlock this init of tcpStatus or srv_count
1735 tcp_ses
->tcpStatus
= CifsNew
;
1736 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
1737 sizeof(tcp_ses
->srcaddr
));
1738 ++tcp_ses
->srv_count
;
1740 if (addr
.ss_family
== AF_INET6
) {
1741 cFYI(1, "attempting ipv6 connect");
1742 /* BB should we allow ipv6 on port 139? */
1743 /* other OS never observed in Wild doing 139 with v6 */
1744 memcpy(&tcp_ses
->dstaddr
, sin_server6
,
1745 sizeof(struct sockaddr_in6
));
1747 memcpy(&tcp_ses
->dstaddr
, sin_server
,
1748 sizeof(struct sockaddr_in
));
1750 rc
= ip_connect(tcp_ses
);
1752 cERROR(1, "Error connecting to socket. Aborting operation");
1753 goto out_err_crypto_release
;
1757 * since we're in a cifs function already, we know that
1758 * this will succeed. No need for try_module_get().
1760 __module_get(THIS_MODULE
);
1761 tcp_ses
->tsk
= kthread_run((void *)(void *)cifs_demultiplex_thread
,
1763 if (IS_ERR(tcp_ses
->tsk
)) {
1764 rc
= PTR_ERR(tcp_ses
->tsk
);
1765 cERROR(1, "error %d create cifsd thread", rc
);
1766 module_put(THIS_MODULE
);
1767 goto out_err_crypto_release
;
1769 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
1771 /* thread spawned, put it on the list */
1772 spin_lock(&cifs_tcp_ses_lock
);
1773 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
1774 spin_unlock(&cifs_tcp_ses_lock
);
1776 cifs_fscache_get_client_cookie(tcp_ses
);
1778 /* queue echo request delayed work */
1779 queue_delayed_work(system_nrt_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
1783 out_err_crypto_release
:
1784 cifs_crypto_shash_release(tcp_ses
);
1786 put_net(cifs_net_ns(tcp_ses
));
1790 if (!IS_ERR(tcp_ses
->hostname
))
1791 kfree(tcp_ses
->hostname
);
1792 if (tcp_ses
->ssocket
)
1793 sock_release(tcp_ses
->ssocket
);
1799 static struct cifsSesInfo
*
1800 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
1802 struct cifsSesInfo
*ses
;
1804 spin_lock(&cifs_tcp_ses_lock
);
1805 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
1806 switch (server
->secType
) {
1808 if (vol
->cred_uid
!= ses
->cred_uid
)
1812 /* anything else takes username/password */
1813 if (ses
->user_name
== NULL
)
1815 if (strncmp(ses
->user_name
, vol
->username
,
1818 if (strlen(vol
->username
) != 0 &&
1819 ses
->password
!= NULL
&&
1820 strncmp(ses
->password
,
1821 vol
->password
? vol
->password
: "",
1826 spin_unlock(&cifs_tcp_ses_lock
);
1829 spin_unlock(&cifs_tcp_ses_lock
);
1834 cifs_put_smb_ses(struct cifsSesInfo
*ses
)
1837 struct TCP_Server_Info
*server
= ses
->server
;
1839 cFYI(1, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
1840 spin_lock(&cifs_tcp_ses_lock
);
1841 if (--ses
->ses_count
> 0) {
1842 spin_unlock(&cifs_tcp_ses_lock
);
1846 list_del_init(&ses
->smb_ses_list
);
1847 spin_unlock(&cifs_tcp_ses_lock
);
1849 if (ses
->status
== CifsGood
) {
1851 CIFSSMBLogoff(xid
, ses
);
1855 cifs_put_tcp_session(server
);
1858 static bool warned_on_ntlm
; /* globals init to false automatically */
1860 static struct cifsSesInfo
*
1861 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
1863 int rc
= -ENOMEM
, xid
;
1864 struct cifsSesInfo
*ses
;
1865 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
1866 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
1870 ses
= cifs_find_smb_ses(server
, volume_info
);
1872 cFYI(1, "Existing smb sess found (status=%d)", ses
->status
);
1874 mutex_lock(&ses
->session_mutex
);
1875 rc
= cifs_negotiate_protocol(xid
, ses
);
1877 mutex_unlock(&ses
->session_mutex
);
1878 /* problem -- put our ses reference */
1879 cifs_put_smb_ses(ses
);
1883 if (ses
->need_reconnect
) {
1884 cFYI(1, "Session needs reconnect");
1885 rc
= cifs_setup_session(xid
, ses
,
1886 volume_info
->local_nls
);
1888 mutex_unlock(&ses
->session_mutex
);
1889 /* problem -- put our reference */
1890 cifs_put_smb_ses(ses
);
1895 mutex_unlock(&ses
->session_mutex
);
1897 /* existing SMB ses has a server reference already */
1898 cifs_put_tcp_session(server
);
1903 cFYI(1, "Existing smb sess not found");
1904 ses
= sesInfoAlloc();
1908 /* new SMB session uses our server ref */
1909 ses
->server
= server
;
1910 if (server
->dstaddr
.ss_family
== AF_INET6
)
1911 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
1913 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
1915 if (volume_info
->username
) {
1916 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
1917 if (!ses
->user_name
)
1921 /* volume_info->password freed at unmount */
1922 if (volume_info
->password
) {
1923 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
1927 if (volume_info
->domainname
) {
1928 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
1929 if (!ses
->domainName
)
1932 ses
->cred_uid
= volume_info
->cred_uid
;
1933 ses
->linux_uid
= volume_info
->linux_uid
;
1935 /* ntlmv2 is much stronger than ntlm security, and has been broadly
1936 supported for many years, time to update default security mechanism */
1937 if ((volume_info
->secFlg
== 0) && warned_on_ntlm
== false) {
1938 warned_on_ntlm
= true;
1939 cERROR(1, "default security mechanism requested. The default "
1940 "security mechanism will be upgraded from ntlm to "
1941 "ntlmv2 in kernel release 2.6.41");
1943 ses
->overrideSecFlg
= volume_info
->secFlg
;
1945 mutex_lock(&ses
->session_mutex
);
1946 rc
= cifs_negotiate_protocol(xid
, ses
);
1948 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
1949 mutex_unlock(&ses
->session_mutex
);
1953 /* success, put it on the list */
1954 spin_lock(&cifs_tcp_ses_lock
);
1955 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
1956 spin_unlock(&cifs_tcp_ses_lock
);
1967 static struct cifsTconInfo
*
1968 cifs_find_tcon(struct cifsSesInfo
*ses
, const char *unc
)
1970 struct list_head
*tmp
;
1971 struct cifsTconInfo
*tcon
;
1973 spin_lock(&cifs_tcp_ses_lock
);
1974 list_for_each(tmp
, &ses
->tcon_list
) {
1975 tcon
= list_entry(tmp
, struct cifsTconInfo
, tcon_list
);
1976 if (tcon
->tidStatus
== CifsExiting
)
1978 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
1982 spin_unlock(&cifs_tcp_ses_lock
);
1985 spin_unlock(&cifs_tcp_ses_lock
);
1990 cifs_put_tcon(struct cifsTconInfo
*tcon
)
1993 struct cifsSesInfo
*ses
= tcon
->ses
;
1995 cFYI(1, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
1996 spin_lock(&cifs_tcp_ses_lock
);
1997 if (--tcon
->tc_count
> 0) {
1998 spin_unlock(&cifs_tcp_ses_lock
);
2002 list_del_init(&tcon
->tcon_list
);
2003 spin_unlock(&cifs_tcp_ses_lock
);
2006 CIFSSMBTDis(xid
, tcon
);
2009 cifs_fscache_release_super_cookie(tcon
);
2011 cifs_put_smb_ses(ses
);
2014 static struct cifsTconInfo
*
2015 cifs_get_tcon(struct cifsSesInfo
*ses
, struct smb_vol
*volume_info
)
2018 struct cifsTconInfo
*tcon
;
2020 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2022 cFYI(1, "Found match on UNC path");
2023 /* existing tcon already has a reference */
2024 cifs_put_smb_ses(ses
);
2025 if (tcon
->seal
!= volume_info
->seal
)
2026 cERROR(1, "transport encryption setting "
2027 "conflicts with existing tid");
2031 tcon
= tconInfoAlloc();
2038 if (volume_info
->password
) {
2039 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2040 if (!tcon
->password
) {
2046 if (strchr(volume_info
->UNC
+ 3, '\\') == NULL
2047 && strchr(volume_info
->UNC
+ 3, '/') == NULL
) {
2048 cERROR(1, "Missing share name");
2053 /* BB Do we need to wrap session_mutex around
2054 * this TCon call and Unix SetFS as
2055 * we do on SessSetup and reconnect? */
2057 rc
= CIFSTCon(xid
, ses
, volume_info
->UNC
, tcon
, volume_info
->local_nls
);
2059 cFYI(1, "CIFS Tcon rc = %d", rc
);
2063 if (volume_info
->nodfs
) {
2064 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2065 cFYI(1, "DFS disabled (%d)", tcon
->Flags
);
2067 tcon
->seal
= volume_info
->seal
;
2068 /* we can have only one retry value for a connection
2069 to a share so for resources mounted more than once
2070 to the same server share the last value passed in
2071 for the retry flag is used */
2072 tcon
->retry
= volume_info
->retry
;
2073 tcon
->nocase
= volume_info
->nocase
;
2074 tcon
->local_lease
= volume_info
->local_lease
;
2076 spin_lock(&cifs_tcp_ses_lock
);
2077 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2078 spin_unlock(&cifs_tcp_ses_lock
);
2080 cifs_fscache_get_super_cookie(tcon
);
2090 cifs_put_tlink(struct tcon_link
*tlink
)
2092 if (!tlink
|| IS_ERR(tlink
))
2095 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2096 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2097 tlink
->tl_time
= jiffies
;
2101 if (!IS_ERR(tlink_tcon(tlink
)))
2102 cifs_put_tcon(tlink_tcon(tlink
));
2108 get_dfs_path(int xid
, struct cifsSesInfo
*pSesInfo
, const char *old_path
,
2109 const struct nls_table
*nls_codepage
, unsigned int *pnum_referrals
,
2110 struct dfs_info3_param
**preferrals
, int remap
)
2115 *pnum_referrals
= 0;
2118 if (pSesInfo
->ipc_tid
== 0) {
2119 temp_unc
= kmalloc(2 /* for slashes */ +
2120 strnlen(pSesInfo
->serverName
,
2121 SERVER_NAME_LEN_WITH_NULL
* 2)
2122 + 1 + 4 /* slash IPC$ */ + 2,
2124 if (temp_unc
== NULL
)
2128 strcpy(temp_unc
+ 2, pSesInfo
->serverName
);
2129 strcpy(temp_unc
+ 2 + strlen(pSesInfo
->serverName
), "\\IPC$");
2130 rc
= CIFSTCon(xid
, pSesInfo
, temp_unc
, NULL
, nls_codepage
);
2131 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc
, pSesInfo
->ipc_tid
);
2135 rc
= CIFSGetDFSRefer(xid
, pSesInfo
, old_path
, preferrals
,
2136 pnum_referrals
, nls_codepage
, remap
);
2137 /* BB map targetUNCs to dfs_info3 structures, here or
2138 in CIFSGetDFSRefer BB */
2143 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2144 static struct lock_class_key cifs_key
[2];
2145 static struct lock_class_key cifs_slock_key
[2];
2148 cifs_reclassify_socket4(struct socket
*sock
)
2150 struct sock
*sk
= sock
->sk
;
2151 BUG_ON(sock_owned_by_user(sk
));
2152 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2153 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2157 cifs_reclassify_socket6(struct socket
*sock
)
2159 struct sock
*sk
= sock
->sk
;
2160 BUG_ON(sock_owned_by_user(sk
));
2161 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2162 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2166 cifs_reclassify_socket4(struct socket
*sock
)
2171 cifs_reclassify_socket6(struct socket
*sock
)
2176 /* See RFC1001 section 14 on representation of Netbios names */
2177 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2181 for (i
= 0, j
= 0; i
< (length
); i
++) {
2182 /* mask a nibble at a time and encode */
2183 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2184 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2191 bind_socket(struct TCP_Server_Info
*server
)
2194 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2195 /* Bind to the specified local IP address */
2196 struct socket
*socket
= server
->ssocket
;
2197 rc
= socket
->ops
->bind(socket
,
2198 (struct sockaddr
*) &server
->srcaddr
,
2199 sizeof(server
->srcaddr
));
2201 struct sockaddr_in
*saddr4
;
2202 struct sockaddr_in6
*saddr6
;
2203 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2204 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2205 if (saddr6
->sin6_family
== AF_INET6
)
2207 "Failed to bind to: %pI6c, error: %d\n",
2208 &saddr6
->sin6_addr
, rc
);
2211 "Failed to bind to: %pI4, error: %d\n",
2212 &saddr4
->sin_addr
.s_addr
, rc
);
2219 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2223 * some servers require RFC1001 sessinit before sending
2224 * negprot - BB check reconnection in case where second
2225 * sessinit is sent but no second negprot
2227 struct rfc1002_session_packet
*ses_init_buf
;
2228 struct smb_hdr
*smb_buf
;
2229 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2232 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2234 if (server
->server_RFC1001_name
&&
2235 server
->server_RFC1001_name
[0] != 0)
2236 rfc1002mangle(ses_init_buf
->trailer
.
2237 session_req
.called_name
,
2238 server
->server_RFC1001_name
,
2239 RFC1001_NAME_LEN_WITH_NULL
);
2241 rfc1002mangle(ses_init_buf
->trailer
.
2242 session_req
.called_name
,
2243 DEFAULT_CIFS_CALLED_NAME
,
2244 RFC1001_NAME_LEN_WITH_NULL
);
2246 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2249 * calling name ends in null (byte 16) from old smb
2252 if (server
->workstation_RFC1001_name
&&
2253 server
->workstation_RFC1001_name
[0] != 0)
2254 rfc1002mangle(ses_init_buf
->trailer
.
2255 session_req
.calling_name
,
2256 server
->workstation_RFC1001_name
,
2257 RFC1001_NAME_LEN_WITH_NULL
);
2259 rfc1002mangle(ses_init_buf
->trailer
.
2260 session_req
.calling_name
,
2262 RFC1001_NAME_LEN_WITH_NULL
);
2264 ses_init_buf
->trailer
.session_req
.scope1
= 0;
2265 ses_init_buf
->trailer
.session_req
.scope2
= 0;
2266 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
2268 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2269 smb_buf
->smb_buf_length
= 0x81000044;
2270 rc
= smb_send(server
, smb_buf
, 0x44);
2271 kfree(ses_init_buf
);
2273 * RFC1001 layer in at least one server
2274 * requires very short break before negprot
2275 * presumably because not expecting negprot
2276 * to follow so fast. This is a simple
2277 * solution that works without
2278 * complicating the code and causes no
2279 * significant slowing down on mount
2282 usleep_range(1000, 2000);
2285 * else the negprot may still work without this
2286 * even though malloc failed
2293 generic_ip_connect(struct TCP_Server_Info
*server
)
2298 struct socket
*socket
= server
->ssocket
;
2299 struct sockaddr
*saddr
;
2301 saddr
= (struct sockaddr
*) &server
->dstaddr
;
2303 if (server
->dstaddr
.ss_family
== AF_INET6
) {
2304 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
2305 slen
= sizeof(struct sockaddr_in6
);
2308 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
2309 slen
= sizeof(struct sockaddr_in
);
2313 if (socket
== NULL
) {
2314 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
2315 IPPROTO_TCP
, &socket
, 1);
2317 cERROR(1, "Error %d creating socket", rc
);
2318 server
->ssocket
= NULL
;
2322 /* BB other socket options to set KEEPALIVE, NODELAY? */
2323 cFYI(1, "Socket created");
2324 server
->ssocket
= socket
;
2325 socket
->sk
->sk_allocation
= GFP_NOFS
;
2326 if (sfamily
== AF_INET6
)
2327 cifs_reclassify_socket6(socket
);
2329 cifs_reclassify_socket4(socket
);
2332 rc
= bind_socket(server
);
2336 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
2338 cFYI(1, "Error %d connecting to server", rc
);
2339 sock_release(socket
);
2340 server
->ssocket
= NULL
;
2345 * Eventually check for other socket options to change from
2346 * the default. sock_setsockopt not used because it expects
2349 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
2350 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
2352 /* make the bufsizes depend on wsize/rsize and max requests */
2353 if (server
->noautotune
) {
2354 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
2355 socket
->sk
->sk_sndbuf
= 200 * 1024;
2356 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
2357 socket
->sk
->sk_rcvbuf
= 140 * 1024;
2360 if (server
->tcp_nodelay
) {
2362 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
2363 (char *)&val
, sizeof(val
));
2365 cFYI(1, "set TCP_NODELAY socket option error %d", rc
);
2368 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2369 socket
->sk
->sk_sndbuf
,
2370 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
2372 if (sport
== htons(RFC1001_PORT
))
2373 rc
= ip_rfc1001_connect(server
);
2379 ip_connect(struct TCP_Server_Info
*server
)
2382 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2383 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2385 if (server
->dstaddr
.ss_family
== AF_INET6
)
2386 sport
= &addr6
->sin6_port
;
2388 sport
= &addr
->sin_port
;
2393 /* try with 445 port at first */
2394 *sport
= htons(CIFS_PORT
);
2396 rc
= generic_ip_connect(server
);
2400 /* if it failed, try with 139 port */
2401 *sport
= htons(RFC1001_PORT
);
2404 return generic_ip_connect(server
);
2407 void reset_cifs_unix_caps(int xid
, struct cifsTconInfo
*tcon
,
2408 struct super_block
*sb
, struct smb_vol
*vol_info
)
2410 /* if we are reconnecting then should we check to see if
2411 * any requested capabilities changed locally e.g. via
2412 * remount but we can not do much about it here
2413 * if they have (even if we could detect it by the following)
2414 * Perhaps we could add a backpointer to array of sb from tcon
2415 * or if we change to make all sb to same share the same
2416 * sb as NFS - then we only have one backpointer to sb.
2417 * What if we wanted to mount the server share twice once with
2418 * and once without posixacls or posix paths? */
2419 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2421 if (vol_info
&& vol_info
->no_linux_ext
) {
2422 tcon
->fsUnixInfo
.Capability
= 0;
2423 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
2424 cFYI(1, "Linux protocol extensions disabled");
2426 } else if (vol_info
)
2427 tcon
->unix_ext
= 1; /* Unix Extensions supported */
2429 if (tcon
->unix_ext
== 0) {
2430 cFYI(1, "Unix extensions disabled so not set on reconnect");
2434 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
2435 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2437 /* check for reconnect case in which we do not
2438 want to change the mount behavior if we can avoid it */
2439 if (vol_info
== NULL
) {
2440 /* turn off POSIX ACL and PATHNAMES if not set
2441 originally at mount time */
2442 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
2443 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2444 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2445 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2446 cERROR(1, "POSIXPATH support change");
2447 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2448 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2449 cERROR(1, "possible reconnect error");
2450 cERROR(1, "server disabled POSIX path support");
2454 cap
&= CIFS_UNIX_CAP_MASK
;
2455 if (vol_info
&& vol_info
->no_psx_acl
)
2456 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2457 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
2458 cFYI(1, "negotiated posix acl support");
2460 sb
->s_flags
|= MS_POSIXACL
;
2463 if (vol_info
&& vol_info
->posix_paths
== 0)
2464 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2465 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
2466 cFYI(1, "negotiate posix pathnames");
2468 CIFS_SB(sb
)->mnt_cifs_flags
|=
2469 CIFS_MOUNT_POSIX_PATHS
;
2472 /* We might be setting the path sep back to a different
2473 form if we are reconnecting and the server switched its
2474 posix path capability for this share */
2475 if (sb
&& (CIFS_SB(sb
)->prepathlen
> 0))
2476 CIFS_SB(sb
)->prepath
[0] = CIFS_DIR_SEP(CIFS_SB(sb
));
2478 if (sb
&& (CIFS_SB(sb
)->rsize
> 127 * 1024)) {
2479 if ((cap
& CIFS_UNIX_LARGE_READ_CAP
) == 0) {
2480 CIFS_SB(sb
)->rsize
= 127 * 1024;
2481 cFYI(DBG2
, "larger reads not supported by srv");
2486 cFYI(1, "Negotiate caps 0x%x", (int)cap
);
2487 #ifdef CONFIG_CIFS_DEBUG2
2488 if (cap
& CIFS_UNIX_FCNTL_CAP
)
2489 cFYI(1, "FCNTL cap");
2490 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
2491 cFYI(1, "EXTATTR cap");
2492 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2493 cFYI(1, "POSIX path cap");
2494 if (cap
& CIFS_UNIX_XATTR_CAP
)
2495 cFYI(1, "XATTR cap");
2496 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
2497 cFYI(1, "POSIX ACL cap");
2498 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
2499 cFYI(1, "very large read cap");
2500 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
2501 cFYI(1, "very large write cap");
2502 #endif /* CIFS_DEBUG2 */
2503 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
2504 if (vol_info
== NULL
) {
2505 cFYI(1, "resetting capabilities failed");
2507 cERROR(1, "Negotiating Unix capabilities "
2508 "with the server failed. Consider "
2509 "mounting with the Unix Extensions\n"
2510 "disabled, if problems are found, "
2511 "by specifying the nounix mount "
2519 convert_delimiter(char *path
, char delim
)
2532 for (i
= 0; path
[i
] != '\0'; i
++) {
2533 if (path
[i
] == old_delim
)
2538 static void setup_cifs_sb(struct smb_vol
*pvolume_info
,
2539 struct cifs_sb_info
*cifs_sb
)
2541 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
2543 if (pvolume_info
->rsize
> CIFSMaxBufSize
) {
2544 cERROR(1, "rsize %d too large, using MaxBufSize",
2545 pvolume_info
->rsize
);
2546 cifs_sb
->rsize
= CIFSMaxBufSize
;
2547 } else if ((pvolume_info
->rsize
) &&
2548 (pvolume_info
->rsize
<= CIFSMaxBufSize
))
2549 cifs_sb
->rsize
= pvolume_info
->rsize
;
2551 cifs_sb
->rsize
= CIFSMaxBufSize
;
2553 if (pvolume_info
->wsize
> PAGEVEC_SIZE
* PAGE_CACHE_SIZE
) {
2554 cERROR(1, "wsize %d too large, using 4096 instead",
2555 pvolume_info
->wsize
);
2556 cifs_sb
->wsize
= 4096;
2557 } else if (pvolume_info
->wsize
)
2558 cifs_sb
->wsize
= pvolume_info
->wsize
;
2560 cifs_sb
->wsize
= min_t(const int,
2561 PAGEVEC_SIZE
* PAGE_CACHE_SIZE
,
2563 /* old default of CIFSMaxBufSize was too small now
2564 that SMB Write2 can send multiple pages in kvec.
2565 RFC1001 does not describe what happens when frame
2566 bigger than 128K is sent so use that as max in
2567 conjunction with 52K kvec constraint on arch with 4K
2570 if (cifs_sb
->rsize
< 2048) {
2571 cifs_sb
->rsize
= 2048;
2572 /* Windows ME may prefer this */
2573 cFYI(1, "readsize set to minimum: 2048");
2575 /* calculate prepath */
2576 cifs_sb
->prepath
= pvolume_info
->prepath
;
2577 if (cifs_sb
->prepath
) {
2578 cifs_sb
->prepathlen
= strlen(cifs_sb
->prepath
);
2579 /* we can not convert the / to \ in the path
2580 separators in the prefixpath yet because we do not
2581 know (until reset_cifs_unix_caps is called later)
2582 whether POSIX PATH CAP is available. We normalize
2583 the / to \ after reset_cifs_unix_caps is called */
2584 pvolume_info
->prepath
= NULL
;
2586 cifs_sb
->prepathlen
= 0;
2587 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
2588 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
2589 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
2590 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
2591 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2592 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
2594 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
2596 if (pvolume_info
->noperm
)
2597 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
2598 if (pvolume_info
->setuids
)
2599 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
2600 if (pvolume_info
->server_ino
)
2601 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
2602 if (pvolume_info
->remap
)
2603 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
2604 if (pvolume_info
->no_xattr
)
2605 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
2606 if (pvolume_info
->sfu_emul
)
2607 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
2608 if (pvolume_info
->nobrl
)
2609 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
2610 if (pvolume_info
->nostrictsync
)
2611 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
2612 if (pvolume_info
->mand_lock
)
2613 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
2614 if (pvolume_info
->cifs_acl
)
2615 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
2616 if (pvolume_info
->override_uid
)
2617 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
2618 if (pvolume_info
->override_gid
)
2619 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
2620 if (pvolume_info
->dynperm
)
2621 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
2622 if (pvolume_info
->fsc
)
2623 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
2624 if (pvolume_info
->multiuser
)
2625 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
2626 CIFS_MOUNT_NO_PERM
);
2627 if (pvolume_info
->strict_io
)
2628 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
2629 if (pvolume_info
->direct_io
) {
2630 cFYI(1, "mounting share using direct i/o");
2631 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
2633 if (pvolume_info
->mfsymlinks
) {
2634 if (pvolume_info
->sfu_emul
) {
2635 cERROR(1, "mount option mfsymlinks ignored if sfu "
2636 "mount option is used");
2638 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
2642 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
2643 cERROR(1, "mount option dynperm ignored if cifsacl "
2644 "mount option supported");
2648 is_path_accessible(int xid
, struct cifsTconInfo
*tcon
,
2649 struct cifs_sb_info
*cifs_sb
, const char *full_path
)
2652 FILE_ALL_INFO
*pfile_info
;
2654 pfile_info
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
2655 if (pfile_info
== NULL
)
2658 rc
= CIFSSMBQPathInfo(xid
, tcon
, full_path
, pfile_info
,
2659 0 /* not legacy */, cifs_sb
->local_nls
,
2660 cifs_sb
->mnt_cifs_flags
&
2661 CIFS_MOUNT_MAP_SPECIAL_CHR
);
2667 cleanup_volume_info(struct smb_vol
**pvolume_info
)
2669 struct smb_vol
*volume_info
;
2671 if (!pvolume_info
|| !*pvolume_info
)
2674 volume_info
= *pvolume_info
;
2675 kzfree(volume_info
->password
);
2676 kfree(volume_info
->UNC
);
2677 kfree(volume_info
->prepath
);
2679 *pvolume_info
= NULL
;
2683 #ifdef CONFIG_CIFS_DFS_UPCALL
2684 /* build_path_to_root returns full path to root when
2685 * we do not have an exiting connection (tcon) */
2687 build_unc_path_to_root(const struct smb_vol
*volume_info
,
2688 const struct cifs_sb_info
*cifs_sb
)
2692 int unc_len
= strnlen(volume_info
->UNC
, MAX_TREE_SIZE
+ 1);
2693 full_path
= kmalloc(unc_len
+ cifs_sb
->prepathlen
+ 1, GFP_KERNEL
);
2694 if (full_path
== NULL
)
2695 return ERR_PTR(-ENOMEM
);
2697 strncpy(full_path
, volume_info
->UNC
, unc_len
);
2698 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_POSIX_PATHS
) {
2700 for (i
= 0; i
< unc_len
; i
++) {
2701 if (full_path
[i
] == '\\')
2706 if (cifs_sb
->prepathlen
)
2707 strncpy(full_path
+ unc_len
, cifs_sb
->prepath
,
2708 cifs_sb
->prepathlen
);
2710 full_path
[unc_len
+ cifs_sb
->prepathlen
] = 0; /* add trailing null */
2716 cifs_mount(struct super_block
*sb
, struct cifs_sb_info
*cifs_sb
,
2717 char *mount_data_global
, const char *devname
)
2721 struct smb_vol
*volume_info
;
2722 struct cifsSesInfo
*pSesInfo
;
2723 struct cifsTconInfo
*tcon
;
2724 struct TCP_Server_Info
*srvTcp
;
2726 char *mount_data
= mount_data_global
;
2727 struct tcon_link
*tlink
;
2728 #ifdef CONFIG_CIFS_DFS_UPCALL
2729 struct dfs_info3_param
*referrals
= NULL
;
2730 unsigned int num_referrals
= 0;
2731 int referral_walks_count
= 0;
2743 volume_info
= kzalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
2749 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
)) {
2754 if (volume_info
->nullauth
) {
2755 cFYI(1, "null user");
2756 volume_info
->username
= "";
2757 } else if (volume_info
->username
) {
2758 /* BB fixme parse for domain name here */
2759 cFYI(1, "Username: %s", volume_info
->username
);
2761 cifserror("No username specified");
2762 /* In userspace mount helper we can get user name from alternate
2763 locations such as env variables and files on disk */
2768 /* this is needed for ASCII cp to Unicode converts */
2769 if (volume_info
->iocharset
== NULL
) {
2770 /* load_nls_default cannot return null */
2771 volume_info
->local_nls
= load_nls_default();
2773 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
2774 if (volume_info
->local_nls
== NULL
) {
2775 cERROR(1, "CIFS mount error: iocharset %s not found",
2776 volume_info
->iocharset
);
2781 cifs_sb
->local_nls
= volume_info
->local_nls
;
2783 /* get a reference to a tcp session */
2784 srvTcp
= cifs_get_tcp_session(volume_info
);
2785 if (IS_ERR(srvTcp
)) {
2786 rc
= PTR_ERR(srvTcp
);
2790 /* get a reference to a SMB session */
2791 pSesInfo
= cifs_get_smb_ses(srvTcp
, volume_info
);
2792 if (IS_ERR(pSesInfo
)) {
2793 rc
= PTR_ERR(pSesInfo
);
2795 goto mount_fail_check
;
2798 setup_cifs_sb(volume_info
, cifs_sb
);
2799 if (pSesInfo
->capabilities
& CAP_LARGE_FILES
)
2800 sb
->s_maxbytes
= MAX_LFS_FILESIZE
;
2802 sb
->s_maxbytes
= MAX_NON_LFS
;
2804 /* BB FIXME fix time_gran to be larger for LANMAN sessions */
2805 sb
->s_time_gran
= 100;
2807 /* search for existing tcon to this server share */
2808 tcon
= cifs_get_tcon(pSesInfo
, volume_info
);
2812 goto remote_path_check
;
2815 /* do not care if following two calls succeed - informational */
2817 CIFSSMBQFSDeviceInfo(xid
, tcon
);
2818 CIFSSMBQFSAttributeInfo(xid
, tcon
);
2821 /* tell server which Unix caps we support */
2822 if (tcon
->ses
->capabilities
& CAP_UNIX
)
2823 /* reset of caps checks mount to see if unix extensions
2824 disabled for just this mount */
2825 reset_cifs_unix_caps(xid
, tcon
, sb
, volume_info
);
2827 tcon
->unix_ext
= 0; /* server does not support them */
2829 /* convert forward to back slashes in prepath here if needed */
2830 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_POSIX_PATHS
) == 0)
2831 convert_delimiter(cifs_sb
->prepath
, CIFS_DIR_SEP(cifs_sb
));
2833 if ((tcon
->unix_ext
== 0) && (cifs_sb
->rsize
> (1024 * 127))) {
2834 cifs_sb
->rsize
= 1024 * 127;
2835 cFYI(DBG2
, "no very large read support, rsize now 127K");
2837 if (!(tcon
->ses
->capabilities
& CAP_LARGE_WRITE_X
))
2838 cifs_sb
->wsize
= min(cifs_sb
->wsize
,
2839 (tcon
->ses
->server
->maxBuf
- MAX_CIFS_HDR_SIZE
));
2840 if (!(tcon
->ses
->capabilities
& CAP_LARGE_READ_X
))
2841 cifs_sb
->rsize
= min(cifs_sb
->rsize
,
2842 (tcon
->ses
->server
->maxBuf
- MAX_CIFS_HDR_SIZE
));
2845 /* check if a whole path (including prepath) is not remote */
2847 /* build_path_to_root works only when we have a valid tcon */
2848 full_path
= cifs_build_path_to_root(cifs_sb
, tcon
);
2849 if (full_path
== NULL
) {
2851 goto mount_fail_check
;
2853 rc
= is_path_accessible(xid
, tcon
, cifs_sb
, full_path
);
2854 if (rc
!= 0 && rc
!= -EREMOTE
) {
2856 goto mount_fail_check
;
2861 /* get referral if needed */
2862 if (rc
== -EREMOTE
) {
2863 #ifdef CONFIG_CIFS_DFS_UPCALL
2864 if (referral_walks_count
> MAX_NESTED_LINKS
) {
2866 * BB: when we implement proper loop detection,
2867 * we will remove this check. But now we need it
2868 * to prevent an indefinite loop if 'DFS tree' is
2869 * misconfigured (i.e. has loops).
2872 goto mount_fail_check
;
2874 /* convert forward to back slashes in prepath here if needed */
2875 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_POSIX_PATHS
) == 0)
2876 convert_delimiter(cifs_sb
->prepath
,
2877 CIFS_DIR_SEP(cifs_sb
));
2878 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
2879 if (IS_ERR(full_path
)) {
2880 rc
= PTR_ERR(full_path
);
2881 goto mount_fail_check
;
2884 cFYI(1, "Getting referral for: %s", full_path
);
2885 rc
= get_dfs_path(xid
, pSesInfo
, full_path
+ 1,
2886 cifs_sb
->local_nls
, &num_referrals
, &referrals
,
2887 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
2888 if (!rc
&& num_referrals
> 0) {
2889 char *fake_devname
= NULL
;
2891 if (mount_data
!= mount_data_global
)
2894 mount_data
= cifs_compose_mount_options(
2895 cifs_sb
->mountdata
, full_path
+ 1,
2896 referrals
, &fake_devname
);
2898 free_dfs_info_array(referrals
, num_referrals
);
2899 kfree(fake_devname
);
2902 if (IS_ERR(mount_data
)) {
2903 rc
= PTR_ERR(mount_data
);
2905 goto mount_fail_check
;
2909 cifs_put_tcon(tcon
);
2911 cifs_put_smb_ses(pSesInfo
);
2913 cleanup_volume_info(&volume_info
);
2914 referral_walks_count
++;
2916 goto try_mount_again
;
2918 #else /* No DFS support, return error on mount */
2924 goto mount_fail_check
;
2926 /* now, hang the tcon off of the superblock */
2927 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
2928 if (tlink
== NULL
) {
2930 goto mount_fail_check
;
2933 tlink
->tl_uid
= pSesInfo
->linux_uid
;
2934 tlink
->tl_tcon
= tcon
;
2935 tlink
->tl_time
= jiffies
;
2936 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
2937 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
2939 cifs_sb
->master_tlink
= tlink
;
2940 spin_lock(&cifs_sb
->tlink_tree_lock
);
2941 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
2942 spin_unlock(&cifs_sb
->tlink_tree_lock
);
2944 queue_delayed_work(system_nrt_wq
, &cifs_sb
->prune_tlinks
,
2948 /* on error free sesinfo and tcon struct if needed */
2950 if (mount_data
!= mount_data_global
)
2952 /* If find_unc succeeded then rc == 0 so we can not end */
2953 /* up accidentally freeing someone elses tcon struct */
2955 cifs_put_tcon(tcon
);
2957 cifs_put_smb_ses(pSesInfo
);
2959 cifs_put_tcp_session(srvTcp
);
2963 /* volume_info->password is freed above when existing session found
2964 (in which case it is not needed anymore) but when new sesion is created
2965 the password ptr is put in the new session structure (in which case the
2966 password will be freed at unmount time) */
2968 /* zero out password before freeing */
2969 cleanup_volume_info(&volume_info
);
2975 CIFSTCon(unsigned int xid
, struct cifsSesInfo
*ses
,
2976 const char *tree
, struct cifsTconInfo
*tcon
,
2977 const struct nls_table
*nls_codepage
)
2979 struct smb_hdr
*smb_buffer
;
2980 struct smb_hdr
*smb_buffer_response
;
2983 unsigned char *bcc_ptr
;
2986 __u16 bytes_left
, count
;
2991 smb_buffer
= cifs_buf_get();
2992 if (smb_buffer
== NULL
)
2995 smb_buffer_response
= smb_buffer
;
2997 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
2998 NULL
/*no tid */ , 4 /*wct */ );
3000 smb_buffer
->Mid
= GetNextMid(ses
->server
);
3001 smb_buffer
->Uid
= ses
->Suid
;
3002 pSMB
= (TCONX_REQ
*) smb_buffer
;
3003 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3005 pSMB
->AndXCommand
= 0xFF;
3006 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3007 bcc_ptr
= &pSMB
->Password
[0];
3008 if ((ses
->server
->secMode
) & SECMODE_USER
) {
3009 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3010 *bcc_ptr
= 0; /* password is null byte */
3011 bcc_ptr
++; /* skip password */
3012 /* already aligned so no need to do it below */
3014 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3015 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3016 specified as required (when that support is added to
3017 the vfs in the future) as only NTLM or the much
3018 weaker LANMAN (which we do not send by default) is accepted
3019 by Samba (not sure whether other servers allow
3020 NTLMv2 password here) */
3021 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3022 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3023 (ses
->server
->secType
== LANMAN
))
3024 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3025 ses
->server
->secMode
&
3026 SECMODE_PW_ENCRYPT
? true : false,
3029 #endif /* CIFS_WEAK_PW_HASH */
3030 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3033 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3034 if (ses
->capabilities
& CAP_UNICODE
) {
3035 /* must align unicode strings */
3036 *bcc_ptr
= 0; /* null byte password */
3041 if (ses
->server
->secMode
&
3042 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
3043 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3045 if (ses
->capabilities
& CAP_STATUS32
) {
3046 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3048 if (ses
->capabilities
& CAP_DFS
) {
3049 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3051 if (ses
->capabilities
& CAP_UNICODE
) {
3052 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3054 cifs_strtoUCS((__le16
*) bcc_ptr
, tree
,
3055 6 /* max utf8 char length in bytes */ *
3056 (/* server len*/ + 256 /* share len */), nls_codepage
);
3057 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3058 bcc_ptr
+= 2; /* skip trailing null */
3059 } else { /* ASCII */
3060 strcpy(bcc_ptr
, tree
);
3061 bcc_ptr
+= strlen(tree
) + 1;
3063 strcpy(bcc_ptr
, "?????");
3064 bcc_ptr
+= strlen("?????");
3066 count
= bcc_ptr
- &pSMB
->Password
[0];
3067 pSMB
->hdr
.smb_buf_length
+= count
;
3068 pSMB
->ByteCount
= cpu_to_le16(count
);
3070 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3073 /* above now done in SendReceive */
3074 if ((rc
== 0) && (tcon
!= NULL
)) {
3077 tcon
->tidStatus
= CifsGood
;
3078 tcon
->need_reconnect
= false;
3079 tcon
->tid
= smb_buffer_response
->Tid
;
3080 bcc_ptr
= pByteArea(smb_buffer_response
);
3081 bytes_left
= get_bcc(smb_buffer_response
);
3082 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3083 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3089 /* skip service field (NB: this field is always ASCII) */
3091 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3092 (bcc_ptr
[2] == 'C')) {
3093 cFYI(1, "IPC connection");
3096 } else if (length
== 2) {
3097 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3098 /* the most common case */
3099 cFYI(1, "disk share connection");
3102 bcc_ptr
+= length
+ 1;
3103 bytes_left
-= (length
+ 1);
3104 strncpy(tcon
->treeName
, tree
, MAX_TREE_SIZE
);
3106 /* mostly informational -- no need to fail on error here */
3107 kfree(tcon
->nativeFileSystem
);
3108 tcon
->nativeFileSystem
= cifs_strndup_from_ucs(bcc_ptr
,
3109 bytes_left
, is_unicode
,
3112 cFYI(1, "nativeFileSystem=%s", tcon
->nativeFileSystem
);
3114 if ((smb_buffer_response
->WordCount
== 3) ||
3115 (smb_buffer_response
->WordCount
== 7))
3116 /* field is in same location */
3117 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3120 cFYI(1, "Tcon flags: 0x%x ", tcon
->Flags
);
3121 } else if ((rc
== 0) && tcon
== NULL
) {
3122 /* all we need to save for IPC$ connection */
3123 ses
->ipc_tid
= smb_buffer_response
->Tid
;
3126 cifs_buf_release(smb_buffer
);
3131 cifs_umount(struct super_block
*sb
, struct cifs_sb_info
*cifs_sb
)
3133 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3134 struct rb_node
*node
;
3135 struct tcon_link
*tlink
;
3138 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3140 spin_lock(&cifs_sb
->tlink_tree_lock
);
3141 while ((node
= rb_first(root
))) {
3142 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3143 cifs_get_tlink(tlink
);
3144 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3145 rb_erase(node
, root
);
3147 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3148 cifs_put_tlink(tlink
);
3149 spin_lock(&cifs_sb
->tlink_tree_lock
);
3151 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3153 tmp
= cifs_sb
->prepath
;
3154 cifs_sb
->prepathlen
= 0;
3155 cifs_sb
->prepath
= NULL
;
3161 int cifs_negotiate_protocol(unsigned int xid
, struct cifsSesInfo
*ses
)
3164 struct TCP_Server_Info
*server
= ses
->server
;
3166 /* only send once per connect */
3167 if (server
->maxBuf
!= 0)
3170 rc
= CIFSSMBNegotiate(xid
, ses
);
3171 if (rc
== -EAGAIN
) {
3172 /* retry only once on 1st time connection */
3173 rc
= CIFSSMBNegotiate(xid
, ses
);
3178 spin_lock(&GlobalMid_Lock
);
3179 if (server
->tcpStatus
!= CifsExiting
)
3180 server
->tcpStatus
= CifsGood
;
3183 spin_unlock(&GlobalMid_Lock
);
3191 int cifs_setup_session(unsigned int xid
, struct cifsSesInfo
*ses
,
3192 struct nls_table
*nls_info
)
3195 struct TCP_Server_Info
*server
= ses
->server
;
3198 ses
->capabilities
= server
->capabilities
;
3199 if (linuxExtEnabled
== 0)
3200 ses
->capabilities
&= (~CAP_UNIX
);
3202 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3203 server
->secMode
, server
->capabilities
, server
->timeAdj
);
3205 rc
= CIFS_SessSetup(xid
, ses
, nls_info
);
3207 cERROR(1, "Send error in SessSetup = %d", rc
);
3209 mutex_lock(&ses
->server
->srv_mutex
);
3210 if (!server
->session_estab
) {
3211 server
->session_key
.response
= ses
->auth_key
.response
;
3212 server
->session_key
.len
= ses
->auth_key
.len
;
3213 server
->sequence_number
= 0x2;
3214 server
->session_estab
= true;
3215 ses
->auth_key
.response
= NULL
;
3217 mutex_unlock(&server
->srv_mutex
);
3219 cFYI(1, "CIFS Session Established successfully");
3220 spin_lock(&GlobalMid_Lock
);
3221 ses
->status
= CifsGood
;
3222 ses
->need_reconnect
= false;
3223 spin_unlock(&GlobalMid_Lock
);
3226 kfree(ses
->auth_key
.response
);
3227 ses
->auth_key
.response
= NULL
;
3228 ses
->auth_key
.len
= 0;
3229 kfree(ses
->ntlmssp
);
3230 ses
->ntlmssp
= NULL
;
3235 static struct cifsTconInfo
*
3236 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, uid_t fsuid
)
3238 struct cifsTconInfo
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3239 struct cifsSesInfo
*ses
;
3240 struct cifsTconInfo
*tcon
= NULL
;
3241 struct smb_vol
*vol_info
;
3242 char username
[MAX_USERNAME_SIZE
+ 1];
3244 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
3245 if (vol_info
== NULL
) {
3246 tcon
= ERR_PTR(-ENOMEM
);
3250 snprintf(username
, MAX_USERNAME_SIZE
, "krb50x%x", fsuid
);
3251 vol_info
->username
= username
;
3252 vol_info
->local_nls
= cifs_sb
->local_nls
;
3253 vol_info
->linux_uid
= fsuid
;
3254 vol_info
->cred_uid
= fsuid
;
3255 vol_info
->UNC
= master_tcon
->treeName
;
3256 vol_info
->retry
= master_tcon
->retry
;
3257 vol_info
->nocase
= master_tcon
->nocase
;
3258 vol_info
->local_lease
= master_tcon
->local_lease
;
3259 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
3261 /* FIXME: allow for other secFlg settings */
3262 vol_info
->secFlg
= CIFSSEC_MUST_KRB5
;
3264 /* get a reference for the same TCP session */
3265 spin_lock(&cifs_tcp_ses_lock
);
3266 ++master_tcon
->ses
->server
->srv_count
;
3267 spin_unlock(&cifs_tcp_ses_lock
);
3269 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
3271 tcon
= (struct cifsTconInfo
*)ses
;
3272 cifs_put_tcp_session(master_tcon
->ses
->server
);
3276 tcon
= cifs_get_tcon(ses
, vol_info
);
3278 cifs_put_smb_ses(ses
);
3282 if (ses
->capabilities
& CAP_UNIX
)
3283 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
3290 static inline struct tcon_link
*
3291 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
3293 return cifs_sb
->master_tlink
;
3296 struct cifsTconInfo
*
3297 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
3299 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
3303 cifs_sb_tcon_pending_wait(void *unused
)
3306 return signal_pending(current
) ? -ERESTARTSYS
: 0;
3309 /* find and return a tlink with given uid */
3310 static struct tcon_link
*
3311 tlink_rb_search(struct rb_root
*root
, uid_t uid
)
3313 struct rb_node
*node
= root
->rb_node
;
3314 struct tcon_link
*tlink
;
3317 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3319 if (tlink
->tl_uid
> uid
)
3320 node
= node
->rb_left
;
3321 else if (tlink
->tl_uid
< uid
)
3322 node
= node
->rb_right
;
3329 /* insert a tcon_link into the tree */
3331 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
3333 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
3334 struct tcon_link
*tlink
;
3337 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
3340 if (tlink
->tl_uid
> new_tlink
->tl_uid
)
3341 new = &((*new)->rb_left
);
3343 new = &((*new)->rb_right
);
3346 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
3347 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
3351 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3354 * If the superblock doesn't refer to a multiuser mount, then just return
3355 * the master tcon for the mount.
3357 * First, search the rbtree for an existing tcon for this fsuid. If one
3358 * exists, then check to see if it's pending construction. If it is then wait
3359 * for construction to complete. Once it's no longer pending, check to see if
3360 * it failed and either return an error or retry construction, depending on
3363 * If one doesn't exist then insert a new tcon_link struct into the tree and
3364 * try to construct a new one.
3367 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
3370 uid_t fsuid
= current_fsuid();
3371 struct tcon_link
*tlink
, *newtlink
;
3373 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
3374 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
3376 spin_lock(&cifs_sb
->tlink_tree_lock
);
3377 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3379 cifs_get_tlink(tlink
);
3380 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3382 if (tlink
== NULL
) {
3383 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
3384 if (newtlink
== NULL
)
3385 return ERR_PTR(-ENOMEM
);
3386 newtlink
->tl_uid
= fsuid
;
3387 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
3388 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
3389 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
3390 cifs_get_tlink(newtlink
);
3392 spin_lock(&cifs_sb
->tlink_tree_lock
);
3393 /* was one inserted after previous search? */
3394 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3396 cifs_get_tlink(tlink
);
3397 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3399 goto wait_for_construction
;
3402 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3403 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3405 wait_for_construction
:
3406 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
3407 cifs_sb_tcon_pending_wait
,
3408 TASK_INTERRUPTIBLE
);
3410 cifs_put_tlink(tlink
);
3411 return ERR_PTR(ret
);
3414 /* if it's good, return it */
3415 if (!IS_ERR(tlink
->tl_tcon
))
3418 /* return error if we tried this already recently */
3419 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
3420 cifs_put_tlink(tlink
);
3421 return ERR_PTR(-EACCES
);
3424 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
3425 goto wait_for_construction
;
3428 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
3429 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
3430 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
3432 if (IS_ERR(tlink
->tl_tcon
)) {
3433 cifs_put_tlink(tlink
);
3434 return ERR_PTR(-EACCES
);
3441 * periodic workqueue job that scans tcon_tree for a superblock and closes
3445 cifs_prune_tlinks(struct work_struct
*work
)
3447 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
3449 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3450 struct rb_node
*node
= rb_first(root
);
3451 struct rb_node
*tmp
;
3452 struct tcon_link
*tlink
;
3455 * Because we drop the spinlock in the loop in order to put the tlink
3456 * it's not guarded against removal of links from the tree. The only
3457 * places that remove entries from the tree are this function and
3458 * umounts. Because this function is non-reentrant and is canceled
3459 * before umount can proceed, this is safe.
3461 spin_lock(&cifs_sb
->tlink_tree_lock
);
3462 node
= rb_first(root
);
3463 while (node
!= NULL
) {
3465 node
= rb_next(tmp
);
3466 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
3468 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
3469 atomic_read(&tlink
->tl_count
) != 0 ||
3470 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
3473 cifs_get_tlink(tlink
);
3474 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3475 rb_erase(tmp
, root
);
3477 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3478 cifs_put_tlink(tlink
);
3479 spin_lock(&cifs_sb
->tlink_tree_lock
);
3481 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3483 queue_delayed_work(system_nrt_wq
, &cifs_sb
->prune_tlinks
,