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>
40
#include <linux/module.h>
44
#include "cifsproto.h"
45
#include "cifs_unicode.h"
46
#include "cifs_debug.h"
47
#include "cifs_fs_sb.h"
50
#include "rfc1002pdu.h"
54
#define RFC1001_PORT 139
56
/* SMB echo "timeout" -- FIXME: tunable? */
57
#define SMB_ECHO_INTERVAL (60 * HZ)
59
extern mempool_t *cifs_req_poolp;
61
/* FIXME: should these be tunable? */
62
#define TLINK_ERROR_EXPIRE (1 * HZ)
63
#define TLINK_IDLE_EXPIRE (600 * HZ)
65
static int ip_connect(struct TCP_Server_Info *server);
66
static int generic_ip_connect(struct TCP_Server_Info *server);
67
static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
68
static void cifs_prune_tlinks(struct work_struct *work);
69
static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
73
* cifs tcp session reconnection
75
* mark tcp session as reconnecting so temporarily locked
76
* mark all smb sessions as reconnecting for tcp session
77
* reconnect tcp session
78
* wake up waiters on reconnection? - (not needed currently)
81
cifs_reconnect(struct TCP_Server_Info *server)
84
struct list_head *tmp, *tmp2;
86
struct cifs_tcon *tcon;
87
struct mid_q_entry *mid_entry;
88
struct list_head retry_list;
90
spin_lock(&GlobalMid_Lock);
91
if (server->tcpStatus == CifsExiting) {
92
/* the demux thread will exit normally
93
next time through the loop */
94
spin_unlock(&GlobalMid_Lock);
97
server->tcpStatus = CifsNeedReconnect;
98
spin_unlock(&GlobalMid_Lock);
101
cFYI(1, "Reconnecting tcp session");
103
/* before reconnecting the tcp session, mark the smb session (uid)
104
and the tid bad so they are not used until reconnected */
105
cFYI(1, "%s: marking sessions and tcons for reconnect", __func__);
106
spin_lock(&cifs_tcp_ses_lock);
107
list_for_each(tmp, &server->smb_ses_list) {
108
ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
109
ses->need_reconnect = true;
111
list_for_each(tmp2, &ses->tcon_list) {
112
tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
113
tcon->need_reconnect = true;
116
spin_unlock(&cifs_tcp_ses_lock);
118
/* do not want to be sending data on a socket we are freeing */
119
cFYI(1, "%s: tearing down socket", __func__);
120
mutex_lock(&server->srv_mutex);
121
if (server->ssocket) {
122
cFYI(1, "State: 0x%x Flags: 0x%lx", server->ssocket->state,
123
server->ssocket->flags);
124
kernel_sock_shutdown(server->ssocket, SHUT_WR);
125
cFYI(1, "Post shutdown state: 0x%x Flags: 0x%lx",
126
server->ssocket->state,
127
server->ssocket->flags);
128
sock_release(server->ssocket);
129
server->ssocket = NULL;
131
server->sequence_number = 0;
132
server->session_estab = false;
133
kfree(server->session_key.response);
134
server->session_key.response = NULL;
135
server->session_key.len = 0;
136
server->lstrp = jiffies;
137
mutex_unlock(&server->srv_mutex);
139
/* mark submitted MIDs for retry and issue callback */
140
INIT_LIST_HEAD(&retry_list);
141
cFYI(1, "%s: moving mids to private list", __func__);
142
spin_lock(&GlobalMid_Lock);
143
list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
144
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
145
if (mid_entry->midState == MID_REQUEST_SUBMITTED)
146
mid_entry->midState = MID_RETRY_NEEDED;
147
list_move(&mid_entry->qhead, &retry_list);
149
spin_unlock(&GlobalMid_Lock);
151
cFYI(1, "%s: issuing mid callbacks", __func__);
152
list_for_each_safe(tmp, tmp2, &retry_list) {
153
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
154
list_del_init(&mid_entry->qhead);
155
mid_entry->callback(mid_entry);
161
/* we should try only the port we connected to before */
162
rc = generic_ip_connect(server);
164
cFYI(1, "reconnect error %d", rc);
167
atomic_inc(&tcpSesReconnectCount);
168
spin_lock(&GlobalMid_Lock);
169
if (server->tcpStatus != CifsExiting)
170
server->tcpStatus = CifsNeedNegotiate;
171
spin_unlock(&GlobalMid_Lock);
173
} while (server->tcpStatus == CifsNeedReconnect);
180
0 not a transact2, or all data present
181
>0 transact2 with that much data missing
182
-EINVAL = invalid transact2
185
static int check2ndT2(struct smb_hdr *pSMB)
187
struct smb_t2_rsp *pSMBt;
189
__u16 total_data_size, data_in_this_rsp;
191
if (pSMB->Command != SMB_COM_TRANSACTION2)
194
/* check for plausible wct, bcc and t2 data and parm sizes */
195
/* check for parm and data offset going beyond end of smb */
196
if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
197
cFYI(1, "invalid transact2 word count");
201
pSMBt = (struct smb_t2_rsp *)pSMB;
203
total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
204
data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
206
if (total_data_size == data_in_this_rsp)
208
else if (total_data_size < data_in_this_rsp) {
209
cFYI(1, "total data %d smaller than data in frame %d",
210
total_data_size, data_in_this_rsp);
214
remaining = total_data_size - data_in_this_rsp;
216
cFYI(1, "missing %d bytes from transact2, check next response",
218
if (total_data_size > CIFSMaxBufSize) {
219
cERROR(1, "TotalDataSize %d is over maximum buffer %d",
220
total_data_size, CIFSMaxBufSize);
226
static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
228
struct smb_t2_rsp *pSMB2 = (struct smb_t2_rsp *)psecond;
229
struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)pTargetSMB;
230
char *data_area_of_target;
231
char *data_area_of_buf2;
233
unsigned int byte_count, total_in_buf;
234
__u16 total_data_size, total_in_buf2;
236
total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
238
if (total_data_size !=
239
get_unaligned_le16(&pSMB2->t2_rsp.TotalDataCount))
240
cFYI(1, "total data size of primary and secondary t2 differ");
242
total_in_buf = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
244
remaining = total_data_size - total_in_buf;
249
if (remaining == 0) /* nothing to do, ignore */
252
total_in_buf2 = get_unaligned_le16(&pSMB2->t2_rsp.DataCount);
253
if (remaining < total_in_buf2) {
254
cFYI(1, "transact2 2nd response contains too much data");
257
/* find end of first SMB data area */
258
data_area_of_target = (char *)&pSMBt->hdr.Protocol +
259
get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
260
/* validate target area */
262
data_area_of_buf2 = (char *)&pSMB2->hdr.Protocol +
263
get_unaligned_le16(&pSMB2->t2_rsp.DataOffset);
265
data_area_of_target += total_in_buf;
267
/* copy second buffer into end of first buffer */
268
total_in_buf += total_in_buf2;
269
/* is the result too big for the field? */
270
if (total_in_buf > USHRT_MAX)
272
put_unaligned_le16(total_in_buf, &pSMBt->t2_rsp.DataCount);
275
byte_count = get_bcc(pTargetSMB);
276
byte_count += total_in_buf2;
277
/* is the result too big for the field? */
278
if (byte_count > USHRT_MAX)
280
put_bcc(byte_count, pTargetSMB);
282
byte_count = be32_to_cpu(pTargetSMB->smb_buf_length);
283
byte_count += total_in_buf2;
284
/* don't allow buffer to overflow */
285
if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4)
287
pTargetSMB->smb_buf_length = cpu_to_be32(byte_count);
289
memcpy(data_area_of_target, data_area_of_buf2, total_in_buf2);
291
if (remaining == total_in_buf2) {
292
cFYI(1, "found the last secondary response");
293
return 0; /* we are done */
294
} else /* more responses to go */
299
cifs_echo_request(struct work_struct *work)
302
struct TCP_Server_Info *server = container_of(work,
303
struct TCP_Server_Info, echo.work);
306
* We cannot send an echo until the NEGOTIATE_PROTOCOL request is
307
* done, which is indicated by maxBuf != 0. Also, no need to ping if
308
* we got a response recently
310
if (server->maxBuf == 0 ||
311
time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
314
rc = CIFSSMBEcho(server);
316
cFYI(1, "Unable to send echo request to server: %s",
320
queue_delayed_work(system_nrt_wq, &server->echo, SMB_ECHO_INTERVAL);
324
allocate_buffers(struct TCP_Server_Info *server)
326
if (!server->bigbuf) {
327
server->bigbuf = (char *)cifs_buf_get();
328
if (!server->bigbuf) {
329
cERROR(1, "No memory for large SMB response");
331
/* retry will check if exiting */
334
} else if (server->large_buf) {
335
/* we are reusing a dirty large buf, clear its start */
336
memset(server->bigbuf, 0, sizeof(struct smb_hdr));
339
if (!server->smallbuf) {
340
server->smallbuf = (char *)cifs_small_buf_get();
341
if (!server->smallbuf) {
342
cERROR(1, "No memory for SMB response");
344
/* retry will check if exiting */
347
/* beginning of smb buffer is cleared in our buf_get */
349
/* if existing small buf clear beginning */
350
memset(server->smallbuf, 0, sizeof(struct smb_hdr));
357
server_unresponsive(struct TCP_Server_Info *server)
359
if (echo_retries > 0 && server->tcpStatus == CifsGood &&
360
time_after(jiffies, server->lstrp +
361
(echo_retries * SMB_ECHO_INTERVAL))) {
362
cERROR(1, "Server %s has not responded in %d seconds. "
363
"Reconnecting...", server->hostname,
364
(echo_retries * SMB_ECHO_INTERVAL / HZ));
365
cifs_reconnect(server);
366
wake_up(&server->response_q);
374
* kvec_array_init - clone a kvec array, and advance into it
375
* @new: pointer to memory for cloned array
376
* @iov: pointer to original array
377
* @nr_segs: number of members in original array
378
* @bytes: number of bytes to advance into the cloned array
380
* This function will copy the array provided in iov to a section of memory
381
* and advance the specified number of bytes into the new array. It returns
382
* the number of segments in the new array. "new" must be at least as big as
383
* the original iov array.
386
kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
391
while (bytes || !iov->iov_len) {
392
int copy = min(bytes, iov->iov_len);
396
if (iov->iov_len == base) {
402
memcpy(new, iov, sizeof(*iov) * nr_segs);
403
new->iov_base += base;
404
new->iov_len -= base;
409
get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
411
struct kvec *new_iov;
413
if (server->iov && nr_segs <= server->nr_iov)
416
/* not big enough -- allocate a new one and release the old */
417
new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
420
server->iov = new_iov;
421
server->nr_iov = nr_segs;
427
cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
428
unsigned int nr_segs, unsigned int to_read)
433
struct msghdr smb_msg;
436
iov = get_server_iovec(server, nr_segs);
440
smb_msg.msg_control = NULL;
441
smb_msg.msg_controllen = 0;
443
for (total_read = 0; to_read; total_read += length, to_read -= length) {
446
if (server_unresponsive(server)) {
447
total_read = -EAGAIN;
451
segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
453
length = kernel_recvmsg(server->ssocket, &smb_msg,
454
iov, segs, to_read, 0);
456
if (server->tcpStatus == CifsExiting) {
457
total_read = -ESHUTDOWN;
459
} else if (server->tcpStatus == CifsNeedReconnect) {
460
cifs_reconnect(server);
461
total_read = -EAGAIN;
463
} else if (length == -ERESTARTSYS ||
467
* Minimum sleep to prevent looping, allowing socket
468
* to clear and app threads to set tcpStatus
469
* CifsNeedReconnect if server hung.
471
usleep_range(1000, 2000);
474
} else if (length <= 0) {
475
cFYI(1, "Received no data or error: expecting %d "
476
"got %d", to_read, length);
477
cifs_reconnect(server);
478
total_read = -EAGAIN;
486
cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
487
unsigned int to_read)
492
iov.iov_len = to_read;
494
return cifs_readv_from_socket(server, &iov, 1, to_read);
498
is_smb_response(struct TCP_Server_Info *server, unsigned char type)
501
* The first byte big endian of the length field,
502
* is actually not part of the length but the type
503
* with the most common, zero, as regular data.
506
case RFC1002_SESSION_MESSAGE:
507
/* Regular SMB response */
509
case RFC1002_SESSION_KEEP_ALIVE:
510
cFYI(1, "RFC 1002 session keep alive");
512
case RFC1002_POSITIVE_SESSION_RESPONSE:
513
cFYI(1, "RFC 1002 positive session response");
515
case RFC1002_NEGATIVE_SESSION_RESPONSE:
517
* We get this from Windows 98 instead of an error on
518
* SMB negprot response.
520
cFYI(1, "RFC 1002 negative session response");
521
/* give server a second to clean up */
524
* Always try 445 first on reconnect since we get NACK
525
* on some if we ever connected to port 139 (the NACK
526
* is since we do not begin with RFC1001 session
529
cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
530
cifs_reconnect(server);
531
wake_up(&server->response_q);
534
cERROR(1, "RFC 1002 unknown response type 0x%x", type);
535
cifs_reconnect(server);
541
static struct mid_q_entry *
542
find_mid(struct TCP_Server_Info *server, struct smb_hdr *buf)
544
struct mid_q_entry *mid;
546
spin_lock(&GlobalMid_Lock);
547
list_for_each_entry(mid, &server->pending_mid_q, qhead) {
548
if (mid->mid == buf->Mid &&
549
mid->midState == MID_REQUEST_SUBMITTED &&
550
mid->command == buf->Command) {
551
spin_unlock(&GlobalMid_Lock);
555
spin_unlock(&GlobalMid_Lock);
560
dequeue_mid(struct mid_q_entry *mid, bool malformed)
562
#ifdef CONFIG_CIFS_STATS2
563
mid->when_received = jiffies;
565
spin_lock(&GlobalMid_Lock);
567
mid->midState = MID_RESPONSE_RECEIVED;
569
mid->midState = MID_RESPONSE_MALFORMED;
570
list_del_init(&mid->qhead);
571
spin_unlock(&GlobalMid_Lock);
575
handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
576
struct smb_hdr *buf, int malformed)
578
if (malformed == 0 && check2ndT2(buf) > 0) {
579
mid->multiRsp = true;
581
/* merge response - fix up 1st*/
582
malformed = coalesce_t2(buf, mid->resp_buf);
586
/* All parts received or packet is malformed. */
587
mid->multiEnd = true;
588
return dequeue_mid(mid, malformed);
590
if (!server->large_buf) {
591
/*FIXME: switch to already allocated largebuf?*/
592
cERROR(1, "1st trans2 resp needs bigbuf");
594
/* Have first buffer */
596
mid->largeBuf = true;
597
server->bigbuf = NULL;
602
mid->largeBuf = server->large_buf;
603
/* Was previous buf put in mpx struct for multi-rsp? */
604
if (!mid->multiRsp) {
605
/* smb buffer will be freed by user thread */
606
if (server->large_buf)
607
server->bigbuf = NULL;
609
server->smallbuf = NULL;
611
dequeue_mid(mid, malformed);
614
static void clean_demultiplex_info(struct TCP_Server_Info *server)
618
/* take it off the list, if it's not already */
619
spin_lock(&cifs_tcp_ses_lock);
620
list_del_init(&server->tcp_ses_list);
621
spin_unlock(&cifs_tcp_ses_lock);
623
spin_lock(&GlobalMid_Lock);
624
server->tcpStatus = CifsExiting;
625
spin_unlock(&GlobalMid_Lock);
626
wake_up_all(&server->response_q);
629
* Check if we have blocked requests that need to free. Note that
630
* cifs_max_pending is normally 50, but can be set at module install
631
* time to as little as two.
633
spin_lock(&GlobalMid_Lock);
634
if (atomic_read(&server->inFlight) >= cifs_max_pending)
635
atomic_set(&server->inFlight, cifs_max_pending - 1);
637
* We do not want to set the max_pending too low or we could end up
638
* with the counter going negative.
640
spin_unlock(&GlobalMid_Lock);
642
* Although there should not be any requests blocked on this queue it
643
* can not hurt to be paranoid and try to wake up requests that may
644
* haven been blocked when more than 50 at time were on the wire to the
645
* same server - they now will see the session is in exit state and get
646
* out of SendReceive.
648
wake_up_all(&server->request_q);
649
/* give those requests time to exit */
652
if (server->ssocket) {
653
sock_release(server->ssocket);
654
server->ssocket = NULL;
657
if (!list_empty(&server->pending_mid_q)) {
658
struct list_head dispose_list;
659
struct mid_q_entry *mid_entry;
660
struct list_head *tmp, *tmp2;
662
INIT_LIST_HEAD(&dispose_list);
663
spin_lock(&GlobalMid_Lock);
664
list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
665
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
666
cFYI(1, "Clearing mid 0x%x", mid_entry->mid);
667
mid_entry->midState = MID_SHUTDOWN;
668
list_move(&mid_entry->qhead, &dispose_list);
670
spin_unlock(&GlobalMid_Lock);
672
/* now walk dispose list and issue callbacks */
673
list_for_each_safe(tmp, tmp2, &dispose_list) {
674
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
675
cFYI(1, "Callback mid 0x%x", mid_entry->mid);
676
list_del_init(&mid_entry->qhead);
677
mid_entry->callback(mid_entry);
679
/* 1/8th of sec is more than enough time for them to exit */
683
if (!list_empty(&server->pending_mid_q)) {
685
* mpx threads have not exited yet give them at least the smb
686
* send timeout time for long ops.
688
* Due to delays on oplock break requests, we need to wait at
689
* least 45 seconds before giving up on a request getting a
690
* response and going ahead and killing cifsd.
692
cFYI(1, "Wait for exit from demultiplex thread");
695
* If threads still have not exited they are probably never
696
* coming home not much else we can do but free the memory.
700
kfree(server->hostname);
704
length = atomic_dec_return(&tcpSesAllocCount);
706
mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
711
standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
714
char *buf = server->smallbuf;
715
struct smb_hdr *smb_buffer = (struct smb_hdr *)buf;
716
unsigned int pdu_length = be32_to_cpu(smb_buffer->smb_buf_length);
718
/* make sure this will fit in a large buffer */
719
if (pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
720
cERROR(1, "SMB response too long (%u bytes)",
722
cifs_reconnect(server);
723
wake_up(&server->response_q);
727
/* switch to large buffer if too big for a small one */
728
if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
729
server->large_buf = true;
730
memcpy(server->bigbuf, server->smallbuf, server->total_read);
731
buf = server->bigbuf;
732
smb_buffer = (struct smb_hdr *)buf;
735
/* now read the rest */
736
length = cifs_read_from_socket(server,
737
buf + sizeof(struct smb_hdr) - 1,
738
pdu_length - sizeof(struct smb_hdr) + 1 + 4);
741
server->total_read += length;
743
dump_smb(smb_buffer, server->total_read);
746
* We know that we received enough to get to the MID as we
747
* checked the pdu_length earlier. Now check to see
748
* if the rest of the header is OK. We borrow the length
749
* var for the rest of the loop to avoid a new stack var.
751
* 48 bytes is enough to display the header and a little bit
752
* into the payload for debugging purposes.
754
length = checkSMB(smb_buffer, smb_buffer->Mid, server->total_read);
756
cifs_dump_mem("Bad SMB: ", buf,
757
min_t(unsigned int, server->total_read, 48));
760
handle_mid(mid, server, smb_buffer, length);
766
cifs_demultiplex_thread(void *p)
769
struct TCP_Server_Info *server = p;
770
unsigned int pdu_length;
772
struct smb_hdr *smb_buffer = NULL;
773
struct task_struct *task_to_wake = NULL;
774
struct mid_q_entry *mid_entry;
776
current->flags |= PF_MEMALLOC;
777
cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
779
length = atomic_inc_return(&tcpSesAllocCount);
781
mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
785
while (server->tcpStatus != CifsExiting) {
789
if (!allocate_buffers(server))
792
server->large_buf = false;
793
smb_buffer = (struct smb_hdr *)server->smallbuf;
794
buf = server->smallbuf;
795
pdu_length = 4; /* enough to get RFC1001 header */
797
length = cifs_read_from_socket(server, buf, pdu_length);
800
server->total_read = length;
803
* The right amount was read from socket - 4 bytes,
804
* so we can now interpret the length field.
806
pdu_length = be32_to_cpu(smb_buffer->smb_buf_length);
808
cFYI(1, "RFC1002 header 0x%x", pdu_length);
809
if (!is_smb_response(server, buf[0]))
812
/* make sure we have enough to get to the MID */
813
if (pdu_length < sizeof(struct smb_hdr) - 1 - 4) {
814
cERROR(1, "SMB response too short (%u bytes)",
816
cifs_reconnect(server);
817
wake_up(&server->response_q);
821
/* read down to the MID */
822
length = cifs_read_from_socket(server, buf + 4,
823
sizeof(struct smb_hdr) - 1 - 4);
826
server->total_read += length;
828
mid_entry = find_mid(server, smb_buffer);
830
if (!mid_entry || !mid_entry->receive)
831
length = standard_receive3(server, mid_entry);
833
length = mid_entry->receive(server, mid_entry);
838
if (server->large_buf) {
839
buf = server->bigbuf;
840
smb_buffer = (struct smb_hdr *)buf;
843
server->lstrp = jiffies;
844
if (mid_entry != NULL) {
845
if (!mid_entry->multiRsp || mid_entry->multiEnd)
846
mid_entry->callback(mid_entry);
847
} else if (!is_valid_oplock_break(smb_buffer, server)) {
848
cERROR(1, "No task to wake, unknown frame received! "
849
"NumMids %d", atomic_read(&midCount));
850
cifs_dump_mem("Received Data is: ", buf,
851
sizeof(struct smb_hdr));
852
#ifdef CONFIG_CIFS_DEBUG2
853
cifs_dump_detail(smb_buffer);
854
cifs_dump_mids(server);
855
#endif /* CIFS_DEBUG2 */
858
} /* end while !EXITING */
860
/* buffer usually freed in free_mid - need to free it here on exit */
861
cifs_buf_release(server->bigbuf);
862
if (server->smallbuf) /* no sense logging a debug message if NULL */
863
cifs_small_buf_release(server->smallbuf);
865
task_to_wake = xchg(&server->tsk, NULL);
866
clean_demultiplex_info(server);
868
/* if server->tsk was NULL then wait for a signal before exiting */
870
set_current_state(TASK_INTERRUPTIBLE);
871
while (!signal_pending(current)) {
873
set_current_state(TASK_INTERRUPTIBLE);
875
set_current_state(TASK_RUNNING);
878
module_put_and_exit(0);
881
/* extract the host portion of the UNC string */
883
extract_hostname(const char *unc)
889
/* skip double chars at beginning of string */
890
/* BB: check validity of these bytes? */
893
/* delimiter between hostname and sharename is always '\\' now */
894
delim = strchr(src, '\\');
896
return ERR_PTR(-EINVAL);
899
dst = kmalloc((len + 1), GFP_KERNEL);
901
return ERR_PTR(-ENOMEM);
903
memcpy(dst, src, len);
910
cifs_parse_mount_options(const char *mountdata, const char *devname,
913
char *value, *data, *end;
914
char *mountdata_copy = NULL, *options;
916
unsigned int temp_len, i, j;
918
short int override_uid = -1;
919
short int override_gid = -1;
920
bool uid_specified = false;
921
bool gid_specified = false;
922
char *nodename = utsname()->nodename;
928
* does not have to be perfect mapping since field is
929
* informational, only used for servers that do not support
930
* port 445 and it can be overridden at mount time
932
memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
933
for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
934
vol->source_rfc1001_name[i] = toupper(nodename[i]);
936
vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
937
/* null target name indicates to use *SMBSERVR default called name
938
if we end up sending RFC1001 session initialize */
939
vol->target_rfc1001_name[0] = 0;
940
vol->cred_uid = current_uid();
941
vol->linux_uid = current_uid();
942
vol->linux_gid = current_gid();
944
/* default to only allowing write access to owner of the mount */
945
vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
947
/* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
948
/* default is always to request posix paths. */
949
vol->posix_paths = 1;
950
/* default to using server inode numbers where available */
953
vol->actimeo = CIFS_DEF_ACTIMEO;
956
goto cifs_parse_mount_err;
958
mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
960
goto cifs_parse_mount_err;
962
options = mountdata_copy;
963
end = options + strlen(options);
964
if (strncmp(options, "sep=", 4) == 0) {
965
if (options[4] != 0) {
966
separator[0] = options[4];
969
cFYI(1, "Null separator not allowed");
972
vol->backupuid_specified = false; /* no backup intent for a user */
973
vol->backupgid_specified = false; /* no backup intent for a group */
975
while ((data = strsep(&options, separator)) != NULL) {
978
if ((value = strchr(data, '=')) != NULL)
981
/* Have to parse this before we parse for "user" */
982
if (strnicmp(data, "user_xattr", 10) == 0) {
984
} else if (strnicmp(data, "nouser_xattr", 12) == 0) {
986
} else if (strnicmp(data, "user", 4) == 0) {
989
"CIFS: invalid or missing username\n");
990
goto cifs_parse_mount_err;
991
} else if (!*value) {
992
/* null user, ie anonymous, authentication */
995
if (strnlen(value, MAX_USERNAME_SIZE) <
997
vol->username = kstrdup(value, GFP_KERNEL);
998
if (!vol->username) {
999
printk(KERN_WARNING "CIFS: no memory "
1001
goto cifs_parse_mount_err;
1004
printk(KERN_WARNING "CIFS: username too long\n");
1005
goto cifs_parse_mount_err;
1007
} else if (strnicmp(data, "pass", 4) == 0) {
1009
vol->password = NULL;
1011
} else if (value[0] == 0) {
1012
/* check if string begins with double comma
1013
since that would mean the password really
1014
does start with a comma, and would not
1015
indicate an empty string */
1016
if (value[1] != separator[0]) {
1017
vol->password = NULL;
1021
temp_len = strlen(value);
1022
/* removed password length check, NTLM passwords
1023
can be arbitrarily long */
1025
/* if comma in password, the string will be
1026
prematurely null terminated. Commas in password are
1027
specified across the cifs mount interface by a double
1028
comma ie ,, and a comma used as in other cases ie ','
1029
as a parameter delimiter/separator is single and due
1030
to the strsep above is temporarily zeroed. */
1032
/* NB: password legally can have multiple commas and
1033
the only illegal character in a password is null */
1035
if ((value[temp_len] == 0) &&
1036
(value + temp_len < end) &&
1037
(value[temp_len+1] == separator[0])) {
1038
/* reinsert comma */
1039
value[temp_len] = separator[0];
1040
temp_len += 2; /* move after second comma */
1041
while (value[temp_len] != 0) {
1042
if (value[temp_len] == separator[0]) {
1043
if (value[temp_len+1] ==
1045
/* skip second comma */
1048
/* single comma indicating start
1055
if (value[temp_len] == 0) {
1058
value[temp_len] = 0;
1059
/* point option to start of next parm */
1060
options = value + temp_len + 1;
1062
/* go from value to value + temp_len condensing
1063
double commas to singles. Note that this ends up
1064
allocating a few bytes too many, which is ok */
1065
vol->password = kzalloc(temp_len, GFP_KERNEL);
1066
if (vol->password == NULL) {
1067
printk(KERN_WARNING "CIFS: no memory "
1069
goto cifs_parse_mount_err;
1071
for (i = 0, j = 0; i < temp_len; i++, j++) {
1072
vol->password[j] = value[i];
1073
if (value[i] == separator[0]
1074
&& value[i+1] == separator[0]) {
1075
/* skip second comma */
1079
vol->password[j] = 0;
1081
vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1082
if (vol->password == NULL) {
1083
printk(KERN_WARNING "CIFS: no memory "
1085
goto cifs_parse_mount_err;
1087
strcpy(vol->password, value);
1089
} else if (!strnicmp(data, "ip", 2) ||
1090
!strnicmp(data, "addr", 4)) {
1091
if (!value || !*value) {
1093
} else if (strnlen(value, INET6_ADDRSTRLEN) <
1095
vol->UNCip = kstrdup(value, GFP_KERNEL);
1097
printk(KERN_WARNING "CIFS: no memory "
1099
goto cifs_parse_mount_err;
1102
printk(KERN_WARNING "CIFS: ip address "
1104
goto cifs_parse_mount_err;
1106
} else if (strnicmp(data, "sec", 3) == 0) {
1107
if (!value || !*value) {
1108
cERROR(1, "no security value specified");
1110
} else if (strnicmp(value, "krb5i", 5) == 0) {
1111
vol->secFlg |= CIFSSEC_MAY_KRB5 |
1113
} else if (strnicmp(value, "krb5p", 5) == 0) {
1114
/* vol->secFlg |= CIFSSEC_MUST_SEAL |
1115
CIFSSEC_MAY_KRB5; */
1116
cERROR(1, "Krb5 cifs privacy not supported");
1117
goto cifs_parse_mount_err;
1118
} else if (strnicmp(value, "krb5", 4) == 0) {
1119
vol->secFlg |= CIFSSEC_MAY_KRB5;
1120
} else if (strnicmp(value, "ntlmsspi", 8) == 0) {
1121
vol->secFlg |= CIFSSEC_MAY_NTLMSSP |
1123
} else if (strnicmp(value, "ntlmssp", 7) == 0) {
1124
vol->secFlg |= CIFSSEC_MAY_NTLMSSP;
1125
} else if (strnicmp(value, "ntlmv2i", 7) == 0) {
1126
vol->secFlg |= CIFSSEC_MAY_NTLMV2 |
1128
} else if (strnicmp(value, "ntlmv2", 6) == 0) {
1129
vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1130
} else if (strnicmp(value, "ntlmi", 5) == 0) {
1131
vol->secFlg |= CIFSSEC_MAY_NTLM |
1133
} else if (strnicmp(value, "ntlm", 4) == 0) {
1134
/* ntlm is default so can be turned off too */
1135
vol->secFlg |= CIFSSEC_MAY_NTLM;
1136
} else if (strnicmp(value, "nontlm", 6) == 0) {
1137
/* BB is there a better way to do this? */
1138
vol->secFlg |= CIFSSEC_MAY_NTLMV2;
1139
#ifdef CONFIG_CIFS_WEAK_PW_HASH
1140
} else if (strnicmp(value, "lanman", 6) == 0) {
1141
vol->secFlg |= CIFSSEC_MAY_LANMAN;
1143
} else if (strnicmp(value, "none", 4) == 0) {
1146
cERROR(1, "bad security option: %s", value);
1147
goto cifs_parse_mount_err;
1149
} else if (strnicmp(data, "vers", 3) == 0) {
1150
if (!value || !*value) {
1151
cERROR(1, "no protocol version specified"
1152
" after vers= mount option");
1153
} else if ((strnicmp(value, "cifs", 4) == 0) ||
1154
(strnicmp(value, "1", 1) == 0)) {
1155
/* this is the default */
1158
} else if ((strnicmp(data, "unc", 3) == 0)
1159
|| (strnicmp(data, "target", 6) == 0)
1160
|| (strnicmp(data, "path", 4) == 0)) {
1161
if (!value || !*value) {
1162
printk(KERN_WARNING "CIFS: invalid path to "
1163
"network resource\n");
1164
goto cifs_parse_mount_err;
1166
if ((temp_len = strnlen(value, 300)) < 300) {
1167
vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1168
if (vol->UNC == NULL)
1169
goto cifs_parse_mount_err;
1170
strcpy(vol->UNC, value);
1171
if (strncmp(vol->UNC, "//", 2) == 0) {
1174
} else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1176
"CIFS: UNC Path does not begin "
1177
"with // or \\\\ \n");
1178
goto cifs_parse_mount_err;
1181
printk(KERN_WARNING "CIFS: UNC name too long\n");
1182
goto cifs_parse_mount_err;
1184
} else if ((strnicmp(data, "domain", 3) == 0)
1185
|| (strnicmp(data, "workgroup", 5) == 0)) {
1186
if (!value || !*value) {
1187
printk(KERN_WARNING "CIFS: invalid domain name\n");
1188
goto cifs_parse_mount_err;
1190
/* BB are there cases in which a comma can be valid in
1191
a domain name and need special handling? */
1192
if (strnlen(value, 256) < 256) {
1193
vol->domainname = kstrdup(value, GFP_KERNEL);
1194
if (!vol->domainname) {
1195
printk(KERN_WARNING "CIFS: no memory "
1196
"for domainname\n");
1197
goto cifs_parse_mount_err;
1199
cFYI(1, "Domain name set");
1201
printk(KERN_WARNING "CIFS: domain name too "
1203
goto cifs_parse_mount_err;
1205
} else if (strnicmp(data, "srcaddr", 7) == 0) {
1206
vol->srcaddr.ss_family = AF_UNSPEC;
1208
if (!value || !*value) {
1209
printk(KERN_WARNING "CIFS: srcaddr value"
1210
" not specified.\n");
1211
goto cifs_parse_mount_err;
1213
i = cifs_convert_address((struct sockaddr *)&vol->srcaddr,
1214
value, strlen(value));
1216
printk(KERN_WARNING "CIFS: Could not parse"
1219
goto cifs_parse_mount_err;
1221
} else if (strnicmp(data, "prefixpath", 10) == 0) {
1222
if (!value || !*value) {
1224
"CIFS: invalid path prefix\n");
1225
goto cifs_parse_mount_err;
1227
if ((temp_len = strnlen(value, 1024)) < 1024) {
1228
if (value[0] != '/')
1229
temp_len++; /* missing leading slash */
1230
vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
1231
if (vol->prepath == NULL)
1232
goto cifs_parse_mount_err;
1233
if (value[0] != '/') {
1234
vol->prepath[0] = '/';
1235
strcpy(vol->prepath+1, value);
1237
strcpy(vol->prepath, value);
1238
cFYI(1, "prefix path %s", vol->prepath);
1240
printk(KERN_WARNING "CIFS: prefix too long\n");
1241
goto cifs_parse_mount_err;
1243
} else if (strnicmp(data, "iocharset", 9) == 0) {
1244
if (!value || !*value) {
1245
printk(KERN_WARNING "CIFS: invalid iocharset "
1247
goto cifs_parse_mount_err;
1249
if (strnlen(value, 65) < 65) {
1250
if (strnicmp(value, "default", 7)) {
1251
vol->iocharset = kstrdup(value,
1254
if (!vol->iocharset) {
1255
printk(KERN_WARNING "CIFS: no "
1258
goto cifs_parse_mount_err;
1261
/* if iocharset not set then load_nls_default
1262
is used by caller */
1263
cFYI(1, "iocharset set to %s", value);
1265
printk(KERN_WARNING "CIFS: iocharset name "
1267
goto cifs_parse_mount_err;
1269
} else if (!strnicmp(data, "uid", 3) && value && *value) {
1270
vol->linux_uid = simple_strtoul(value, &value, 0);
1271
uid_specified = true;
1272
} else if (!strnicmp(data, "cruid", 5) && value && *value) {
1273
vol->cred_uid = simple_strtoul(value, &value, 0);
1274
} else if (!strnicmp(data, "forceuid", 8)) {
1276
} else if (!strnicmp(data, "noforceuid", 10)) {
1278
} else if (!strnicmp(data, "gid", 3) && value && *value) {
1279
vol->linux_gid = simple_strtoul(value, &value, 0);
1280
gid_specified = true;
1281
} else if (!strnicmp(data, "forcegid", 8)) {
1283
} else if (!strnicmp(data, "noforcegid", 10)) {
1285
} else if (strnicmp(data, "file_mode", 4) == 0) {
1286
if (value && *value) {
1288
simple_strtoul(value, &value, 0);
1290
} else if (strnicmp(data, "dir_mode", 4) == 0) {
1291
if (value && *value) {
1293
simple_strtoul(value, &value, 0);
1295
} else if (strnicmp(data, "dirmode", 4) == 0) {
1296
if (value && *value) {
1298
simple_strtoul(value, &value, 0);
1300
} else if (strnicmp(data, "port", 4) == 0) {
1301
if (value && *value) {
1303
simple_strtoul(value, &value, 0);
1305
} else if (strnicmp(data, "rsize", 5) == 0) {
1306
if (value && *value) {
1308
simple_strtoul(value, &value, 0);
1310
} else if (strnicmp(data, "wsize", 5) == 0) {
1311
if (value && *value) {
1313
simple_strtoul(value, &value, 0);
1315
} else if (strnicmp(data, "sockopt", 5) == 0) {
1316
if (!value || !*value) {
1317
cERROR(1, "no socket option specified");
1319
} else if (strnicmp(value, "TCP_NODELAY", 11) == 0) {
1320
vol->sockopt_tcp_nodelay = 1;
1322
} else if (strnicmp(data, "netbiosname", 4) == 0) {
1323
if (!value || !*value || (*value == ' ')) {
1324
cFYI(1, "invalid (empty) netbiosname");
1326
memset(vol->source_rfc1001_name, 0x20,
1329
* FIXME: are there cases in which a comma can
1330
* be valid in workstation netbios name (and
1331
* need special handling)?
1333
for (i = 0; i < RFC1001_NAME_LEN; i++) {
1334
/* don't ucase netbiosname for user */
1337
vol->source_rfc1001_name[i] = value[i];
1339
/* The string has 16th byte zero still from
1340
set at top of the function */
1341
if (i == RFC1001_NAME_LEN && value[i] != 0)
1342
printk(KERN_WARNING "CIFS: netbiosname"
1343
" longer than 15 truncated.\n");
1345
} else if (strnicmp(data, "servern", 7) == 0) {
1346
/* servernetbiosname specified override *SMBSERVER */
1347
if (!value || !*value || (*value == ' ')) {
1348
cFYI(1, "empty server netbiosname specified");
1350
/* last byte, type, is 0x20 for servr type */
1351
memset(vol->target_rfc1001_name, 0x20,
1352
RFC1001_NAME_LEN_WITH_NULL);
1354
for (i = 0; i < 15; i++) {
1355
/* BB are there cases in which a comma can be
1356
valid in this workstation netbios name
1357
(and need special handling)? */
1359
/* user or mount helper must uppercase
1364
vol->target_rfc1001_name[i] =
1367
/* The string has 16th byte zero still from
1368
set at top of the function */
1369
if (i == RFC1001_NAME_LEN && value[i] != 0)
1370
printk(KERN_WARNING "CIFS: server net"
1371
"biosname longer than 15 truncated.\n");
1373
} else if (strnicmp(data, "actimeo", 7) == 0) {
1374
if (value && *value) {
1375
vol->actimeo = HZ * simple_strtoul(value,
1377
if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1378
cERROR(1, "CIFS: attribute cache"
1379
"timeout too large");
1380
goto cifs_parse_mount_err;
1383
} else if (strnicmp(data, "credentials", 4) == 0) {
1385
} else if (strnicmp(data, "version", 3) == 0) {
1387
} else if (strnicmp(data, "guest", 5) == 0) {
1389
} else if (strnicmp(data, "rw", 2) == 0 && strlen(data) == 2) {
1391
} else if (strnicmp(data, "ro", 2) == 0) {
1393
} else if (strnicmp(data, "noblocksend", 11) == 0) {
1394
vol->noblocksnd = 1;
1395
} else if (strnicmp(data, "noautotune", 10) == 0) {
1396
vol->noautotune = 1;
1397
} else if ((strnicmp(data, "suid", 4) == 0) ||
1398
(strnicmp(data, "nosuid", 6) == 0) ||
1399
(strnicmp(data, "exec", 4) == 0) ||
1400
(strnicmp(data, "noexec", 6) == 0) ||
1401
(strnicmp(data, "nodev", 5) == 0) ||
1402
(strnicmp(data, "noauto", 6) == 0) ||
1403
(strnicmp(data, "dev", 3) == 0)) {
1404
/* The mount tool or mount.cifs helper (if present)
1405
uses these opts to set flags, and the flags are read
1406
by the kernel vfs layer before we get here (ie
1407
before read super) so there is no point trying to
1408
parse these options again and set anything and it
1409
is ok to just ignore them */
1411
} else if (strnicmp(data, "hard", 4) == 0) {
1413
} else if (strnicmp(data, "soft", 4) == 0) {
1415
} else if (strnicmp(data, "perm", 4) == 0) {
1417
} else if (strnicmp(data, "noperm", 6) == 0) {
1419
} else if (strnicmp(data, "mapchars", 8) == 0) {
1421
} else if (strnicmp(data, "nomapchars", 10) == 0) {
1423
} else if (strnicmp(data, "sfu", 3) == 0) {
1425
} else if (strnicmp(data, "nosfu", 5) == 0) {
1427
} else if (strnicmp(data, "nodfs", 5) == 0) {
1429
} else if (strnicmp(data, "posixpaths", 10) == 0) {
1430
vol->posix_paths = 1;
1431
} else if (strnicmp(data, "noposixpaths", 12) == 0) {
1432
vol->posix_paths = 0;
1433
} else if (strnicmp(data, "nounix", 6) == 0) {
1434
vol->no_linux_ext = 1;
1435
} else if (strnicmp(data, "nolinux", 7) == 0) {
1436
vol->no_linux_ext = 1;
1437
} else if ((strnicmp(data, "nocase", 6) == 0) ||
1438
(strnicmp(data, "ignorecase", 10) == 0)) {
1440
} else if (strnicmp(data, "mand", 4) == 0) {
1442
} else if (strnicmp(data, "nomand", 6) == 0) {
1444
} else if (strnicmp(data, "_netdev", 7) == 0) {
1446
} else if (strnicmp(data, "brl", 3) == 0) {
1448
} else if ((strnicmp(data, "nobrl", 5) == 0) ||
1449
(strnicmp(data, "nolock", 6) == 0)) {
1451
/* turn off mandatory locking in mode
1452
if remote locking is turned off since the
1453
local vfs will do advisory */
1454
if (vol->file_mode ==
1455
(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1456
vol->file_mode = S_IALLUGO;
1457
} else if (strnicmp(data, "forcemandatorylock", 9) == 0) {
1458
/* will take the shorter form "forcemand" as well */
1459
/* This mount option will force use of mandatory
1460
(DOS/Windows style) byte range locks, instead of
1461
using posix advisory byte range locks, even if the
1462
Unix extensions are available and posix locks would
1463
be supported otherwise. If Unix extensions are not
1464
negotiated this has no effect since mandatory locks
1465
would be used (mandatory locks is all that those
1466
those servers support) */
1468
} else if (strnicmp(data, "setuids", 7) == 0) {
1470
} else if (strnicmp(data, "nosetuids", 9) == 0) {
1472
} else if (strnicmp(data, "dynperm", 7) == 0) {
1473
vol->dynperm = true;
1474
} else if (strnicmp(data, "nodynperm", 9) == 0) {
1475
vol->dynperm = false;
1476
} else if (strnicmp(data, "nohard", 6) == 0) {
1478
} else if (strnicmp(data, "nosoft", 6) == 0) {
1480
} else if (strnicmp(data, "nointr", 6) == 0) {
1482
} else if (strnicmp(data, "intr", 4) == 0) {
1484
} else if (strnicmp(data, "nostrictsync", 12) == 0) {
1485
vol->nostrictsync = 1;
1486
} else if (strnicmp(data, "strictsync", 10) == 0) {
1487
vol->nostrictsync = 0;
1488
} else if (strnicmp(data, "serverino", 7) == 0) {
1489
vol->server_ino = 1;
1490
} else if (strnicmp(data, "noserverino", 9) == 0) {
1491
vol->server_ino = 0;
1492
} else if (strnicmp(data, "rwpidforward", 12) == 0) {
1493
vol->rwpidforward = 1;
1494
} else if (strnicmp(data, "cifsacl", 7) == 0) {
1496
} else if (strnicmp(data, "nocifsacl", 9) == 0) {
1498
} else if (strnicmp(data, "acl", 3) == 0) {
1499
vol->no_psx_acl = 0;
1500
} else if (strnicmp(data, "noacl", 5) == 0) {
1501
vol->no_psx_acl = 1;
1502
} else if (strnicmp(data, "locallease", 6) == 0) {
1503
vol->local_lease = 1;
1504
} else if (strnicmp(data, "sign", 4) == 0) {
1505
vol->secFlg |= CIFSSEC_MUST_SIGN;
1506
} else if (strnicmp(data, "seal", 4) == 0) {
1507
/* we do not do the following in secFlags because seal
1508
is a per tree connection (mount) not a per socket
1509
or per-smb connection option in the protocol */
1510
/* vol->secFlg |= CIFSSEC_MUST_SEAL; */
1512
} else if (strnicmp(data, "direct", 6) == 0) {
1514
} else if (strnicmp(data, "forcedirectio", 13) == 0) {
1516
} else if (strnicmp(data, "strictcache", 11) == 0) {
1518
} else if (strnicmp(data, "noac", 4) == 0) {
1519
printk(KERN_WARNING "CIFS: Mount option noac not "
1520
"supported. Instead set "
1521
"/proc/fs/cifs/LookupCacheEnabled to 0\n");
1522
} else if (strnicmp(data, "fsc", 3) == 0) {
1523
#ifndef CONFIG_CIFS_FSCACHE
1524
cERROR(1, "FS-Cache support needs CONFIG_CIFS_FSCACHE "
1525
"kernel config option set");
1526
goto cifs_parse_mount_err;
1529
} else if (strnicmp(data, "mfsymlinks", 10) == 0) {
1530
vol->mfsymlinks = true;
1531
} else if (strnicmp(data, "multiuser", 8) == 0) {
1532
vol->multiuser = true;
1533
} else if (!strnicmp(data, "backupuid", 9) && value && *value) {
1534
err = kstrtouint(value, 0, &vol->backupuid);
1536
cERROR(1, "%s: Invalid backupuid value",
1538
goto cifs_parse_mount_err;
1540
vol->backupuid_specified = true;
1541
} else if (!strnicmp(data, "backupgid", 9) && value && *value) {
1542
err = kstrtouint(value, 0, &vol->backupgid);
1544
cERROR(1, "%s: Invalid backupgid value",
1546
goto cifs_parse_mount_err;
1548
vol->backupgid_specified = true;
1550
printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
1553
if (vol->UNC == NULL) {
1554
if (devname == NULL) {
1555
printk(KERN_WARNING "CIFS: Missing UNC name for mount "
1557
goto cifs_parse_mount_err;
1559
if ((temp_len = strnlen(devname, 300)) < 300) {
1560
vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
1561
if (vol->UNC == NULL)
1562
goto cifs_parse_mount_err;
1563
strcpy(vol->UNC, devname);
1564
if (strncmp(vol->UNC, "//", 2) == 0) {
1567
} else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
1568
printk(KERN_WARNING "CIFS: UNC Path does not "
1569
"begin with // or \\\\ \n");
1570
goto cifs_parse_mount_err;
1572
value = strpbrk(vol->UNC+2, "/\\");
1576
printk(KERN_WARNING "CIFS: UNC name too long\n");
1577
goto cifs_parse_mount_err;
1581
if (vol->multiuser && !(vol->secFlg & CIFSSEC_MAY_KRB5)) {
1582
cERROR(1, "Multiuser mounts currently require krb5 "
1584
goto cifs_parse_mount_err;
1587
if (vol->UNCip == NULL)
1588
vol->UNCip = &vol->UNC[2];
1591
vol->override_uid = override_uid;
1592
else if (override_uid == 1)
1593
printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
1594
"specified with no uid= option.\n");
1597
vol->override_gid = override_gid;
1598
else if (override_gid == 1)
1599
printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
1600
"specified with no gid= option.\n");
1602
kfree(mountdata_copy);
1605
cifs_parse_mount_err:
1606
kfree(mountdata_copy);
1610
/** Returns true if srcaddr isn't specified and rhs isn't
1611
* specified, or if srcaddr is specified and
1612
* matches the IP address of the rhs argument.
1615
srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1617
switch (srcaddr->sa_family) {
1619
return (rhs->sa_family == AF_UNSPEC);
1621
struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1622
struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1623
return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1626
struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1627
struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)&rhs;
1628
return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1632
return false; /* don't expect to be here */
1637
* If no port is specified in addr structure, we try to match with 445 port
1638
* and if it fails - with 139 ports. It should be called only if address
1639
* families of server and addr are equal.
1642
match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1644
__be16 port, *sport;
1646
switch (addr->sa_family) {
1648
sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1649
port = ((struct sockaddr_in *) addr)->sin_port;
1652
sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1653
port = ((struct sockaddr_in6 *) addr)->sin6_port;
1661
port = htons(CIFS_PORT);
1665
port = htons(RFC1001_PORT);
1668
return port == *sport;
1672
match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1673
struct sockaddr *srcaddr)
1675
switch (addr->sa_family) {
1677
struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1678
struct sockaddr_in *srv_addr4 =
1679
(struct sockaddr_in *)&server->dstaddr;
1681
if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1686
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1687
struct sockaddr_in6 *srv_addr6 =
1688
(struct sockaddr_in6 *)&server->dstaddr;
1690
if (!ipv6_addr_equal(&addr6->sin6_addr,
1691
&srv_addr6->sin6_addr))
1693
if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1699
return false; /* don't expect to be here */
1702
if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
1709
match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
1711
unsigned int secFlags;
1713
if (vol->secFlg & (~(CIFSSEC_MUST_SIGN | CIFSSEC_MUST_SEAL)))
1714
secFlags = vol->secFlg;
1716
secFlags = global_secflags | vol->secFlg;
1718
switch (server->secType) {
1720
if (!(secFlags & (CIFSSEC_MAY_LANMAN|CIFSSEC_MAY_PLNTXT)))
1724
if (!(secFlags & CIFSSEC_MAY_NTLMV2))
1728
if (!(secFlags & CIFSSEC_MAY_NTLM))
1732
if (!(secFlags & CIFSSEC_MAY_KRB5))
1736
if (!(secFlags & CIFSSEC_MAY_NTLMSSP))
1740
/* shouldn't happen */
1744
/* now check if signing mode is acceptable */
1745
if ((secFlags & CIFSSEC_MAY_SIGN) == 0 &&
1746
(server->sec_mode & SECMODE_SIGN_REQUIRED))
1748
else if (((secFlags & CIFSSEC_MUST_SIGN) == CIFSSEC_MUST_SIGN) &&
1750
(SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED)) == 0)
1756
static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
1757
struct smb_vol *vol)
1759
if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1762
if (!match_address(server, addr,
1763
(struct sockaddr *)&vol->srcaddr))
1766
if (!match_port(server, addr))
1769
if (!match_security(server, vol))
1775
static struct TCP_Server_Info *
1776
cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
1778
struct TCP_Server_Info *server;
1780
spin_lock(&cifs_tcp_ses_lock);
1781
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1782
if (!match_server(server, addr, vol))
1785
++server->srv_count;
1786
spin_unlock(&cifs_tcp_ses_lock);
1787
cFYI(1, "Existing tcp session with server found");
1790
spin_unlock(&cifs_tcp_ses_lock);
1795
cifs_put_tcp_session(struct TCP_Server_Info *server)
1797
struct task_struct *task;
1799
spin_lock(&cifs_tcp_ses_lock);
1800
if (--server->srv_count > 0) {
1801
spin_unlock(&cifs_tcp_ses_lock);
1805
put_net(cifs_net_ns(server));
1807
list_del_init(&server->tcp_ses_list);
1808
spin_unlock(&cifs_tcp_ses_lock);
1810
cancel_delayed_work_sync(&server->echo);
1812
spin_lock(&GlobalMid_Lock);
1813
server->tcpStatus = CifsExiting;
1814
spin_unlock(&GlobalMid_Lock);
1816
cifs_crypto_shash_release(server);
1817
cifs_fscache_release_client_cookie(server);
1819
kfree(server->session_key.response);
1820
server->session_key.response = NULL;
1821
server->session_key.len = 0;
1823
task = xchg(&server->tsk, NULL);
1825
force_sig(SIGKILL, task);
1828
static struct TCP_Server_Info *
1829
cifs_get_tcp_session(struct smb_vol *volume_info)
1831
struct TCP_Server_Info *tcp_ses = NULL;
1832
struct sockaddr_storage addr;
1833
struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
1834
struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
1837
memset(&addr, 0, sizeof(struct sockaddr_storage));
1839
cFYI(1, "UNC: %s ip: %s", volume_info->UNC, volume_info->UNCip);
1841
if (volume_info->UNCip && volume_info->UNC) {
1842
rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
1844
strlen(volume_info->UNCip),
1847
/* we failed translating address */
1851
} else if (volume_info->UNCip) {
1852
/* BB using ip addr as tcp_ses name to connect to the
1854
cERROR(1, "Connecting to DFS root not implemented yet");
1857
} else /* which tcp_sess DFS root would we conect to */ {
1858
cERROR(1, "CIFS mount error: No UNC path (e.g. -o "
1859
"unc=//192.168.1.100/public) specified");
1864
/* see if we already have a matching tcp_ses */
1865
tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr, volume_info);
1869
tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1875
rc = cifs_crypto_shash_allocate(tcp_ses);
1877
cERROR(1, "could not setup hash structures rc %d", rc);
1881
cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1882
tcp_ses->hostname = extract_hostname(volume_info->UNC);
1883
if (IS_ERR(tcp_ses->hostname)) {
1884
rc = PTR_ERR(tcp_ses->hostname);
1885
goto out_err_crypto_release;
1888
tcp_ses->noblocksnd = volume_info->noblocksnd;
1889
tcp_ses->noautotune = volume_info->noautotune;
1890
tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
1891
atomic_set(&tcp_ses->inFlight, 0);
1892
init_waitqueue_head(&tcp_ses->response_q);
1893
init_waitqueue_head(&tcp_ses->request_q);
1894
INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1895
mutex_init(&tcp_ses->srv_mutex);
1896
memcpy(tcp_ses->workstation_RFC1001_name,
1897
volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1898
memcpy(tcp_ses->server_RFC1001_name,
1899
volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1900
tcp_ses->session_estab = false;
1901
tcp_ses->sequence_number = 0;
1902
tcp_ses->lstrp = jiffies;
1903
INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1904
INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1905
INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1908
* at this point we are the only ones with the pointer
1909
* to the struct since the kernel thread not created yet
1910
* no need to spinlock this init of tcpStatus or srv_count
1912
tcp_ses->tcpStatus = CifsNew;
1913
memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
1914
sizeof(tcp_ses->srcaddr));
1915
++tcp_ses->srv_count;
1917
if (addr.ss_family == AF_INET6) {
1918
cFYI(1, "attempting ipv6 connect");
1919
/* BB should we allow ipv6 on port 139? */
1920
/* other OS never observed in Wild doing 139 with v6 */
1921
memcpy(&tcp_ses->dstaddr, sin_server6,
1922
sizeof(struct sockaddr_in6));
1924
memcpy(&tcp_ses->dstaddr, sin_server,
1925
sizeof(struct sockaddr_in));
1927
rc = ip_connect(tcp_ses);
1929
cERROR(1, "Error connecting to socket. Aborting operation");
1930
goto out_err_crypto_release;
1934
* since we're in a cifs function already, we know that
1935
* this will succeed. No need for try_module_get().
1937
__module_get(THIS_MODULE);
1938
tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1940
if (IS_ERR(tcp_ses->tsk)) {
1941
rc = PTR_ERR(tcp_ses->tsk);
1942
cERROR(1, "error %d create cifsd thread", rc);
1943
module_put(THIS_MODULE);
1944
goto out_err_crypto_release;
1946
tcp_ses->tcpStatus = CifsNeedNegotiate;
1948
/* thread spawned, put it on the list */
1949
spin_lock(&cifs_tcp_ses_lock);
1950
list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1951
spin_unlock(&cifs_tcp_ses_lock);
1953
cifs_fscache_get_client_cookie(tcp_ses);
1955
/* queue echo request delayed work */
1956
queue_delayed_work(system_nrt_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
1960
out_err_crypto_release:
1961
cifs_crypto_shash_release(tcp_ses);
1963
put_net(cifs_net_ns(tcp_ses));
1967
if (!IS_ERR(tcp_ses->hostname))
1968
kfree(tcp_ses->hostname);
1969
if (tcp_ses->ssocket)
1970
sock_release(tcp_ses->ssocket);
1976
static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
1978
switch (ses->server->secType) {
1980
if (vol->cred_uid != ses->cred_uid)
1984
/* anything else takes username/password */
1985
if (ses->user_name == NULL)
1987
if (strncmp(ses->user_name, vol->username,
1990
if (strlen(vol->username) != 0 &&
1991
ses->password != NULL &&
1992
strncmp(ses->password,
1993
vol->password ? vol->password : "",
2000
static struct cifs_ses *
2001
cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2003
struct cifs_ses *ses;
2005
spin_lock(&cifs_tcp_ses_lock);
2006
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2007
if (!match_session(ses, vol))
2010
spin_unlock(&cifs_tcp_ses_lock);
2013
spin_unlock(&cifs_tcp_ses_lock);
2018
cifs_put_smb_ses(struct cifs_ses *ses)
2021
struct TCP_Server_Info *server = ses->server;
2023
cFYI(1, "%s: ses_count=%d\n", __func__, ses->ses_count);
2024
spin_lock(&cifs_tcp_ses_lock);
2025
if (--ses->ses_count > 0) {
2026
spin_unlock(&cifs_tcp_ses_lock);
2030
list_del_init(&ses->smb_ses_list);
2031
spin_unlock(&cifs_tcp_ses_lock);
2033
if (ses->status == CifsGood) {
2035
CIFSSMBLogoff(xid, ses);
2039
cifs_put_tcp_session(server);
2042
static bool warned_on_ntlm; /* globals init to false automatically */
2044
static struct cifs_ses *
2045
cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2047
int rc = -ENOMEM, xid;
2048
struct cifs_ses *ses;
2049
struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2050
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2054
ses = cifs_find_smb_ses(server, volume_info);
2056
cFYI(1, "Existing smb sess found (status=%d)", ses->status);
2058
mutex_lock(&ses->session_mutex);
2059
rc = cifs_negotiate_protocol(xid, ses);
2061
mutex_unlock(&ses->session_mutex);
2062
/* problem -- put our ses reference */
2063
cifs_put_smb_ses(ses);
2067
if (ses->need_reconnect) {
2068
cFYI(1, "Session needs reconnect");
2069
rc = cifs_setup_session(xid, ses,
2070
volume_info->local_nls);
2072
mutex_unlock(&ses->session_mutex);
2073
/* problem -- put our reference */
2074
cifs_put_smb_ses(ses);
2079
mutex_unlock(&ses->session_mutex);
2081
/* existing SMB ses has a server reference already */
2082
cifs_put_tcp_session(server);
2087
cFYI(1, "Existing smb sess not found");
2088
ses = sesInfoAlloc();
2092
/* new SMB session uses our server ref */
2093
ses->server = server;
2094
if (server->dstaddr.ss_family == AF_INET6)
2095
sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2097
sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2099
if (volume_info->username) {
2100
ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2101
if (!ses->user_name)
2105
/* volume_info->password freed at unmount */
2106
if (volume_info->password) {
2107
ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2111
if (volume_info->domainname) {
2112
ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2113
if (!ses->domainName)
2116
ses->cred_uid = volume_info->cred_uid;
2117
ses->linux_uid = volume_info->linux_uid;
2119
/* ntlmv2 is much stronger than ntlm security, and has been broadly
2120
supported for many years, time to update default security mechanism */
2121
if ((volume_info->secFlg == 0) && warned_on_ntlm == false) {
2122
warned_on_ntlm = true;
2123
cERROR(1, "default security mechanism requested. The default "
2124
"security mechanism will be upgraded from ntlm to "
2125
"ntlmv2 in kernel release 3.3");
2127
ses->overrideSecFlg = volume_info->secFlg;
2129
mutex_lock(&ses->session_mutex);
2130
rc = cifs_negotiate_protocol(xid, ses);
2132
rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2133
mutex_unlock(&ses->session_mutex);
2137
/* success, put it on the list */
2138
spin_lock(&cifs_tcp_ses_lock);
2139
list_add(&ses->smb_ses_list, &server->smb_ses_list);
2140
spin_unlock(&cifs_tcp_ses_lock);
2151
static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2153
if (tcon->tidStatus == CifsExiting)
2155
if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2160
static struct cifs_tcon *
2161
cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2163
struct list_head *tmp;
2164
struct cifs_tcon *tcon;
2166
spin_lock(&cifs_tcp_ses_lock);
2167
list_for_each(tmp, &ses->tcon_list) {
2168
tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2169
if (!match_tcon(tcon, unc))
2172
spin_unlock(&cifs_tcp_ses_lock);
2175
spin_unlock(&cifs_tcp_ses_lock);
2180
cifs_put_tcon(struct cifs_tcon *tcon)
2183
struct cifs_ses *ses = tcon->ses;
2185
cFYI(1, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2186
spin_lock(&cifs_tcp_ses_lock);
2187
if (--tcon->tc_count > 0) {
2188
spin_unlock(&cifs_tcp_ses_lock);
2192
list_del_init(&tcon->tcon_list);
2193
spin_unlock(&cifs_tcp_ses_lock);
2196
CIFSSMBTDis(xid, tcon);
2199
cifs_fscache_release_super_cookie(tcon);
2201
cifs_put_smb_ses(ses);
2204
static struct cifs_tcon *
2205
cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2208
struct cifs_tcon *tcon;
2210
tcon = cifs_find_tcon(ses, volume_info->UNC);
2212
cFYI(1, "Found match on UNC path");
2213
/* existing tcon already has a reference */
2214
cifs_put_smb_ses(ses);
2215
if (tcon->seal != volume_info->seal)
2216
cERROR(1, "transport encryption setting "
2217
"conflicts with existing tid");
2221
tcon = tconInfoAlloc();
2228
if (volume_info->password) {
2229
tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2230
if (!tcon->password) {
2236
if (strchr(volume_info->UNC + 3, '\\') == NULL
2237
&& strchr(volume_info->UNC + 3, '/') == NULL) {
2238
cERROR(1, "Missing share name");
2243
/* BB Do we need to wrap session_mutex around
2244
* this TCon call and Unix SetFS as
2245
* we do on SessSetup and reconnect? */
2247
rc = CIFSTCon(xid, ses, volume_info->UNC, tcon, volume_info->local_nls);
2249
cFYI(1, "CIFS Tcon rc = %d", rc);
2253
if (volume_info->nodfs) {
2254
tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2255
cFYI(1, "DFS disabled (%d)", tcon->Flags);
2257
tcon->seal = volume_info->seal;
2258
/* we can have only one retry value for a connection
2259
to a share so for resources mounted more than once
2260
to the same server share the last value passed in
2261
for the retry flag is used */
2262
tcon->retry = volume_info->retry;
2263
tcon->nocase = volume_info->nocase;
2264
tcon->local_lease = volume_info->local_lease;
2266
spin_lock(&cifs_tcp_ses_lock);
2267
list_add(&tcon->tcon_list, &ses->tcon_list);
2268
spin_unlock(&cifs_tcp_ses_lock);
2270
cifs_fscache_get_super_cookie(tcon);
2280
cifs_put_tlink(struct tcon_link *tlink)
2282
if (!tlink || IS_ERR(tlink))
2285
if (!atomic_dec_and_test(&tlink->tl_count) ||
2286
test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2287
tlink->tl_time = jiffies;
2291
if (!IS_ERR(tlink_tcon(tlink)))
2292
cifs_put_tcon(tlink_tcon(tlink));
2297
static inline struct tcon_link *
2298
cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2300
return cifs_sb->master_tlink;
2304
compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2306
struct cifs_sb_info *old = CIFS_SB(sb);
2307
struct cifs_sb_info *new = mnt_data->cifs_sb;
2309
if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2312
if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2313
(new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2317
* We want to share sb only if we don't specify an r/wsize or
2318
* specified r/wsize is greater than or equal to existing one.
2320
if (new->wsize && new->wsize < old->wsize)
2323
if (new->rsize && new->rsize < old->rsize)
2326
if (old->mnt_uid != new->mnt_uid || old->mnt_gid != new->mnt_gid)
2329
if (old->mnt_file_mode != new->mnt_file_mode ||
2330
old->mnt_dir_mode != new->mnt_dir_mode)
2333
if (strcmp(old->local_nls->charset, new->local_nls->charset))
2336
if (old->actimeo != new->actimeo)
2343
cifs_match_super(struct super_block *sb, void *data)
2345
struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2346
struct smb_vol *volume_info;
2347
struct cifs_sb_info *cifs_sb;
2348
struct TCP_Server_Info *tcp_srv;
2349
struct cifs_ses *ses;
2350
struct cifs_tcon *tcon;
2351
struct tcon_link *tlink;
2352
struct sockaddr_storage addr;
2355
memset(&addr, 0, sizeof(struct sockaddr_storage));
2357
spin_lock(&cifs_tcp_ses_lock);
2358
cifs_sb = CIFS_SB(sb);
2359
tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2360
if (IS_ERR(tlink)) {
2361
spin_unlock(&cifs_tcp_ses_lock);
2364
tcon = tlink_tcon(tlink);
2366
tcp_srv = ses->server;
2368
volume_info = mnt_data->vol;
2370
if (!volume_info->UNCip || !volume_info->UNC)
2373
rc = cifs_fill_sockaddr((struct sockaddr *)&addr,
2375
strlen(volume_info->UNCip),
2380
if (!match_server(tcp_srv, (struct sockaddr *)&addr, volume_info) ||
2381
!match_session(ses, volume_info) ||
2382
!match_tcon(tcon, volume_info->UNC)) {
2387
rc = compare_mount_options(sb, mnt_data);
2389
spin_unlock(&cifs_tcp_ses_lock);
2390
cifs_put_tlink(tlink);
2395
get_dfs_path(int xid, struct cifs_ses *pSesInfo, const char *old_path,
2396
const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
2397
struct dfs_info3_param **preferrals, int remap)
2402
*pnum_referrals = 0;
2405
if (pSesInfo->ipc_tid == 0) {
2406
temp_unc = kmalloc(2 /* for slashes */ +
2407
strnlen(pSesInfo->serverName,
2408
SERVER_NAME_LEN_WITH_NULL * 2)
2409
+ 1 + 4 /* slash IPC$ */ + 2,
2411
if (temp_unc == NULL)
2415
strcpy(temp_unc + 2, pSesInfo->serverName);
2416
strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
2417
rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
2418
cFYI(1, "CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid);
2422
rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
2423
pnum_referrals, nls_codepage, remap);
2424
/* BB map targetUNCs to dfs_info3 structures, here or
2425
in CIFSGetDFSRefer BB */
2430
#ifdef CONFIG_DEBUG_LOCK_ALLOC
2431
static struct lock_class_key cifs_key[2];
2432
static struct lock_class_key cifs_slock_key[2];
2435
cifs_reclassify_socket4(struct socket *sock)
2437
struct sock *sk = sock->sk;
2438
BUG_ON(sock_owned_by_user(sk));
2439
sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2440
&cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2444
cifs_reclassify_socket6(struct socket *sock)
2446
struct sock *sk = sock->sk;
2447
BUG_ON(sock_owned_by_user(sk));
2448
sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2449
&cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2453
cifs_reclassify_socket4(struct socket *sock)
2458
cifs_reclassify_socket6(struct socket *sock)
2463
/* See RFC1001 section 14 on representation of Netbios names */
2464
static void rfc1002mangle(char *target, char *source, unsigned int length)
2468
for (i = 0, j = 0; i < (length); i++) {
2469
/* mask a nibble at a time and encode */
2470
target[j] = 'A' + (0x0F & (source[i] >> 4));
2471
target[j+1] = 'A' + (0x0F & source[i]);
2478
bind_socket(struct TCP_Server_Info *server)
2481
if (server->srcaddr.ss_family != AF_UNSPEC) {
2482
/* Bind to the specified local IP address */
2483
struct socket *socket = server->ssocket;
2484
rc = socket->ops->bind(socket,
2485
(struct sockaddr *) &server->srcaddr,
2486
sizeof(server->srcaddr));
2488
struct sockaddr_in *saddr4;
2489
struct sockaddr_in6 *saddr6;
2490
saddr4 = (struct sockaddr_in *)&server->srcaddr;
2491
saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2492
if (saddr6->sin6_family == AF_INET6)
2494
"Failed to bind to: %pI6c, error: %d\n",
2495
&saddr6->sin6_addr, rc);
2498
"Failed to bind to: %pI4, error: %d\n",
2499
&saddr4->sin_addr.s_addr, rc);
2506
ip_rfc1001_connect(struct TCP_Server_Info *server)
2510
* some servers require RFC1001 sessinit before sending
2511
* negprot - BB check reconnection in case where second
2512
* sessinit is sent but no second negprot
2514
struct rfc1002_session_packet *ses_init_buf;
2515
struct smb_hdr *smb_buf;
2516
ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2519
ses_init_buf->trailer.session_req.called_len = 32;
2521
if (server->server_RFC1001_name &&
2522
server->server_RFC1001_name[0] != 0)
2523
rfc1002mangle(ses_init_buf->trailer.
2524
session_req.called_name,
2525
server->server_RFC1001_name,
2526
RFC1001_NAME_LEN_WITH_NULL);
2528
rfc1002mangle(ses_init_buf->trailer.
2529
session_req.called_name,
2530
DEFAULT_CIFS_CALLED_NAME,
2531
RFC1001_NAME_LEN_WITH_NULL);
2533
ses_init_buf->trailer.session_req.calling_len = 32;
2536
* calling name ends in null (byte 16) from old smb
2539
if (server->workstation_RFC1001_name &&
2540
server->workstation_RFC1001_name[0] != 0)
2541
rfc1002mangle(ses_init_buf->trailer.
2542
session_req.calling_name,
2543
server->workstation_RFC1001_name,
2544
RFC1001_NAME_LEN_WITH_NULL);
2546
rfc1002mangle(ses_init_buf->trailer.
2547
session_req.calling_name,
2549
RFC1001_NAME_LEN_WITH_NULL);
2551
ses_init_buf->trailer.session_req.scope1 = 0;
2552
ses_init_buf->trailer.session_req.scope2 = 0;
2553
smb_buf = (struct smb_hdr *)ses_init_buf;
2555
/* sizeof RFC1002_SESSION_REQUEST with no scope */
2556
smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2557
rc = smb_send(server, smb_buf, 0x44);
2558
kfree(ses_init_buf);
2560
* RFC1001 layer in at least one server
2561
* requires very short break before negprot
2562
* presumably because not expecting negprot
2563
* to follow so fast. This is a simple
2564
* solution that works without
2565
* complicating the code and causes no
2566
* significant slowing down on mount
2569
usleep_range(1000, 2000);
2572
* else the negprot may still work without this
2573
* even though malloc failed
2580
generic_ip_connect(struct TCP_Server_Info *server)
2585
struct socket *socket = server->ssocket;
2586
struct sockaddr *saddr;
2588
saddr = (struct sockaddr *) &server->dstaddr;
2590
if (server->dstaddr.ss_family == AF_INET6) {
2591
sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
2592
slen = sizeof(struct sockaddr_in6);
2595
sport = ((struct sockaddr_in *) saddr)->sin_port;
2596
slen = sizeof(struct sockaddr_in);
2600
if (socket == NULL) {
2601
rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2602
IPPROTO_TCP, &socket, 1);
2604
cERROR(1, "Error %d creating socket", rc);
2605
server->ssocket = NULL;
2609
/* BB other socket options to set KEEPALIVE, NODELAY? */
2610
cFYI(1, "Socket created");
2611
server->ssocket = socket;
2612
socket->sk->sk_allocation = GFP_NOFS;
2613
if (sfamily == AF_INET6)
2614
cifs_reclassify_socket6(socket);
2616
cifs_reclassify_socket4(socket);
2619
rc = bind_socket(server);
2624
* Eventually check for other socket options to change from
2625
* the default. sock_setsockopt not used because it expects
2628
socket->sk->sk_rcvtimeo = 7 * HZ;
2629
socket->sk->sk_sndtimeo = 5 * HZ;
2631
/* make the bufsizes depend on wsize/rsize and max requests */
2632
if (server->noautotune) {
2633
if (socket->sk->sk_sndbuf < (200 * 1024))
2634
socket->sk->sk_sndbuf = 200 * 1024;
2635
if (socket->sk->sk_rcvbuf < (140 * 1024))
2636
socket->sk->sk_rcvbuf = 140 * 1024;
2639
if (server->tcp_nodelay) {
2641
rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
2642
(char *)&val, sizeof(val));
2644
cFYI(1, "set TCP_NODELAY socket option error %d", rc);
2647
cFYI(1, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
2648
socket->sk->sk_sndbuf,
2649
socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2651
rc = socket->ops->connect(socket, saddr, slen, 0);
2653
cFYI(1, "Error %d connecting to server", rc);
2654
sock_release(socket);
2655
server->ssocket = NULL;
2659
if (sport == htons(RFC1001_PORT))
2660
rc = ip_rfc1001_connect(server);
2666
ip_connect(struct TCP_Server_Info *server)
2669
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2670
struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2672
if (server->dstaddr.ss_family == AF_INET6)
2673
sport = &addr6->sin6_port;
2675
sport = &addr->sin_port;
2680
/* try with 445 port at first */
2681
*sport = htons(CIFS_PORT);
2683
rc = generic_ip_connect(server);
2687
/* if it failed, try with 139 port */
2688
*sport = htons(RFC1001_PORT);
2691
return generic_ip_connect(server);
2694
void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
2695
struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
2697
/* if we are reconnecting then should we check to see if
2698
* any requested capabilities changed locally e.g. via
2699
* remount but we can not do much about it here
2700
* if they have (even if we could detect it by the following)
2701
* Perhaps we could add a backpointer to array of sb from tcon
2702
* or if we change to make all sb to same share the same
2703
* sb as NFS - then we only have one backpointer to sb.
2704
* What if we wanted to mount the server share twice once with
2705
* and once without posixacls or posix paths? */
2706
__u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2708
if (vol_info && vol_info->no_linux_ext) {
2709
tcon->fsUnixInfo.Capability = 0;
2710
tcon->unix_ext = 0; /* Unix Extensions disabled */
2711
cFYI(1, "Linux protocol extensions disabled");
2713
} else if (vol_info)
2714
tcon->unix_ext = 1; /* Unix Extensions supported */
2716
if (tcon->unix_ext == 0) {
2717
cFYI(1, "Unix extensions disabled so not set on reconnect");
2721
if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2722
__u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2723
cFYI(1, "unix caps which server supports %lld", cap);
2724
/* check for reconnect case in which we do not
2725
want to change the mount behavior if we can avoid it */
2726
if (vol_info == NULL) {
2727
/* turn off POSIX ACL and PATHNAMES if not set
2728
originally at mount time */
2729
if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2730
cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2731
if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2732
if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2733
cERROR(1, "POSIXPATH support change");
2734
cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2735
} else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2736
cERROR(1, "possible reconnect error");
2737
cERROR(1, "server disabled POSIX path support");
2741
if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2742
cERROR(1, "per-share encryption not supported yet");
2744
cap &= CIFS_UNIX_CAP_MASK;
2745
if (vol_info && vol_info->no_psx_acl)
2746
cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2747
else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2748
cFYI(1, "negotiated posix acl support");
2750
cifs_sb->mnt_cifs_flags |=
2751
CIFS_MOUNT_POSIXACL;
2754
if (vol_info && vol_info->posix_paths == 0)
2755
cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2756
else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2757
cFYI(1, "negotiate posix pathnames");
2759
cifs_sb->mnt_cifs_flags |=
2760
CIFS_MOUNT_POSIX_PATHS;
2763
cFYI(1, "Negotiate caps 0x%x", (int)cap);
2764
#ifdef CONFIG_CIFS_DEBUG2
2765
if (cap & CIFS_UNIX_FCNTL_CAP)
2766
cFYI(1, "FCNTL cap");
2767
if (cap & CIFS_UNIX_EXTATTR_CAP)
2768
cFYI(1, "EXTATTR cap");
2769
if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2770
cFYI(1, "POSIX path cap");
2771
if (cap & CIFS_UNIX_XATTR_CAP)
2772
cFYI(1, "XATTR cap");
2773
if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2774
cFYI(1, "POSIX ACL cap");
2775
if (cap & CIFS_UNIX_LARGE_READ_CAP)
2776
cFYI(1, "very large read cap");
2777
if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2778
cFYI(1, "very large write cap");
2779
if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2780
cFYI(1, "transport encryption cap");
2781
if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2782
cFYI(1, "mandatory transport encryption cap");
2783
#endif /* CIFS_DEBUG2 */
2784
if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2785
if (vol_info == NULL) {
2786
cFYI(1, "resetting capabilities failed");
2788
cERROR(1, "Negotiating Unix capabilities "
2789
"with the server failed. Consider "
2790
"mounting with the Unix Extensions\n"
2791
"disabled, if problems are found, "
2792
"by specifying the nounix mount "
2799
void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
2800
struct cifs_sb_info *cifs_sb)
2802
INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2804
spin_lock_init(&cifs_sb->tlink_tree_lock);
2805
cifs_sb->tlink_tree = RB_ROOT;
2808
* Temporarily set r/wsize for matching superblock. If we end up using
2809
* new sb then client will later negotiate it downward if needed.
2811
cifs_sb->rsize = pvolume_info->rsize;
2812
cifs_sb->wsize = pvolume_info->wsize;
2814
cifs_sb->mnt_uid = pvolume_info->linux_uid;
2815
cifs_sb->mnt_gid = pvolume_info->linux_gid;
2816
if (pvolume_info->backupuid_specified)
2817
cifs_sb->mnt_backupuid = pvolume_info->backupuid;
2818
if (pvolume_info->backupgid_specified)
2819
cifs_sb->mnt_backupgid = pvolume_info->backupgid;
2820
cifs_sb->mnt_file_mode = pvolume_info->file_mode;
2821
cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
2822
cFYI(1, "file mode: 0x%x dir mode: 0x%x",
2823
cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
2825
cifs_sb->actimeo = pvolume_info->actimeo;
2826
cifs_sb->local_nls = pvolume_info->local_nls;
2828
if (pvolume_info->noperm)
2829
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
2830
if (pvolume_info->setuids)
2831
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
2832
if (pvolume_info->server_ino)
2833
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
2834
if (pvolume_info->remap)
2835
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
2836
if (pvolume_info->no_xattr)
2837
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
2838
if (pvolume_info->sfu_emul)
2839
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
2840
if (pvolume_info->nobrl)
2841
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
2842
if (pvolume_info->nostrictsync)
2843
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
2844
if (pvolume_info->mand_lock)
2845
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
2846
if (pvolume_info->rwpidforward)
2847
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
2848
if (pvolume_info->cifs_acl)
2849
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
2850
if (pvolume_info->backupuid_specified)
2851
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
2852
if (pvolume_info->backupgid_specified)
2853
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
2854
if (pvolume_info->override_uid)
2855
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
2856
if (pvolume_info->override_gid)
2857
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
2858
if (pvolume_info->dynperm)
2859
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
2860
if (pvolume_info->fsc)
2861
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
2862
if (pvolume_info->multiuser)
2863
cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
2864
CIFS_MOUNT_NO_PERM);
2865
if (pvolume_info->strict_io)
2866
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
2867
if (pvolume_info->direct_io) {
2868
cFYI(1, "mounting share using direct i/o");
2869
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
2871
if (pvolume_info->mfsymlinks) {
2872
if (pvolume_info->sfu_emul) {
2873
cERROR(1, "mount option mfsymlinks ignored if sfu "
2874
"mount option is used");
2876
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
2880
if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
2881
cERROR(1, "mount option dynperm ignored if cifsacl "
2882
"mount option supported");
2886
* When the server supports very large reads and writes via POSIX extensions,
2887
* we can allow up to 2^24-1, minus the size of a READ/WRITE_AND_X header, not
2888
* including the RFC1001 length.
2890
* Note that this might make for "interesting" allocation problems during
2891
* writeback however as we have to allocate an array of pointers for the
2892
* pages. A 16M write means ~32kb page array with PAGE_CACHE_SIZE == 4096.
2894
* For reads, there is a similar problem as we need to allocate an array
2895
* of kvecs to handle the receive, though that should only need to be done
2898
#define CIFS_MAX_WSIZE ((1<<24) - 1 - sizeof(WRITE_REQ) + 4)
2899
#define CIFS_MAX_RSIZE ((1<<24) - sizeof(READ_RSP) + 4)
2902
* When the server doesn't allow large posix writes, only allow a rsize/wsize
2903
* of 2^17-1 minus the size of the call header. That allows for a read or
2904
* write up to the maximum size described by RFC1002.
2906
#define CIFS_MAX_RFC1002_WSIZE ((1<<17) - 1 - sizeof(WRITE_REQ) + 4)
2907
#define CIFS_MAX_RFC1002_RSIZE ((1<<17) - 1 - sizeof(READ_RSP) + 4)
2910
* The default wsize is 1M. find_get_pages seems to return a maximum of 256
2911
* pages in a single call. With PAGE_CACHE_SIZE == 4k, this means we can fill
2912
* a single wsize request with a single call.
2914
#define CIFS_DEFAULT_IOSIZE (1024 * 1024)
2917
* Windows only supports a max of 60k reads. Default to that when posix
2918
* extensions aren't in force.
2920
#define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024)
2923
cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
2925
__u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2926
struct TCP_Server_Info *server = tcon->ses->server;
2927
unsigned int wsize = pvolume_info->wsize ? pvolume_info->wsize :
2928
CIFS_DEFAULT_IOSIZE;
2930
/* can server support 24-bit write sizes? (via UNIX extensions) */
2931
if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
2932
wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
2935
* no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
2936
* Limit it to max buffer offered by the server, minus the size of the
2937
* WRITEX header, not including the 4 byte RFC1001 length.
2939
if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
2940
(!(server->capabilities & CAP_UNIX) &&
2941
(server->sec_mode & (SECMODE_SIGN_ENABLED|SECMODE_SIGN_REQUIRED))))
2942
wsize = min_t(unsigned int, wsize,
2943
server->maxBuf - sizeof(WRITE_REQ) + 4);
2945
/* hard limit of CIFS_MAX_WSIZE */
2946
wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
2952
cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info)
2954
__u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2955
struct TCP_Server_Info *server = tcon->ses->server;
2956
unsigned int rsize, defsize;
2959
* Set default value...
2961
* HACK alert! Ancient servers have very small buffers. Even though
2962
* MS-CIFS indicates that servers are only limited by the client's
2963
* bufsize for reads, testing against win98se shows that it throws
2964
* INVALID_PARAMETER errors if you try to request too large a read.
2966
* If the server advertises a MaxBufferSize of less than one page,
2967
* assume that it also can't satisfy reads larger than that either.
2969
* FIXME: Is there a better heuristic for this?
2971
if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP))
2972
defsize = CIFS_DEFAULT_IOSIZE;
2973
else if (server->capabilities & CAP_LARGE_READ_X)
2974
defsize = CIFS_DEFAULT_NON_POSIX_RSIZE;
2975
else if (server->maxBuf >= PAGE_CACHE_SIZE)
2976
defsize = CIFSMaxBufSize;
2978
defsize = server->maxBuf - sizeof(READ_RSP);
2980
rsize = pvolume_info->rsize ? pvolume_info->rsize : defsize;
2983
* no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
2984
* the client's MaxBufferSize.
2986
if (!(server->capabilities & CAP_LARGE_READ_X))
2987
rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
2989
/* hard limit of CIFS_MAX_RSIZE */
2990
rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
2996
is_path_accessible(int xid, struct cifs_tcon *tcon,
2997
struct cifs_sb_info *cifs_sb, const char *full_path)
3000
FILE_ALL_INFO *pfile_info;
3002
pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
3003
if (pfile_info == NULL)
3006
rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
3007
0 /* not legacy */, cifs_sb->local_nls,
3008
cifs_sb->mnt_cifs_flags &
3009
CIFS_MOUNT_MAP_SPECIAL_CHR);
3011
if (rc == -EOPNOTSUPP || rc == -EINVAL)
3012
rc = SMBQueryInformation(xid, tcon, full_path, pfile_info,
3013
cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
3014
CIFS_MOUNT_MAP_SPECIAL_CHR);
3020
cleanup_volume_info_contents(struct smb_vol *volume_info)
3022
kfree(volume_info->username);
3023
kzfree(volume_info->password);
3024
if (volume_info->UNCip != volume_info->UNC + 2)
3025
kfree(volume_info->UNCip);
3026
kfree(volume_info->UNC);
3027
kfree(volume_info->domainname);
3028
kfree(volume_info->iocharset);
3029
kfree(volume_info->prepath);
3033
cifs_cleanup_volume_info(struct smb_vol *volume_info)
3037
cleanup_volume_info_contents(volume_info);
3042
#ifdef CONFIG_CIFS_DFS_UPCALL
3043
/* build_path_to_root returns full path to root when
3044
* we do not have an exiting connection (tcon) */
3046
build_unc_path_to_root(const struct smb_vol *vol,
3047
const struct cifs_sb_info *cifs_sb)
3049
char *full_path, *pos;
3050
unsigned int pplen = vol->prepath ? strlen(vol->prepath) : 0;
3051
unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3053
full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3054
if (full_path == NULL)
3055
return ERR_PTR(-ENOMEM);
3057
strncpy(full_path, vol->UNC, unc_len);
3058
pos = full_path + unc_len;
3061
strncpy(pos, vol->prepath, pplen);
3065
*pos = '\0'; /* add trailing null */
3066
convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3067
cFYI(1, "%s: full_path=%s", __func__, full_path);
3072
* Perform a dfs referral query for a share and (optionally) prefix
3074
* If a referral is found, cifs_sb->mountdata will be (re-)allocated
3075
* to a string containing updated options for the submount. Otherwise it
3076
* will be left untouched.
3078
* Returns the rc from get_dfs_path to the caller, which can be used to
3079
* determine whether there were referrals.
3082
expand_dfs_referral(int xid, struct cifs_ses *pSesInfo,
3083
struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3087
unsigned int num_referrals = 0;
3088
struct dfs_info3_param *referrals = NULL;
3089
char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3091
full_path = build_unc_path_to_root(volume_info, cifs_sb);
3092
if (IS_ERR(full_path))
3093
return PTR_ERR(full_path);
3095
/* For DFS paths, skip the first '\' of the UNC */
3096
ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3098
rc = get_dfs_path(xid, pSesInfo , ref_path, cifs_sb->local_nls,
3099
&num_referrals, &referrals,
3100
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
3102
if (!rc && num_referrals > 0) {
3103
char *fake_devname = NULL;
3105
mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3106
full_path + 1, referrals,
3109
free_dfs_info_array(referrals, num_referrals);
3111
if (IS_ERR(mdata)) {
3112
rc = PTR_ERR(mdata);
3115
cleanup_volume_info_contents(volume_info);
3116
memset(volume_info, '\0', sizeof(*volume_info));
3117
rc = cifs_setup_volume_info(volume_info, mdata,
3120
kfree(fake_devname);
3121
kfree(cifs_sb->mountdata);
3122
cifs_sb->mountdata = mdata;
3130
cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3131
const char *devname)
3135
if (cifs_parse_mount_options(mount_data, devname, volume_info))
3138
if (volume_info->nullauth) {
3139
cFYI(1, "null user");
3140
volume_info->username = kzalloc(1, GFP_KERNEL);
3141
if (volume_info->username == NULL)
3143
} else if (volume_info->username) {
3144
/* BB fixme parse for domain name here */
3145
cFYI(1, "Username: %s", volume_info->username);
3147
cifserror("No username specified");
3148
/* In userspace mount helper we can get user name from alternate
3149
locations such as env variables and files on disk */
3153
/* this is needed for ASCII cp to Unicode converts */
3154
if (volume_info->iocharset == NULL) {
3155
/* load_nls_default cannot return null */
3156
volume_info->local_nls = load_nls_default();
3158
volume_info->local_nls = load_nls(volume_info->iocharset);
3159
if (volume_info->local_nls == NULL) {
3160
cERROR(1, "CIFS mount error: iocharset %s not found",
3161
volume_info->iocharset);
3170
cifs_get_volume_info(char *mount_data, const char *devname)
3173
struct smb_vol *volume_info;
3175
volume_info = kzalloc(sizeof(struct smb_vol), GFP_KERNEL);
3177
return ERR_PTR(-ENOMEM);
3179
rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3181
cifs_cleanup_volume_info(volume_info);
3182
volume_info = ERR_PTR(rc);
3188
/* make sure ra_pages is a multiple of rsize */
3189
static inline unsigned int
3190
cifs_ra_pages(struct cifs_sb_info *cifs_sb)
3193
unsigned int rsize_pages = cifs_sb->rsize / PAGE_CACHE_SIZE;
3195
if (rsize_pages >= default_backing_dev_info.ra_pages)
3196
return default_backing_dev_info.ra_pages;
3197
else if (rsize_pages == 0)
3200
reads = default_backing_dev_info.ra_pages / rsize_pages;
3201
return reads * rsize_pages;
3205
cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3209
struct cifs_ses *pSesInfo;
3210
struct cifs_tcon *tcon;
3211
struct TCP_Server_Info *srvTcp;
3213
struct tcon_link *tlink;
3214
#ifdef CONFIG_CIFS_DFS_UPCALL
3215
int referral_walks_count = 0;
3218
rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
3222
#ifdef CONFIG_CIFS_DFS_UPCALL
3224
/* cleanup activities if we're chasing a referral */
3225
if (referral_walks_count) {
3227
cifs_put_tcon(tcon);
3229
cifs_put_smb_ses(pSesInfo);
3242
/* get a reference to a tcp session */
3243
srvTcp = cifs_get_tcp_session(volume_info);
3244
if (IS_ERR(srvTcp)) {
3245
rc = PTR_ERR(srvTcp);
3246
bdi_destroy(&cifs_sb->bdi);
3250
/* get a reference to a SMB session */
3251
pSesInfo = cifs_get_smb_ses(srvTcp, volume_info);
3252
if (IS_ERR(pSesInfo)) {
3253
rc = PTR_ERR(pSesInfo);
3255
goto mount_fail_check;
3258
/* search for existing tcon to this server share */
3259
tcon = cifs_get_tcon(pSesInfo, volume_info);
3263
goto remote_path_check;
3266
/* tell server which Unix caps we support */
3267
if (tcon->ses->capabilities & CAP_UNIX) {
3268
/* reset of caps checks mount to see if unix extensions
3269
disabled for just this mount */
3270
reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3271
if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3272
(le64_to_cpu(tcon->fsUnixInfo.Capability) &
3273
CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3275
goto mount_fail_check;
3278
tcon->unix_ext = 0; /* server does not support them */
3280
/* do not care if following two calls succeed - informational */
3282
CIFSSMBQFSDeviceInfo(xid, tcon);
3283
CIFSSMBQFSAttributeInfo(xid, tcon);
3286
cifs_sb->wsize = cifs_negotiate_wsize(tcon, volume_info);
3287
cifs_sb->rsize = cifs_negotiate_rsize(tcon, volume_info);
3289
/* tune readahead according to rsize */
3290
cifs_sb->bdi.ra_pages = cifs_ra_pages(cifs_sb);
3293
#ifdef CONFIG_CIFS_DFS_UPCALL
3295
* Perform an unconditional check for whether there are DFS
3296
* referrals for this path without prefix, to provide support
3297
* for DFS referrals from w2k8 servers which don't seem to respond
3298
* with PATH_NOT_COVERED to requests that include the prefix.
3299
* Chase the referral if found, otherwise continue normally.
3301
if (referral_walks_count == 0) {
3302
int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
3305
referral_walks_count++;
3306
goto try_mount_again;
3311
/* check if a whole path is not remote */
3313
/* build_path_to_root works only when we have a valid tcon */
3314
full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3315
if (full_path == NULL) {
3317
goto mount_fail_check;
3319
rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
3320
if (rc != 0 && rc != -EREMOTE) {
3322
goto mount_fail_check;
3327
/* get referral if needed */
3328
if (rc == -EREMOTE) {
3329
#ifdef CONFIG_CIFS_DFS_UPCALL
3330
if (referral_walks_count > MAX_NESTED_LINKS) {
3332
* BB: when we implement proper loop detection,
3333
* we will remove this check. But now we need it
3334
* to prevent an indefinite loop if 'DFS tree' is
3335
* misconfigured (i.e. has loops).
3338
goto mount_fail_check;
3341
rc = expand_dfs_referral(xid, pSesInfo, volume_info, cifs_sb,
3345
referral_walks_count++;
3346
goto try_mount_again;
3348
goto mount_fail_check;
3349
#else /* No DFS support, return error on mount */
3355
goto mount_fail_check;
3357
/* now, hang the tcon off of the superblock */
3358
tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3359
if (tlink == NULL) {
3361
goto mount_fail_check;
3364
tlink->tl_uid = pSesInfo->linux_uid;
3365
tlink->tl_tcon = tcon;
3366
tlink->tl_time = jiffies;
3367
set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3368
set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3370
cifs_sb->master_tlink = tlink;
3371
spin_lock(&cifs_sb->tlink_tree_lock);
3372
tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3373
spin_unlock(&cifs_sb->tlink_tree_lock);
3375
queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,
3379
/* on error free sesinfo and tcon struct if needed */
3381
/* If find_unc succeeded then rc == 0 so we can not end */
3382
/* up accidentally freeing someone elses tcon struct */
3384
cifs_put_tcon(tcon);
3386
cifs_put_smb_ses(pSesInfo);
3388
cifs_put_tcp_session(srvTcp);
3389
bdi_destroy(&cifs_sb->bdi);
3398
* Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3399
* pointer may be NULL.
3402
CIFSTCon(unsigned int xid, struct cifs_ses *ses,
3403
const char *tree, struct cifs_tcon *tcon,
3404
const struct nls_table *nls_codepage)
3406
struct smb_hdr *smb_buffer;
3407
struct smb_hdr *smb_buffer_response;
3410
unsigned char *bcc_ptr;
3413
__u16 bytes_left, count;
3418
smb_buffer = cifs_buf_get();
3419
if (smb_buffer == NULL)
3422
smb_buffer_response = smb_buffer;
3424
header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3425
NULL /*no tid */ , 4 /*wct */ );
3427
smb_buffer->Mid = GetNextMid(ses->server);
3428
smb_buffer->Uid = ses->Suid;
3429
pSMB = (TCONX_REQ *) smb_buffer;
3430
pSMBr = (TCONX_RSP *) smb_buffer_response;
3432
pSMB->AndXCommand = 0xFF;
3433
pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3434
bcc_ptr = &pSMB->Password[0];
3435
if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3436
pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3437
*bcc_ptr = 0; /* password is null byte */
3438
bcc_ptr++; /* skip password */
3439
/* already aligned so no need to do it below */
3441
pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3442
/* BB FIXME add code to fail this if NTLMv2 or Kerberos
3443
specified as required (when that support is added to
3444
the vfs in the future) as only NTLM or the much
3445
weaker LANMAN (which we do not send by default) is accepted
3446
by Samba (not sure whether other servers allow
3447
NTLMv2 password here) */
3448
#ifdef CONFIG_CIFS_WEAK_PW_HASH
3449
if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3450
(ses->server->secType == LANMAN))
3451
calc_lanman_hash(tcon->password, ses->server->cryptkey,
3452
ses->server->sec_mode &
3453
SECMODE_PW_ENCRYPT ? true : false,
3456
#endif /* CIFS_WEAK_PW_HASH */
3457
rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3458
bcc_ptr, nls_codepage);
3460
bcc_ptr += CIFS_AUTH_RESP_SIZE;
3461
if (ses->capabilities & CAP_UNICODE) {
3462
/* must align unicode strings */
3463
*bcc_ptr = 0; /* null byte password */
3468
if (ses->server->sec_mode &
3469
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3470
smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3472
if (ses->capabilities & CAP_STATUS32) {
3473
smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3475
if (ses->capabilities & CAP_DFS) {
3476
smb_buffer->Flags2 |= SMBFLG2_DFS;
3478
if (ses->capabilities & CAP_UNICODE) {
3479
smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3481
cifs_strtoUCS((__le16 *) bcc_ptr, tree,
3482
6 /* max utf8 char length in bytes */ *
3483
(/* server len*/ + 256 /* share len */), nls_codepage);
3484
bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3485
bcc_ptr += 2; /* skip trailing null */
3486
} else { /* ASCII */
3487
strcpy(bcc_ptr, tree);
3488
bcc_ptr += strlen(tree) + 1;
3490
strcpy(bcc_ptr, "?????");
3491
bcc_ptr += strlen("?????");
3493
count = bcc_ptr - &pSMB->Password[0];
3494
pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3495
pSMB->hdr.smb_buf_length) + count);
3496
pSMB->ByteCount = cpu_to_le16(count);
3498
rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3501
/* above now done in SendReceive */
3502
if ((rc == 0) && (tcon != NULL)) {
3505
tcon->tidStatus = CifsGood;
3506
tcon->need_reconnect = false;
3507
tcon->tid = smb_buffer_response->Tid;
3508
bcc_ptr = pByteArea(smb_buffer_response);
3509
bytes_left = get_bcc(smb_buffer_response);
3510
length = strnlen(bcc_ptr, bytes_left - 2);
3511
if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3517
/* skip service field (NB: this field is always ASCII) */
3519
if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3520
(bcc_ptr[2] == 'C')) {
3521
cFYI(1, "IPC connection");
3524
} else if (length == 2) {
3525
if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3526
/* the most common case */
3527
cFYI(1, "disk share connection");
3530
bcc_ptr += length + 1;
3531
bytes_left -= (length + 1);
3532
strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
3534
/* mostly informational -- no need to fail on error here */
3535
kfree(tcon->nativeFileSystem);
3536
tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr,
3537
bytes_left, is_unicode,
3540
cFYI(1, "nativeFileSystem=%s", tcon->nativeFileSystem);
3542
if ((smb_buffer_response->WordCount == 3) ||
3543
(smb_buffer_response->WordCount == 7))
3544
/* field is in same location */
3545
tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3548
cFYI(1, "Tcon flags: 0x%x ", tcon->Flags);
3549
} else if ((rc == 0) && tcon == NULL) {
3550
/* all we need to save for IPC$ connection */
3551
ses->ipc_tid = smb_buffer_response->Tid;
3554
cifs_buf_release(smb_buffer);
3559
cifs_umount(struct cifs_sb_info *cifs_sb)
3561
struct rb_root *root = &cifs_sb->tlink_tree;
3562
struct rb_node *node;
3563
struct tcon_link *tlink;
3565
cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3567
spin_lock(&cifs_sb->tlink_tree_lock);
3568
while ((node = rb_first(root))) {
3569
tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3570
cifs_get_tlink(tlink);
3571
clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3572
rb_erase(node, root);
3574
spin_unlock(&cifs_sb->tlink_tree_lock);
3575
cifs_put_tlink(tlink);
3576
spin_lock(&cifs_sb->tlink_tree_lock);
3578
spin_unlock(&cifs_sb->tlink_tree_lock);
3580
bdi_destroy(&cifs_sb->bdi);
3581
kfree(cifs_sb->mountdata);
3582
unload_nls(cifs_sb->local_nls);
3586
int cifs_negotiate_protocol(unsigned int xid, struct cifs_ses *ses)
3589
struct TCP_Server_Info *server = ses->server;
3591
/* only send once per connect */
3592
if (server->maxBuf != 0)
3595
rc = CIFSSMBNegotiate(xid, ses);
3596
if (rc == -EAGAIN) {
3597
/* retry only once on 1st time connection */
3598
rc = CIFSSMBNegotiate(xid, ses);
3603
spin_lock(&GlobalMid_Lock);
3604
if (server->tcpStatus == CifsNeedNegotiate)
3605
server->tcpStatus = CifsGood;
3608
spin_unlock(&GlobalMid_Lock);
3616
int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
3617
struct nls_table *nls_info)
3620
struct TCP_Server_Info *server = ses->server;
3623
ses->capabilities = server->capabilities;
3624
if (linuxExtEnabled == 0)
3625
ses->capabilities &= (~CAP_UNIX);
3627
cFYI(1, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
3628
server->sec_mode, server->capabilities, server->timeAdj);
3630
rc = CIFS_SessSetup(xid, ses, nls_info);
3632
cERROR(1, "Send error in SessSetup = %d", rc);
3634
mutex_lock(&ses->server->srv_mutex);
3635
if (!server->session_estab) {
3636
server->session_key.response = ses->auth_key.response;
3637
server->session_key.len = ses->auth_key.len;
3638
server->sequence_number = 0x2;
3639
server->session_estab = true;
3640
ses->auth_key.response = NULL;
3642
mutex_unlock(&server->srv_mutex);
3644
cFYI(1, "CIFS Session Established successfully");
3645
spin_lock(&GlobalMid_Lock);
3646
ses->status = CifsGood;
3647
ses->need_reconnect = false;
3648
spin_unlock(&GlobalMid_Lock);
3651
kfree(ses->auth_key.response);
3652
ses->auth_key.response = NULL;
3653
ses->auth_key.len = 0;
3654
kfree(ses->ntlmssp);
3655
ses->ntlmssp = NULL;
3660
static struct cifs_tcon *
3661
cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
3663
struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3664
struct cifs_ses *ses;
3665
struct cifs_tcon *tcon = NULL;
3666
struct smb_vol *vol_info;
3667
char username[28]; /* big enough for "krb50x" + hex of ULONG_MAX 6+16 */
3668
/* We used to have this as MAX_USERNAME which is */
3669
/* way too big now (256 instead of 32) */
3671
vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
3672
if (vol_info == NULL) {
3673
tcon = ERR_PTR(-ENOMEM);
3677
snprintf(username, sizeof(username), "krb50x%x", fsuid);
3678
vol_info->username = username;
3679
vol_info->local_nls = cifs_sb->local_nls;
3680
vol_info->linux_uid = fsuid;
3681
vol_info->cred_uid = fsuid;
3682
vol_info->UNC = master_tcon->treeName;
3683
vol_info->retry = master_tcon->retry;
3684
vol_info->nocase = master_tcon->nocase;
3685
vol_info->local_lease = master_tcon->local_lease;
3686
vol_info->no_linux_ext = !master_tcon->unix_ext;
3688
/* FIXME: allow for other secFlg settings */
3689
vol_info->secFlg = CIFSSEC_MUST_KRB5;
3691
/* get a reference for the same TCP session */
3692
spin_lock(&cifs_tcp_ses_lock);
3693
++master_tcon->ses->server->srv_count;
3694
spin_unlock(&cifs_tcp_ses_lock);
3696
ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
3698
tcon = (struct cifs_tcon *)ses;
3699
cifs_put_tcp_session(master_tcon->ses->server);
3703
tcon = cifs_get_tcon(ses, vol_info);
3705
cifs_put_smb_ses(ses);
3709
if (ses->capabilities & CAP_UNIX)
3710
reset_cifs_unix_caps(0, tcon, NULL, vol_info);
3718
cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3720
return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3724
cifs_sb_tcon_pending_wait(void *unused)
3727
return signal_pending(current) ? -ERESTARTSYS : 0;
3730
/* find and return a tlink with given uid */
3731
static struct tcon_link *
3732
tlink_rb_search(struct rb_root *root, uid_t uid)
3734
struct rb_node *node = root->rb_node;
3735
struct tcon_link *tlink;
3738
tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3740
if (tlink->tl_uid > uid)
3741
node = node->rb_left;
3742
else if (tlink->tl_uid < uid)
3743
node = node->rb_right;
3750
/* insert a tcon_link into the tree */
3752
tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3754
struct rb_node **new = &(root->rb_node), *parent = NULL;
3755
struct tcon_link *tlink;
3758
tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3761
if (tlink->tl_uid > new_tlink->tl_uid)
3762
new = &((*new)->rb_left);
3764
new = &((*new)->rb_right);
3767
rb_link_node(&new_tlink->tl_rbnode, parent, new);
3768
rb_insert_color(&new_tlink->tl_rbnode, root);
3772
* Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3775
* If the superblock doesn't refer to a multiuser mount, then just return
3776
* the master tcon for the mount.
3778
* First, search the rbtree for an existing tcon for this fsuid. If one
3779
* exists, then check to see if it's pending construction. If it is then wait
3780
* for construction to complete. Once it's no longer pending, check to see if
3781
* it failed and either return an error or retry construction, depending on
3784
* If one doesn't exist then insert a new tcon_link struct into the tree and
3785
* try to construct a new one.
3788
cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3791
uid_t fsuid = current_fsuid();
3792
struct tcon_link *tlink, *newtlink;
3794
if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3795
return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3797
spin_lock(&cifs_sb->tlink_tree_lock);
3798
tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3800
cifs_get_tlink(tlink);
3801
spin_unlock(&cifs_sb->tlink_tree_lock);
3803
if (tlink == NULL) {
3804
newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3805
if (newtlink == NULL)
3806
return ERR_PTR(-ENOMEM);
3807
newtlink->tl_uid = fsuid;
3808
newtlink->tl_tcon = ERR_PTR(-EACCES);
3809
set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3810
set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3811
cifs_get_tlink(newtlink);
3813
spin_lock(&cifs_sb->tlink_tree_lock);
3814
/* was one inserted after previous search? */
3815
tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3817
cifs_get_tlink(tlink);
3818
spin_unlock(&cifs_sb->tlink_tree_lock);
3820
goto wait_for_construction;
3823
tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3824
spin_unlock(&cifs_sb->tlink_tree_lock);
3826
wait_for_construction:
3827
ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
3828
cifs_sb_tcon_pending_wait,
3829
TASK_INTERRUPTIBLE);
3831
cifs_put_tlink(tlink);
3832
return ERR_PTR(ret);
3835
/* if it's good, return it */
3836
if (!IS_ERR(tlink->tl_tcon))
3839
/* return error if we tried this already recently */
3840
if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
3841
cifs_put_tlink(tlink);
3842
return ERR_PTR(-EACCES);
3845
if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
3846
goto wait_for_construction;
3849
tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
3850
clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
3851
wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
3853
if (IS_ERR(tlink->tl_tcon)) {
3854
cifs_put_tlink(tlink);
3855
return ERR_PTR(-EACCES);
3862
* periodic workqueue job that scans tcon_tree for a superblock and closes
3866
cifs_prune_tlinks(struct work_struct *work)
3868
struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
3870
struct rb_root *root = &cifs_sb->tlink_tree;
3871
struct rb_node *node = rb_first(root);
3872
struct rb_node *tmp;
3873
struct tcon_link *tlink;
3876
* Because we drop the spinlock in the loop in order to put the tlink
3877
* it's not guarded against removal of links from the tree. The only
3878
* places that remove entries from the tree are this function and
3879
* umounts. Because this function is non-reentrant and is canceled
3880
* before umount can proceed, this is safe.
3882
spin_lock(&cifs_sb->tlink_tree_lock);
3883
node = rb_first(root);
3884
while (node != NULL) {
3886
node = rb_next(tmp);
3887
tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
3889
if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
3890
atomic_read(&tlink->tl_count) != 0 ||
3891
time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
3894
cifs_get_tlink(tlink);
3895
clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3896
rb_erase(tmp, root);
3898
spin_unlock(&cifs_sb->tlink_tree_lock);
3899
cifs_put_tlink(tlink);
3900
spin_lock(&cifs_sb->tlink_tree_lock);
3902
spin_unlock(&cifs_sb->tlink_tree_lock);
3904
queue_delayed_work(system_nrt_wq, &cifs_sb->prune_tlinks,