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
,
812 unsigned int temp_len
, i
, j
;
814 short int override_uid
= -1;
815 short int override_gid
= -1;
816 bool uid_specified
= false;
817 bool gid_specified
= false;
818 char *nodename
= utsname()->nodename
;
824 * does not have to be perfect mapping since field is
825 * informational, only used for servers that do not support
826 * port 445 and it can be overridden at mount time
828 memset(vol
->source_rfc1001_name
, 0x20, RFC1001_NAME_LEN
);
829 for (i
= 0; i
< strnlen(nodename
, RFC1001_NAME_LEN
); i
++)
830 vol
->source_rfc1001_name
[i
] = toupper(nodename
[i
]);
832 vol
->source_rfc1001_name
[RFC1001_NAME_LEN
] = 0;
833 /* null target name indicates to use *SMBSERVR default called name
834 if we end up sending RFC1001 session initialize */
835 vol
->target_rfc1001_name
[0] = 0;
836 vol
->cred_uid
= current_uid();
837 vol
->linux_uid
= current_uid();
838 vol
->linux_gid
= current_gid();
840 /* default to only allowing write access to owner of the mount */
841 vol
->dir_mode
= vol
->file_mode
= S_IRUGO
| S_IXUGO
| S_IWUSR
;
843 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
844 /* default is always to request posix paths. */
845 vol
->posix_paths
= 1;
846 /* default to using server inode numbers where available */
849 vol
->actimeo
= CIFS_DEF_ACTIMEO
;
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
+1] == separator
[0])) {
921 value
[temp_len
] = separator
[0];
922 temp_len
+= 2; /* move after second comma */
923 while (value
[temp_len
] != 0) {
924 if (value
[temp_len
] == separator
[0]) {
925 if (value
[temp_len
+1] ==
927 /* skip second comma */
930 /* single comma indicating start
937 if (value
[temp_len
] == 0) {
941 /* point option to start of next parm */
942 options
= value
+ temp_len
+ 1;
944 /* go from value to value + temp_len condensing
945 double commas to singles. Note that this ends up
946 allocating a few bytes too many, which is ok */
947 vol
->password
= kzalloc(temp_len
, GFP_KERNEL
);
948 if (vol
->password
== NULL
) {
949 printk(KERN_WARNING
"CIFS: no memory "
953 for (i
= 0, j
= 0; i
< temp_len
; i
++, j
++) {
954 vol
->password
[j
] = value
[i
];
955 if (value
[i
] == separator
[0]
956 && value
[i
+1] == separator
[0]) {
957 /* skip second comma */
961 vol
->password
[j
] = 0;
963 vol
->password
= kzalloc(temp_len
+1, GFP_KERNEL
);
964 if (vol
->password
== NULL
) {
965 printk(KERN_WARNING
"CIFS: no memory "
969 strcpy(vol
->password
, value
);
971 } else if (!strnicmp(data
, "ip", 2) ||
972 !strnicmp(data
, "addr", 4)) {
973 if (!value
|| !*value
) {
975 } else if (strnlen(value
, INET6_ADDRSTRLEN
) <
979 printk(KERN_WARNING
"CIFS: ip address "
983 } else if (strnicmp(data
, "sec", 3) == 0) {
984 if (!value
|| !*value
) {
985 cERROR(1, "no security value specified");
987 } else if (strnicmp(value
, "krb5i", 5) == 0) {
988 vol
->secFlg
|= CIFSSEC_MAY_KRB5
|
990 } else if (strnicmp(value
, "krb5p", 5) == 0) {
991 /* vol->secFlg |= CIFSSEC_MUST_SEAL |
993 cERROR(1, "Krb5 cifs privacy not supported");
995 } else if (strnicmp(value
, "krb5", 4) == 0) {
996 vol
->secFlg
|= CIFSSEC_MAY_KRB5
;
997 } else if (strnicmp(value
, "ntlmsspi", 8) == 0) {
998 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
|
1000 } else if (strnicmp(value
, "ntlmssp", 7) == 0) {
1001 vol
->secFlg
|= CIFSSEC_MAY_NTLMSSP
;
1002 } else if (strnicmp(value
, "ntlmv2i", 7) == 0) {
1003 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
|
1005 } else if (strnicmp(value
, "ntlmv2", 6) == 0) {
1006 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1007 } else if (strnicmp(value
, "ntlmi", 5) == 0) {
1008 vol
->secFlg
|= CIFSSEC_MAY_NTLM
|
1010 } else if (strnicmp(value
, "ntlm", 4) == 0) {
1011 /* ntlm is default so can be turned off too */
1012 vol
->secFlg
|= CIFSSEC_MAY_NTLM
;
1013 } else if (strnicmp(value
, "nontlm", 6) == 0) {
1014 /* BB is there a better way to do this? */
1015 vol
->secFlg
|= CIFSSEC_MAY_NTLMV2
;
1016 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1017 } else if (strnicmp(value
, "lanman", 6) == 0) {
1018 vol
->secFlg
|= CIFSSEC_MAY_LANMAN
;
1020 } else if (strnicmp(value
, "none", 4) == 0) {
1023 cERROR(1, "bad security option: %s", value
);
1026 } else if ((strnicmp(data
, "unc", 3) == 0)
1027 || (strnicmp(data
, "target", 6) == 0)
1028 || (strnicmp(data
, "path", 4) == 0)) {
1029 if (!value
|| !*value
) {
1030 printk(KERN_WARNING
"CIFS: invalid path to "
1031 "network resource\n");
1032 return 1; /* needs_arg; */
1034 if ((temp_len
= strnlen(value
, 300)) < 300) {
1035 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1036 if (vol
->UNC
== NULL
)
1038 strcpy(vol
->UNC
, value
);
1039 if (strncmp(vol
->UNC
, "//", 2) == 0) {
1042 } else if (strncmp(vol
->UNC
, "\\\\", 2) != 0) {
1044 "CIFS: UNC Path does not begin "
1045 "with // or \\\\ \n");
1049 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1052 } else if ((strnicmp(data
, "domain", 3) == 0)
1053 || (strnicmp(data
, "workgroup", 5) == 0)) {
1054 if (!value
|| !*value
) {
1055 printk(KERN_WARNING
"CIFS: invalid domain name\n");
1056 return 1; /* needs_arg; */
1058 /* BB are there cases in which a comma can be valid in
1059 a domain name and need special handling? */
1060 if (strnlen(value
, 256) < 256) {
1061 vol
->domainname
= value
;
1062 cFYI(1, "Domain name set");
1064 printk(KERN_WARNING
"CIFS: domain name too "
1068 } else if (strnicmp(data
, "srcaddr", 7) == 0) {
1069 vol
->srcaddr
.ss_family
= AF_UNSPEC
;
1071 if (!value
|| !*value
) {
1072 printk(KERN_WARNING
"CIFS: srcaddr value"
1073 " not specified.\n");
1074 return 1; /* needs_arg; */
1076 i
= cifs_convert_address((struct sockaddr
*)&vol
->srcaddr
,
1077 value
, strlen(value
));
1079 printk(KERN_WARNING
"CIFS: Could not parse"
1084 } else if (strnicmp(data
, "prefixpath", 10) == 0) {
1085 if (!value
|| !*value
) {
1087 "CIFS: invalid path prefix\n");
1088 return 1; /* needs_argument */
1090 if ((temp_len
= strnlen(value
, 1024)) < 1024) {
1091 if (value
[0] != '/')
1092 temp_len
++; /* missing leading slash */
1093 vol
->prepath
= kmalloc(temp_len
+1, GFP_KERNEL
);
1094 if (vol
->prepath
== NULL
)
1096 if (value
[0] != '/') {
1097 vol
->prepath
[0] = '/';
1098 strcpy(vol
->prepath
+1, value
);
1100 strcpy(vol
->prepath
, value
);
1101 cFYI(1, "prefix path %s", vol
->prepath
);
1103 printk(KERN_WARNING
"CIFS: prefix too long\n");
1106 } else if (strnicmp(data
, "iocharset", 9) == 0) {
1107 if (!value
|| !*value
) {
1108 printk(KERN_WARNING
"CIFS: invalid iocharset "
1110 return 1; /* needs_arg; */
1112 if (strnlen(value
, 65) < 65) {
1113 if (strnicmp(value
, "default", 7))
1114 vol
->iocharset
= value
;
1115 /* if iocharset not set then load_nls_default
1116 is used by caller */
1117 cFYI(1, "iocharset set to %s", value
);
1119 printk(KERN_WARNING
"CIFS: iocharset name "
1123 } else if (!strnicmp(data
, "uid", 3) && value
&& *value
) {
1124 vol
->linux_uid
= simple_strtoul(value
, &value
, 0);
1125 uid_specified
= true;
1126 } else if (!strnicmp(data
, "cruid", 5) && value
&& *value
) {
1127 vol
->cred_uid
= simple_strtoul(value
, &value
, 0);
1128 } else if (!strnicmp(data
, "forceuid", 8)) {
1130 } else if (!strnicmp(data
, "noforceuid", 10)) {
1132 } else if (!strnicmp(data
, "gid", 3) && value
&& *value
) {
1133 vol
->linux_gid
= simple_strtoul(value
, &value
, 0);
1134 gid_specified
= true;
1135 } else if (!strnicmp(data
, "forcegid", 8)) {
1137 } else if (!strnicmp(data
, "noforcegid", 10)) {
1139 } else if (strnicmp(data
, "file_mode", 4) == 0) {
1140 if (value
&& *value
) {
1142 simple_strtoul(value
, &value
, 0);
1144 } else if (strnicmp(data
, "dir_mode", 4) == 0) {
1145 if (value
&& *value
) {
1147 simple_strtoul(value
, &value
, 0);
1149 } else if (strnicmp(data
, "dirmode", 4) == 0) {
1150 if (value
&& *value
) {
1152 simple_strtoul(value
, &value
, 0);
1154 } else if (strnicmp(data
, "port", 4) == 0) {
1155 if (value
&& *value
) {
1157 simple_strtoul(value
, &value
, 0);
1159 } else if (strnicmp(data
, "rsize", 5) == 0) {
1160 if (value
&& *value
) {
1162 simple_strtoul(value
, &value
, 0);
1164 } else if (strnicmp(data
, "wsize", 5) == 0) {
1165 if (value
&& *value
) {
1167 simple_strtoul(value
, &value
, 0);
1169 } else if (strnicmp(data
, "sockopt", 5) == 0) {
1170 if (!value
|| !*value
) {
1171 cERROR(1, "no socket option specified");
1173 } else if (strnicmp(value
, "TCP_NODELAY", 11) == 0) {
1174 vol
->sockopt_tcp_nodelay
= 1;
1176 } else if (strnicmp(data
, "netbiosname", 4) == 0) {
1177 if (!value
|| !*value
|| (*value
== ' ')) {
1178 cFYI(1, "invalid (empty) netbiosname");
1180 memset(vol
->source_rfc1001_name
, 0x20,
1183 * FIXME: are there cases in which a comma can
1184 * be valid in workstation netbios name (and
1185 * need special handling)?
1187 for (i
= 0; i
< RFC1001_NAME_LEN
; i
++) {
1188 /* don't ucase netbiosname for user */
1191 vol
->source_rfc1001_name
[i
] = value
[i
];
1193 /* The string has 16th byte zero still from
1194 set at top of the function */
1195 if (i
== RFC1001_NAME_LEN
&& value
[i
] != 0)
1196 printk(KERN_WARNING
"CIFS: netbiosname"
1197 " longer than 15 truncated.\n");
1199 } else if (strnicmp(data
, "servern", 7) == 0) {
1200 /* servernetbiosname specified override *SMBSERVER */
1201 if (!value
|| !*value
|| (*value
== ' ')) {
1202 cFYI(1, "empty server netbiosname specified");
1204 /* last byte, type, is 0x20 for servr type */
1205 memset(vol
->target_rfc1001_name
, 0x20,
1206 RFC1001_NAME_LEN_WITH_NULL
);
1208 for (i
= 0; i
< 15; i
++) {
1209 /* BB are there cases in which a comma can be
1210 valid in this workstation netbios name
1211 (and need special handling)? */
1213 /* user or mount helper must uppercase
1218 vol
->target_rfc1001_name
[i
] =
1221 /* The string has 16th byte zero still from
1222 set at top of the function */
1223 if (i
== RFC1001_NAME_LEN
&& value
[i
] != 0)
1224 printk(KERN_WARNING
"CIFS: server net"
1225 "biosname longer than 15 truncated.\n");
1227 } else if (strnicmp(data
, "actimeo", 7) == 0) {
1228 if (value
&& *value
) {
1229 vol
->actimeo
= HZ
* simple_strtoul(value
,
1231 if (vol
->actimeo
> CIFS_MAX_ACTIMEO
) {
1232 cERROR(1, "CIFS: attribute cache"
1233 "timeout too large");
1237 } else if (strnicmp(data
, "credentials", 4) == 0) {
1239 } else if (strnicmp(data
, "version", 3) == 0) {
1241 } else if (strnicmp(data
, "guest", 5) == 0) {
1243 } else if (strnicmp(data
, "rw", 2) == 0) {
1245 } else if (strnicmp(data
, "ro", 2) == 0) {
1247 } else if (strnicmp(data
, "noblocksend", 11) == 0) {
1248 vol
->noblocksnd
= 1;
1249 } else if (strnicmp(data
, "noautotune", 10) == 0) {
1250 vol
->noautotune
= 1;
1251 } else if ((strnicmp(data
, "suid", 4) == 0) ||
1252 (strnicmp(data
, "nosuid", 6) == 0) ||
1253 (strnicmp(data
, "exec", 4) == 0) ||
1254 (strnicmp(data
, "noexec", 6) == 0) ||
1255 (strnicmp(data
, "nodev", 5) == 0) ||
1256 (strnicmp(data
, "noauto", 6) == 0) ||
1257 (strnicmp(data
, "dev", 3) == 0)) {
1258 /* The mount tool or mount.cifs helper (if present)
1259 uses these opts to set flags, and the flags are read
1260 by the kernel vfs layer before we get here (ie
1261 before read super) so there is no point trying to
1262 parse these options again and set anything and it
1263 is ok to just ignore them */
1265 } else if (strnicmp(data
, "hard", 4) == 0) {
1267 } else if (strnicmp(data
, "soft", 4) == 0) {
1269 } else if (strnicmp(data
, "perm", 4) == 0) {
1271 } else if (strnicmp(data
, "noperm", 6) == 0) {
1273 } else if (strnicmp(data
, "mapchars", 8) == 0) {
1275 } else if (strnicmp(data
, "nomapchars", 10) == 0) {
1277 } else if (strnicmp(data
, "sfu", 3) == 0) {
1279 } else if (strnicmp(data
, "nosfu", 5) == 0) {
1281 } else if (strnicmp(data
, "nodfs", 5) == 0) {
1283 } else if (strnicmp(data
, "posixpaths", 10) == 0) {
1284 vol
->posix_paths
= 1;
1285 } else if (strnicmp(data
, "noposixpaths", 12) == 0) {
1286 vol
->posix_paths
= 0;
1287 } else if (strnicmp(data
, "nounix", 6) == 0) {
1288 vol
->no_linux_ext
= 1;
1289 } else if (strnicmp(data
, "nolinux", 7) == 0) {
1290 vol
->no_linux_ext
= 1;
1291 } else if ((strnicmp(data
, "nocase", 6) == 0) ||
1292 (strnicmp(data
, "ignorecase", 10) == 0)) {
1294 } else if (strnicmp(data
, "mand", 4) == 0) {
1296 } else if (strnicmp(data
, "nomand", 6) == 0) {
1298 } else if (strnicmp(data
, "_netdev", 7) == 0) {
1300 } else if (strnicmp(data
, "brl", 3) == 0) {
1302 } else if ((strnicmp(data
, "nobrl", 5) == 0) ||
1303 (strnicmp(data
, "nolock", 6) == 0)) {
1305 /* turn off mandatory locking in mode
1306 if remote locking is turned off since the
1307 local vfs will do advisory */
1308 if (vol
->file_mode
==
1309 (S_IALLUGO
& ~(S_ISUID
| S_IXGRP
)))
1310 vol
->file_mode
= S_IALLUGO
;
1311 } else if (strnicmp(data
, "forcemandatorylock", 9) == 0) {
1312 /* will take the shorter form "forcemand" as well */
1313 /* This mount option will force use of mandatory
1314 (DOS/Windows style) byte range locks, instead of
1315 using posix advisory byte range locks, even if the
1316 Unix extensions are available and posix locks would
1317 be supported otherwise. If Unix extensions are not
1318 negotiated this has no effect since mandatory locks
1319 would be used (mandatory locks is all that those
1320 those servers support) */
1322 } else if (strnicmp(data
, "setuids", 7) == 0) {
1324 } else if (strnicmp(data
, "nosetuids", 9) == 0) {
1326 } else if (strnicmp(data
, "dynperm", 7) == 0) {
1327 vol
->dynperm
= true;
1328 } else if (strnicmp(data
, "nodynperm", 9) == 0) {
1329 vol
->dynperm
= false;
1330 } else if (strnicmp(data
, "nohard", 6) == 0) {
1332 } else if (strnicmp(data
, "nosoft", 6) == 0) {
1334 } else if (strnicmp(data
, "nointr", 6) == 0) {
1336 } else if (strnicmp(data
, "intr", 4) == 0) {
1338 } else if (strnicmp(data
, "nostrictsync", 12) == 0) {
1339 vol
->nostrictsync
= 1;
1340 } else if (strnicmp(data
, "strictsync", 10) == 0) {
1341 vol
->nostrictsync
= 0;
1342 } else if (strnicmp(data
, "serverino", 7) == 0) {
1343 vol
->server_ino
= 1;
1344 } else if (strnicmp(data
, "noserverino", 9) == 0) {
1345 vol
->server_ino
= 0;
1346 } else if (strnicmp(data
, "cifsacl", 7) == 0) {
1348 } else if (strnicmp(data
, "nocifsacl", 9) == 0) {
1350 } else if (strnicmp(data
, "acl", 3) == 0) {
1351 vol
->no_psx_acl
= 0;
1352 } else if (strnicmp(data
, "noacl", 5) == 0) {
1353 vol
->no_psx_acl
= 1;
1354 } else if (strnicmp(data
, "locallease", 6) == 0) {
1355 vol
->local_lease
= 1;
1356 } else if (strnicmp(data
, "sign", 4) == 0) {
1357 vol
->secFlg
|= CIFSSEC_MUST_SIGN
;
1358 } else if (strnicmp(data
, "seal", 4) == 0) {
1359 /* we do not do the following in secFlags because seal
1360 is a per tree connection (mount) not a per socket
1361 or per-smb connection option in the protocol */
1362 /* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1364 } else if (strnicmp(data
, "direct", 6) == 0) {
1366 } else if (strnicmp(data
, "forcedirectio", 13) == 0) {
1368 } else if (strnicmp(data
, "strictcache", 11) == 0) {
1370 } else if (strnicmp(data
, "noac", 4) == 0) {
1371 printk(KERN_WARNING
"CIFS: Mount option noac not "
1372 "supported. Instead set "
1373 "/proc/fs/cifs/LookupCacheEnabled to 0\n");
1374 } else if (strnicmp(data
, "fsc", 3) == 0) {
1375 #ifndef CONFIG_CIFS_FSCACHE
1376 cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE"
1377 "kernel config option set");
1381 } else if (strnicmp(data
, "mfsymlinks", 10) == 0) {
1382 vol
->mfsymlinks
= true;
1383 } else if (strnicmp(data
, "multiuser", 8) == 0) {
1384 vol
->multiuser
= true;
1386 printk(KERN_WARNING
"CIFS: Unknown mount option %s\n",
1389 if (vol
->UNC
== NULL
) {
1390 if (devname
== NULL
) {
1391 printk(KERN_WARNING
"CIFS: Missing UNC name for mount "
1395 if ((temp_len
= strnlen(devname
, 300)) < 300) {
1396 vol
->UNC
= kmalloc(temp_len
+1, GFP_KERNEL
);
1397 if (vol
->UNC
== NULL
)
1399 strcpy(vol
->UNC
, devname
);
1400 if (strncmp(vol
->UNC
, "//", 2) == 0) {
1403 } else if (strncmp(vol
->UNC
, "\\\\", 2) != 0) {
1404 printk(KERN_WARNING
"CIFS: UNC Path does not "
1405 "begin with // or \\\\ \n");
1408 value
= strpbrk(vol
->UNC
+2, "/\\");
1412 printk(KERN_WARNING
"CIFS: UNC name too long\n");
1417 if (vol
->multiuser
&& !(vol
->secFlg
& CIFSSEC_MAY_KRB5
)) {
1418 cERROR(1, "Multiuser mounts currently require krb5 "
1423 if (vol
->UNCip
== NULL
)
1424 vol
->UNCip
= &vol
->UNC
[2];
1427 vol
->override_uid
= override_uid
;
1428 else if (override_uid
== 1)
1429 printk(KERN_NOTICE
"CIFS: ignoring forceuid mount option "
1430 "specified with no uid= option.\n");
1433 vol
->override_gid
= override_gid
;
1434 else if (override_gid
== 1)
1435 printk(KERN_NOTICE
"CIFS: ignoring forcegid mount option "
1436 "specified with no gid= option.\n");
1441 /** Returns true if srcaddr isn't specified and rhs isn't
1442 * specified, or if srcaddr is specified and
1443 * matches the IP address of the rhs argument.
1446 srcip_matches(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1448 switch (srcaddr
->sa_family
) {
1450 return (rhs
->sa_family
== AF_UNSPEC
);
1452 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1453 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1454 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1457 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1458 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)&rhs
;
1459 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1463 return false; /* don't expect to be here */
1468 * If no port is specified in addr structure, we try to match with 445 port
1469 * and if it fails - with 139 ports. It should be called only if address
1470 * families of server and addr are equal.
1473 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1475 __be16 port
, *sport
;
1477 switch (addr
->sa_family
) {
1479 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1480 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1483 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1484 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
1492 port
= htons(CIFS_PORT
);
1496 port
= htons(RFC1001_PORT
);
1499 return port
== *sport
;
1503 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1504 struct sockaddr
*srcaddr
)
1506 switch (addr
->sa_family
) {
1508 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
1509 struct sockaddr_in
*srv_addr4
=
1510 (struct sockaddr_in
*)&server
->dstaddr
;
1512 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
1517 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
1518 struct sockaddr_in6
*srv_addr6
=
1519 (struct sockaddr_in6
*)&server
->dstaddr
;
1521 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
1522 &srv_addr6
->sin6_addr
))
1524 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
1530 return false; /* don't expect to be here */
1533 if (!srcip_matches(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
1540 match_security(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
1542 unsigned int secFlags
;
1544 if (vol
->secFlg
& (~(CIFSSEC_MUST_SIGN
| CIFSSEC_MUST_SEAL
)))
1545 secFlags
= vol
->secFlg
;
1547 secFlags
= global_secflags
| vol
->secFlg
;
1549 switch (server
->secType
) {
1551 if (!(secFlags
& (CIFSSEC_MAY_LANMAN
|CIFSSEC_MAY_PLNTXT
)))
1555 if (!(secFlags
& CIFSSEC_MAY_NTLMV2
))
1559 if (!(secFlags
& CIFSSEC_MAY_NTLM
))
1563 if (!(secFlags
& CIFSSEC_MAY_KRB5
))
1567 if (!(secFlags
& CIFSSEC_MAY_NTLMSSP
))
1571 /* shouldn't happen */
1575 /* now check if signing mode is acceptable */
1576 if ((secFlags
& CIFSSEC_MAY_SIGN
) == 0 &&
1577 (server
->secMode
& SECMODE_SIGN_REQUIRED
))
1579 else if (((secFlags
& CIFSSEC_MUST_SIGN
) == CIFSSEC_MUST_SIGN
) &&
1581 (SECMODE_SIGN_ENABLED
|SECMODE_SIGN_REQUIRED
)) == 0)
1587 static struct TCP_Server_Info
*
1588 cifs_find_tcp_session(struct sockaddr
*addr
, struct smb_vol
*vol
)
1590 struct TCP_Server_Info
*server
;
1592 spin_lock(&cifs_tcp_ses_lock
);
1593 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
1594 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
1597 if (!match_address(server
, addr
,
1598 (struct sockaddr
*)&vol
->srcaddr
))
1601 if (!match_port(server
, addr
))
1604 if (!match_security(server
, vol
))
1607 ++server
->srv_count
;
1608 spin_unlock(&cifs_tcp_ses_lock
);
1609 cFYI(1, "Existing tcp session with server found");
1612 spin_unlock(&cifs_tcp_ses_lock
);
1617 cifs_put_tcp_session(struct TCP_Server_Info
*server
)
1619 struct task_struct
*task
;
1621 spin_lock(&cifs_tcp_ses_lock
);
1622 if (--server
->srv_count
> 0) {
1623 spin_unlock(&cifs_tcp_ses_lock
);
1627 put_net(cifs_net_ns(server
));
1629 list_del_init(&server
->tcp_ses_list
);
1630 spin_unlock(&cifs_tcp_ses_lock
);
1632 cancel_delayed_work_sync(&server
->echo
);
1634 spin_lock(&GlobalMid_Lock
);
1635 server
->tcpStatus
= CifsExiting
;
1636 spin_unlock(&GlobalMid_Lock
);
1638 cifs_crypto_shash_release(server
);
1639 cifs_fscache_release_client_cookie(server
);
1641 kfree(server
->session_key
.response
);
1642 server
->session_key
.response
= NULL
;
1643 server
->session_key
.len
= 0;
1645 task
= xchg(&server
->tsk
, NULL
);
1647 force_sig(SIGKILL
, task
);
1650 static struct TCP_Server_Info
*
1651 cifs_get_tcp_session(struct smb_vol
*volume_info
)
1653 struct TCP_Server_Info
*tcp_ses
= NULL
;
1654 struct sockaddr_storage addr
;
1655 struct sockaddr_in
*sin_server
= (struct sockaddr_in
*) &addr
;
1656 struct sockaddr_in6
*sin_server6
= (struct sockaddr_in6
*) &addr
;
1659 memset(&addr
, 0, sizeof(struct sockaddr_storage
));
1661 cFYI(1, "UNC: %s ip: %s", volume_info
->UNC
, volume_info
->UNCip
);
1663 if (volume_info
->UNCip
&& volume_info
->UNC
) {
1664 rc
= cifs_fill_sockaddr((struct sockaddr
*)&addr
,
1666 strlen(volume_info
->UNCip
),
1669 /* we failed translating address */
1673 } else if (volume_info
->UNCip
) {
1674 /* BB using ip addr as tcp_ses name to connect to the
1676 cERROR(1, "Connecting to DFS root not implemented yet");
1679 } else /* which tcp_sess DFS root would we conect to */ {
1680 cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1681 "unc=//192.168.1.100/public) specified");
1686 /* see if we already have a matching tcp_ses */
1687 tcp_ses
= cifs_find_tcp_session((struct sockaddr
*)&addr
, volume_info
);
1691 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
1697 rc
= cifs_crypto_shash_allocate(tcp_ses
);
1699 cERROR(1, "could not setup hash structures rc %d", rc
);
1703 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
1704 tcp_ses
->hostname
= extract_hostname(volume_info
->UNC
);
1705 if (IS_ERR(tcp_ses
->hostname
)) {
1706 rc
= PTR_ERR(tcp_ses
->hostname
);
1707 goto out_err_crypto_release
;
1710 tcp_ses
->noblocksnd
= volume_info
->noblocksnd
;
1711 tcp_ses
->noautotune
= volume_info
->noautotune
;
1712 tcp_ses
->tcp_nodelay
= volume_info
->sockopt_tcp_nodelay
;
1713 atomic_set(&tcp_ses
->inFlight
, 0);
1714 init_waitqueue_head(&tcp_ses
->response_q
);
1715 init_waitqueue_head(&tcp_ses
->request_q
);
1716 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
1717 mutex_init(&tcp_ses
->srv_mutex
);
1718 memcpy(tcp_ses
->workstation_RFC1001_name
,
1719 volume_info
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1720 memcpy(tcp_ses
->server_RFC1001_name
,
1721 volume_info
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1722 tcp_ses
->session_estab
= false;
1723 tcp_ses
->sequence_number
= 0;
1724 tcp_ses
->lstrp
= jiffies
;
1725 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
1726 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
1727 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
1730 * at this point we are the only ones with the pointer
1731 * to the struct since the kernel thread not created yet
1732 * no need to spinlock this init of tcpStatus or srv_count
1734 tcp_ses
->tcpStatus
= CifsNew
;
1735 memcpy(&tcp_ses
->srcaddr
, &volume_info
->srcaddr
,
1736 sizeof(tcp_ses
->srcaddr
));
1737 ++tcp_ses
->srv_count
;
1739 if (addr
.ss_family
== AF_INET6
) {
1740 cFYI(1, "attempting ipv6 connect");
1741 /* BB should we allow ipv6 on port 139? */
1742 /* other OS never observed in Wild doing 139 with v6 */
1743 memcpy(&tcp_ses
->dstaddr
, sin_server6
,
1744 sizeof(struct sockaddr_in6
));
1746 memcpy(&tcp_ses
->dstaddr
, sin_server
,
1747 sizeof(struct sockaddr_in
));
1749 rc
= ip_connect(tcp_ses
);
1751 cERROR(1, "Error connecting to socket. Aborting operation");
1752 goto out_err_crypto_release
;
1756 * since we're in a cifs function already, we know that
1757 * this will succeed. No need for try_module_get().
1759 __module_get(THIS_MODULE
);
1760 tcp_ses
->tsk
= kthread_run((void *)(void *)cifs_demultiplex_thread
,
1762 if (IS_ERR(tcp_ses
->tsk
)) {
1763 rc
= PTR_ERR(tcp_ses
->tsk
);
1764 cERROR(1, "error %d create cifsd thread", rc
);
1765 module_put(THIS_MODULE
);
1766 goto out_err_crypto_release
;
1768 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
1770 /* thread spawned, put it on the list */
1771 spin_lock(&cifs_tcp_ses_lock
);
1772 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
1773 spin_unlock(&cifs_tcp_ses_lock
);
1775 cifs_fscache_get_client_cookie(tcp_ses
);
1777 /* queue echo request delayed work */
1778 queue_delayed_work(system_nrt_wq
, &tcp_ses
->echo
, SMB_ECHO_INTERVAL
);
1782 out_err_crypto_release
:
1783 cifs_crypto_shash_release(tcp_ses
);
1785 put_net(cifs_net_ns(tcp_ses
));
1789 if (!IS_ERR(tcp_ses
->hostname
))
1790 kfree(tcp_ses
->hostname
);
1791 if (tcp_ses
->ssocket
)
1792 sock_release(tcp_ses
->ssocket
);
1798 static struct cifsSesInfo
*
1799 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*vol
)
1801 struct cifsSesInfo
*ses
;
1803 spin_lock(&cifs_tcp_ses_lock
);
1804 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
1805 switch (server
->secType
) {
1807 if (vol
->cred_uid
!= ses
->cred_uid
)
1811 /* anything else takes username/password */
1812 if (ses
->user_name
== NULL
)
1814 if (strncmp(ses
->user_name
, vol
->username
,
1817 if (strlen(vol
->username
) != 0 &&
1818 ses
->password
!= NULL
&&
1819 strncmp(ses
->password
,
1820 vol
->password
? vol
->password
: "",
1825 spin_unlock(&cifs_tcp_ses_lock
);
1828 spin_unlock(&cifs_tcp_ses_lock
);
1833 cifs_put_smb_ses(struct cifsSesInfo
*ses
)
1836 struct TCP_Server_Info
*server
= ses
->server
;
1838 cFYI(1, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
1839 spin_lock(&cifs_tcp_ses_lock
);
1840 if (--ses
->ses_count
> 0) {
1841 spin_unlock(&cifs_tcp_ses_lock
);
1845 list_del_init(&ses
->smb_ses_list
);
1846 spin_unlock(&cifs_tcp_ses_lock
);
1848 if (ses
->status
== CifsGood
) {
1850 CIFSSMBLogoff(xid
, ses
);
1854 cifs_put_tcp_session(server
);
1857 static bool warned_on_ntlm
; /* globals init to false automatically */
1859 static struct cifsSesInfo
*
1860 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb_vol
*volume_info
)
1862 int rc
= -ENOMEM
, xid
;
1863 struct cifsSesInfo
*ses
;
1864 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
1865 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
1869 ses
= cifs_find_smb_ses(server
, volume_info
);
1871 cFYI(1, "Existing smb sess found (status=%d)", ses
->status
);
1873 mutex_lock(&ses
->session_mutex
);
1874 rc
= cifs_negotiate_protocol(xid
, ses
);
1876 mutex_unlock(&ses
->session_mutex
);
1877 /* problem -- put our ses reference */
1878 cifs_put_smb_ses(ses
);
1882 if (ses
->need_reconnect
) {
1883 cFYI(1, "Session needs reconnect");
1884 rc
= cifs_setup_session(xid
, ses
,
1885 volume_info
->local_nls
);
1887 mutex_unlock(&ses
->session_mutex
);
1888 /* problem -- put our reference */
1889 cifs_put_smb_ses(ses
);
1894 mutex_unlock(&ses
->session_mutex
);
1896 /* existing SMB ses has a server reference already */
1897 cifs_put_tcp_session(server
);
1902 cFYI(1, "Existing smb sess not found");
1903 ses
= sesInfoAlloc();
1907 /* new SMB session uses our server ref */
1908 ses
->server
= server
;
1909 if (server
->dstaddr
.ss_family
== AF_INET6
)
1910 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
1912 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
1914 if (volume_info
->username
) {
1915 ses
->user_name
= kstrdup(volume_info
->username
, GFP_KERNEL
);
1916 if (!ses
->user_name
)
1920 /* volume_info->password freed at unmount */
1921 if (volume_info
->password
) {
1922 ses
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
1926 if (volume_info
->domainname
) {
1927 ses
->domainName
= kstrdup(volume_info
->domainname
, GFP_KERNEL
);
1928 if (!ses
->domainName
)
1931 ses
->cred_uid
= volume_info
->cred_uid
;
1932 ses
->linux_uid
= volume_info
->linux_uid
;
1934 /* ntlmv2 is much stronger than ntlm security, and has been broadly
1935 supported for many years, time to update default security mechanism */
1936 if ((volume_info
->secFlg
== 0) && warned_on_ntlm
== false) {
1937 warned_on_ntlm
= true;
1938 cERROR(1, "default security mechanism requested. The default "
1939 "security mechanism will be upgraded from ntlm to "
1940 "ntlmv2 in kernel release 2.6.41");
1942 ses
->overrideSecFlg
= volume_info
->secFlg
;
1944 mutex_lock(&ses
->session_mutex
);
1945 rc
= cifs_negotiate_protocol(xid
, ses
);
1947 rc
= cifs_setup_session(xid
, ses
, volume_info
->local_nls
);
1948 mutex_unlock(&ses
->session_mutex
);
1952 /* success, put it on the list */
1953 spin_lock(&cifs_tcp_ses_lock
);
1954 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
1955 spin_unlock(&cifs_tcp_ses_lock
);
1966 static struct cifsTconInfo
*
1967 cifs_find_tcon(struct cifsSesInfo
*ses
, const char *unc
)
1969 struct list_head
*tmp
;
1970 struct cifsTconInfo
*tcon
;
1972 spin_lock(&cifs_tcp_ses_lock
);
1973 list_for_each(tmp
, &ses
->tcon_list
) {
1974 tcon
= list_entry(tmp
, struct cifsTconInfo
, tcon_list
);
1975 if (tcon
->tidStatus
== CifsExiting
)
1977 if (strncmp(tcon
->treeName
, unc
, MAX_TREE_SIZE
))
1981 spin_unlock(&cifs_tcp_ses_lock
);
1984 spin_unlock(&cifs_tcp_ses_lock
);
1989 cifs_put_tcon(struct cifsTconInfo
*tcon
)
1992 struct cifsSesInfo
*ses
= tcon
->ses
;
1994 cFYI(1, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
1995 spin_lock(&cifs_tcp_ses_lock
);
1996 if (--tcon
->tc_count
> 0) {
1997 spin_unlock(&cifs_tcp_ses_lock
);
2001 list_del_init(&tcon
->tcon_list
);
2002 spin_unlock(&cifs_tcp_ses_lock
);
2005 CIFSSMBTDis(xid
, tcon
);
2008 cifs_fscache_release_super_cookie(tcon
);
2010 cifs_put_smb_ses(ses
);
2013 static struct cifsTconInfo
*
2014 cifs_get_tcon(struct cifsSesInfo
*ses
, struct smb_vol
*volume_info
)
2017 struct cifsTconInfo
*tcon
;
2019 tcon
= cifs_find_tcon(ses
, volume_info
->UNC
);
2021 cFYI(1, "Found match on UNC path");
2022 /* existing tcon already has a reference */
2023 cifs_put_smb_ses(ses
);
2024 if (tcon
->seal
!= volume_info
->seal
)
2025 cERROR(1, "transport encryption setting "
2026 "conflicts with existing tid");
2030 tcon
= tconInfoAlloc();
2037 if (volume_info
->password
) {
2038 tcon
->password
= kstrdup(volume_info
->password
, GFP_KERNEL
);
2039 if (!tcon
->password
) {
2045 if (strchr(volume_info
->UNC
+ 3, '\\') == NULL
2046 && strchr(volume_info
->UNC
+ 3, '/') == NULL
) {
2047 cERROR(1, "Missing share name");
2052 /* BB Do we need to wrap session_mutex around
2053 * this TCon call and Unix SetFS as
2054 * we do on SessSetup and reconnect? */
2056 rc
= CIFSTCon(xid
, ses
, volume_info
->UNC
, tcon
, volume_info
->local_nls
);
2058 cFYI(1, "CIFS Tcon rc = %d", rc
);
2062 if (volume_info
->nodfs
) {
2063 tcon
->Flags
&= ~SMB_SHARE_IS_IN_DFS
;
2064 cFYI(1, "DFS disabled (%d)", tcon
->Flags
);
2066 tcon
->seal
= volume_info
->seal
;
2067 /* we can have only one retry value for a connection
2068 to a share so for resources mounted more than once
2069 to the same server share the last value passed in
2070 for the retry flag is used */
2071 tcon
->retry
= volume_info
->retry
;
2072 tcon
->nocase
= volume_info
->nocase
;
2073 tcon
->local_lease
= volume_info
->local_lease
;
2075 spin_lock(&cifs_tcp_ses_lock
);
2076 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2077 spin_unlock(&cifs_tcp_ses_lock
);
2079 cifs_fscache_get_super_cookie(tcon
);
2089 cifs_put_tlink(struct tcon_link
*tlink
)
2091 if (!tlink
|| IS_ERR(tlink
))
2094 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2095 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2096 tlink
->tl_time
= jiffies
;
2100 if (!IS_ERR(tlink_tcon(tlink
)))
2101 cifs_put_tcon(tlink_tcon(tlink
));
2107 get_dfs_path(int xid
, struct cifsSesInfo
*pSesInfo
, const char *old_path
,
2108 const struct nls_table
*nls_codepage
, unsigned int *pnum_referrals
,
2109 struct dfs_info3_param
**preferrals
, int remap
)
2114 *pnum_referrals
= 0;
2117 if (pSesInfo
->ipc_tid
== 0) {
2118 temp_unc
= kmalloc(2 /* for slashes */ +
2119 strnlen(pSesInfo
->serverName
,
2120 SERVER_NAME_LEN_WITH_NULL
* 2)
2121 + 1 + 4 /* slash IPC$ */ + 2,
2123 if (temp_unc
== NULL
)
2127 strcpy(temp_unc
+ 2, pSesInfo
->serverName
);
2128 strcpy(temp_unc
+ 2 + strlen(pSesInfo
->serverName
), "\\IPC$");
2129 rc
= CIFSTCon(xid
, pSesInfo
, temp_unc
, NULL
, nls_codepage
);
2130 cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc
, pSesInfo
->ipc_tid
);
2134 rc
= CIFSGetDFSRefer(xid
, pSesInfo
, old_path
, preferrals
,
2135 pnum_referrals
, nls_codepage
, remap
);
2136 /* BB map targetUNCs to dfs_info3 structures, here or
2137 in CIFSGetDFSRefer BB */
2142 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2143 static struct lock_class_key cifs_key
[2];
2144 static struct lock_class_key cifs_slock_key
[2];
2147 cifs_reclassify_socket4(struct socket
*sock
)
2149 struct sock
*sk
= sock
->sk
;
2150 BUG_ON(sock_owned_by_user(sk
));
2151 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2152 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2156 cifs_reclassify_socket6(struct socket
*sock
)
2158 struct sock
*sk
= sock
->sk
;
2159 BUG_ON(sock_owned_by_user(sk
));
2160 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2161 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2165 cifs_reclassify_socket4(struct socket
*sock
)
2170 cifs_reclassify_socket6(struct socket
*sock
)
2175 /* See RFC1001 section 14 on representation of Netbios names */
2176 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2180 for (i
= 0, j
= 0; i
< (length
); i
++) {
2181 /* mask a nibble at a time and encode */
2182 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2183 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2190 bind_socket(struct TCP_Server_Info
*server
)
2193 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2194 /* Bind to the specified local IP address */
2195 struct socket
*socket
= server
->ssocket
;
2196 rc
= socket
->ops
->bind(socket
,
2197 (struct sockaddr
*) &server
->srcaddr
,
2198 sizeof(server
->srcaddr
));
2200 struct sockaddr_in
*saddr4
;
2201 struct sockaddr_in6
*saddr6
;
2202 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2203 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2204 if (saddr6
->sin6_family
== AF_INET6
)
2206 "Failed to bind to: %pI6c, error: %d\n",
2207 &saddr6
->sin6_addr
, rc
);
2210 "Failed to bind to: %pI4, error: %d\n",
2211 &saddr4
->sin_addr
.s_addr
, rc
);
2218 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2222 * some servers require RFC1001 sessinit before sending
2223 * negprot - BB check reconnection in case where second
2224 * sessinit is sent but no second negprot
2226 struct rfc1002_session_packet
*ses_init_buf
;
2227 struct smb_hdr
*smb_buf
;
2228 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2231 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2233 if (server
->server_RFC1001_name
&&
2234 server
->server_RFC1001_name
[0] != 0)
2235 rfc1002mangle(ses_init_buf
->trailer
.
2236 session_req
.called_name
,
2237 server
->server_RFC1001_name
,
2238 RFC1001_NAME_LEN_WITH_NULL
);
2240 rfc1002mangle(ses_init_buf
->trailer
.
2241 session_req
.called_name
,
2242 DEFAULT_CIFS_CALLED_NAME
,
2243 RFC1001_NAME_LEN_WITH_NULL
);
2245 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2248 * calling name ends in null (byte 16) from old smb
2251 if (server
->workstation_RFC1001_name
&&
2252 server
->workstation_RFC1001_name
[0] != 0)
2253 rfc1002mangle(ses_init_buf
->trailer
.
2254 session_req
.calling_name
,
2255 server
->workstation_RFC1001_name
,
2256 RFC1001_NAME_LEN_WITH_NULL
);
2258 rfc1002mangle(ses_init_buf
->trailer
.
2259 session_req
.calling_name
,
2261 RFC1001_NAME_LEN_WITH_NULL
);
2263 ses_init_buf
->trailer
.session_req
.scope1
= 0;
2264 ses_init_buf
->trailer
.session_req
.scope2
= 0;
2265 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
2267 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2268 smb_buf
->smb_buf_length
= 0x81000044;
2269 rc
= smb_send(server
, smb_buf
, 0x44);
2270 kfree(ses_init_buf
);
2272 * RFC1001 layer in at least one server
2273 * requires very short break before negprot
2274 * presumably because not expecting negprot
2275 * to follow so fast. This is a simple
2276 * solution that works without
2277 * complicating the code and causes no
2278 * significant slowing down on mount
2281 usleep_range(1000, 2000);
2284 * else the negprot may still work without this
2285 * even though malloc failed
2292 generic_ip_connect(struct TCP_Server_Info
*server
)
2297 struct socket
*socket
= server
->ssocket
;
2298 struct sockaddr
*saddr
;
2300 saddr
= (struct sockaddr
*) &server
->dstaddr
;
2302 if (server
->dstaddr
.ss_family
== AF_INET6
) {
2303 sport
= ((struct sockaddr_in6
*) saddr
)->sin6_port
;
2304 slen
= sizeof(struct sockaddr_in6
);
2307 sport
= ((struct sockaddr_in
*) saddr
)->sin_port
;
2308 slen
= sizeof(struct sockaddr_in
);
2312 if (socket
== NULL
) {
2313 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
2314 IPPROTO_TCP
, &socket
, 1);
2316 cERROR(1, "Error %d creating socket", rc
);
2317 server
->ssocket
= NULL
;
2321 /* BB other socket options to set KEEPALIVE, NODELAY? */
2322 cFYI(1, "Socket created");
2323 server
->ssocket
= socket
;
2324 socket
->sk
->sk_allocation
= GFP_NOFS
;
2325 if (sfamily
== AF_INET6
)
2326 cifs_reclassify_socket6(socket
);
2328 cifs_reclassify_socket4(socket
);
2331 rc
= bind_socket(server
);
2335 rc
= socket
->ops
->connect(socket
, saddr
, slen
, 0);
2337 cFYI(1, "Error %d connecting to server", rc
);
2338 sock_release(socket
);
2339 server
->ssocket
= NULL
;
2344 * Eventually check for other socket options to change from
2345 * the default. sock_setsockopt not used because it expects
2348 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
2349 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
2351 /* make the bufsizes depend on wsize/rsize and max requests */
2352 if (server
->noautotune
) {
2353 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
2354 socket
->sk
->sk_sndbuf
= 200 * 1024;
2355 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
2356 socket
->sk
->sk_rcvbuf
= 140 * 1024;
2359 if (server
->tcp_nodelay
) {
2361 rc
= kernel_setsockopt(socket
, SOL_TCP
, TCP_NODELAY
,
2362 (char *)&val
, sizeof(val
));
2364 cFYI(1, "set TCP_NODELAY socket option error %d", rc
);
2367 cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2368 socket
->sk
->sk_sndbuf
,
2369 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
2371 if (sport
== htons(RFC1001_PORT
))
2372 rc
= ip_rfc1001_connect(server
);
2378 ip_connect(struct TCP_Server_Info
*server
)
2381 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2382 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2384 if (server
->dstaddr
.ss_family
== AF_INET6
)
2385 sport
= &addr6
->sin6_port
;
2387 sport
= &addr
->sin_port
;
2392 /* try with 445 port at first */
2393 *sport
= htons(CIFS_PORT
);
2395 rc
= generic_ip_connect(server
);
2399 /* if it failed, try with 139 port */
2400 *sport
= htons(RFC1001_PORT
);
2403 return generic_ip_connect(server
);
2406 void reset_cifs_unix_caps(int xid
, struct cifsTconInfo
*tcon
,
2407 struct super_block
*sb
, struct smb_vol
*vol_info
)
2409 /* if we are reconnecting then should we check to see if
2410 * any requested capabilities changed locally e.g. via
2411 * remount but we can not do much about it here
2412 * if they have (even if we could detect it by the following)
2413 * Perhaps we could add a backpointer to array of sb from tcon
2414 * or if we change to make all sb to same share the same
2415 * sb as NFS - then we only have one backpointer to sb.
2416 * What if we wanted to mount the server share twice once with
2417 * and once without posixacls or posix paths? */
2418 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2420 if (vol_info
&& vol_info
->no_linux_ext
) {
2421 tcon
->fsUnixInfo
.Capability
= 0;
2422 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
2423 cFYI(1, "Linux protocol extensions disabled");
2425 } else if (vol_info
)
2426 tcon
->unix_ext
= 1; /* Unix Extensions supported */
2428 if (tcon
->unix_ext
== 0) {
2429 cFYI(1, "Unix extensions disabled so not set on reconnect");
2433 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
2434 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2436 /* check for reconnect case in which we do not
2437 want to change the mount behavior if we can avoid it */
2438 if (vol_info
== NULL
) {
2439 /* turn off POSIX ACL and PATHNAMES if not set
2440 originally at mount time */
2441 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
2442 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2443 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2444 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2445 cERROR(1, "POSIXPATH support change");
2446 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2447 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2448 cERROR(1, "possible reconnect error");
2449 cERROR(1, "server disabled POSIX path support");
2453 cap
&= CIFS_UNIX_CAP_MASK
;
2454 if (vol_info
&& vol_info
->no_psx_acl
)
2455 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2456 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
2457 cFYI(1, "negotiated posix acl support");
2459 sb
->s_flags
|= MS_POSIXACL
;
2462 if (vol_info
&& vol_info
->posix_paths
== 0)
2463 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2464 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
2465 cFYI(1, "negotiate posix pathnames");
2467 CIFS_SB(sb
)->mnt_cifs_flags
|=
2468 CIFS_MOUNT_POSIX_PATHS
;
2471 /* We might be setting the path sep back to a different
2472 form if we are reconnecting and the server switched its
2473 posix path capability for this share */
2474 if (sb
&& (CIFS_SB(sb
)->prepathlen
> 0))
2475 CIFS_SB(sb
)->prepath
[0] = CIFS_DIR_SEP(CIFS_SB(sb
));
2477 if (sb
&& (CIFS_SB(sb
)->rsize
> 127 * 1024)) {
2478 if ((cap
& CIFS_UNIX_LARGE_READ_CAP
) == 0) {
2479 CIFS_SB(sb
)->rsize
= 127 * 1024;
2480 cFYI(DBG2
, "larger reads not supported by srv");
2485 cFYI(1, "Negotiate caps 0x%x", (int)cap
);
2486 #ifdef CONFIG_CIFS_DEBUG2
2487 if (cap
& CIFS_UNIX_FCNTL_CAP
)
2488 cFYI(1, "FCNTL cap");
2489 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
2490 cFYI(1, "EXTATTR cap");
2491 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2492 cFYI(1, "POSIX path cap");
2493 if (cap
& CIFS_UNIX_XATTR_CAP
)
2494 cFYI(1, "XATTR cap");
2495 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
2496 cFYI(1, "POSIX ACL cap");
2497 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
2498 cFYI(1, "very large read cap");
2499 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
2500 cFYI(1, "very large write cap");
2501 #endif /* CIFS_DEBUG2 */
2502 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
2503 if (vol_info
== NULL
) {
2504 cFYI(1, "resetting capabilities failed");
2506 cERROR(1, "Negotiating Unix capabilities "
2507 "with the server failed. Consider "
2508 "mounting with the Unix Extensions\n"
2509 "disabled, if problems are found, "
2510 "by specifying the nounix mount "
2518 convert_delimiter(char *path
, char delim
)
2531 for (i
= 0; path
[i
] != '\0'; i
++) {
2532 if (path
[i
] == old_delim
)
2537 static void setup_cifs_sb(struct smb_vol
*pvolume_info
,
2538 struct cifs_sb_info
*cifs_sb
)
2540 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
2542 if (pvolume_info
->rsize
> CIFSMaxBufSize
) {
2543 cERROR(1, "rsize %d too large, using MaxBufSize",
2544 pvolume_info
->rsize
);
2545 cifs_sb
->rsize
= CIFSMaxBufSize
;
2546 } else if ((pvolume_info
->rsize
) &&
2547 (pvolume_info
->rsize
<= CIFSMaxBufSize
))
2548 cifs_sb
->rsize
= pvolume_info
->rsize
;
2550 cifs_sb
->rsize
= CIFSMaxBufSize
;
2552 if (pvolume_info
->wsize
> PAGEVEC_SIZE
* PAGE_CACHE_SIZE
) {
2553 cERROR(1, "wsize %d too large, using 4096 instead",
2554 pvolume_info
->wsize
);
2555 cifs_sb
->wsize
= 4096;
2556 } else if (pvolume_info
->wsize
)
2557 cifs_sb
->wsize
= pvolume_info
->wsize
;
2559 cifs_sb
->wsize
= min_t(const int,
2560 PAGEVEC_SIZE
* PAGE_CACHE_SIZE
,
2562 /* old default of CIFSMaxBufSize was too small now
2563 that SMB Write2 can send multiple pages in kvec.
2564 RFC1001 does not describe what happens when frame
2565 bigger than 128K is sent so use that as max in
2566 conjunction with 52K kvec constraint on arch with 4K
2569 if (cifs_sb
->rsize
< 2048) {
2570 cifs_sb
->rsize
= 2048;
2571 /* Windows ME may prefer this */
2572 cFYI(1, "readsize set to minimum: 2048");
2574 /* calculate prepath */
2575 cifs_sb
->prepath
= pvolume_info
->prepath
;
2576 if (cifs_sb
->prepath
) {
2577 cifs_sb
->prepathlen
= strlen(cifs_sb
->prepath
);
2578 /* we can not convert the / to \ in the path
2579 separators in the prefixpath yet because we do not
2580 know (until reset_cifs_unix_caps is called later)
2581 whether POSIX PATH CAP is available. We normalize
2582 the / to \ after reset_cifs_unix_caps is called */
2583 pvolume_info
->prepath
= NULL
;
2585 cifs_sb
->prepathlen
= 0;
2586 cifs_sb
->mnt_uid
= pvolume_info
->linux_uid
;
2587 cifs_sb
->mnt_gid
= pvolume_info
->linux_gid
;
2588 cifs_sb
->mnt_file_mode
= pvolume_info
->file_mode
;
2589 cifs_sb
->mnt_dir_mode
= pvolume_info
->dir_mode
;
2590 cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2591 cifs_sb
->mnt_file_mode
, cifs_sb
->mnt_dir_mode
);
2593 cifs_sb
->actimeo
= pvolume_info
->actimeo
;
2595 if (pvolume_info
->noperm
)
2596 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_PERM
;
2597 if (pvolume_info
->setuids
)
2598 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SET_UID
;
2599 if (pvolume_info
->server_ino
)
2600 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_SERVER_INUM
;
2601 if (pvolume_info
->remap
)
2602 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MAP_SPECIAL_CHR
;
2603 if (pvolume_info
->no_xattr
)
2604 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_XATTR
;
2605 if (pvolume_info
->sfu_emul
)
2606 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_UNX_EMUL
;
2607 if (pvolume_info
->nobrl
)
2608 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NO_BRL
;
2609 if (pvolume_info
->nostrictsync
)
2610 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOSSYNC
;
2611 if (pvolume_info
->mand_lock
)
2612 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_NOPOSIXBRL
;
2613 if (pvolume_info
->cifs_acl
)
2614 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_CIFS_ACL
;
2615 if (pvolume_info
->override_uid
)
2616 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_UID
;
2617 if (pvolume_info
->override_gid
)
2618 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_OVERR_GID
;
2619 if (pvolume_info
->dynperm
)
2620 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DYNPERM
;
2621 if (pvolume_info
->fsc
)
2622 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_FSCACHE
;
2623 if (pvolume_info
->multiuser
)
2624 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_MULTIUSER
|
2625 CIFS_MOUNT_NO_PERM
);
2626 if (pvolume_info
->strict_io
)
2627 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_STRICT_IO
;
2628 if (pvolume_info
->direct_io
) {
2629 cFYI(1, "mounting share using direct i/o");
2630 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_DIRECT_IO
;
2632 if (pvolume_info
->mfsymlinks
) {
2633 if (pvolume_info
->sfu_emul
) {
2634 cERROR(1, "mount option mfsymlinks ignored if sfu "
2635 "mount option is used");
2637 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_MF_SYMLINKS
;
2641 if ((pvolume_info
->cifs_acl
) && (pvolume_info
->dynperm
))
2642 cERROR(1, "mount option dynperm ignored if cifsacl "
2643 "mount option supported");
2647 is_path_accessible(int xid
, struct cifsTconInfo
*tcon
,
2648 struct cifs_sb_info
*cifs_sb
, const char *full_path
)
2651 FILE_ALL_INFO
*pfile_info
;
2653 pfile_info
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
2654 if (pfile_info
== NULL
)
2657 rc
= CIFSSMBQPathInfo(xid
, tcon
, full_path
, pfile_info
,
2658 0 /* not legacy */, cifs_sb
->local_nls
,
2659 cifs_sb
->mnt_cifs_flags
&
2660 CIFS_MOUNT_MAP_SPECIAL_CHR
);
2666 cleanup_volume_info(struct smb_vol
**pvolume_info
)
2668 struct smb_vol
*volume_info
;
2670 if (!pvolume_info
|| !*pvolume_info
)
2673 volume_info
= *pvolume_info
;
2674 kzfree(volume_info
->password
);
2675 kfree(volume_info
->UNC
);
2676 kfree(volume_info
->prepath
);
2678 *pvolume_info
= NULL
;
2682 #ifdef CONFIG_CIFS_DFS_UPCALL
2683 /* build_path_to_root returns full path to root when
2684 * we do not have an exiting connection (tcon) */
2686 build_unc_path_to_root(const struct smb_vol
*volume_info
,
2687 const struct cifs_sb_info
*cifs_sb
)
2691 int unc_len
= strnlen(volume_info
->UNC
, MAX_TREE_SIZE
+ 1);
2692 full_path
= kmalloc(unc_len
+ cifs_sb
->prepathlen
+ 1, GFP_KERNEL
);
2693 if (full_path
== NULL
)
2694 return ERR_PTR(-ENOMEM
);
2696 strncpy(full_path
, volume_info
->UNC
, unc_len
);
2697 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_POSIX_PATHS
) {
2699 for (i
= 0; i
< unc_len
; i
++) {
2700 if (full_path
[i
] == '\\')
2705 if (cifs_sb
->prepathlen
)
2706 strncpy(full_path
+ unc_len
, cifs_sb
->prepath
,
2707 cifs_sb
->prepathlen
);
2709 full_path
[unc_len
+ cifs_sb
->prepathlen
] = 0; /* add trailing null */
2715 cifs_mount(struct super_block
*sb
, struct cifs_sb_info
*cifs_sb
,
2716 char *mount_data_global
, const char *devname
)
2720 struct smb_vol
*volume_info
;
2721 struct cifsSesInfo
*pSesInfo
;
2722 struct cifsTconInfo
*tcon
;
2723 struct TCP_Server_Info
*srvTcp
;
2725 char *mount_data
= mount_data_global
;
2726 struct tcon_link
*tlink
;
2727 #ifdef CONFIG_CIFS_DFS_UPCALL
2728 struct dfs_info3_param
*referrals
= NULL
;
2729 unsigned int num_referrals
= 0;
2730 int referral_walks_count
= 0;
2742 volume_info
= kzalloc(sizeof(struct smb_vol
), GFP_KERNEL
);
2748 if (cifs_parse_mount_options(mount_data
, devname
, volume_info
)) {
2753 if (volume_info
->nullauth
) {
2754 cFYI(1, "null user");
2755 volume_info
->username
= "";
2756 } else if (volume_info
->username
) {
2757 /* BB fixme parse for domain name here */
2758 cFYI(1, "Username: %s", volume_info
->username
);
2760 cifserror("No username specified");
2761 /* In userspace mount helper we can get user name from alternate
2762 locations such as env variables and files on disk */
2767 /* this is needed for ASCII cp to Unicode converts */
2768 if (volume_info
->iocharset
== NULL
) {
2769 /* load_nls_default cannot return null */
2770 volume_info
->local_nls
= load_nls_default();
2772 volume_info
->local_nls
= load_nls(volume_info
->iocharset
);
2773 if (volume_info
->local_nls
== NULL
) {
2774 cERROR(1, "CIFS mount error: iocharset %s not found",
2775 volume_info
->iocharset
);
2780 cifs_sb
->local_nls
= volume_info
->local_nls
;
2782 /* get a reference to a tcp session */
2783 srvTcp
= cifs_get_tcp_session(volume_info
);
2784 if (IS_ERR(srvTcp
)) {
2785 rc
= PTR_ERR(srvTcp
);
2789 /* get a reference to a SMB session */
2790 pSesInfo
= cifs_get_smb_ses(srvTcp
, volume_info
);
2791 if (IS_ERR(pSesInfo
)) {
2792 rc
= PTR_ERR(pSesInfo
);
2794 goto mount_fail_check
;
2797 setup_cifs_sb(volume_info
, cifs_sb
);
2798 if (pSesInfo
->capabilities
& CAP_LARGE_FILES
)
2799 sb
->s_maxbytes
= MAX_LFS_FILESIZE
;
2801 sb
->s_maxbytes
= MAX_NON_LFS
;
2803 /* BB FIXME fix time_gran to be larger for LANMAN sessions */
2804 sb
->s_time_gran
= 100;
2806 /* search for existing tcon to this server share */
2807 tcon
= cifs_get_tcon(pSesInfo
, volume_info
);
2811 goto remote_path_check
;
2814 /* do not care if following two calls succeed - informational */
2816 CIFSSMBQFSDeviceInfo(xid
, tcon
);
2817 CIFSSMBQFSAttributeInfo(xid
, tcon
);
2820 /* tell server which Unix caps we support */
2821 if (tcon
->ses
->capabilities
& CAP_UNIX
)
2822 /* reset of caps checks mount to see if unix extensions
2823 disabled for just this mount */
2824 reset_cifs_unix_caps(xid
, tcon
, sb
, volume_info
);
2826 tcon
->unix_ext
= 0; /* server does not support them */
2828 /* convert forward to back slashes in prepath here if needed */
2829 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_POSIX_PATHS
) == 0)
2830 convert_delimiter(cifs_sb
->prepath
, CIFS_DIR_SEP(cifs_sb
));
2832 if ((tcon
->unix_ext
== 0) && (cifs_sb
->rsize
> (1024 * 127))) {
2833 cifs_sb
->rsize
= 1024 * 127;
2834 cFYI(DBG2
, "no very large read support, rsize now 127K");
2836 if (!(tcon
->ses
->capabilities
& CAP_LARGE_WRITE_X
))
2837 cifs_sb
->wsize
= min(cifs_sb
->wsize
,
2838 (tcon
->ses
->server
->maxBuf
- MAX_CIFS_HDR_SIZE
));
2839 if (!(tcon
->ses
->capabilities
& CAP_LARGE_READ_X
))
2840 cifs_sb
->rsize
= min(cifs_sb
->rsize
,
2841 (tcon
->ses
->server
->maxBuf
- MAX_CIFS_HDR_SIZE
));
2844 /* check if a whole path (including prepath) is not remote */
2846 /* build_path_to_root works only when we have a valid tcon */
2847 full_path
= cifs_build_path_to_root(cifs_sb
, tcon
);
2848 if (full_path
== NULL
) {
2850 goto mount_fail_check
;
2852 rc
= is_path_accessible(xid
, tcon
, cifs_sb
, full_path
);
2853 if (rc
!= 0 && rc
!= -EREMOTE
) {
2855 goto mount_fail_check
;
2860 /* get referral if needed */
2861 if (rc
== -EREMOTE
) {
2862 #ifdef CONFIG_CIFS_DFS_UPCALL
2863 if (referral_walks_count
> MAX_NESTED_LINKS
) {
2865 * BB: when we implement proper loop detection,
2866 * we will remove this check. But now we need it
2867 * to prevent an indefinite loop if 'DFS tree' is
2868 * misconfigured (i.e. has loops).
2871 goto mount_fail_check
;
2873 /* convert forward to back slashes in prepath here if needed */
2874 if ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_POSIX_PATHS
) == 0)
2875 convert_delimiter(cifs_sb
->prepath
,
2876 CIFS_DIR_SEP(cifs_sb
));
2877 full_path
= build_unc_path_to_root(volume_info
, cifs_sb
);
2878 if (IS_ERR(full_path
)) {
2879 rc
= PTR_ERR(full_path
);
2880 goto mount_fail_check
;
2883 cFYI(1, "Getting referral for: %s", full_path
);
2884 rc
= get_dfs_path(xid
, pSesInfo
, full_path
+ 1,
2885 cifs_sb
->local_nls
, &num_referrals
, &referrals
,
2886 cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MAP_SPECIAL_CHR
);
2887 if (!rc
&& num_referrals
> 0) {
2888 char *fake_devname
= NULL
;
2890 if (mount_data
!= mount_data_global
)
2893 mount_data
= cifs_compose_mount_options(
2894 cifs_sb
->mountdata
, full_path
+ 1,
2895 referrals
, &fake_devname
);
2897 free_dfs_info_array(referrals
, num_referrals
);
2898 kfree(fake_devname
);
2901 if (IS_ERR(mount_data
)) {
2902 rc
= PTR_ERR(mount_data
);
2904 goto mount_fail_check
;
2908 cifs_put_tcon(tcon
);
2910 cifs_put_smb_ses(pSesInfo
);
2912 cleanup_volume_info(&volume_info
);
2913 referral_walks_count
++;
2915 goto try_mount_again
;
2917 #else /* No DFS support, return error on mount */
2923 goto mount_fail_check
;
2925 /* now, hang the tcon off of the superblock */
2926 tlink
= kzalloc(sizeof *tlink
, GFP_KERNEL
);
2927 if (tlink
== NULL
) {
2929 goto mount_fail_check
;
2932 tlink
->tl_uid
= pSesInfo
->linux_uid
;
2933 tlink
->tl_tcon
= tcon
;
2934 tlink
->tl_time
= jiffies
;
2935 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
2936 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
2938 cifs_sb
->master_tlink
= tlink
;
2939 spin_lock(&cifs_sb
->tlink_tree_lock
);
2940 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
2941 spin_unlock(&cifs_sb
->tlink_tree_lock
);
2943 queue_delayed_work(system_nrt_wq
, &cifs_sb
->prune_tlinks
,
2947 /* on error free sesinfo and tcon struct if needed */
2949 if (mount_data
!= mount_data_global
)
2951 /* If find_unc succeeded then rc == 0 so we can not end */
2952 /* up accidentally freeing someone elses tcon struct */
2954 cifs_put_tcon(tcon
);
2956 cifs_put_smb_ses(pSesInfo
);
2958 cifs_put_tcp_session(srvTcp
);
2962 /* volume_info->password is freed above when existing session found
2963 (in which case it is not needed anymore) but when new sesion is created
2964 the password ptr is put in the new session structure (in which case the
2965 password will be freed at unmount time) */
2967 /* zero out password before freeing */
2968 cleanup_volume_info(&volume_info
);
2974 CIFSTCon(unsigned int xid
, struct cifsSesInfo
*ses
,
2975 const char *tree
, struct cifsTconInfo
*tcon
,
2976 const struct nls_table
*nls_codepage
)
2978 struct smb_hdr
*smb_buffer
;
2979 struct smb_hdr
*smb_buffer_response
;
2982 unsigned char *bcc_ptr
;
2985 __u16 bytes_left
, count
;
2990 smb_buffer
= cifs_buf_get();
2991 if (smb_buffer
== NULL
)
2994 smb_buffer_response
= smb_buffer
;
2996 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
2997 NULL
/*no tid */ , 4 /*wct */ );
2999 smb_buffer
->Mid
= GetNextMid(ses
->server
);
3000 smb_buffer
->Uid
= ses
->Suid
;
3001 pSMB
= (TCONX_REQ
*) smb_buffer
;
3002 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3004 pSMB
->AndXCommand
= 0xFF;
3005 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3006 bcc_ptr
= &pSMB
->Password
[0];
3007 if ((ses
->server
->secMode
) & SECMODE_USER
) {
3008 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3009 *bcc_ptr
= 0; /* password is null byte */
3010 bcc_ptr
++; /* skip password */
3011 /* already aligned so no need to do it below */
3013 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3014 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3015 specified as required (when that support is added to
3016 the vfs in the future) as only NTLM or the much
3017 weaker LANMAN (which we do not send by default) is accepted
3018 by Samba (not sure whether other servers allow
3019 NTLMv2 password here) */
3020 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3021 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3022 (ses
->server
->secType
== LANMAN
))
3023 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3024 ses
->server
->secMode
&
3025 SECMODE_PW_ENCRYPT
? true : false,
3028 #endif /* CIFS_WEAK_PW_HASH */
3029 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3032 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3033 if (ses
->capabilities
& CAP_UNICODE
) {
3034 /* must align unicode strings */
3035 *bcc_ptr
= 0; /* null byte password */
3040 if (ses
->server
->secMode
&
3041 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
3042 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3044 if (ses
->capabilities
& CAP_STATUS32
) {
3045 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3047 if (ses
->capabilities
& CAP_DFS
) {
3048 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3050 if (ses
->capabilities
& CAP_UNICODE
) {
3051 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3053 cifs_strtoUCS((__le16
*) bcc_ptr
, tree
,
3054 6 /* max utf8 char length in bytes */ *
3055 (/* server len*/ + 256 /* share len */), nls_codepage
);
3056 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3057 bcc_ptr
+= 2; /* skip trailing null */
3058 } else { /* ASCII */
3059 strcpy(bcc_ptr
, tree
);
3060 bcc_ptr
+= strlen(tree
) + 1;
3062 strcpy(bcc_ptr
, "?????");
3063 bcc_ptr
+= strlen("?????");
3065 count
= bcc_ptr
- &pSMB
->Password
[0];
3066 pSMB
->hdr
.smb_buf_length
+= count
;
3067 pSMB
->ByteCount
= cpu_to_le16(count
);
3069 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3072 /* above now done in SendReceive */
3073 if ((rc
== 0) && (tcon
!= NULL
)) {
3076 tcon
->tidStatus
= CifsGood
;
3077 tcon
->need_reconnect
= false;
3078 tcon
->tid
= smb_buffer_response
->Tid
;
3079 bcc_ptr
= pByteArea(smb_buffer_response
);
3080 bytes_left
= get_bcc(smb_buffer_response
);
3081 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3082 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3088 /* skip service field (NB: this field is always ASCII) */
3090 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3091 (bcc_ptr
[2] == 'C')) {
3092 cFYI(1, "IPC connection");
3095 } else if (length
== 2) {
3096 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3097 /* the most common case */
3098 cFYI(1, "disk share connection");
3101 bcc_ptr
+= length
+ 1;
3102 bytes_left
-= (length
+ 1);
3103 strncpy(tcon
->treeName
, tree
, MAX_TREE_SIZE
);
3105 /* mostly informational -- no need to fail on error here */
3106 kfree(tcon
->nativeFileSystem
);
3107 tcon
->nativeFileSystem
= cifs_strndup_from_ucs(bcc_ptr
,
3108 bytes_left
, is_unicode
,
3111 cFYI(1, "nativeFileSystem=%s", tcon
->nativeFileSystem
);
3113 if ((smb_buffer_response
->WordCount
== 3) ||
3114 (smb_buffer_response
->WordCount
== 7))
3115 /* field is in same location */
3116 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3119 cFYI(1, "Tcon flags: 0x%x ", tcon
->Flags
);
3120 } else if ((rc
== 0) && tcon
== NULL
) {
3121 /* all we need to save for IPC$ connection */
3122 ses
->ipc_tid
= smb_buffer_response
->Tid
;
3125 cifs_buf_release(smb_buffer
);
3130 cifs_umount(struct super_block
*sb
, struct cifs_sb_info
*cifs_sb
)
3132 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3133 struct rb_node
*node
;
3134 struct tcon_link
*tlink
;
3137 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3139 spin_lock(&cifs_sb
->tlink_tree_lock
);
3140 while ((node
= rb_first(root
))) {
3141 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3142 cifs_get_tlink(tlink
);
3143 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3144 rb_erase(node
, root
);
3146 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3147 cifs_put_tlink(tlink
);
3148 spin_lock(&cifs_sb
->tlink_tree_lock
);
3150 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3152 tmp
= cifs_sb
->prepath
;
3153 cifs_sb
->prepathlen
= 0;
3154 cifs_sb
->prepath
= NULL
;
3160 int cifs_negotiate_protocol(unsigned int xid
, struct cifsSesInfo
*ses
)
3163 struct TCP_Server_Info
*server
= ses
->server
;
3165 /* only send once per connect */
3166 if (server
->maxBuf
!= 0)
3169 rc
= CIFSSMBNegotiate(xid
, ses
);
3170 if (rc
== -EAGAIN
) {
3171 /* retry only once on 1st time connection */
3172 rc
= CIFSSMBNegotiate(xid
, ses
);
3177 spin_lock(&GlobalMid_Lock
);
3178 if (server
->tcpStatus
!= CifsExiting
)
3179 server
->tcpStatus
= CifsGood
;
3182 spin_unlock(&GlobalMid_Lock
);
3190 int cifs_setup_session(unsigned int xid
, struct cifsSesInfo
*ses
,
3191 struct nls_table
*nls_info
)
3194 struct TCP_Server_Info
*server
= ses
->server
;
3197 ses
->capabilities
= server
->capabilities
;
3198 if (linuxExtEnabled
== 0)
3199 ses
->capabilities
&= (~CAP_UNIX
);
3201 cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3202 server
->secMode
, server
->capabilities
, server
->timeAdj
);
3204 rc
= CIFS_SessSetup(xid
, ses
, nls_info
);
3206 cERROR(1, "Send error in SessSetup = %d", rc
);
3208 mutex_lock(&ses
->server
->srv_mutex
);
3209 if (!server
->session_estab
) {
3210 server
->session_key
.response
= ses
->auth_key
.response
;
3211 server
->session_key
.len
= ses
->auth_key
.len
;
3212 server
->sequence_number
= 0x2;
3213 server
->session_estab
= true;
3214 ses
->auth_key
.response
= NULL
;
3216 mutex_unlock(&server
->srv_mutex
);
3218 cFYI(1, "CIFS Session Established successfully");
3219 spin_lock(&GlobalMid_Lock
);
3220 ses
->status
= CifsGood
;
3221 ses
->need_reconnect
= false;
3222 spin_unlock(&GlobalMid_Lock
);
3225 kfree(ses
->auth_key
.response
);
3226 ses
->auth_key
.response
= NULL
;
3227 ses
->auth_key
.len
= 0;
3228 kfree(ses
->ntlmssp
);
3229 ses
->ntlmssp
= NULL
;
3234 static struct cifsTconInfo
*
3235 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, uid_t fsuid
)
3237 struct cifsTconInfo
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3238 struct cifsSesInfo
*ses
;
3239 struct cifsTconInfo
*tcon
= NULL
;
3240 struct smb_vol
*vol_info
;
3241 char username
[MAX_USERNAME_SIZE
+ 1];
3243 vol_info
= kzalloc(sizeof(*vol_info
), GFP_KERNEL
);
3244 if (vol_info
== NULL
) {
3245 tcon
= ERR_PTR(-ENOMEM
);
3249 snprintf(username
, MAX_USERNAME_SIZE
, "krb50x%x", fsuid
);
3250 vol_info
->username
= username
;
3251 vol_info
->local_nls
= cifs_sb
->local_nls
;
3252 vol_info
->linux_uid
= fsuid
;
3253 vol_info
->cred_uid
= fsuid
;
3254 vol_info
->UNC
= master_tcon
->treeName
;
3255 vol_info
->retry
= master_tcon
->retry
;
3256 vol_info
->nocase
= master_tcon
->nocase
;
3257 vol_info
->local_lease
= master_tcon
->local_lease
;
3258 vol_info
->no_linux_ext
= !master_tcon
->unix_ext
;
3260 /* FIXME: allow for other secFlg settings */
3261 vol_info
->secFlg
= CIFSSEC_MUST_KRB5
;
3263 /* get a reference for the same TCP session */
3264 spin_lock(&cifs_tcp_ses_lock
);
3265 ++master_tcon
->ses
->server
->srv_count
;
3266 spin_unlock(&cifs_tcp_ses_lock
);
3268 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, vol_info
);
3270 tcon
= (struct cifsTconInfo
*)ses
;
3271 cifs_put_tcp_session(master_tcon
->ses
->server
);
3275 tcon
= cifs_get_tcon(ses
, vol_info
);
3277 cifs_put_smb_ses(ses
);
3281 if (ses
->capabilities
& CAP_UNIX
)
3282 reset_cifs_unix_caps(0, tcon
, NULL
, vol_info
);
3289 static inline struct tcon_link
*
3290 cifs_sb_master_tlink(struct cifs_sb_info
*cifs_sb
)
3292 return cifs_sb
->master_tlink
;
3295 struct cifsTconInfo
*
3296 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
3298 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
3302 cifs_sb_tcon_pending_wait(void *unused
)
3305 return signal_pending(current
) ? -ERESTARTSYS
: 0;
3308 /* find and return a tlink with given uid */
3309 static struct tcon_link
*
3310 tlink_rb_search(struct rb_root
*root
, uid_t uid
)
3312 struct rb_node
*node
= root
->rb_node
;
3313 struct tcon_link
*tlink
;
3316 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3318 if (tlink
->tl_uid
> uid
)
3319 node
= node
->rb_left
;
3320 else if (tlink
->tl_uid
< uid
)
3321 node
= node
->rb_right
;
3328 /* insert a tcon_link into the tree */
3330 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
3332 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
3333 struct tcon_link
*tlink
;
3336 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
3339 if (tlink
->tl_uid
> new_tlink
->tl_uid
)
3340 new = &((*new)->rb_left
);
3342 new = &((*new)->rb_right
);
3345 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
3346 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
3350 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3353 * If the superblock doesn't refer to a multiuser mount, then just return
3354 * the master tcon for the mount.
3356 * First, search the rbtree for an existing tcon for this fsuid. If one
3357 * exists, then check to see if it's pending construction. If it is then wait
3358 * for construction to complete. Once it's no longer pending, check to see if
3359 * it failed and either return an error or retry construction, depending on
3362 * If one doesn't exist then insert a new tcon_link struct into the tree and
3363 * try to construct a new one.
3366 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
3369 uid_t fsuid
= current_fsuid();
3370 struct tcon_link
*tlink
, *newtlink
;
3372 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
3373 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
3375 spin_lock(&cifs_sb
->tlink_tree_lock
);
3376 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3378 cifs_get_tlink(tlink
);
3379 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3381 if (tlink
== NULL
) {
3382 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
3383 if (newtlink
== NULL
)
3384 return ERR_PTR(-ENOMEM
);
3385 newtlink
->tl_uid
= fsuid
;
3386 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
3387 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
3388 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
3389 cifs_get_tlink(newtlink
);
3391 spin_lock(&cifs_sb
->tlink_tree_lock
);
3392 /* was one inserted after previous search? */
3393 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3395 cifs_get_tlink(tlink
);
3396 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3398 goto wait_for_construction
;
3401 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3402 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3404 wait_for_construction
:
3405 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
3406 cifs_sb_tcon_pending_wait
,
3407 TASK_INTERRUPTIBLE
);
3409 cifs_put_tlink(tlink
);
3410 return ERR_PTR(ret
);
3413 /* if it's good, return it */
3414 if (!IS_ERR(tlink
->tl_tcon
))
3417 /* return error if we tried this already recently */
3418 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
3419 cifs_put_tlink(tlink
);
3420 return ERR_PTR(-EACCES
);
3423 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
3424 goto wait_for_construction
;
3427 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
3428 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
3429 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
3431 if (IS_ERR(tlink
->tl_tcon
)) {
3432 cifs_put_tlink(tlink
);
3433 return ERR_PTR(-EACCES
);
3440 * periodic workqueue job that scans tcon_tree for a superblock and closes
3444 cifs_prune_tlinks(struct work_struct
*work
)
3446 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
3448 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3449 struct rb_node
*node
= rb_first(root
);
3450 struct rb_node
*tmp
;
3451 struct tcon_link
*tlink
;
3454 * Because we drop the spinlock in the loop in order to put the tlink
3455 * it's not guarded against removal of links from the tree. The only
3456 * places that remove entries from the tree are this function and
3457 * umounts. Because this function is non-reentrant and is canceled
3458 * before umount can proceed, this is safe.
3460 spin_lock(&cifs_sb
->tlink_tree_lock
);
3461 node
= rb_first(root
);
3462 while (node
!= NULL
) {
3464 node
= rb_next(tmp
);
3465 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
3467 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
3468 atomic_read(&tlink
->tl_count
) != 0 ||
3469 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
3472 cifs_get_tlink(tlink
);
3473 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3474 rb_erase(tmp
, root
);
3476 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3477 cifs_put_tlink(tlink
);
3478 spin_lock(&cifs_sb
->tlink_tree_lock
);
3480 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3482 queue_delayed_work(system_nrt_wq
, &cifs_sb
->prune_tlinks
,